Wie erstelle ich ein Skript mit automatischer Vervollständigung?

Wie erstelle ich ein Skript mit automatischer Vervollständigung?

Wenn ich ein Programm wie dieses verwende svnund 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_WORDSist ein Array, das alle einzelnen Wörter in der aktuellen Befehlszeile enthält.
  • COMP_CWORDist 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 compgenBefehl gibt das Array von Elementen aus zurück --help, --verbosepassend --versionzum aktuellen Wort "${cur}":

compgen -W "--help --verbose --version" -- "<userinput>"

Quelle

Antwort2

Hier ist ein vollständiges Tutorial.

Sehen wir uns ein Beispiel für ein Skript an, admin.shbei 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_completionund /etc/bash_completion.d/*einige Beispiele an.

Antwort4

Wenn Sie nur eine einfache, wortbasierte Autovervollständigung wünschen (also keine Unterbefehlsvervollständigung oder ähnliches), completeverfügt der Befehl über eine -WOption, die einfach das Richtige tut.

Zum Beispiel habe ich die folgenden Zeilen in meinem .bashrczur 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 IFSVariable 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 -oOption:

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 completeBefehl in Ihrem ausführen ~/.zshrc:

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi

verwandte Informationen