Von vim ausgeführte Befehle erkennen keine Bash-Befehls-Aliase


96

Ich benutze Bash auf Mac und einer der Aliase ist so

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

Aber wenn ich es tue

 :! gitlog

Ich bekomme

/bin/bash: gitlog: command not found 

Ich weiß, dass ich in meiner .gitconfig Aliase wie diese hinzufügen kann

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

Ich möchte jedoch nicht alle meine Bash-Aliase zu .gitconfig hinzufügen. Das ist nicht trocken.

Gibt es eine bessere Lösung?


Wenn sich die Aliase in der .gitconfig befinden würden, müssten Sie sie nicht in Ihren Bash-Aliasen wiederholen, und alles, was git verwendet, würde sie kennen und nicht nur Bash. DRY ist also bewundernswert, aber es gibt auch SPOT (Single Point Of Truth). Wenn Sie Ihren SPOT an den richtigen Ort bringen, ist es auch einfacher, DRY zu sein.
Jonathan Leffler


Antworten:


113

Bash lädt Ihre .bashrc nur, wenn sie interaktiv ist. Verwenden

:set shellcmdflag=-ic

Damit sich Vims :!Shell wie Ihre Eingabeaufforderung verhält.


6
Bearbeiten Sie Ihre .vimrc-Datei (vim ~ / .vimrc) und setzen Sie diese dort in eine Zeile (ohne die :)
skeept

9
Das ist gut, aber ich habe Probleme. Wenn ich den interaktiven Modus (das i-Flag) aktiviere, kann ich meine Alias-Shell-Befehle problemlos ausführen. Sobald die Ausführung der Befehle abgeschlossen ist, wird vim beendet, was unerwünscht ist. Beispiel: Ich habe versucht :! Ls mit shellcmdflag = -ic: [4] + Gestoppt vi ~ / .vimrc
ashgromnies

6
@ Kevin: Gibt es keine Möglichkeit, das normale Verhalten von viw mit der interaktiven Bash zu erreichen? (Führen Sie den Befehl aus, warten Sie auf einen Schlüssel,
kehren Sie

7
Für mich führt der Befehl in .vimrc zu suspended (tty output)Wenn ich benutzegit commit
has2k1

27
Wenn Sie Vim anweisen, immer eine interaktive Shell zu verwenden, kann dies zu Problemen führen. Eine bessere Lösung besteht darin, herauszufinden, was in Ihrer Bash-Konfiguration Aliase einrichtet und wie Sie diese an einen Ort verschieben können, der auch in nicht interaktiven Shells geladen ist. Beispielsweise wird zshell nur ~/.zshrcfür interaktive Shells geladen , aber ~/.zshenvfür alle Shells. Daher habe ich mein Alias-Setup dorthin verschoben und es funktioniert jetzt in Vim. Weitere Informationen finden Sie unter man zsh(oder auf den Manpages Ihrer Shell).
Nathan Long

83

Ich weiß, dass diese Frage bereits zuvor "beantwortet" wurde, aber ich habe ein Problem mit der Antwort. Die Schale nicht brauchen , um auf interaktive in Vim eingestellt werden. In diesem Thread finden Sie eine alternative Antwort, ohne eine interaktive Shell beenden zu müssen.

Wenn Sie eine nicht interaktive Shell (standardmäßig), aber eine Erweiterung von Bash-Aliasen möchten, fügen Sie Ihre Alias-Definitionen in eine Datei ein, z. B. .bash_aliases, und aktivieren Sie die Alias-Erweiterung in dieser Datei explizit:

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

Fügen Sie dies dann zu Ihrer .vimrc-Datei hinzu, damit die Aliase-Datei jedes Mal gelesen wird, wenn Sie einen Shell-Befehl in vim ausführen:

let $BASH_ENV = "~/.bash_aliases"

Diese Lösung wurde von "Jakob" vorgeschlagen. Das Original finden Sie unter dem folgenden Link. Ich habe dies unter Mac OS X 10.9 getestet und es hat einwandfrei funktioniert!

vim - Aliase im interaktiven Modus nicht erkennen?


7
Die mit Abstand beste Lösung. Persönlich setze ich die $BASH_ENVVariable in meinem .bashrc(vor jeder benutzerdefinierten Überprüfung des interaktiven Modus), damit ich alle meine Aliase für Anwendungen verwenden kann.
el.atomo

2
Dies ist wahrscheinlich die beste Lösung auf dieser Seite, da der Umfang der Änderungen auf Vim beschränkt wäre. Man könnte sogar noch weiter gehen let $BASH_ENV="~/.vim/vim_bash"und dies würde für alle :!Aufrufe innerhalb von Vim verwendet werden.
Teeeeeeeeeeeeeeeeeeeeeeeeeeeeeej

Dies funktioniert in der Standard-Shell von macOS 10.15.2, zsh, leider nicht.
Ben Quigley

8

Beachten Sie, dass Sie je nach Konfiguration Ihrer Bash-Punktedateien möglicherweise die Option -l anstelle der Option -i verwenden möchten. Dadurch wird die Shell als Login-Shell gestartet.


4
dreftymac schrieb: "Um dies für mich zum Laufen zu bringen, war es notwendig, die Option -lic auszuführen, andernfalls gab vim 'Befehl nicht gefunden' zurück"
dreftymac

8

Ich weiß, dass es eine alte Frage sein kann, aber keine der oben genannten Antworten hat für mich wie gewünscht funktioniert. Also für diejenigen, die vom Googeln hierher gekommen sind und für (oh-my-) zsh-Benutzer:

Meine Lösung dafür war so einfach wie das Kopieren von .zshrc nach .zshenv - gemäß http://zsh.sourceforge.net/Intro/intro_3.html :

`.zshenv 'wird für alle Aufrufe der Shell verwendet, sofern nicht die Option -f festgelegt ist. Es sollte Befehle zum Festlegen des Befehlssuchpfads sowie andere wichtige Umgebungsvariablen enthalten. `.zshenv 'sollte keine Befehle enthalten, die eine Ausgabe erzeugen oder davon ausgehen, dass die Shell an ein tty angehängt ist.

Also $ cp ~/.zshrc ~/.zshenvwerde ich das Ding machen.


Danke dafür! Ich wollte nur beachten, dass Sie Ihre Shell-Aliase, wenn Sie sie in einer Datei haben, einfach in .zshenv beziehen können. So etwas wie: . $HOME/.aliases
Scifisamurai

2

Ich fühle mich nicht wohl mit der Einstellung der Option -i, da sie einige Auswirkungen hat und ich die Shell oft von vim aus benutze. Was ich stattdessen tun würde, ist so etwas wie:!bash -c ". ~/.alias; gitlog"


Dies scheint die beste Lösung zu sein, aber es funktioniert nicht für mich. Es heißt immer noch Befehl nicht gefunden
still_dreaming_1
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.