我的c / c ++项目往往有相当直接的目录结构,分隔出src,include,bin等。我也倾向于在最上面的目录中有一个主makefile。当在Emacs中这样工作时,我总是必须发出 M-x cd uppermost-dir ,以便我的编译快捷方式按预期工作。
有没有办法让当前目录与我启动Emacs的目录相同?也就是说,当我打开文件时,我可以阻止Emacs更改它的工作目录吗?
或者,对于典型的工作流程,我是否缺少一些重要的内容,这些目录层次结构在Emacs中是独一无二的?
答案 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等等。
答案 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的方法。