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)))

不過不推薦這么做。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM