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)))
不過不推薦這麽做。
Emacs flycheck插件配置中遇到的若幹問題