I comandi eseguiti da vim non riconoscono gli alias dei comandi bash


97

Uso bash su Mac e uno degli alias è così

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

Tuttavia quando lo faccio

 :! gitlog

ottengo

/bin/bash: gitlog: command not found 

So di poter aggiungere alias come questo nel mio .gitconfig

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

Tuttavia non voglio aggiungere tutti i miei alias bash a .gitconfig. Quello non è SECCO.

C'è una soluzione migliore?


Se gli alias fossero nel .gitconfig, non avresti bisogno di ripeterli nei tuoi alias Bash e tutto ciò che usa git li riconoscerebbe, piuttosto che solo Bash. Quindi, DRY è ammirevole, ma c'è anche SPOT (Single Point Of Truth), e mettere il tuo SPOT nel posto giusto significa che è anche più facile essere DRY.
Jonathan Leffler


Risposte:


114

Bash non carica il tuo .bashrc a meno che non sia interattivo. Uso

:set shellcmdflag=-ic

per fare in modo che la :!shell di Vim si comporti come il prompt dei comandi.


6
modifica il tuo file .vimrc (vim ~ / .vimrc) e mettilo in una riga lì (senza :)
skeept

9
Questo va bene ma ho problemi - se abilito la modalità interattiva (il flag i), allora posso eseguire bene i miei comandi di shell con alias, ma non appena i comandi vengono eseguiti, vim esce, il che è indesiderabile. Ad esempio, ho provato a fare:! Ls con shellcmdflag = -ic: [4] + Fermato vi ~ / .vimrc
ashgromnies

6
@ Kevin: non c'è modo di ottenere il normale comportamento di viw con la bash interattiva? (esegui il comando, attendi qualsiasi tasto, torna a vim)
Mayeu

7
Per me, avere il comando in .vimrc porta a suspended (tty output)Quando usogit commit
has2k1

27
Dire a Vim di usare sempre una shell interattiva può creare problemi. Una soluzione migliore è capire cosa nella tua configurazione bash imposta gli alias e come puoi spostarli in un posto che viene caricato anche in shell non interattive. Ad esempio, zshell si carica solo ~/.zshrcper le shell interattive, ma carica ~/.zshenvper tutte le shell, quindi ho spostato lì la mia configurazione alias e ora funziona da Vim. Vedi man zsh(o le pagine man della tua shell) per ulteriori informazioni.
Nathan Long

83

So che questa domanda è già stata precedentemente "risolta", ma ho un problema con la risposta. La shell non ha bisogno di essere impostata su interattiva in Vim. Vedi questo thread per una risposta alternativa senza dover uscire da una shell interattiva.

Se vuoi una shell non interattiva (come impostazione predefinita) ma l'espansione degli alias bash, metti le definizioni degli alias in un file, ad esempio .bash_aliases e abilita esplicitamente l'espansione degli alias in questo file:

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

Quindi aggiungilo al tuo .vimrc in modo che il file alias venga effettivamente letto ogni volta che esegui un comando di shell da vim:

let $BASH_ENV = "~/.bash_aliases"

Questa soluzione è stata suggerita da "Jakob". Vedere il collegamento sottostante per l'originale. L'ho provato su Mac OS X 10.9 e ha funzionato perfettamente!

vim - non riconosce gli alias in modalità interattiva?


7
La migliore soluzione in assoluto. Personalmente, ho impostato la $BASH_ENVvar nel mio .bashrc(prima di qualsiasi controllo della modalità interattiva personalizzata), in modo da poter utilizzare tutti i miei alias attraverso le applicazioni.
el.atomo

2
Questa è probabilmente la soluzione migliore in questa pagina perché l'ambito delle modifiche sarebbe limitato a Vim. Si potrebbe anche andare oltre e let $BASH_ENV="~/.vim/vim_bash", e questo verrebbe utilizzato per tutte le :!invocazioni all'interno di Vim.
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej

Questo non funziona nella shell predefinita di macOS 10.15.2, zsh, sfortunatamente.
Ben Quigley il

8

Nota che a seconda di come sono configurati i tuoi dotfile bash potresti voler usare l'opzione -l piuttosto che -i. Questo avvierà la shell come shell di login.


4
dreftymac ha scritto: "Per fare in modo che funzionasse per me, era necessario fare l'opzione -lic, altrimenti vim ha restituito 'comando non trovato'"
dreftymac

8

So che potrebbe essere una vecchia domanda, tuttavia nessuna delle risposte precedenti ha funzionato come desiderato. Quindi per quelli che sono venuti qui da Google e per gli utenti di (oh-my-) zsh:

La mia soluzione a questo era semplicemente come copiare .zshrc in .zshenv - come da http://zsh.sourceforge.net/Intro/intro_3.html :

".zshenv" ha origine su tutte le invocazioni della shell, a meno che non sia impostata l'opzione -f. Dovrebbe contenere comandi per impostare il percorso di ricerca dei comandi, oltre ad altre importanti variabili d'ambiente. ".zshenv" non deve contenere comandi che producono output o presuppongono che la shell sia collegata a una tty.

Quindi $ cp ~/.zshrc ~/.zshenvfarà la cosa.


Grazie per questo! Volevo solo notare che se hai i tuoi alias di shell in un file, puoi semplicemente trovarli in .zshenv. Qualcosa come: . $HOME/.aliases
scifisamurai

2

Non mi sento molto a mio agio con l'impostazione dell'opzione -i, poiché ha un certo impatto e sto usando spesso la shell di vim. Quello che farei invece è qualcosa di simile:!bash -c ". ~/.alias; gitlog"


Questa sembra la soluzione migliore, ma per me non funziona. Dice ancora comando non trovato
still_dreaming_1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.