我在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。那不是干。
有更好的解决方案吗?
答案 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上进行了测试,它运行得很完美!
答案 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"