vim autocmd:基于事件的删除和添加组命令

时间:2016-10-31 07:50:43

标签: vim autocmd vim-quickfix

我正在使用quickfix,我已将其设置为在快速修复命令后立即运行cwindow。另外,我有一个我的C ++源文件的模板文件,我希望在我的新源文件的开头复制它。这是我的.vimrc:

augroup SourceTemplate
    autocmd!
    autocmd bufnewfile *.c,*.cpp,*.hpp,*.h so /home/username/.vim/template.cpp
augroup QuickFix
    autocmd!
   " #1 autocmd QuickFixCmdPre * augroup! SourceTemplate
   " #2 autocmd! SourceTemplate bufnewfile
    autocmd QuickFixCmdPost [^l]* nested cwindow
    autocmd QuickFixCmdPost    l* nested lwindow
augroup END 

我的template.cpp文件在开头有一个:插入,'。'最后,我想在新的源文件的开头插入一些文本。如果我只使用其中一个,那么上面的两个组合就会很好用!

问题是,每当我运行:make时,quickfix命令会在底部打开一个窗口,正如预期的那样,但我也会看到一个带有模板文本的新缓冲区(而不是我正在编辑的文件) 。在执行Ctrl-G时,显示的文件名是(在一种情况下)"在..."中包含的文件中,这也是cwindow中突出显示的行。因此,bufnewfile事件由于某种原因被触发,我需要在quickfix的情况下禁用对应于bufnewfile的autocmds。我能够想到几个解决方案。但是它们都没有按照我的要求工作。

如果我取消注释上面的#2,则会永久删除SourceTemplate组。它的命令甚至不在新的新文件上执行。如果我取消注释#1,则根本不会禁用SourceTemplate命令,问题仍然存在。

我如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

根据您的描述,我认为会发生以下情况:

在没有:make的情况下运行!时,会跳转到第一个错误。 CP。 :help :make

      7. If [!] is not given the first error is jumped to.

您的错误解析似乎已关闭,因此从编译器输出中选择了不存在的文件(In file included from...)。这会触发BufNewFile事件,从而触发模板。

疗法

最简单的解决方案是使用:make!,因此没有跳转。在检查错误列表时,请确保该位置确实存在(否则当您跳转到错误时,您将再次获取该模板)。

您可以定义:autocmd QuickFixCmdPost,从动态修补程序列表中删除不存在的错误位置(使用getqflist() / setqflist()filereadable())。

当然,最好的解决方案是调整编译器输出和/或错误解析(cp。:help errorformat),以便只报告实际的现有源代码文件。