vim autocmd:基于事件的删除和添加组命令
vim autocmd: Event based removal and addition of group commands
我正在使用 quickfix 并且我已将其设置为 cwindow 在 Quick fix 命令后立即变为 运行。另外,我有一个 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 和一个 '.'最后,我想在新源文件的开头插入一些文本。如果我只使用其中一个,上面的两个augroups效果很好!
问题是,每当我 运行 :make 时,quickfix 命令都会像预期的那样在底部打开一个 window,但我也会看到一个新的缓冲区,其中包含我的模板文本它(而不是我正在编辑的文件)。在执行 Ctrl-G 时,显示的文件名是(在一种情况下)"In file included from...",这也是 cwindow 中突出显示的行。因此,bufnewfile 事件由于某种原因被触发,我需要禁用与 bufnewfile 对应的 autocmd,以防出现 quickfix。我能够想到几个解决方案。但是 none 他们的工作方式符合我的要求。
如果我取消上面#2 的注释,SourceTemplate 组将被永久删除。它的命令甚至不会在新文件上执行。如果我取消注释 #1,SourceTemplate 命令根本不会被禁用,问题仍然存在。
如何实现?
根据您的描述,我认为会发生以下情况:
如你运行:make
没有!
,第一个错误跳转到。 CP。 :help :make
:
7. If [!] is not given the first error is jumped to.
您的错误解析似乎已关闭,因此从编译器输出中选取了不存在的文件 (In file included from...
)。这会触发 BufNewFile
事件,因此会插入模板。
补救措施
最简单的解决方案是使用 :make!
,因此没有跳转。在检查错误列表时,确保该位置确实存在(否则当您跳转到错误时您将再次获得模板)。
您可以定义一个 :autocmd QuickFixCmdPost
从 quickfix 列表中删除不存在的错误位置(使用 getqflist()
/ setqflist()
和 filereadable()
)。
当然,最好的解决方案是调整编译器输出 and/or 错误解析 (cp. :help errorformat
),以便仅报告实际的现有源代码文件。
我正在使用 quickfix 并且我已将其设置为 cwindow 在 Quick fix 命令后立即变为 运行。另外,我有一个 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 和一个 '.'最后,我想在新源文件的开头插入一些文本。如果我只使用其中一个,上面的两个augroups效果很好!
问题是,每当我 运行 :make 时,quickfix 命令都会像预期的那样在底部打开一个 window,但我也会看到一个新的缓冲区,其中包含我的模板文本它(而不是我正在编辑的文件)。在执行 Ctrl-G 时,显示的文件名是(在一种情况下)"In file included from...",这也是 cwindow 中突出显示的行。因此,bufnewfile 事件由于某种原因被触发,我需要禁用与 bufnewfile 对应的 autocmd,以防出现 quickfix。我能够想到几个解决方案。但是 none 他们的工作方式符合我的要求。
如果我取消上面#2 的注释,SourceTemplate 组将被永久删除。它的命令甚至不会在新文件上执行。如果我取消注释 #1,SourceTemplate 命令根本不会被禁用,问题仍然存在。
如何实现?
根据您的描述,我认为会发生以下情况:
如你运行:make
没有!
,第一个错误跳转到。 CP。 :help :make
:
7. If [!] is not given the first error is jumped to.
您的错误解析似乎已关闭,因此从编译器输出中选取了不存在的文件 (In file included from...
)。这会触发 BufNewFile
事件,因此会插入模板。
补救措施
最简单的解决方案是使用 :make!
,因此没有跳转。在检查错误列表时,确保该位置确实存在(否则当您跳转到错误时您将再次获得模板)。
您可以定义一个 :autocmd QuickFixCmdPost
从 quickfix 列表中删除不存在的错误位置(使用 getqflist()
/ setqflist()
和 filereadable()
)。
当然,最好的解决方案是调整编译器输出 and/or 错误解析 (cp. :help errorformat
),以便仅报告实际的现有源代码文件。