Comandos executados a partir do vim não estão reconhecendo aliases de comando bash

Eu uso bash no mac e um dos aliases é assim

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

No entanto, quando eu faço

  :! gitlog 

eu recebo

 /bin/bash: gitlog: command not found 

Eu sei que posso adicionar aliases como este no meu .gitconfig

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

No entanto, não quero adicionar todos os meus apelidos bash ao .gitconfig. Isso não é DRY.

Existe uma solução melhor?

O Bash não carrega seu .bashrc a menos que seja interativo. Usar

 :set shellcmdflag=-ic 

para fazer o Vim:! shell se comporta como seu prompt de comando.

Eu sei que esta questão já foi anteriormente “respondida”, mas eu tenho um problema com a resposta. O shell não precisa ser configurado para interativo no Vim. Veja este tópico para uma resposta alternativa sem ter que sair de um shell interativo.

Se você deseja shell não interativo (como padrão), mas expansão de alias bash, coloque suas definições de alias em um arquivo, por exemplo, .bash_aliases e ative explicitamente a expansão de alias neste arquivo:

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

Em seguida, adicione isso ao seu .vimrc, para que o arquivo de aliases seja realmente lido sempre que você executar um comando shell a partir do vim:

 let $BASH_ENV = "~/.bash_aliases" 

Esta solução foi sugerida por “Jakob”. Veja o link abaixo para o original. Eu testei isso no Mac OS X 10.9 e funcionou perfeitamente!

vim – não reconhecendo aliases quando no modo interativo?

Note que dependendo de como seus arquivos de ponto bash estão configurados você pode querer usar a opção -l ao invés da opção -i. Isto irá lançar o shell como shell de login.

Eu sei que pode ser uma pergunta antiga, mas nenhuma das respostas acima funcionou para mim como desejado. Então, para os que vieram do googling e para os usuários (oh-my-) zsh:

Minha solução para isso foi tão simples quanto copiar .zshrc para .zshenv – como por http://zsh.sourceforge.net/Intro/intro_3.html :

`.zshenv ‘é originado em todas as invocações do shell, a menos que a opção -f esteja configurada. Ele deve conter comandos para definir o caminho de pesquisa do comando, além de outras variables ​​de ambiente importantes. `.zshenv ‘não deve conter comandos que produzam saída ou assuma que o shell está anexado a um tty.

Então $ cp ~/.zshrc ~/.zshenv fará a coisa.

Eu não me sinto muito confortável com a configuração da opção -i, pois ela tem bastante impacto e estou usando a shell frequentemente do vim. O que eu faria em vez disso é algo como :!bash -c ". ~/.alias; gitlog"