![如何通过 shell 命令传递 vim 缓冲区内容并将输出捕获到分割窗口](https://linux22.com/image/1271312/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20shell%20%E5%91%BD%E4%BB%A4%E4%BC%A0%E9%80%92%20vim%20%E7%BC%93%E5%86%B2%E5%8C%BA%E5%86%85%E5%AE%B9%E5%B9%B6%E5%B0%86%E8%BE%93%E5%87%BA%E6%8D%95%E8%8E%B7%E5%88%B0%E5%88%86%E5%89%B2%E7%AA%97%E5%8F%A3.png)
我读过很多关于从 vim 运行 shell 命令的帖子,很多关于 vim 命令、.vimrc 等的文档,但我似乎无法很好地理解“ex”语言或 vim 映射,无法做我想做的事情,所以我在这里问这个问题。如下:
我在 vim 中打开了一个缓冲区(使用 Snow Leopard 上最新的稳定版 MacVim,但不在 gui 模式下),稍后我会将其内容输入到命令行工具中,该工具将对其进行处理并提供一些输出。我想要的是能够:
- 按下一个键(或组合键,或发出 vi 命令)
- 运行我的命令行实用程序,并将当前缓冲区的内容(可能未保存到文件中)传输到其中
- 捕获其输出并在 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 行的可执行文件。