Polecenia wykonywane z vima nie rozpoznają aliasów poleceń bash


98

Używam basha na Macu i jeden z aliasów jest taki

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

Jednak kiedy to zrobię

 :! gitlog

dostaję

/bin/bash: gitlog: command not found 

Wiem, że mogę dodawać takie aliasy do mojego pliku .gitconfig

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

Jednak nie chcę dodawać wszystkich moich aliasów bash do .gitconfig. To nie jest SUCHE.

Czy jest lepsze rozwiązanie?


Gdyby aliasy znajdowały się w .gitconfig, nie musiałbyś ich powtarzać w swoich aliasach Bash, a wszystko, co używa git, znałoby je, a nie tylko Bash. Tak więc DRY jest godne podziwu, ale jest też SPOT (Single Point Of Truth), a umieszczenie SPOTa we właściwym miejscu oznacza, że ​​łatwiej też jest być SUCHYM.
Jonathan Leffler


Odpowiedzi:


116

Bash nie ładuje twojego .bashrc, chyba że jest interaktywny. Posługiwać się

:set shellcmdflag=-ic

aby :!powłoka Vima zachowywała się jak wiersz poleceń.


6
edytuj swój plik .vimrc (vim ~ / .vimrc) i umieść go tam w linii (bez :)
skeept

9
To dobrze, ale mam problemy - jeśli włączę tryb interaktywny (flaga i), mogę poprawnie wykonywać moje aliasowane polecenia powłoki, ale gdy tylko polecenia zostaną wykonane, vim zakończy działanie, co jest niepożądane. Ex, próbowałem zrobić:! Ls z shellcmdflag = -ic: [4] + Zatrzymano vi ~ / .vimrc
ashgromnies

6
@Kevin: nie ma sposobu, aby uzyskać normalne zachowanie viw z interaktywnym bashem? (wykonaj polecenie, poczekaj na dowolny klawisz, wróć do vim)
Mayeu

7
Dla mnie posiadanie polecenia w .vimrc prowadzi do suspended (tty output)Kiedy używamgit commit
has2k1

27
Mówienie Vimowi, aby zawsze używał interaktywnej powłoki, może spowodować problemy. Lepszym rozwiązaniem jest ustalenie, co w konfiguracji basha ustawia aliasy i jak można je przenieść do miejsca, które jest ładowane nawet w powłokach nieinteraktywnych. Na przykład zshell ładuje się tylko ~/.zshrcdla powłok interaktywnych, ale ładuje się ~/.zshenvdla wszystkich powłok, więc przeniosłem tam konfigurację aliasu i teraz działa z poziomu Vima. Zobacz man zsh(lub strony podręcznika Twojej powłoki) po więcej.
Nathan Long

83

Wiem, że na to pytanie już wcześniej "udzielono odpowiedzi", ale mam problem z odpowiedzią. Powłoka nie musi być ustawiona na interaktywną w Vimie. Zobacz ten wątek, aby uzyskać alternatywną odpowiedź bez konieczności wychodzenia z interaktywnej powłoki.

Jeśli chcesz mieć nieinteraktywną powłokę (domyślnie), ale rozszerzanie aliasów bash, umieść definicje aliasów w pliku, np. .Bash_aliases i jawnie włącz rozwijanie aliasów w tym pliku:

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

Następnie dodaj to do swojego .vimrc, aby plik aliasów był faktycznie odczytywany za każdym razem, gdy uruchomisz polecenie powłoki z poziomu vima:

let $BASH_ENV = "~/.bash_aliases"

Takie rozwiązanie zaproponował „Jakob”. Zobacz link poniżej, aby zobaczyć oryginał. Przetestowałem to na Mac OS X 10.9 i działało bezbłędnie!

vim - nie rozpoznaje aliasów w trybie interaktywnym?


7
Zdecydowanie najlepsze rozwiązanie. Osobiście ustawiam $BASH_ENVzmienną w moim .bashrc(przed jakimkolwiek niestandardowym sprawdzeniem trybu interaktywnego), więc mogę używać wszystkich moich aliasów w aplikacjach.
el.atomo

2
To prawdopodobnie najlepsze rozwiązanie na tej stronie, ponieważ zakres zmian byłby ograniczony do Vima. Można by nawet posunąć się dalej i let $BASH_ENV="~/.vim/vim_bash"to byłoby używane do wszystkich :!wywołań w Vimie.
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej

Niestety nie działa to w domyślnej powłoce macOS 10.15.2, zsh.
Ben Quigley,

8

Zauważ, że w zależności od tego, jak skonfigurowane są twoje bash dotfiles, możesz chcieć użyć opcji -l zamiast opcji -i. Spowoduje to uruchomienie powłoki jako powłoki logowania.


4
dreftymac napisał: "Żeby to działało dla mnie, trzeba było zrobić opcję -lic, w przeciwnym razie vim zwrócił 'polecenie nie znaleziono'"
dreftymac

8

Wiem, że może to być stare pytanie, jednak żadna z powyższych odpowiedzi nie zadziałała w moim przypadku. Więc dla tych, którzy przyjechali tutaj z Google i dla użytkowników (oh-my-) zsh:

Moje rozwiązanie było tak proste, jak skopiowanie .zshrc do .zshenv - jak na http://zsh.sourceforge.net/Intro/intro_3.html :

`.zshenv 'jest pobierany ze wszystkich wywołań powłoki, chyba że ustawiono opcję -f. Powinien zawierać polecenia do ustawiania ścieżki wyszukiwania poleceń oraz inne ważne zmienne środowiskowe. `.zshenv 'nie powinien zawierać poleceń, które generują wyjście lub zakładają, że powłoka jest dołączona do terminala.

Więc $ cp ~/.zshrc ~/.zshenvzrobię to.


Dziękuję Ci za to! Chciałem tylko zauważyć, że jeśli masz aliasy powłoki w pliku, możesz je po prostu pobrać w .zshenv. Coś jak: . $HOME/.aliases
scifisamurai

2

Nie czuję się zbyt komfortowo z ustawieniem opcji -i, ponieważ ma to spory wpływ i często używam powłoki z vima. Zamiast tego zrobiłbym coś w stylu:!bash -c ". ~/.alias; gitlog"


Wydaje się, że to najlepsze rozwiązanie, ale nie działa dla mnie. Nadal mówi, że polecenie nie zostało znalezione
still_dreaming_1
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.