2012-06-29 3 views
2

Возможно ли интегрировать Cppcheck с Emacs более сложным способом, чем simply calling the shell command on the current buffer? Я бы хотел, чтобы 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. Если вы затем включите flymake в буферах режима c++, вы получите подсветку с ошибкой.

This является примером flymake, работающего с моими буферами Python с использованием pyflakes.

flymake в целом ожидает, что выход в такой форме filename:line_number: class: message

Где filename это имя файла, number номер строки, class представляет собой строку, как error или warning, указывающий тип сообщения и 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 вещи.

  2. Определите функцию для создания командной строки, каждый раз, когда flymake сканирует ваш буфер.Ths fn получает имя файла, поддерживающего буфер, и создает командную строку. В вашем случае он будет запускать cppcheck со всеми соответствующими параметрами командной строки. Fn, который генерирует командную строку, вызывается init fn, указанным в # 1.

  3. определить регулярное выражение, соответствующее сообщениям об ошибках, сгенерированным вашим инструментом, и добавить это регулярное выражение в список flymake. Это позволяет flymake извлекать сообщения об ошибках из вывода запускаемого инструмента. Разбрав вывод, flymake может получить номера строк и выделить пунктирные линии в вашем буфере.

1

Основываясь на ответах, flymake звучит хорошо.

вы можете написать парсер cppcheck, но проще использовать параметр cppcheck --template.

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

может соответствовать шаблону flymake. Это просто идея.

3

Хммм ... Я думаю, что это действительно просто на самом деле. Просто используйте «компилировать», как и в M-х компилировать и типа как команды компиляции:

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

Если имя файла является имя файла, на котором вы хотите запустить cppcheck. Это выводит вывод cppcheck в форму, которую может обрабатывать буфер , и дает вам полную функциональность, с которой вы получаете, например, компиляцию g ++. . -quiet, вероятно, не нужен, но поскольку все, о чем я забочусь, это ошибки, которые я использую.

+1

Эта строка шаблона практически не отличается от [ответа, полученного несколько месяцев назад] (http://stackoverflow.com/a/11350979/789593). Чтобы отличить ваш ответ, вы можете включить информацию о том, как избежать необходимости вводить такую ​​длинную команду, например. как эффективно включить его в файл make или как заставить команду запускать его в текущем буфере. –

0

Самый быстрый способ, вероятно, использовать flymake и добавить дополнительную цель в ваш файл.

Эта установка работает для меня:

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

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

Я получаю «cc1plus: error: output filename, указанный дважды», когда я использую ваш Makefile. – jcoffland

Смежные вопросы