2013-10-03 5 views
1

я использую следующий сценарий для интеграции cppcheck с GVim:Vim & CppCheck, который errorformat использовать:

" vimcppcheck.vim 
" =================================================================== 
" Code Checking with cppcheck (1) 
" =================================================================== 

function! Cppcheck_1() 
    set makeprg=cppcheck\ --enable=all\ % 
    setlocal errorformat=[%f:%l]:%m 
    let curr_dir = expand('%:h') 
    if curr_dir == '' 
    let curr_dir = '.' 
    endif 
    echo curr_dir 
    execute 'lcd ' . curr_dir 
    execute 'make' 
    execute 'lcd -' 
    exe ":botright cwindow" 
    :copen 
endfunction 


:menu Build.Code\ Checking.cppcheck :cclose<CR>:update<CR>:call Cppcheck_1() <cr> 

Обычно это очень хорошо, но этот сценарий иногда создает проблемы при проверке неправильных указателей с cppcheck, для пример у меня есть следующий код C:

/* test_cppcheck.c */ 
#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int *ptr01; 

    *ptr01 = (int *)malloc((size_t)10 * sizeof(int)); /* FIXME: I intensionally written *ptr01 instead of ptr01 */ 
    if(ptr01==NULL) { 
    fprintf(stderr, "\ndynamic memory allocation failed\n"); 
    exit(EXIT_FAILURE); 
    } 
    free(ptr01); 
    ptr01 = NULL; 
} 

QuickFix список показывает:

|| Checking test_cppcheck.c... 
H:\codes\test_cppcheck.c:11] -> [test_cppcheck.c|12| (warning) Possible null pointer dereference: ptr01 - otherwise it is redundant to check it against null. 
H:\codes\test_cppcheck.c|11| (error) Uninitialized variable: ptr01 
H:\codes\test_cppcheck.c|16| (error) Uninitialized variable: ptr01 
H:\codes\test_cppcheck.c|12| (error) Uninitialized variable: ptr01 
|| Checking usage of global functions.. 
|| (information) Cppcheck cannot find all the include files (use --check-config for details) 

После огромных ошибок vim новый файл '11] -> [test_cppcheck.c] создан в новом буфере при двойном щелчке первой ошибки, ничего не может быть сделано из окна quickfix. Это из-за ошибки, насколько я знаю.

The -> вместо: создавая все проблемы, хотя я знаю, что небольшая настройка этого скрипта исправит эту проблему, , но я устал от этого.

Пожалуйста, попробуйте это первым и предложите мне соответственно. Если кто-нибудь может показать мне дорогу, я заранее благодарю его.

ответ

2

Без оригинального формата ошибки это догадка, но я думаю, что вам нужно добавить альтернативу 'errorformat' определению (это через запятую):

setlocal errorformat=[%f:%l]\ ->\ %m,[%f:%l]:%m 

PS: Вы должны также использовать :setlocal для параметра 'makeprg', чтобы ограничить его и текущим буфером.

+0

спасибо ** очень очень очень **. Это прекрасно работает, это потрясающе и потрясающе. Но я не знаю, как использовать: setlocal для опции makeprg, чтобы ограничить ее текущим буфером, однако я получил свой ответ. Еще раз спасибо. –

+0

Я просто имею в виду, что в вашей функции 'Cppcheck_1()' измените 'set makeprg ...' на 'setlocal makeprg ...'. –

+0

Спасибо, я изменю это. –

0

Спасибо вам, г-н Инго Karkat,

Теперь я использую этот скрипт и его прекрасно работает, как я ожидал.

Это может быть общее решение для всех, кто заинтересован в интеграции cppcheck с vim.

Конечно, этот скрипт можно улучшить. Но это их отправная точка.

" vimcppcheck.vim 
" =================================================================== 
" Code Checking with cppcheck (1) 
" Thanks to Mr. Ingo Karkat 
" http://stackoverflow.com/questions/19157270/vim-cppcheck-which-errorformat-to-use 
" =================================================================== 

function! Cppcheck_1() 
    setlocal makeprg=cppcheck\ --enable=all\ % 
    " earlier it was: " setlocal errorformat=[%f:%l]:%m 
    " fixed by an advise by Mr. Ingo Karkat 
    setlocal errorformat+=[%f:%l]\ ->\ %m,[%f:%l]:%m 
    let curr_dir = expand('%:h') 
    if curr_dir == '' 
    let curr_dir = '.' 
    endif 
    echo curr_dir 
    execute 'lcd ' . curr_dir 
    execute 'make' 
    execute 'lcd -' 
    exe ":botright cwindow" 
    :copen 
endfunction 


:menu Build.Code\ Checking.cppcheck :cclose<CR>:update<CR>:call Cppcheck_1() <cr> 
Смежные вопросы