Emacs:如何定义&x27;书签&x27;目录变量

Emacs:如何定义&x27;书签&x27;目录变量,emacs,bookmarks,Emacs,Bookmarks,我使用Emacs和ESS进行R编程,通常我在几个特定的文件夹中工作。由于我工作环境的配置,我工作的文件夹在每个文件夹结构中通常“非常深”,即,在到达我工作的目录之前,我需要指定几个子文件夹: /Desktop/SUB1/SUB2/SUB3/SUB4... 这很乏味,我不得不反复使用CTR+XCTR+F来查找文件,即使我只需要在几个地方工作。我想知道,是否有可能允许我定义一些变量来存储我所处理的公共位置,并且当我需要查找任何脚本时,我只需要调用如下内容: $SHORTCUT/Script.R

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

/Desktop/SUB1/SUB2/SUB3/SUB4...
这很乏味,我不得不反复使用
CTR+X
CTR+F
来查找文件,即使我只需要在几个地方工作。我想知道,是否有可能允许我定义一些变量来存储我所处理的公共位置,并且当我需要查找任何脚本时,我只需要调用如下内容:

$SHORTCUT/Script.R
这将是一个类似于Linux窗口管理器中书签的功能。我知道有一个全局设置环境,允许您设置默认目录。然而,这只会使一个文件夹的工作更容易一些。这是一个进步,但如果我同时在几个项目上工作,仍然不够好


有什么建议吗

这里有几个选项。我为你准备了2个书签和文件注册 如果执行以下命令

(设置寄存器a'(文件“~/.emacs”)

然后执行
C-x r j a
M-x跳转以注册a
您将跳转到.emacs文件。我鼓励你阅读登记册上的文档,它们非常方便

第二个是书签。您可以在感兴趣的缓冲区中使用
C-x r m
为文件或目录添加书签。别忘了保存书签,否则下次重新启动emacs时它们会消失<代码>M-x书签保存

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

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

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

然后同时按
=-
,或以足够快的速度按下,即可转到.emacs文件。一个很好的特性是,您也可以使用本地模式,因此同一个主键和弦可以根据您的模式执行不同的操作。

这是我过去所做的:

(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,然后按回车键
  • emacs打开文件
我现在无法访问windows计算机,但您可能需要稍微更改路径,例如:
“C:\\Program Files(x86)\\Aspell\\bin\\Aspell.exe”
此选项带有额外的\\转义符

任何时候,当你想向JEOPEN deep文件中添加一个文件时,你都不需要重新评估该函数(一开始似乎有点奇怪,但这就是你“编辑时编辑编辑器”的方式,不必重新加载整个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”(不带引号)

尝试
M-x书签集
。您也可以使用文件寄存器。请参见
C-h f set register
除了为文件或目录设置书签外,还可以定义OS环境变量并使用completion。这样,您就可以准确地使用
$SHORTCUT/Script.R
<代码>选项卡通过展开环境变量完成以
$SHORTCUT
开头的输入。不过,书签通常更快(打字更少)且更灵活。谢谢你,我能够创建一个系统环境。但是,必须在命令行上启动Emacs,以使系统环境正常工作。您是否可以建议它自动加载系统环境?选项
(getenv var)
在某种程度上无法正常工作,只支持一个特定变量。请参阅Emacs手册,节点。如何在Emacs外部设置环境变量(Emacs可以访问这些变量)取决于您的操作系统。有关环境变量扩展的信息,请参见node。(设置register?a'(文件“~/.emacs”))书签非常有用。有一个问题:我注意到你也可以用register来表示职位。寄存器名是否支持多个字符,例如,我可以使用
crr
,而不是
r
?据我所知,不支持多个字符,但它区分大小写,因此您有很多选择。另一种选择是使用
键和弦
打开文件。但是您需要从melpa安装该软件包。再见,詹姆斯。一个问题:这个函数支持位置而不是文件吗?通常我在一个特定的文件夹中处理多个文件,这样会更加灵活。这就是你想要的吗?还是我误解了。如果你想跳转到目录,我建议你使用神奇的组织模式,还有一个书签系统(我从来没有使用过,但可能很好),我指的是目录。很抱歉给你带来了困惑。我不知道组织模式是否适合R编码,但稍后会尝试一下!尝试创建一个类似“mylinks.org”的文件来启动组织模式。然后添加
[[file+emacs:/Users/name/logs/tasks/l/learn/][learn]]]
org模式应该使其成为一个只显示“learn”的链接。单击时,应该打开它前面的目录。组织模式确实值得花些时间学习。