从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
会做这件事。