Emacs:如何定义目录的“书签”变量

时间:2019-03-19 21:46:41

标签: emacs bookmarks

我使用Emacs和ESS进行R编程,通常我在几个特定的​​文件夹中工作。由于工作环境的配置,我处理的文件夹通常在每个文件夹结构中都“非常深”,即在到达工作目录之前,我需要指定几个子文件夹:

/Desktop/SUB1/SUB2/SUB3/SUB4...

这很乏味,我不得不反复使用CTR+X CTR+F查找文件,即使我只需要在几个地方工作。我想知道,是否有可能让我定义一些变量来存储我工作的常用位置,并且当我需要查找任何脚本时,只需要调用类似的内容即可:

$SHORTCUT/Script.R

这将是一个功能,例如Linux窗口管理器中的书签。我了解有一个全局设置环境,允许您设置默认目录。但是,这只会使一个文件夹的工作更加轻松。这是一种进步,但如果我同时从事多个项目,还不够好。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

在这里您有几个选择。我的商店中有2个书签和文件寄存器供您使用 如果执行以下命令

(set-register ?a '(file . "~/.emacs"))

然后执行C-x r j aM-x jump-to-register a,您将跳到.emacs文件。我鼓励您阅读有关寄存器的文档,它们非常方便。

第二个是书签。您可以通过在感兴趣的缓冲区中使用C-x r m来为文件或目录添加书签。不要忘记保存书签,否则下次您重新启动emacs时它们会消失。 M-x bookmark save

更新 第三种选择是使用可以在melpa上找到的keychords包

(defun open-this  ()
  (interactive)
  (find-file "~/.emacs") )

(require 'key-chord)
(key-chord-mode 1)
(key-chord-define-global "=-"  'open-this)

然后通过同时或足够快地按=-来进入.emacs文件。一个不错的功能是您也可以使用本地模式,因此同一键和弦会根据您的模式执行不同的操作。

答案 1 :(得分:1)

这是我过去所做的事情:

(defun jea-open-deep-file (arg)
  (interactive "sWhich File?: ")
  (cond
   ((string= "1" arg) (find-file "~/.emacs"))
   ((string= "2" arg) (find-file "/Users/jamesanderson/code/python/aws/comprehend/README.md"))
   ((string= "3" arg) (find-file "~/some/other/file/somewhere/else.el"))
   (t (message "unknown choice"))))
(global-set-key [(f7)] 'jea-open-deep-file)

那么,我在这里发生什么?有一个名为“ jea-open-deep-file”的功能,可以用“ find-file”打开任何文件。如果您想尝试,可以将其放入“ .emacs”文件或* scratch *缓冲区中,仅尝试一次。一旦编辑了find-file调用以指向要打开的文件,就可以评估缓冲区(有多种方法可以执行此操作,此讨论最简单的方法是: Alt + X 然后“ eval-buffer”,底部没有引号。

如何使用?在这种情况下,我已将该函数映射到 F7 键。选择一个您尚未使用的。因此,一旦安装了eval-buffer,我就可以去:

  • F7
  • 它提示我“哪个文件?”
  • 我输入1、2或3,然后按 RETURN
  • emacs打开文件

我现在无法使用Windows计算机,但是,您可能需要稍微更改路径,例如:"C:\\Program Files (x86)\\Aspell\\bin\\aspell.exe",并带有额外的 \\ 转义符。

每当您要将文件添加到jea-open-deep-file时,都不需要重新评估该功能(起初看起来有点怪异,但是,这就是您在“编辑编辑器时正在编辑”,这非常好,不必重新加载整个emacs应用。)

编辑:

如果要跳至特定行,请尝试:

(defun jea-open-file-goto-line (fname line)
  (progn
    (find-file fname)
    (goto-char 0)
    (forward-line line)))

(defun jea-open-deep-file (arg)
  (interactive "sWhich File-Line?: ")
  (let* ((split (split-string arg "-"))
         (file (car split))
         (line (string-to-number (cadr split))))
    (cond
     ((string= "a" file) (jea-open-file-goto-line "~/.emacs" line))
     ((string= "b" file) (jea-open-file-goto-line "/Users/jamesanderson/code/python/aws/comprehend/README.md" line))
     ((string= "c" file) (jea-open-file-goto-line "~/some/other/file/somewhere/else.el" line))
     (t (message "unknown choice")))))

(global-set-key [(f7)] 'jea-open-deep-file)

当出现提示时,如果要转到标记为“ b”的文件的第13行,请键入“ b-13”(不带引号)