工欲善其事必先利其器,一个高效的代码检查工具会大大提高我们的开发效率。flycheck是Emacs中常用的一个代码编译检查工具,本文记录配置它的时候遇到的一些问题以及解决方法。
flycheck的基本原理很简单,就是在需要做检查的时候(时机可能是你保存了某个文件,或者改文件打开后idle了若干时间),使用编译工具把你当前的源文件编译一遍,有问题就显示在当前buffer中。对于C++代码,它的做法就是用gcc或者g++把当前源文件编译一遍。理解了原理,遇到问题后就好解决了。
1,错误行高亮问题
我想修改错误行的高亮方式,我的做法是直接修改flycheck.el源文件,对于C++代码,修改下面的地方就可以:
732(defface flycheck-error 733 '((((supports :underline (:style wave))) 734 :underline (:style wave :color "cyan") 735 :background yellow) // 这一行是我加的 736 (t 737 :underline t :inherit error)) 738 739 "Flycheck face for errors." 740 :package-version '(flycheck . "0.13") 741 :group 'flycheck-faces) 742
我这样改的目的是将错误行的背景修改成黄色,这样更醒目一些。
2,打开cpp文件后,flycheck在include出显示错误,说找不到该头文件
上面说了flycheck的工作原理,找不到头文件,说明flycheck在用gcc编译源代码时没找到头文件,通过阅读flycheck.el代码可以看出,通过设置变量flycheck-gcc-include-path能指定头文件路径,对于一个大型C++项目来说,头文件可能散落在很多目录下面,这可以通过在项目根目录下面生成一个名叫.dir-locals.el的文件,在它里面指定gcc编译的时候的头文件路径,就像下面这样:
1((c++-mode . ((flycheck-gcc-include-path . ( 2 "/usr/include" 3 "/home/cobbliu/thirdparty/gcc-4.9.2/include" 4 "/home/admin/jinxin/project/include" 5 "/home/admin/jinxin/project/chunkserver/include")))))
如果头文件目录非常多,可以通过Bear来生成compile_commands.json,然后对compile_commands.json做一些处理拿出所有的头文件路径写到.dir-locals.el中
3,打开cpp文件后,flycheck并没有起作用
我打开了一个cpp文件,手动写了一行错误的代码,但是flycheck并没有工作,这个时候需要看一些flycheck在编译当前文件的时候具体出了什么错误,详情见http://www.flycheck.org/en/latest/user/troubleshooting.html。简单地说,就是使用M-x flycheck-compile,然后键入c/c++-gcc让flycheck手动编译一次,它的编译信息会在一个单独的Buffer中显示,flycheck没有工作肯定是编译的时候出了什么问题,根据Buffer中显示的问题去逐一解决。
4,.h文件没有被flycheck做检查
.h文件被emacs使用c-mode打开了,可以在.emacs中使用下面的命令让emacs用c++-mode打开.h文件:
add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
5,flycheck-compile发现编译错误太多,比如变量未定义等错误
这主要是因为flycheck在使用gcc编译源文件的时候,加上了-Wall选项,要想关闭改选项,在.emacs中修改变量flycheck-gcc-warnings的值,像下面这样:
(add-hook 'c++-mode-hook (lambda () (setq flycheck-gcc-warnings nil)))
不过不推荐这么做。