Emacs:'查找文件'而不更改工作目录

时间:2011-06-16 06:03:24

标签: emacs elisp

我的c / c ++项目往往有相当直接的目录结构,分隔出src,include,bin等。我也倾向于在最上面的目录中有一个主makefile。当在Emacs中这样工作时,我总是必须发出 M-x cd uppermost-dir ,以便我的编译快捷方式按预期工作。

有没有办法让当前目录与我启动Emacs的目录相同?也就是说,当我打开文件时,我可以阻止Emacs更改它的工作目录吗?

或者,对于典型的工作流程,我是否缺少一些重要的内容,这些目录层次结构在Emacs中是独一无二的?

5 个答案:

答案 0 :(得分:7)

一种方法可以做到这一点:

在项目调用.dir-locals.el

的根目录中创建一个文件

只要您在目录或其子目录中打开文件,就会读取此内容。

要备份到根文件夹并运行make作为编译命令,只需将其放在.dir-locals.el文件中。

((nil . ((compile-command . "cd ~/mycode/c/; make"))))

nil是为(nil表示任意)设置局部变量的模式,所以为了只对C ++模式这样做,你可以这样做......

((c++-mode . ((compile-command . "cd ~/mycode/c/; make"))))

显然你可以设置一个包含更多选项的列表,例如为java文件运行ant等等。

emacs manual entry for directory locals

答案 1 :(得分:5)

使用make参数调用--directory以强制它在执行任何操作之前更改为该目录:

make --directory /path/to/your/project

答案 2 :(得分:4)

切换到项目目录( Makefile 所在的位置)并调用compile:

(defun my-compile ()
  (interactive)
  (when-let (default-directory (locate-dominating-file default-directory "Makefile"))
    (call-interactively 'compile)))

答案 3 :(得分:1)

与文件关联的缓冲区关联的当前目录通常是包含该文件的目录。你可以改变它,但它不是你想要做的。

将变量compilation-directory设置为文件局部变量(通常相对于当前文件,例如"../..")或.dir-locals.el

答案 4 :(得分:1)

我曾经M-x compile <RET> cd /path/to/project && make -j8,但现在更喜欢Ben的方法。