我正在开发 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 元字符,这也能正常工作,所以我强烈推荐它。(你会得到-c
vim 在分叉“shell”时插入的,但我相信你可以处理它)。