2012-04-10 97 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