在Vim中捕获shell命令的输出

在Vim中捕获shell命令的输出,vim,Vim,我正在尝试编写一个函数,该函数将接受一个gem名称,并根据Bundler显示的内容在该gem的目录中运行Ctrl-p。现在我被困在如何捕获shell命令的输出上 到目前为止,我已经: function! GemCtrlP(gem_name) execute '!bundle list ' . a:gem_name endfunction 我想保存bundle调用的输出,然后通过管道将其传输到CtrlP。我可以做CtrlP部分,但我不确定如何捕获shell输出 有什么想法吗?可以使用:re

我正在尝试编写一个函数,该函数将接受一个gem名称,并根据Bundler显示的内容在该gem的目录中运行Ctrl-p。现在我被困在如何捕获shell命令的输出上

到目前为止,我已经:

function! GemCtrlP(gem_name)
   execute '!bundle list ' . a:gem_name
endfunction
我想保存
bundle
调用的输出,然后通过管道将其传输到CtrlP。我可以做CtrlP部分,但我不确定如何捕获shell输出


有什么想法吗?

可以使用
:redir
命令捕获任意vim命令。 对于shell命令,通常更容易使用
system()
函数

请在上查看帮助

:h :redir
:h system

帮助中应该有足够的示例(或查看一些插件)。

使用
:redir
命令可以捕获任意vim命令。 对于shell命令,通常更容易使用
system()
函数

请在上查看帮助

:h :redir
:h system

帮助中应该有足够的示例(或查看一些插件)。

Christian发布的内容的更全面版本:

function! GemCtrlP(gem_name)
  let path = system('bundle list ' . a:gem_name . ' | tr -d "\n"')
  execute 'CtrlP ' . path
endfunction

Christian发布的内容的更全面版本:

function! GemCtrlP(gem_name)
  let path = system('bundle list ' . a:gem_name . ' | tr -d "\n"')
  execute 'CtrlP ' . path
endfunction

看起来系统实际上显示了一个空字符或什么:
async_job-7ba2b1e64340^@
。有没有办法把多余的
^@
去掉?我以ag.vim为例,但我似乎无法理解这些可能是二进制空值。最近的VIM被SOH(0x01)取代。您应该能够使用substitute()函数剥离那些只需将其导入tr@576i确实如此,但您并不总是希望将输出放入实际文档中。系统似乎实际显示了空字符或其他内容:
async_job-7ba2b1e64340^@
。有没有办法把多余的
^@
去掉?我以ag.vim为例,但我似乎无法理解这些可能是二进制空值。最近的VIM被SOH(0x01)取代。您应该能够使用substitute()函数剥离那些只需将其导入tr@576i确实如此,但您并不总是希望将输出放入实际文档中。