2011-01-10 207 views
70

我用在Mac bash和別名之一是這樣的命令不認識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

如果別名在.gitconfig中,那麼你不需要在你的Bash別名中重複它們,所有使用git的都會知道它們,而不僅僅是Bash。所以,DRY是令人欽佩的,但也有SPOT(單點的真相),讓你的SPOT在正確的位置意味着它更容易幹。 – 2011-05-29 14:34:11

+0

請參閱:http://stackoverflow.com/a/9014154/1040358 – kikuchiyo 2012-01-28 17:09:30

+0

可能的跨站點重複:http://superuser.com/questions/47821/vim-ignores-aliases – 2014-04-09 21:35:32

回答

89

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

:set shellcmdflag=-ic 

使Vim的:!殼行爲像您的命令提示符。

+0

有沒有一種方法可以告訴vim在vim啓動時執行該命令。謝謝 – 2011-01-10 17:02:30

+2

編輯你的.vimrc文件(vim〜/ .vimrc),並把它放在一行(沒有:) – skeept 2011-01-10 17:25:00

+1

哇,我應該先試過。看起來像是在vim上閱讀一本書的時間。謝謝。 – 2011-01-11 16:21:57

7

請注意,根據您的bash dotfiles的配置方式,您可能需要使用-l而不是-i選項。這將啓動shell作爲登錄shell。

2

我對設置-i選項感覺不太舒服,因爲它有相當的影響,我經常從vim使用shell。我會做什麼,而不是像:!bash -c ". ~/.alias; gitlog"

58

我知道這個問題以前已經「回答」,但我有一個問題的答案。 shell不需要需要在Vim中設置爲交互式。看到這個線程的另一個答案,而不必退出交互式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?

4

我知道這可能是一個老問題,但上述答案的根據需要爲我工作。因此,對於誰來到這裏,從google搜索者和(哦,我的 - )zsh的用戶:

我對這個解決方案是簡單地複印.zshrc到.zshenv - 按http://zsh.sourceforge.net/Intro/intro_3.html

` .zshenv'源於shell的所有調用,除非設置了-f選項。它應該包含設置命令搜索路徑的命令以及其他重要的環境變量。 `。zshenv'不應該包含產生輸出的命令或者假定shell連接到tty。

所以$ cp ~/.zshrc ~/.zshenv會做的事情。