编译时在Emacs中查找缓冲区文件名

时间:2012-04-10 03:06:27

标签: emacs

我正在尝试设置Emacs,以便在菜单中选择“Compile ..”时,Emacs在命令行上执行“make filename”。我正在尝试类似的事情:

(setq compile-command (concat "make " (file-name-sans-extension
                                       buffer-file-name)))

但它不起作用 - 看起来Emacs正在寻找*scratch*缓冲区的文件名,但没有缓冲区。有谁知道如何解决这个问题?

感谢。

更新:正如Cheeso所建议的,一个钩子修复了这个问题。这是一个适合我的版本:

(defun cur-file ()
  (file-name-sans-extension
   (file-name-nondirectory (buffer-file-name (current-buffer)))))

(add-hook 'c++-mode-hook
          (lambda()
            (set (make-local-variable 'compile-command)
                 (concat "make " (cur-file)))))

1 个答案:

答案 0 :(得分:3)

是的 - 有两种选择。

  • 简单:定义file-local variable。在您的文件的标题注释中只包含类似

    的内容
     // -*- compile-command: "gcc -Wall -O3 -o f file.c" -*-
    

    有关详细信息,请参阅: https://stackoverflow.com/a/4540977/48082

  • 更详细 - 有一个名为smarter-compile.el的模块可用on the marmalade repo。它允许您定义一些规则来猜测用于特定缓冲区的compile-command。比如,如果有makefile,请使用MAKE;否则,如果文件是.c文件,请使用gcc;等

    如果您不想在每个文件中插入注释,或者您有大量不同类型的文件和项目,那么这很好。

ps:我猜,你的简单setq无效的原因是你没有在正在编辑的缓冲区中对它进行评估。可能你想把它放到你的个人xxxx-mode-hook-fn中,其中xxx是你正在编辑的文件的模式。