从vim执行的命令不识别bash命令别名

我在Mac上使用bash,其中一个别名是这样的

alias gitlog='git --no-pager log -n 20 --pretty=format:%h%x09%an%x09%ad%x09%s --date=short --no-merges' 

但是,当我这样做

  :! gitlog 

我明白了

 /bin/bash: gitlog: command not found 

我知道我可以在我的.gitconfig中添加这样的别名

 [alias] co = checkout st = status ci = commit br = branch df = diff 

不过,我不想将所有的bash别名添加到.gitconfig。 那不是干的。

有更好的解决scheme吗?

Bash不加载你的.bashrc,除非它是交互式的。 使用

 :set shellcmdflag=-ic 

做Vim的:! shell的行为就像你的命令提示符。

我知道这个问题以前已经“回答”了,但是我的答案有问题。 在Vim中,shell不需要设置为交互式。 看到这个线程的另一个答案,而不必退出交互式shell。

如果你想要非交互式的shell(默认),但扩展bash别名,把你的别名定义在一个文件,例如.bash_aliases,并显式启用别名扩展在这个文件中:

 shopt -s expand_aliases alias la='ls -la' 

然后将其添加到.vimrc中,以便每次在vim中运行shell命令时都会读取别名文件:

 let $BASH_ENV = "~/.bash_aliases" 

这个解决scheme是由“Jakob”提出的。 请参阅下面的链接的原始。 我在Mac OS X 10.9上进行了testing,效果非常好!

vim – 在交互模式下不能识别别名?

请注意,根据您的bash dotfiles的configuration方式,您可能需要使用-l而不是-i选项。 这将作为loginshell启动shell。

我不太喜欢设置-i选项,因为它有相当的影响,我经常从vim使用shell。 我会做的是这样的:!bash -c ". ~/.alias; gitlog"

我知道这可能是一个古老的问题,但是没有任何上述的答案为我所需要的。 因此,对于来自Google使用Google和(oh-my-)zsh用户的人来说:

我的解决scheme就像将.zshrc复制到.zshenv一样简单 – 按照http://zsh.sourceforge.net/Intro/intro_3.html

`.zshenv'源于shell的所有调用,除非设置了-f选项。 它应该包含设置命令searchpath的命令,以及其他重要的环境variables。 `.zshenv'不应该包含产生输出的命令,或者假定shell连接到tty。

所以$ cp ~/.zshrc ~/.zshenv会做这件事。