2

我想覆盖 wq/q/w!/w/q! 到用户定义的命令及其功能。

例子 :

如果我使用 :wq 退出,该命令应该对该特定 c/c++ 文件进行静态代码检查并退出。

在这种情况下请帮助我。

提前致谢。

4

4 回答 4

6

你的问题的内置解决方案在 Vim 中称为“自动命令”。

这是一种在特定时间调用命令的方法,例如打开、保存或关闭缓冲区。

查看:help autocmd完整列表

在您的情况下,您应该添加.vimrc以下命令

autocmd BufWritePre *.cpp,*.hpp !cppcheck %

  • BufWritePre表示“在写入缓冲区之前”(您也可以使用BufWriteor BufWritePost
  • *.cpp,*.hpp表示仅在保存 cpp 或 hpp 文件时才会应用 auto 命令。如果需要,您可以添加 c 和 h 文件。
  • %表示“当前缓冲区的路径”
  • cppcheck必须在你的路上

您没有覆盖“w”的默认行为,而是使用“钩子”添加自定义命令。

于 2011-08-08T12:22:01.273 回答
3

我不会那样做的。它迫使我们(实际上是您)仅在文件真正可编译时才保存——当我们不得不中止当前的编辑时,这是没有意义的,因为我们已经忘记的催促会议即将开始;在这种情况下保存文件是正常的处理方式。

此外,在 a 上运行 cppcheck 的目的是:wq什么?我们如何利用结果?

相反,我会有一个运行 cppcheck 的映射,但是 :make 以利用 vim quickfix 功能 (:h quickfix)

function s:Check()
  try
    let save_makeprg=&makeprg
    set makeprg=cppcheck
    " you may have to specify other files/extensions
    :make *.cpp *.hpp
  finally
    let &makeprg=save_makeprg
  endtry
endfunction
nnoremap <buffer> <c-f7> :call <sid>Check()<cr>
于 2011-08-08T14:48:03.650 回答
0
<block>
function FunForQuickfix(makeprgIn, makeefmIn)
  try
    let save_makeprg=&makeprg
    let save_makeefm=&efm
    let &makeprg=a:makeprgIn
    let &efm=a:makeefmIn
    :wa
    :make
    :cw
  finally
    let &makeprg=save_makeprg
    let &efm=save_makeefm
  endtry
endfunction

function CompileAndRunTestCodeByScons()
  call FunForQuickfix('scons . -j8 -u', '%f:%l:%c:\ %m,%f:%l:\ %m,build/release64/%f:%l:%c:\ %m,build/release64/%f:%l:\ %m,%f\|%l\|,build/release64/%f:%s,%m:%l:Assertion,%sExpression:\ false,scons:\ building\ terminated\ because\ of\ errors,%sError%m')
endfunction
function CppCheck()
  call FunForQuickfix("cppcheck *.cpp -j 8 --enable=all", "\[%f:%l\]:\ %m")
endfunction
nmap ma :wa<CR>:call CompileAndRunTestCodeByScons()<CR>
nmap mc :wa<CR>:call CppCheck()<CR>
nmap <F3> :cp<cr>
nmap <F4> :cn<cr>

</block>

在 ~/.vimrc 中添加这个,然后使用 ma 编译代码和 mc 运行 cppcheck 这个代码是从 Luc Hermitte 复制的,我改变它

于 2013-03-03T16:45:46.327 回答
0

你可能想要一些更好的东西,在 vim 中开发时使用 cppcheck 和其他检查。

安装并使用该 vim 插件:https ://github.com/scrooloose/syntastic

于 2015-06-23T15:45:07.830 回答