如何通过 shell 命令传递 vim 缓冲区内容并将输出捕获到拆分窗口

mal*_*vim 8 unix bash vim vi command-line

我已经阅读了很多关于从 vim 运行 shell 命令的线程,很多关于 vim 命令的文档,.vimrc 等等,但我似乎无法很好地理解“ex”语言或 vim 映射来完成我的工作想要,所以我在这里问这个问题。开始:

我在 vim 中有一个打开的缓冲区(在 Snow Leopard 上使用最新的稳定 MacVim,但不是在 gui 模式下),我稍后会将其内容输入到命令行工具中,该工具将处理它并给我一些输出。我想要的是能够:

  1. 按一个键(或组合键,或发出 vi 命令)
  2. 运行我的命令行实用程序,并将当前缓冲区的内容(可能未保存到文件中)通过管道传输到其中
  3. 捕获其输出并在 vim 中显示,最好在新的拆分窗口中显示(如 :help 所做的)

所以,总而言之:我可以跑

$ cat ~/myinput.txt | myScript > output.txt
Run Code Online (Sandbox Code Playgroud)

但是我想在 vim 内部做类似的事情,如果可能的话,将输出放在一个新的拆分窗口中。

更新:
当然,在发布后,我发现了有关该主题的更多信息。我现在知道我可以在 vim 中做到这一点:

:%! myScript
Run Code Online (Sandbox Code Playgroud)

它会将 myScript 的输出(缓冲区内容通过管道传送到它)放入我当前的缓冲区,替换我现在拥有的任何内容。

那么有没有办法将这些内容放入一个新的、拆分的窗口、缓冲区?谢谢!

Hep*_*ite 7

我会把这样的东西放在我的 ~/.vimrc 或 ~/.vim/plugin/ 中带有 .vim 扩展名的文件中:

command! FW call FilterToNewWindow('myscript')

function! FilterToNewWindow(script)
    let TempFile = tempname()
    let SaveModified = &modified
    exe 'w ' . TempFile
    let &modified = SaveModified
    exe 'split ' . TempFile
    exe '%! ' . a:script
endfunction
Run Code Online (Sandbox Code Playgroud)

然后你就可以做“ :FW”了。

更改命令定义以要求将过滤器脚本名称参数传递给函数而不是“硬编码”它可能是一个好主意。