2010-07-22 136 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

相关问题