2012-06-29 32 views
2

是否有可能以比simply calling the shell command on the current buffer更復雜的方式整合Cppcheck和Emacs?我希望Emacs能夠解析Cppcheck的消息,並將它們視爲來自編譯器的消息(類似於compile的工作方式),例如使用C-x`訪問Cppcheck消息的目標。將Cppcheck與Emacs集成

下面是一些例子輸出Cppcheck:

$ cppcheck --enable=all test.cpp 
Checking test.cpp... 
[test.cpp:4]: (error) Possible null pointer dereference: p - otherwise it is redundant to check if p is null at line 5 
[test.cpp:38]: (style) The scope of the variable 'i' can be reduced 
[test.cpp:38]: (style) Variable 'i' is assigned a value that is never used 
[test.cpp:23]: (error) Possible null pointer dereference: p 
[test.cpp:33]: (error) Possible null pointer dereference: p 
Checking usage of global functions.. 
[test.cpp:36]: (style) The function 'f' is never used 
[test.cpp:1]: (style) The function 'f1' is never used 
[test.cpp:9]: (style) The function 'f2' is never used 
[test.cpp:26]: (style) The function 'f3' is never used 

回答

2

您可以使用flymake附帶的Emacs的。

其基本思想是編寫一個flymake命令,該命令運行cppcheck,然後將輸出轉換爲flymake可以使用的格式。如果您在c++模式緩衝區中啓用flymake,則會突然出現錯誤突出顯示。

This是flymake使用我的Python緩衝區使用pyflakes的一個示例。

flymake一般期望以這種形式 filename:line_number: class: message

哪裏filename輸出是該文件的名稱,number是行號,class就像errorwarning一個字符串指示消息和message的類型是一個指示實際錯誤的字符串。 cppcheck輸出看起來接近於此。你可能應該寫一個小包裝將cppcheck的輸出轉換爲這種格式,然後添加一個鉤子來打開flymake進行C++模式。

隨着C的增加,像gcc -Wall -o nul -S ${CHK_SOURCES}Makefile的目標check-syntax和運行flymake-mode什麼是必要的。我認爲它對於C++模式會很相似。

對於血淋淋的細節,你應該看看http://flymake.sourceforge.net/

+0

感謝。聽起來像一個合理的方法。有沒有可能以這種方式獲得幫助設置flymake? –

+1

建議是免費的,但幫助很難得到呃? :)如果你能告訴我cppcheck的輸出是什麼樣的,我可能會提供一些幫助。 –

+0

是的。我已經添加了一些示例輸出到我的問題。 –

2

Is it possible to integrate Cppcheck with Emacs in a more sophisticated way

是的,這是可能的。使用flymake。我很驚訝沒有人爲cppcheck做過這件事。

沒問題,你可以自己動手。添加cppcheck作爲flymake工具的新口味。爲此,請按照現有示例進行操作。這不是太複雜,但很難知道怎麼辦。 (我從來沒有見過描述如何將新工具集成到flymake的指南文檔)。現有的工作示例解決了這個問題。

這是一個7k的文件,它添加了PHP CodeSniffer作爲flymake工具。 http://www.emacswiki.org/emacs/flyphpcs.el

大部分7K的是評論...

你應該能夠修改添加到flymake任意工具。關鍵的步驟是:

  1. 協理目標文件的擴展名(例如:的.cpp)用的一對做你flymake東西函數(init和清理)。

  2. 定義了一個函數來生成命令行,每次flymake都會掃描你的緩衝區。該fn獲取支持緩衝區的文件的名稱,並生成命令行。在你的情況下,它將使用所有適當的命令行參數運行cppcheck。生成命令行的fn由#1中引用的init fn調用。

  3. 定義一個匹配您的工具生成的錯誤消息的正則表達式,並將該正則表達式添加到flymake列表中。這允許flymake從您運行的工具的輸出中提取錯誤消息。通過解析輸出,flymake可以獲取行號並突出顯示緩衝區中的折線。

1

根據答案,flymake聽起來不錯。

您可以編寫一個cppcheck解析器,但聽起來更容易使用cppcheck --template選項。

cppcheck --template="{file}:{line}:{severity}:{message}" foo.cpp 

可能匹配flymake模式。這只是一個想法。

3

嗯......我覺得這其實很簡單。只要使用「編譯」,如M-X編譯,和類型的編譯命令:

cppcheck --template='{file}:{line}:{severity}:{message}' --quiet <filename> 

當文件名是指您想運行cppcheck文件的名稱。這使得cppcheck的輸出成爲緩衝區可以解析的形式,併爲您提供完整的功能,例如g ++編譯。 --quiet可能不是必需的,但因爲我所關心的都是我使用的錯誤。

+1

該模板行與[幾個月前給出的答案]幾乎沒有區別(http://stackoverflow.com/a/11350979/789593)。爲了區分您的答案,您可能希望包含有關如何避免輸入如此長的命令的信息,例如如何將其有效地整合到make文件中或如何使命令在當前緩衝區上運行它。 –

0

最快的方法可能是使用flymake併爲makefile添加額外的目標。

這個設置是爲我工作:

check-syntax: cppcheck 
    g++ -o nul -S ${CHK_SOURCES} $(CFLAGS) 

cppcheck: 
    cppcheck --enable=all --quiet --template={file}:{line}:{severity}:{message} ${CHK_SOURCES} 
+0

當我使用Makefile時,得到「cc1plus:error:output filename specified twice」。 – jcoffland