Mam skonfigurowanych kilka skryptów kończących bash (głównie przy użyciu bash-it i niektórych ustawień ręcznych).
Mam też kilka aliasów konfiguracji dla typowych zadań, takich jak gco
na git checkout
. W tej chwili mogę pisać git checkout d
Tabi develop
jest dla mnie kompletny, ale kiedy piszę gco d
Tab, nie jest kompletny.
Zakładam, że dzieje się tak, ponieważ skrypt ukończenia jest włączony git
i nie można go zobaczyć gco
.
Czy istnieje sposób, aby generalnie / programowo sprawić, aby wszystkie moje skrypty uzupełniania działały z moimi aliasami? Nie można ukończyć, gdy używasz aliasu, pokonując cel aliasu.
bash
tab-completion
dstarh
źródło
źródło
bash --version
aby uzyskać to (nie używaj-v
, inne dane wyjściowe).ll --[TAB]
, wydrukuje listę opcjils
? Jestem dość sceptyczny, ale jeśli jesteś pewien, że coś takiego istniało w 11.10, byłbym ciekawy, aby to przejrzeć i ustalić, co zostało usunięte.Odpowiedzi:
Poniższy kod, zaadaptowany z tej odpowiedzi przepełnienia stosu i wątku dyskusji na forach Ubuntu , doda uzupełnienia dla wszystkich zdefiniowanych aliasów:
W przypadku prostych aliasów (tylko komenda, bez argumentów) przypisze oryginalną funkcję uzupełniania do aliasu; dla aliasów z argumentami tworzy funkcję otoki, która wstawia dodatkowe argumenty do oryginalnej funkcji uzupełniania.
W przeciwieństwie do skryptów, z których ewoluował, funkcja respektuje cudzysłowy zarówno dla polecenia aliasu, jak i jego argumentów (ale te pierwsze muszą być dopasowane przez polecenie zakończenia i nie mogą być zagnieżdżone), i powinno niezawodnie filtrować aliasy do list poleceń i potoki (które są pomijane, ponieważ nie można dowiedzieć się, co należy w nich wykonać bez ponownego utworzenia kompletnej logiki parsowania wiersza poleceń powłoki).
Stosowanie
Zapisz kod jako plik skryptu powłoki i źródło , w którym się znajduje, lub skopiuj funkcję hurtowo do
.bashrc
(lub odpowiedniego pliku kropki ). Ważne jest, aby wywołać funkcję po skonfigurowaniu zarówno zakończenia basha, jak i definicji aliasu (powyższy kod wywołuje funkcję zaraz po jej zdefiniowaniu, w duchu „źródła i zapomnienia”, ale można przenieść wywołanie gdziekolwiek poniżej) bardziej Ci odpowiada). Jeśli nie chcesz, aby funkcja w twoim środowisku po jej wyjściu, możesz dodaćunset -f alias_completion
po wywołaniu.Notatki
Jeśli używasz wersji
bash
4.1 lub nowszej i używasz dynamicznie ładowanych uzupełnień, skrypt podejmie próbę załadowania uzupełnień dla wszystkich twoich aliasowanych poleceń, aby móc zbudować funkcje otoki dla twoich aliasów.źródło
~/.bashrc
. Zapisz go jako plik skryptu powłoki i zgłoś go (. /path/to/alias_completion.sh
) lub skopiuj i wklej kod hurtowo./usr/share/bash-completion/completions/
nimi są ładowane tylko za pierwszym razem, gdy użytkownik faktycznie trafi[TAB]
. Więc nawet jeśli funkcja jest załadowana z~/.bashrc
niego, nie wygeneruje uzupełnień dla aliasów do poleceń w nim zawartych. Po upewnieniucomplete -p
się, że działaapt-get
iapt-cache
skopiowałem twoją funkcję do terminala i działa poprawnie./tmp
celu~/.bash_completion
i ręcznie dodane na jego początku odpowiedniesource /usr/share/bash-completion/completions/
wpisy (osobno dlaapt-get
iapt-cache
-apt-{cache,get}
nie działa).Tak, oto projekt kompletnego aliasu , który dokładnie rozwiązuje Twój problem. Zapewnia ogólne i programowe uzupełnianie aliasów bez użycia
eval
.źródło
Jest to ręczny sposób dla tych, którzy tego szukają.
Najpierw wyszukaj oryginalne polecenie zakończenia. Przykład:
Teraz dodaj je do skryptu uruchamiania (np. ~ / .Bashrc):
źródło: https://superuser.com/a/1004334
źródło