是否可以以比simply calling the shell command on the current buffer更复杂的方式将Cppcheck与Emacs集成?我希望Emacs能够解析Cppcheck的消息并将它们视为来自编译器的消息(类似于compile
的工作方式),例如使用 Cx` 来访问Cppcheck消息的目标
以下是一些示例输出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
答案 0 :(得分:3)
cppcheck --template='{file}:{line}:{severity}:{message}' --quiet <filename>
其中filename是您希望运行cppcheck的文件的名称。这使得cppcheck的输出成为编译缓冲区可以解析的形式,并为您提供了完整的功能,例如g ++编译。 --quiet可能没有必要,但因为我所关心的只是我使用的错误。
答案 1 :(得分:2)
您可以使用Emacs附带的flymake。
基本思想是编写一个运行cppcheck的flymake命令,然后将输出按摩到flymake可以使用的格式。如果您在c++
模式缓冲区中启用了flymake,则会突然显示错误。
This是使用pyflakes
使用我的Python缓冲区的flymake示例。
flymake一般期望以这种形式输出
filename:line_number: class: message
filename
是文件的名称,number
是行号,class
是一个字符串,如error
或warning
,表示类型message message
是一个表示实际错误的字符串。 cppcheck
输出看起来接近于此。您应该编写一个小包装器来将cppcheck
的输出转换为此格式,然后添加一个钩子以打开用于c ++模式的flymake。
使用C,在目标gcc -Wall -o nul -S ${CHK_SOURCES}
下运行Makefile
并check-syntax
添加flymake-mode
之类的内容,这样做是必要的。我认为它对c ++模式来说类似。
有关血腥的详细信息,请查看http://flymake.sourceforge.net/
答案 2 :(得分:2)
是否可以以更复杂的方式将Cppcheck与Emacs集成
是的,有可能。使用flymake。我很惊讶没有人为cppcheck做过这个。
没问题,你可以自己动手。添加cppcheck作为flymake工具的新风格。为此,请按照现有示例进行操作。这不是太复杂,但是冷却,很难知道做什么。 (我从未见过描述如何将新工具集成到flymake中的指南文档)。按照现有的工作示例解决了这个问题。
这是一个7k文件,它将PHP CodeSniffer添加为flymake工具。 http://www.emacswiki.org/emacs/flyphpcs.el
大部分7k是评论......
您应该可以修改它以向flymake添加任意工具。关键步骤是:
将目标文件扩展名(例如:.cpp)与执行flymake内容的一对函数(init和cleanup)相关联。
定义一个生成命令行的函数,每次flymake扫描你的缓冲区。 fn获取支持缓冲区的文件的名称,并生成命令行。在您的情况下,它将使用所有适当的命令行参数运行cppcheck。生成命令行的fn由#1中引用的init fn调用。
定义一个与您的工具生成的错误消息匹配的正则表达式,并将该正则表达式添加到flymake列表中。这允许flymake从您运行的工具的输出中提取错误消息。通过解析输出,flymake可以获取行号并突出显示缓冲区中的虚线。
答案 3 :(得分:1)
基于答案,flymake听起来不错。
你可以编写一个cppcheck解析器,但使用cppcheck --template选项听起来更容易。
cppcheck --template="{file}:{line}:{severity}:{message}" foo.cpp
可能与flymake模式匹配。这只是一个想法。
答案 4 :(得分: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}