在Vim中捕获Shell命令的输出

3
我正在尝试编写一个函数,该函数将接受一个宝石名称,并在基于Bundler显示的那个宝石目录中运行Ctrl-P。目前我卡在如何捕获来自shell命令的输出上。
到目前为止,我的代码如下:
function! GemCtrlP(gem_name)
   execute '!bundle list ' . a:gem_name
endfunction

我希望能够保存bundle调用的输出结果,然后将其导入CtrlP。我可以完成CtrlP部分,但不确定如何捕获shell输出。

有什么想法吗?

2个回答

5

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

请参阅帮助文档:

:h :redir
:h system

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


看起来系统实际上显示了一个空字符或其他东西:async_job-7ba2b1e64340^@。有没有办法去掉那个额外的^@?我正在查看ag.vim的示例,但似乎无法弄清楚怎么做。 - Josh Bodah
这些可能是二进制的空值。最近的Vim将其替换为SOH(0x01)。你应该可以使用substitute()函数去除它们。 - Christian Brabandt
能够将其直接传输到管道中 - Josh Bodah
@576i 的确如此,但你并不总是希望将输出直接放入你的实际文档中。 - Christian Brabandt

1
更详细的版本,与Christian发布的内容相关:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接