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

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

我读过很多关于从 vim 运行 shell 命令的帖子,很多关于 vim 命令、.vimrc 等的文档,但我似乎无法很好地理解“ex”语言或 vim 映射,无法做我想做的事情,所以我在这里问这个问题。如下:

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

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

因此,总而言之:我可以运行

$ cat ~/myinput.txt | myScript > output.txt

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

更新:
当然,发布后不久,我发现了有关该主题的更多信息。我现在知道我可以在 vim 中执行此操作:

:%! myScript

它会将 myScript 的输出(以及通过管道传输到它的缓冲区内容)放入我当前的缓冲区中,替换我现在其中的所有内容。

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

答案1

我会将类似这样的内容放入我的 ~/.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

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

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

答案2

来自@Heptite 的功能更加通用:

function! FilterToNewWindow()
    let TempFile = tempname()
    let SaveModified = &modified
    exe 'w ' . TempFile
    exe '!chmod +x ' . TempFile
    let &modified = SaveModified
    exe ':e ' . TempFile
    exe '%! ' . @%
   exe 'w!'
endfunction

" bash execute contents of current buffer and filter it to a new window
command! FW call FilterToNewWindow()

```

答案3

此命令将完成您想要的一半任务。

map <Leader>r :!%:p<cr>

为了使其正常工作,当前缓冲区必须是带有 shebang 行的可执行文件。

答案4

相关内容