Emacs flycheck插件配置中遇到的若干问题

工欲善其事必先利其器,一个高效的代码检查工具会大大提高我们的开发效率。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)))

不过不推荐这么做。

原文地址:https://www.cnblogs.com/cobbliu/p/7468620.html