正确设置打开.h文件进入c++-mode的姿势是怎样的?

.emacs中直接设置(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))能行,但在这种情况下,我在.dir-locals.el中添加的

((nil . ((eval . (add-hook 'c++-mode-hook 
				  (lambda () 
				   (custom-set-variables
					'(company-clang-arguments (quote ("-std=c++11")))
				    '(flycheck-clang-args (quote ("-std=c++11"))))))))
  ))

并不会生效,手动M-x c+,上面的设置会生效。

而如果把其从.emacs中移动到.dir-locals.el中,如下

((nil . ((eval . (add-hook 'c++-mode-hook 
				  (lambda () 
				   (custom-set-variables
					'(company-clang-arguments (quote ("-std=c++11")))
				    '(flycheck-clang-args (quote ("-std=c++11")))))))
         (eval . (add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))))
  ))

并不会进入c++-mode,手动进入,.dir-locals.el会生效。这是怎么回事。。。

还有,这个safe-local-variable-values怎么关掉,这种白名单机制也太那啥了。。。

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

在你的.emacs 加上这一句就可以用 c++-mode打开.h文件了.

BTW,如果你的配置文件只是.emacs我建议你拆开.

在我看来,你的c++11配置应该改成:

(add-hook 'c++-mode-hook (lambda ()
			   (setq company-clang-arguments "-std=c++11")
			   (setq flycheck-clang-args "-std=c++11")
			   ))

(quote ("-std=c++11")) 的意思是取这个list的字面值,即 "-std=c++11"

M-x customize-group里找变量改是这样的,改成你这样和我那样效果没什么不同。

还有,我想要在.dir-locals.el里改成功,我题目上也说了在.emacs里改能行,但要执行那个hook,还得手动来一次。

我想原因可能是emacs先打开了文件再加载的.dir-locals.el

等等,这么一说我应该在emacs里打开文件。。。又试了一下,还是要手动,但参数设置成功了的。

从M-x customize-group里找变量改是这样的,改成你这样和我那样效果没什么不同。

customize-group 是Emacs 生成的,这个是手写的.可读性的不同.

只是我没看懂,为什么要把配置移动到.dir-locals.el,这跟dir-locals.el 有什么关系

不同项目不一样啊,我有的是纯C,有的纯C++,有的是C和C++混合的(这种头文件直接C++)。

估计你想说的是 M-x c++-mode

这时改 auto-mode-alist 太晚了,在 Major Mode 设置完了才会设置 Directory Variable :

你可以把已经设置成 c-mode 的改成 c++-mode

M-x add-dir-local-variable c-mode mode c++

不过还是希望只有.hc++-mode,毕竟有的是C和C++混合的。。。

还有什么问题吗?.h 用什么 Mode 不是已经在由你控制吗?

另外,除了用 Directory/File Local Variable,Emacs 26 中有

("\\.h\\'" . c-or-c++-mode)

所以你也可以写个函数自动选择哪个 Major Mode。

嗯,我知道,不是标注了解决方案吗。。。

那这个是什么意思?

这不是把c-mode改成c++-mode吗,如果项目里同时有.c不就也进c++-mode了?这样就不是很完美,比如C和C++混编,对外提供C接口那种项目。不过这种情况手动切换也没什么,要求有点高了。

1 个赞

噢,再还考虑这种情况的话,如果一定要用 Directory Local Variable 的话,就只能用 eval 改成别的 Major Mode 了。设置 eval 的话,自己个人用没问题,共享的话,会给别人造成风险。

1 个赞

C/C++ 混合的 .h 不是大多数当作 C++ 都应该要能正常渲染吗

要能通过

clang++ -fsyntax-only -x c++-header a.h

c11和c++11是不兼容的(比如_Generic),而且c里面各种指针cast的合法用法,clang默认都要警告,当然-w倒是可以。。。

不过我在你发的cquery的贴子里面提的问题是怎么回事啊。。。

你这个 .dir-locals.el 问题太多了,手机上看了都着急。