【问题标题】:Emacs: 'Find file' without changing working directoryEmacs:“查找文件”而不更改工作目录
【发布时间】:2011-06-16 06:03:23
【问题描述】:

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

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

另外,在 Emacs 中具有像这样的目录层次结构的典型工作流程中,我是否缺少一些重要的东西?

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

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

    在你的项目的根目录下创建一个文件调用.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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这也有效,但比上面贾斯汀描述的 .dir-locals.el 解决方案稍微多一点工作。谢谢!
      • 它没有太大区别,但你可以将两者结合起来...... ((nil . ((compile-command . "make --directory ~/mycode/c/")))) 。 ..但我没有测试这个
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2021-10-11
            • 2011-03-25
            • 2017-03-30
            • 2016-09-14
            • 1970-01-01
            • 2010-11-12
            • 1970-01-01
            相关资源
            最近更新 更多