1

我正在使用 quickfix 并且我已对其进行了设置,以便在 Quick fix 命令之后立即运行 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 文件的开头有一个 :insert 和一个 '.' 最后,我想在新源文件的开头插入一些文本。如果我只使用其中一个,上面的两个 augroup 工作得很好!

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

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

我如何实现这一目标?

4

1 回答 1

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),以便只报告实际的现有源代码文件。

于 2016-10-31T08:46:49.050 回答