Wenn ich ein Programm wie dieses verwende svn
und in Gnome Terminal eingebe:
svn upd
und klicken Sie Tabauf die automatische Vervollständigung:
svn update
Ist es möglich, so etwas in meinem benutzerdefinierten Bash-Skript zu tun?
Antwort1
Sie müssen eine neue Datei erstellen:
/etc/bash_completion.d/foo
Für eine statische Autovervollständigung ( z. B. --help
/ ) fügen Sie Folgendes hinzu:--verbose
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS
ist ein Array, das alle einzelnen Wörter in der aktuellen Befehlszeile enthält.COMP_CWORD
ist ein Index des Wortes, das die aktuelle Cursorposition enthält.COMPREPLY
ist eine Array-Variable, aus der Bash die möglichen Vervollständigungen liest.
Und der compgen
Befehl gibt das Array von Elementen aus zurück --help
, --verbose
passend --version
zum aktuellen Wort "${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
Antwort2
Hier ist ein vollständiges Tutorial.
Sehen wir uns ein Beispiel für ein Skript an, admin.sh
bei dem die automatische Vervollständigung funktionieren soll.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_2
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Beachten Sie die Option shortlist
. Wenn Sie das Skript mit dieser Option aufrufen, werden alle möglichen Optionen für dieses Skript ausgegeben.
Und hier haben Sie das Autovervollständigungsskript:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
Beachten Sie, dass das letzte zu vervollständigende Argument der Name des Skripts ist, dem Sie die Autovervollständigung hinzufügen möchten. Sie müssen lediglich Ihr Autovervollständigungsskript wie folgt zu bashrc hinzufügen:
source /path/to/your/autocomplete.sh
oder kopieren Sie es nach:
/etc/bash_completion.d
Antwort3
Du kannst den ... benutzenProgrammierbare Vervollständigung. Schauen Sie sich /etc/bash_completion
und /etc/bash_completion.d/*
einige Beispiele an.
Antwort4
Wenn Sie nur eine einfache, wortbasierte Autovervollständigung wünschen (also keine Unterbefehlsvervollständigung oder ähnliches), complete
verfügt der Befehl über eine -W
Option, die einfach das Richtige tut.
Zum Beispiel habe ich die folgenden Zeilen in meinem .bashrc
zur automatischen Vervollständigung eines Programms namensjupyter:
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Jetzt jupyter <TAB> <TAB>
wird es für mich automatisch vervollständigt.
DerDokumenteunter gnu.org sind hilfreich.
Es scheint davon abzuhängen, ob die IFS
Variable richtig gesetzt ist, aber das hat bei mir keine Probleme verursacht.
Um die Dateinamenvervollständigung und die Standard-BASH-Vervollständigung hinzuzufügen, verwenden Sie die -o
Option:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Um dies in zsh zu verwenden, fügen Sie den folgenden Code hinzu, bevor Sie den complete
Befehl in Ihrem ausführen ~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi