1. 程式人生 > >Emacs flycheck插件配置中遇到的若幹問題

Emacs flycheck插件配置中遇到的若幹問題

add err user 如果 解決 ror buffer 編譯錯誤 生成

工欲善其事必先利其器,一個高效的代碼檢查工具會大大提高我們的開發效率。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)))

不過不推薦這麽做。

Emacs flycheck插件配置中遇到的若幹問題