使用Vim执行外部命令时别名不生效,例如:
:! ll
我希望它像普通 shell 一样支持别名。
不存在“普通外壳”这样的东西。您有“交互式 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 都可以访问它们。
与 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'
。