从vim执行的命令无法识别bash命令别名

时间:2011-01-10 00:38:50

标签: bash vim alias

我在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。那不是干。

有更好的解决方案吗?

5 个答案:

答案 0 :(得分:103)

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

:set shellcmdflag=-ic

使Vim的:! shell的行为类似于命令提示符。

答案 1 :(得分:72)

我知道这个问题之前已经“回答”了,但我的答案有问题。在Vim中,shell不需要需要设置为交互式。无需退出交互式shell,请参阅此主题以获取备用答案。

  

如果您想要非交互式shell(默认情况下)但扩展bash别名,请将别名定义放在文件中,例如: .bash_aliases并在此文件中明确启用别名扩展:

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

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

let $BASH_ENV = "~/.bash_aliases"

此解决方案由“Jakob”提出。请参阅以下链接了解原件。我在Mac OS X 10.9上进行了测试,它运行得很完美!

vim -- not recognizing aliases when in interactive mode?

答案 2 :(得分:7)

请注意,根据bash dotfiles的配置方式,您可能需要使用-l而不是-i选项。这将以shell身份启动shell。

答案 3 :(得分:4)

我知道这可能是个老问题,但上述答案都没有按照我的意愿对我有用。所以对于那些从谷歌搜索和(哦 - 我 - )zsh用户来到这里的人:

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

  

`.zshenv'来源于shell的所有调用,除非设置了-f选项。它应包含用于设置命令搜索路径的命令以及其他重要的环境变量。 `.zshenv'不应包含产生输出的命令或假设shell附加到tty。

所以$ cp ~/.zshrc ~/.zshenv会做的。

答案 4 :(得分:2)

我觉得设置-i选项感觉不太舒服,因为它有很大的影响,而且我经常从vim使用shell。我所做的是:!bash -c ". ~/.alias; gitlog"