vim:运行一个shell(不是make,不是perl,不是......),解析输出,跳转到错误位置

时间:2016-09-16 13:55:09

标签: shell vim vi

在另一个编辑器中,我非常习惯这个工作流程:

  1. 使用通用组合键运行任意shell命令(例如MdIconModulemakeperl -cw script.plrake cucumberrubocop -D -R
  2. 编辑器在子进程中运行命令,输出在编辑器窗口中滚动。使用大量(静态)静态正则表来解析错误位置(./my_fancy_build_script.sh)(即,没有必要事先告诉编辑器输出来自file:numbergcc或其他任何工具)。
  3. 在编译期间(和之后),输出将一直保持到关闭该缓冲区为止。
  4. 我可以按另一个组合键跳转到下一个(或上一个)错误位置。
  5. 我可以在那个缓冲区中手动导航(像往常一样),当我按下Enter时,我就会登陆错误位置。
  6. 到目前为止一切顺利。

    perlvim。它似乎基本上做我想要的。我没有找到如何执行第1步。我知道使用quickfix来运行make,或者如何使用Perl插件来运行Perl脚本,或:make等。我没有找到运行任何旧shell命令的通用命令,而没有使用特定于语言的插件。如果我使用通常的:grep命令,则输出是a)在按键后消失,b)不可用于!

    是否有类似于我在其他编辑器中使用的内容?我如何在quickfix中完成?

    编辑:我尝试了vi然后:set makeprg='$COMMAND',但仅当:make不包含空格时才有效。

    我不想手动将命令的输出重定向到某个文件,并使用$COMMAND打开该文件,如vim -q file文档中所示。

1 个答案:

答案 0 :(得分:2)

Vi没有“quickfix”功能。

如果用“Vi”表示“Vim”,是的,quickfix窗口几乎完全适合第2,3,4,5点。

  
      
  1. 编辑器在子进程中运行命令,输出在编辑器窗口中滚动。使用大量(静态)静态正则表来解析错误位置(文件:数字)(即,没有必要事先告诉编辑器输出来自gcc,perl或其他任何工具)。
  2.   

要编译或运行语法检查程序,您需要使用:make并在每个文件类型的基础上设置makeprg选项(以及可能errorformat):

:set makeprg=foo\ --bar\ -baz
:make

makeprgerrorformat通常由您的文件类型的ftplugin或:compiler命令设置。

对于grepping,如果要使用grep替代方法,则需要使用:grep命令并可能设置grepprggrepformat选项:

:grep foo **/*.c

除了grep,编译器和语法检查程序之外,您可以使用:cexpr:cfile命令填充quickfix列表(和窗口),这些命令与我认为的“通用”quickfix命令最接近的:

:cexpr system("foo")
  
      
  1. 在编译期间(和之后),输出将一直保持到关闭该缓冲区为止。
  2.   

是的,这就是quickfix窗口的工作原理。

  
      
  1. 我可以按另一个组合键跳转到下一个(或上一个)错误位置。
  2.   
:cn
:cp
:cc5

如果需要,您可以创建自定义映射。

  
      
  1. 我可以在那个缓冲区中手动导航(像往常一样),当我按下Enter时,我就会登陆错误位置。
  2.   

是的,这就是你使用quickfix窗口的方式。

quickfix窗口不会自动打开,但您可以使用:cnext:cprevious:cfirst:clast和其他命令跳转到列表中的错误:

:cn
:cn
:cp

要打开quickfix窗口,请使用:cwindow命令:

:cwindow

如果您希望在列出错误/位置时自动打开quickfix窗口,请将这些行添加到vimrc

augroup autoqf
    autocmd!

    " automatically open the location/quickfix window after :make, :grep,
    " :lvimgrep and friends if there are valid locations/errors
    autocmd QuickFixCmdPost [^l]* cwindow
    autocmd QuickFixCmdPost l*    lwindow
augroup END