我正在使用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命令,问题仍然存在。
我如何实现这一目标?
答案 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
),以便只报告实际的现有源代码文件。