如何设置 vim :sh 命令产生的 shell 的环境变量

How to set environment variables of the shell resulting from the vim :sh command

我经常在Vim中使用:sh去shell执行一些操作,然后我$ exit到return回到我的Vim 会话。问题是,有时我回到一个选项卡,我忘记了我是否退出了 Vim 会话,如果我猜错了,输入 $ exit 将关闭选项卡或 SSH 连接,我'我不在 Vim 的子 shell 中。我希望能够在使用 :sh 从 Vim 打开子 shell 时设置 shell 的一些特殊环境变量。有办法吗?

我在想 :sh ENVVAR="vim is open!" 如果设置了变量,我可以在我的 PS1 中显示 ENVVAR,但这似乎不起作用。

您可以使用let设置环境变量。只需在变量名称前加上 $.

:let $ENVVAR = 'vim is open!'
:sh
$ echo $ENVAR
vim is open!

参见:help :let-environment。当然,你可以把 let 命令放在你的 vimrc 中。此外,vim 自己设置了一些环境变量,您也可以从 shell:

中查询
:sh
$ env | grep VIM
VIMRUNTIME=/usr/share/vim/vim81
VIM=/usr/share/vim
MYVIMRC=/home/user/.vimrc

假设您 运行 在 Linux 或 macOS(或相当相似的东西)上,您可以通过这样做来获取父进程名称:

ps -p $PPID -o comm=

因此您可以像这样向 shell 配置中添加一些内容:

IN_VIM=$(ps -p $PPID -o comm= | grep -qsE '[gm]?vim' && echo 1)

然后根据$IN_VIM是否非空做一些事情。