1

我正在尝试设置 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)))))
4

1 回答 1

4

是的 - 给你几个选择。

  • 很简单:定义一个文件局部变量。在文件的标题注释中只包含类似

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

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

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

    如果您不想在每个文件中插入注释,或者如果您有无数不同类型的文件和项目正在处理,这很好。

ps:setq我猜你的简单不起作用的原因是你没有在正在编辑的缓冲区中评估它。可能您想将其放入您的个人xxxx-mode-hook-fnxxx 中,其中 xxx 是您正在编辑的文件的模式。

于 2012-04-10T03:23:06.987 回答