2010-07-22 132 views

回答

61

試試這個:

(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode)) 

每當你打開.h文件,C++ - 模式將被使用。

+0

它工作。非常感謝。 – kujawk 2010-07-22 19:01:40

3

我可以發誓我看到這個問題已經適當地回答了嗎?奇怪的。

你想這樣的:

(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode)) 
+0

你做了...作者刪除了它。 – 2010-07-26 20:17:25

19

如果你不希望這適用於所有.h文件中,你可以添加以下到你的C++頭文件的底部。

// Local Variables: 
// mode: c++ 
// End: 

這適用於任何想要在每個文件基礎上設置的Emacs變量。 Emacs忽略前導字符,因此使用適合文件類型的任何註釋字符。

+0

謝謝,沒有意識到你可以用emacs做到這一點。 – kujawk 2010-08-04 17:05:11

+0

不知道曾經在有史以來的文件。這可能非常有用。謝謝:) – 2015-08-25 08:11:50

16

由於我使用C和C定期++,我寫了這個功能,試圖「猜測」 .h文件是否打算爲C或C++

;; function decides whether .h file is C or C++ header, sets C++ by 
;; default because there's more chance of there being a .h without a 
;; .cc than a .h without a .c (ie. for C++ template files) 
(defun c-c++-header() 
    "sets either c-mode or c++-mode, whichever is appropriate for 
header" 
    (interactive) 
    (let ((c-file (concat (substring (buffer-file-name) 0 -1) "c"))) 
    (if (file-exists-p c-file) 
     (c-mode) 
     (c++-mode)))) 
(add-to-list 'auto-mode-alist '("\\.h\\'" . c-c++-header)) 

如果不工作,我設置一鍵C和C++切換模式

;; and if that doesn't work, a function to toggle between c-mode and 
;; c++-mode 
(defun c-c++-toggle() 
    "toggles between c-mode and c++-mode" 
    (interactive) 
    (cond ((string= major-mode "c-mode") 
     (c++-mode)) 
     ((string= major-mode "c++-mode") 
     (c-mode)))) 

它不是完美的,頭是C或C++,但它爲我的作品有可能是決定一個更好的啓發。

+0

更好的解決方案可能是在文件中編碼模式(請參閱我的答案),然後定義用於向文件添加適當行的鍵。唯一的缺點是不使用emacs的人也會看到這一點,但是由於它位於文件的底部,所以它不應該成爲一個問題。 – KeithB 2010-07-30 18:42:34

+1

這對您自己的項目來說很好,但我的解決方案主要是爲了處理其他人的項目。您可以在第三方項目中將您的本地變量「讀取」到頭尾,但這太費事了。 – Borbus 2010-08-03 18:47:12

+0

我其實很喜歡這個解決方案,它可以很容易地在不修改任何源文件的情況下自定義行爲。例如,在我的版本中,我使用'(string-match「llvm」(buffer-file-name))'來確定.h文件是否爲C++(llvm是一個C++項目)。 – zdav 2014-10-02 13:21:15

32

適當使用c模式和C++模式的另一種方法是使用directory local variables來設置模式。該模式已設定後

目錄變量進行評估,所以實際上你可以寫一個.dir-locals.el文件包含這你的C++項目:

((c-mode . ((mode . c++)))) 

和Emacs將模式更改爲c++-mode每當它最初將其設置爲c-mode

如果您使用C和C++項目混合工作,這將爲每個項目提供一個相當簡單的解決方案。當然,如果大多數項目都是C++,那麼可以將C++模式設置爲默認值,然後您可以在相反的情況下使用此方法切換到c模式。


normal-mode電話(set-auto-mode)並依次(hack-local-variables)。另請參見:How can I access directory-local variables in my major mode hooks?

要做到這一點,添加

(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode)) 

.emacs文件,該文件默認打開C++模式.h文件。

+3

這是最有用的答案。另外,請注意'mode'是文件局部變量列表中的一種特殊形式,並且僅在此處記錄(http://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables的.html)。 – scry 2015-03-17 02:48:56

+0

我已經添加了腳註(2),所以你的答案是自給自足的,不依賴於其他人。現在,它應該是被接受的答案。謝謝。 – YSC 2017-04-04 08:50:27

+0

該解決方案使C++模式也可用於.glsl文件。有什麼辦法可以強制使用glsl-mode嗎? – jco 2017-05-08 08:30:43

17

顯然,你也可以把這個在文件的頂部:

// -*-c++-*- 

告訴Emacs的是一個C++文件。

我使用這個,因爲我經常以一個vanilla Emacs結束,它沒有以任何方式配置Emacs。

+1

或者也可以這樣:'// - * - mode:C++ - * - '。您還可以在其中添加其他變量,如' - * - coding:utf-8;模式:python;標籤寬度:4; - * - ' – donkopotamus 2016-03-08 23:29:02

相關問題