使用Vim执行外部命令时别名不生效

问题描述 投票:0回答:2

使用Vim执行外部命令时别名不生效,例如:

:! ll

我希望它像普通 shell 一样支持别名。

shell vim
2个回答
1
投票

不存在“普通外壳”这样的东西。您有“交互式 shell”和“非交互式 shell”,它们的不同之处在于它们在启动时获取的

*rc
文件以及 别名是否扩展 。甚至还有其他类型。

默认情况下,Vim 对 :!

$ man bash
使用
非交互式 shell
,如下所示,以说明非交互式 shell 中的别名:

当 shell 不具有交互性时,别名不会展开,除非使用 shopt 设置 Expand_aliases shell 选项(请参阅下面的 SHELL BUILTIN COMMANDS 下的 shopt 描述)。

现在,你可以尝试使用

shopt
或尝试说服Vim使用带有
:help 'shellcmdflag'
的交互式shell,但这些对我来说听起来不像是解决方案。

IMO,唯一正确的解决方案是将别名转换为实际的 shell 脚本,位于

$PATH
中的某个位置,所有类型的 shell 都可以访问它们。


0
投票

与 romainl 在 他的答案中所写的相反,Vim 自己的

:help :!
建议如下:

在 Unix 上,该命令通常以非交互式方式运行 壳。如果您想使用交互式 shell (使用别名)将“shellcmdflag”设置为“-ic”。

那就是

:set shellcmdflag=-ic

需要注意的是,运行命令后 shell 不会终止,而是提示您输入。您必须

fg
才能返回 Vim。我猜这就是 romainl 放弃它作为解决方案的原因。

FWIW,我不久前写了一个小别名,当我输入

fg
时,无论我是否通过 Vim 的
:shell
:terminal
命令或 Ctrl-Z:

在 shell 中,它都会让我返回 Vim
alias fg="[[ -v VIM ]] && exit || fg"

这也适用于将

:!
设置为“-ic”的
'shellcmdflag'

© www.soinside.com 2019 - 2024. All rights reserved.