2012-04-10 61 views
1

我想设置Emacs,这样当我在菜单中选择“编译..”时,Emacs会在命令行上执行“make filename”。我想是这样的:编译时在Emacs中查找缓冲区文件名

(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

n.b.您应该接受Cheeso的答案,或者发布您自己的解决方案作为答案并接受。 – phils 2012-04-10 05:41:03

回答

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是你正在编辑的文件的模式。

+0

嗯,不知道我喜欢第一个选项,但你是对的:Emacs似乎不是在本地评估表达式。我已经发布了修补程序,这对我来说很有用,它带有一个钩子。 – LazyCat 2012-04-10 03:35:18

+0

刚刚FYY此响应解释了为什么此解决方案的工作原理:http://stackoverflow.com/a/12758033/54848 – elviejo79 2013-01-29 20:20:38