将“execute”函数的返回值保存到变量vimscript中

Dan*_*dez 1 variables vim shell

在vimscript中,我找不到将execute函数的返回值保存到变量中的方法。

我想做以下事情:

let s = execute(":!echo dani")
echo s
Run Code Online (Sandbox Code Playgroud)

这应该返回: dani

Vim 不接受这一点。在我的设置中(使用 vim-airline 和其他 UI 插件),屏幕会显示所有内容,并在按下按键后恢复正常。

是否可以在 vimscript 中将函数调用的返回值保存到变量中,或者相反地将函数的返回值保存到变量中execute

谢谢 SO

Ing*_*kat 6

execute()是现代的替代品:redir;它确实捕获了执行命令的所有输出。让我们仔细看看:

:let s = execute(":! echo dani") | echo strtrans(s)
^@:! echo dani^M^@dani^M^@
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它抓住了整个命令它的结果。如果您使用 plain :echo,换行符并^@掩盖完整输出(使用 会更好地看到它:echomsg,它对特殊字符的解释较少)。

我认为您真正想要的只是执行的外部命令的输出(此处:)echo。您可以使用system()代替:!

:let s = system('echo dani') | echo strtrans(s)
dani^@
Run Code Online (Sandbox Code Playgroud)

尾随的换行符通常会像这样删除:

:let s = substitute(system('echo dani'), '\n\+$', '', '') | echo strtrans(s)
dani
Run Code Online (Sandbox Code Playgroud)