Могу ли я использовать cppcheck при выполнении: wq в редакторе Vim для c / c ++ в интерактивном режиме - PullRequest
1 голос
/ 09 августа 2011

Может ли кто-нибудь помочь мне найти решение для моего требования?

Требование - это когда пользователь выходит из vim, должно произойти cppcheck, и если произойдет какое-либо предупреждение или ошибка, то это должно быть предложено пользователю.

Заранее спасибо.

1 Ответ

1 голос
/ 09 августа 2011

Полагаю, вам все равно, будет ли команда выполняться асинхронно, поскольку вы все равно выходите из буфера. Вы можете использовать команду :! для запуска команд оболочки и :read для захвата вывода в новое окно:

function! s:RunShellCommand(cmdline)
    let first = 1
    let words = []
    " Expand and escape cmd arguments.
    " shellescape() should work with '\'
    for part in split(a:cmdline)
        if first
            " skip the cmd. ugly, i know.
            let first = 0
        else
            if part[0] =~ '\v[%#<]'
                let part = expand(part)
            endif
            let part = shellescape(part, 1)
       endif
       call add(words, part)
   endfor
   let expanded_cmdline = join(words)

   " Create the new window
   botright new
   setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
   call setline(1, 'Showing output from cmd:    ' . expanded_cmdline)
   call append(line('$'), substitute(getline(2), '.', '=', 'g'))

   " This is where actual work is getting done :-)
   silent execute '$read !'. expanded_cmdline

   " Uncomment the line below if you want the buffer to be
   " non-modifiable
   " setlocal nomodifiable
   1
endfunction

Затем вы можете определить автокоманду, когда буфер выгружается:

au BufUnload *.cpp s:RunShellCommand('cppcheck %')

или несколько более общая команда, которую вы можете вызвать в любое время:

command! -complete=shellcmd -nargs=+ Shell call s:RunShellCommand(<q-args>)

Теперь, чтобы предотвратить закрытие буфера, вы должны переназначить :wq или :q на функцию, которая будет выполнять вышеупомянутое (плюс, возможно, некоторое подтверждение?), Поскольку после вызова :quit его нельзя отменить .

...