VimL:捕获`exec`命令的输出,在变量里面是可能的吗?

sen*_*rio 3 vim

我有一些bash脚本,我需要从Vim脚本中检索它们的输出.可能吗?如果有,怎么样?

Ing*_*kat 7

要执行外部命令并在Vim变量中捕获其输出,请使用system():

:let hostname = system('hostname')
Run Code Online (Sandbox Code Playgroud)

通过配置调用该命令'shell'; 只要你的Bash脚本有一个合适的shebang行(#!/bin/bash),一切都应该没问题.

如果您最终想要将输出插入当前缓冲区,您也可以:read !{cmd}直接使用:

:read !hostname
Run Code Online (Sandbox Code Playgroud)


ser*_*gio 5

作为替代方法,请注意该let语句的默认签名是:

let {var} = {expr}
Run Code Online (Sandbox Code Playgroud)

其中右侧必须是一个表达式。这意味着 无法捕获命令let的输出。换句话说,尝试:execute

let {var} = {cmd}
Run Code Online (Sandbox Code Playgroud)

会产生错误。解决方法是使用该redir命令,其语法如下:

redir => {var}
{cmd}
redir end
Run Code Online (Sandbox Code Playgroud)

让我们看看它在实践中是如何运作的。第一次尝试:

let somevar = echo "The current locale settings are: " . v:lang
Run Code Online (Sandbox Code Playgroud)

返回错误E15:无效表达式。现在有:

redir => somevar
echo "The current locale settings are: " . v:lang
redir end 
Run Code Online (Sandbox Code Playgroud)

错误消失并且变量已成功分配,这可以通过打印其值来验证:

echo somevar
Run Code Online (Sandbox Code Playgroud)

与输出:

The current locale settings are: en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)