Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vim autocmd:基于事件的组命令删除和添加_Vim_Autocmd_Vim Quickfix - Fatal编程技术网

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

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!

我正在使用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文件的开头有一个: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.