测试 vimscript

测试 vimscript

我正在开发 vimscript 的测试框架(我知道这是徒劳的;请你逗我开心)。一些 vim 插件会调用 shell(使用函数system()!命令)。我希望测试驱动程序能够捕获这些调用并返回预先准备好的数据。

据我所知,vim 会system()执行 fork 并在子 shell 中运行命令。理论上,应该可以这样做

alias ls="echo one\ntwo\nthree"

这样我们就可以进行如下测试:

:.!ls

并检查输出是否

one
two
three

实际上,vim 似乎会派生出一个不尊重任何临时别名的子 shell。换句话说,它使用用户的 shell(zsh、bash 等)而不是用户的 shell 设置(全局或本地)创建一个新的干净的 shell 环境。

您是否知道在由用户控制某些系统调用的环境中运行 vim 的任何方法?

答案1

非交互式 shell 不会像交互式 shell 那样进行所有初始化。bash有关详细信息,请参阅手册页(或任何您要定位的 shell)的 INVOCATION 部分。

另一方面,bash 会$BASH_ENV在启动非交互式 shell 之前查找名为 in 的脚本并执行它。使用它来为 vim 的 shell 转义设置环境。命令行演示:

% bash -c 'alias'
<no output>
% export BASH_ENV=./special.aliases 
% bash -c 'alias'
this=that

但实际上你可以做得更好:将变量设置SHELL为你选择的程序,也许只是/bin/echo,然后 vim 会调用它而不是启动难以控制的 shell。即使你的命令包含管道或其他 shell 元字符,这也能正常工作,所以我强烈推荐它。(你会得到-cvim 在分叉“shell”时插入的,但我相信你可以处理它)。

相关内容