我的问题实际上有两个方面:我有一个用于 TeX 处理的用户定义函数,称为texsed
,如下所示:
function texsed () {
sed -i -f $S/tex_rule.sed $1 && pdflatex $2 $1
}
该定义位于 zshrc 文件中~/.zshrc
。现在,每当我which texsed
从 zsh 会话中调用时,我都会得到以下输出。问题是我无法从 vim 获得相同的输出,我尝试通过以下命令获得该输出:
:r !which texsed
:r !zsh -c "which texsed"
两者都不起作用。
我显然不理解内置命令,所以我的问题(天真地)是:
- zsh 内置程序如何
which
工作? - 我如何能够通过这样的外部命令获取通过配置定义的别名或函数的定义?
提前致谢 :)
答案1
当您:!...
在 Vim 中使用时,它通常$SHELL
使用参数-c
和运行...
。这会产生一个非交互式 shell。沙子来自zsh 文档:
然后从 读取命令
$ZDOTDIR/.zshenv
。如果 shell 是登录 shell,则从 读取命令/etc/zprofile
,然后读取命令$ZDOTDIR/.zprofile
。然后,如果 shell 是交互式的,则从/etc/zshrc
和 then读取命令$ZDOTDIR/.zshrc
。最后,如果shell是登录shell,/etc/zlogin
则$ZDOTDIR/.zlogin
读取。
因此, with :!...
,.zshrc
根本就不会被读取,并且该函数也未定义。
作为我在 Vim Stack Exchange 上的相关帖子中建议,有两种方法可以影响调用,:!...
以便您可以定义此函数:
:!
向用于运行命令的shell 添加一个选项shellcmdflag
。从:h :!
:On Unix the command normally runs in a non-interactive shell. If you want an interactive shell to be used (to use aliases) set 'shellcmdflag' to "-ic".
环境变量。现在,如果这是 bash,有一个快速解决方案:
$BASH_ENV
。但对于 zsh 来说,没有简单的等价物。看zsh 有与 BASH_ENV 等效的东西吗?通过设置ZDOTDIR
.但我仍然更喜欢这种方式,因为你可以准确添加在 Vim 中使用时所需的配置:!
。