Ich möchte ein Bash-Vervollständigungsskript erstellen, das Argumente des Formulars --arg
und erkennt --some-arg=file
.
Nachdem ich dieses Tutorial und einige Beispiele gelesen /usr/share/bash_completion/completions/
habe, habe ich das folgende Skript geschrieben (um Zeit beim Eingeben einiger Flags mit Chromium zu sparen):
_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
Ich habe es in gespeichert ~/bash_completions/chromium
und einen Symlink mit erstellt sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
.
Dann habe ich es mit geladen . /usr/share/bash_completions/completions/chromium
.
Jetzt habe ich zwei Probleme:
chromium --u<TAB>
erweitert sich zuchromium --user-data-dir=<SPACE>
(ich will den Raum nicht).- Pfade (Verzeichnisse und Dateien) werden nicht mehr ausgefüllt.
Wie kann ich diese Probleme lösen?
bash
autocomplete
chrome
Rob W.
quelle
quelle
Antworten:
Ich habe die Lösung für beide Probleme gefunden!
Verwenden Sie die
nospace
Option , um kein Leerzeichen anzuhängen . Dies kann auf zwei Arten erfolgen:complete
:complete -o nospace -F _chromium chromium
compopt
integrierte:compopt -o nospace
(um die Option zu aktivieren)compopt +o nospace
(um die Option zu deaktivieren)Ich fand es in der Bash-Dokumentation unter gnu.org, 8.7 Programmable Completion Builtins .
-f
Flagge mit zu verwendencompgen
. Ich folgte diesem Rat und setzte ihn um alsCOMPREPLY=( $(compgen -f "$cur") )
. Dies funktionierte gut, bis ich versuchte, einen Pfad mit Leerzeichen zu vervollständigen.Beim Stapelüberlauf habe ich diese Antwort gefunden , die die manuelle Erstellung der Abschlussliste (ohne Verwendung
compgen
) empfiehlt . Dieser Ansatz hat gut funktioniert.filenames
Option, um Readline mitzuteilen, dass die Compspec Dateinamen generiert, damit Folgendes möglich ist:colored-stats
aktiviert).Mit Hilfe von Bashs String-Manipulation (zum Erweitern
~
und Behandeln von Leerzeichen) habe ich ein Bash-Vervollständigungsskript erstellt, das alle in der Frage angegebenen Kriterien erfüllt.quelle
-f
switch für die Vervollständigung des Dateipfads verwendet, aber es vervollständigt das/
Zeichen nicht, wenn es sich um ein Verzeichnis handelt ... es ist jedoch eine kleine Sache.Um Dateinamen zu vervollständigen, versuchen Sie es
-f
mitcompgen
.Ich fürchte, Sie werden die Leerzeichen nach den Optionen nicht mehr entfernen können, da die Fertigstellung so funktioniert - sobald eine eindeutige Übereinstimmung gefunden wurde, wird sie vollständig vervollständigt.
quelle
-f
. Ich habe es versucht, aber es behandelt Leerzeichen nicht richtig: Der Pfad/tmp/foo bar
führt zu zwei Abschlusseinträgen/tmp/foo
undbar
. Über das Unerwünschte--arg=<SPACE>
: Ich habe die Lösung dafür gefunden und sie in der Antwort unten veröffentlicht .