我正在尝试设置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)))))
答案 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是你正在编辑的文件的模式。