vim autocmd:基于事件的组命令删除和添加
我正在使用quickfix,并且我已经设置好了它,以便在一个quickfix命令之后立即运行cwindow。此外,我有一个模板文件,我的C++源文件,我想复制在我的新的源文件的开始。这是我的.vimrc:vim autocmd:基于事件的组命令删除和添加,vim,autocmd,vim-quickfix,Vim,Autocmd,Vim Quickfix,我正在使用quickfix,并且我已经设置好了它,以便在一个quickfix命令之后立即运行cwindow。此外,我有一个模板文件,我的C++源文件,我想复制在我的新的源文件的开始。这是我的.vimrc: augroup SourceTemplate autocmd! autocmd bufnewfile *.c,*.cpp,*.hpp,*.h so /home/username/.vim/template.cpp augroup QuickFix autocmd!
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事件由于某种原因被触发,我需要在quickfix中禁用与bufnewfile对应的autocmds。我想出了几个解决办法。但是没有一个像我希望的那样工作
如果我取消上面的注释#2,SourceTemplate组将永远被删除。它的命令甚至不会在新文件上执行。如果我取消注释#1,SourceTemplate命令根本不会被禁用,问题仍然存在
如何实现这一点?根据您的描述,我认为会发生以下情况: 运行
时:不使用生成代码>,第一个错误跳转到。Cp.:帮助:生成
:
您的错误分析似乎已关闭,因此将从编译器输出中选取不存在的文件(,包含在…
中)。这将触发BufNewFile
事件,从而插入模板
补救措施
最简单的解决方法是使用:make代码>,所以没有跳转。检查错误列表时,确保该位置确实存在(否则跳转到错误时将再次获得模板)
您可以定义一个:autocmd QuickFixCmdPost
,从快速修复列表中删除不存在的错误位置(使用getqflist()
/setqflist()
和filereadable()
)
当然,最好的解决方案是调整编译器输出和/或错误解析(cp.:help errorformat
),以便只报告实际的、现有的源代码文件。根据您的描述,我认为会发生以下情况:
运行时:不使用生成代码>,第一个错误跳转到。Cp.:帮助:生成
:
您的错误分析似乎已关闭,因此将从编译器输出中选取不存在的文件(,包含在…
中)。这将触发BufNewFile
事件,从而插入模板
补救措施
最简单的解决方法是使用:make代码>,所以没有跳转。检查错误列表时,确保该位置确实存在(否则跳转到错误时将再次获得模板)
您可以定义一个:autocmd QuickFixCmdPost
,从快速修复列表中删除不存在的错误位置(使用getqflist()
/setqflist()
和filereadable()
)
当然,最好的解决方案是调整编译器输出和/或错误解析(cp.:help errorformat
),以便只报告实际的、现有的源代码文件。谢谢。那很有帮助!我看到这个问题实际上是重复的:顺便问一下,我如何标记重复?谢谢。那很有帮助!我看到这个问题实际上是重复的:顺便问一下,我如何标记重复?可能重复的可能重复的可能重复的
7. If [!] is not given the first error is jumped to.