Os comandos executados a partir do vim não reconhecem aliases de comando bash


96

Eu uso o 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'

Porém 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 aliases de bash a .gitconfig. Isso não é SECO.

Existe uma solução melhor?


Se os aliases estivessem no .gitconfig, então você não precisaria repeti-los nos aliases do Bash, e tudo que usa git os reconheceria, ao invés de apenas o Bash. Portanto, o DRY é admirável, mas também existe o SPOT (Single Point Of Truth), e colocar o seu SPOT no lugar certo significa que é mais fácil ser DRY também.
Jonathan Leffler


Respostas:


113

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

:set shellcmdflag=-ic

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


6
edite seu arquivo .vimrc (vim ~ / .vimrc) e coloque-o em uma linha lá (sem o :)
realizado em

9
Isso é bom, mas estou tendo problemas - se eu ativar o modo interativo (o sinalizador i), posso executar meus comandos de shell com alias sem problemas, mas assim que a execução dos comandos terminar, o vim sai, o que é indesejável. Por exemplo, eu tentei fazer:! Ls com shellcmdflag = -ic: [4] + vi ~ / .vimrc
ashgromnies interrompido

6
@Kevin: não há como obter o comportamento normal do viw com o bash interativo? (execute o comando, espere qualquer tecla, volte ao vim)
Mayeu

7
Para mim, ter o comando em .vimrc leva a suspended (tty output)When i usegit commit
has2k1

27
Dizer ao Vim para sempre usar um shell interativo pode criar problemas. Uma solução melhor é descobrir o que na configuração do bash define aliases e como você pode mover isso para um local que seja carregado mesmo em shells não interativos. Por exemplo, zshell carrega apenas ~/.zshrcpara shells interativos, mas carrega ~/.zshenvpara todos os shells, então movi minha configuração de alias para lá e agora funciona a partir do Vim. Veja man zsh(ou as páginas de manual do seu shell) para mais.
Nathan Long

83

Sei que esta pergunta já foi "respondida" anteriormente, mas tenho um problema com a resposta. O shell não precisa ser definido como interativo no Vim. Consulte este tópico para obter uma resposta alternativa sem precisar sair de um shell interativo.

Se você quiser um shell não interativo (como padrão), mas expansão de aliases bash, coloque suas definições de alias em um arquivo, por exemplo .bash_aliases e habilite 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 de dentro 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 reconhece aliases no modo interativo?


7
A melhor solução de longe. Pessoalmente, eu defino o $BASH_ENVvar no meu .bashrc(antes de qualquer verificação de modo interativo personalizado), para que possa usar todos os meus apelidos em aplicativos.
el.atomo

2
Esta é provavelmente a melhor solução nesta página porque o escopo das mudanças seria limitado ao Vim. Pode-se ir mais longe e let $BASH_ENV="~/.vim/vim_bash", isso seria usado para todas as :!invocações dentro do Vim.
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej

Isso não funciona no shell padrão do macOS 10.15.2, zsh, infelizmente.
Ben Quigley

8

Observe que dependendo de como seus arquivos dot bash estão configurados, você pode querer usar a opção -l em vez da opção -i. Isso iniciará o shell como shell de login.


4
dreftymac escreveu: "Para fazer isso funcionar para mim, foi necessário fazer a opção -lic, caso contrário, o vim retornou 'comando não encontrado'"
dreftymac

8

Eu sei que pode ser uma pergunta antiga, porém nenhuma das respostas acima funcionou para mim como desejado. Então, para aqueles que vieram aqui do Google e para usuários (oh-my-) zsh:

Minha solução para isso foi simplesmente copiar .zshrc para .zshenv - de acordo com http://zsh.sourceforge.net/Intro/intro_3.html :

`.zshenv 'é originado em todas as invocações do shell, a menos que a opção -f seja definida. Ele deve conter comandos para definir o caminho de pesquisa do comando, além de outras variáveis ​​de ambiente importantes. `.zshenv 'não deve conter comandos que produzem saída ou assumem que o shell está anexado a um tty.

Então $ cp ~/.zshrc ~/.zshenvvai fazer a coisa.


Obrigado por isso! Só queria observar que, se você tiver seus aliases de shell em um arquivo, poderá apenas obtê-los em .zshenv. Algo como: . $HOME/.aliases
scifisamurai

2

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


Esta parece ser a melhor solução, mas não está funcionando para mim. Ele ainda diz comando não encontrado
still_dreaming_1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.