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

工欲善其事必先利其器,一個高效的代碼檢查工具會大大提升咱們的開發效率。flycheck是Emacs中經常使用的一個代碼編譯檢查工具,本文記錄配置它的時候遇到的一些問題以及解決方法。html

flycheck的基本原理很簡單,就是在須要作檢查的時候(時機多是你保存了某個文件,或者改文件打開後idle了若干時間),使用編譯工具把你當前的源文件編譯一遍,有問題就顯示在當前buffer中。對於C++代碼,它的作法就是用gcc或者g++把當前源文件編譯一遍。理解了原理,遇到問題後就好解決了。c++

1,錯誤行高亮問題json

我想修改錯誤行的高亮方式,個人作法是直接修改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

我這樣改的目的是將錯誤行的背景修改爲黃色,這樣更醒目一些。spa

 

2,打開cpp文件後,flycheck在include出顯示錯誤,說找不到該頭文件code

上面說了flycheck的工做原理,找不到頭文件,說明flycheck在用gcc編譯源代碼時沒找到頭文件,經過閱讀flycheck.el代碼能夠看出,經過設置變量flycheck-gcc-include-path能指定頭文件路徑,對於一個大型C++項目來講,頭文件可能散落在不少目錄下面,這能夠經過在項目根目錄下面生成一個名叫.dir-locals.el的文件,在它裏面指定gcc編譯的時候的頭文件路徑,就像下面這樣:server

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中htm

 

3,打開cpp文件後,flycheck並無起做用blog

我打開了一個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)))

不過不推薦這麼作。

相關文章
相關標籤/搜索