在.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++
不过还是希望只有.h
进c++-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 问题太多了,手机上看了都着急。