W bash łatwo jest skonfigurować niestandardowe uzupełnianie argumentów poleceń za pomocą complete
wbudowanego. Na przykład, jeśli dla hipotetycznego polecenia z streszczeniem foo --a | --b | --c
, możesz to zrobićcomplete -W '--a --b --c' foo
Można również dostosować zakończenie uzyskać po naciśnięciu Tabna pusty wiersz za pomocą complete -E
, np complete -E -W 'foo bar'
. Następnie naciśnięcie klawisza Tab w pustym monicie sugeruje tylko foo
i bar
.
Jak dostosować uzupełnianie poleceń w niepusty komunikat? Np. Jeśli siedzę w:
anthony@Zia:~$ f
jak dostosować ukończenie, aby naciśnięcie klawisza zawsze się kończyło foo
?
(Rzeczywisty przypadek, który chciałbym, to loc
TAB→ localc
. A mój brat, który poprosił mnie o to, chce tego z mplayerem).
bash
autocomplete
derobert
źródło
źródło
loc
dolocalc
? Proponuję alternatywy, ponieważ po dłuższym czasie kopania i przeszukiwania nie znalazłem sposobu na dostosowanie zakończenia bash w ten sposób. To może nie być możliwe.locate
,locale
,lockfile
lub którykolwiek z pozostałych rozwinięćloc
. Być może lepszym rozwiązaniem byłoby zmapowanie innego klucza do tego konkretnego zakończenia.loc<TAB>->localc
)?Odpowiedzi:
Zakończenie polecenia (wraz z innymi) jest obsługiwane przez bash ukończenia readline . Działa to na nieco niższym poziomie niż zwykłe „programowalne zakończenie” (które jest wywoływane tylko po zidentyfikowaniu polecenia i dwóch specjalnych przypadkach zidentyfikowanych powyżej).
Aktualizacja: nowa wersja bash-5.0 (styczeń 2019) dodaje
complete -I
właśnie do tego problemu.Odpowiednie polecenia readline to:
W podobny sposób jak w przypadku bardziej powszechnych
complete -F
niektóre z nich można przekazać do funkcji za pomocąbind -x
.Umożliwia to dołączenie własnego ciągu znaków dla każdego polecenia lub prefiksu
~/.complete.d/
. Np. Jeśli utworzysz plik wykonywalny za~/.complete.d/loc
pomocą:To zrobi (mniej więcej) to, czego oczekujesz.
Powyższa funkcja ma pewną długość, aby emulować normalne zachowanie kończenia polecenia bash, choć jest niedoskonała (szczególnie wątpliwe
sort | fmt | column
przeniesienie, aby wyświetlić listę dopasowań).Jednak nie jest to trywialny problem z tym, że może on użyć tylko funkcji do zastąpienia powiązania z
complete
funkcją główną (domyślnie wywoływane za pomocą TAB).Podejście to działałoby dobrze z innym powiązaniem klawiszy używanym tylko do niestandardowego uzupełniania poleceń, ale po prostu nie implementuje logiki pełnego uzupełniania (np. Późniejszych słów w wierszu poleceń). Takie działanie wymagałoby analizy linii poleceń, zajmowania się pozycją kursora i innych trudnych rzeczy, których prawdopodobnie nie należy brać pod uwagę w skrypcie powłoki ...
źródło
Nie wiem, czy zrozumiałem twoją potrzebę tego ...
Oznaczałoby to, że twoja bash zna tylko jedno polecenie zaczynające się od
f
.Podstawową ideą realizacji jest: jeśli jest niejednoznaczna, wydrukuj możliwości.
Więc możesz ustawić swój
PATH
katalog na tylko jedno polecenie i wyłączyć wszystkie wbudowane bash, aby uzyskać tę pracę.W każdym razie mogę dać ci też obejście:
Więc jeśli wpiszesz
_ <Tab>
, dokończy to, do_ foo
którego wykonaniafoo
.Niemniej jednak
alias f='foo'
byłoby to o wiele łatwiejsze.źródło
Prosta odpowiedź byłaby dla ciebie
tylko podstawowe wyjścia
po prostu dodaj żądany program do automatycznego uzupełniania do ukończenia bash
źródło
Uruchom poniższe polecenie, aby dowiedzieć się, gdzie jest zainstalowany plik binarny mplayer:
LUB użyj ścieżki do pliku binarnego mplayer, jeśli o tym wiesz, w poniższym poleceniu:
Idealnie wszystko, co wpiszesz, jest wyszukiwane we wszystkich katalogach określonych w
$PATH
zmiennej.źródło
mplayer
jest już w nich$PATH
i chcą czegoś takiego jakmp<tab>
produkowaćmplayer
, zamiast wszystkich plików binarnych, które zaczynają sięmp
(np.mpage
mpcd
mpartition
mplayer
Itp.)