Chcę utworzyć skrypt zakończenia bash, który rozpoznaje argumenty formularza --arg
i --some-arg=file
.
Po przeczytaniu tego samouczka i kilku przykładów /usr/share/bash_completion/completions/
napisałem następujący skrypt (aby zaoszczędzić czas na wpisywaniu niektórych flag za pomocą Chromium):
_chromium()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Some interesting options
opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
# Handle --xxxxxx=file
if [[ ${cur} == "--"*"=" ]] ; then
# Removed failures (is my logic OK?)
return 0
fi
# Handle other options
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _chromium chromium
Zapisałem go ~/bash_completions/chromium
i utworzyłem dowiązanie symboliczne sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
.
Następnie załadowałem go za pomocą . /usr/share/bash_completions/completions/chromium
.
Teraz mam dwa problemy:
chromium --u<TAB>
rozwija się dochromium --user-data-dir=<SPACE>
(nie chcę miejsca).- Ścieżki (katalogi i pliki) nie są już uzupełniane.
Jak mogę rozwiązać te problemy?
bash
autocomplete
chrome
Rob W.
źródło
źródło
Odpowiedzi:
Znalazłem rozwiązanie obu problemów!
Aby nie dodawać spacji, użyj
nospace
opcji. Można to zrobić na dwa sposoby:complete
:complete -o nospace -F _chromium chromium
compopt
wbudowanego:compopt -o nospace
(aby włączyć opcję)compopt +o nospace
(aby wyłączyć opcję)Znalazłem go w dokumentacji Bash na gnu.org, 8.7 Programowalne kompilacje uzupełniające .
-f
flagi zcompgen
. Postępowałem zgodnie z tą radą i wdrożyłem ją jakoCOMPREPLY=( $(compgen -f "$cur") )
. To działało dobrze, dopóki nie próbowałem uzupełnić ścieżki zawierającej spacje.W przypadku przepełnienia stosu znalazłem tę odpowiedź, która zaleca ręczne utworzenie listy ukończeń (bez użycia
compgen
). To podejście działało dobrze.filenames
opcji, aby powiedzieć Readline, że compspec generuje nazwy plików, dzięki czemu może:colored-stats
włączonym)Za pomocą manipulacji ciągiem Basha (w celu rozszerzenia
~
i radzenia sobie ze spacjami) zbudowałem skrypty ukończenia basha, które spełniają wszystkie kryteria określone w pytaniu.źródło
-f
przełącznika do uzupełnienia ścieżki do pliku, ale nie uzupełnia on/
znaku, jeśli jest to katalog ... to jednak drobiazg.Aby uzupełnić nazwy plików, spróbuj przejść
-f
docompgen
.Obawiam się, że nie będziesz w stanie pozbyć się spacji po opcjach, ponieważ tak działa uzupełnianie - gdy znajdzie unikalne dopasowanie, kompletuje je całkowicie.
źródło
-f
. Próbowałem, ale nie obsługuje poprawnie spacji: Ścieżka/tmp/foo bar
powoduje dwa wpisy zakończenia/tmp/foo
ibar
. O niechcianych--arg=<SPACE>
: znalazłem rozwiązanie tego problemu i zamieściłem je w odpowiedzi poniżej .