Bash Auto Completion Skript


7

Ich versuche, die automatische Vervollständigung für einen Befehl einzurichten, der nur einen Parameter, einen Ordnernamen, akzeptiert.

In habe /secure/kernel_builds/ich die drei folgenden Unterordner:

3.5.6/ 3.6.2/ source/

Jetzt möchte ich die automatische Vervollständigung, die alle möglichen Unterordnernamen auflistet, aber nicht den genannten source. Im Moment verwende ich eine ziemlich dumme Methode, um zu überprüfen, ob das Vervollständigungswort mit einer Zahl begonnen wird.

_avail_kernel_builds()
{
    case $COMP_CWORD in
        1)
            if [[ "${COMP_WORDS[COMP_CWORD]}" =~ ^[0-9] ]];then
                COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"* )
            else
                COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"[0-9]*/ )
            fi
            COMPREPLY=( "${COMPREPLY[@]#/secure/kernel_builds/}" )
            COMPREPLY=( "${COMPREPLY[@]%/}" )
            ;;
    esac    
}

Gibt es einen besseren Weg, dies zu tun?

Antworten:


1

Das compgeneingebaute hat ein -XArgument für genau diesen Zweck:

-X Filterpat
    filterpat ist ein Muster, das für die Dateinamenerweiterung verwendet wird. Es wird auf die Liste von angewendet
    mögliche Vervollständigungen, die durch die vorhergehenden Optionen und Argumente generiert wurden, und jeweils 
    Der Abschluss-Matching-Filterpat wird aus der Liste entfernt. Ein führender! in Filterpat
    negiert das Muster; In diesem Fall wird jede Vervollständigung entfernt, die nicht mit Filterpat übereinstimmt.

Sie könnten also wahrscheinlich einfach so etwas tun:

_avail_kernel_builds() {
    case $COMP_CWORD in
        1) COMPREPLY=( $(cd /secure/kernel_builds; compgen -d -X "source") ) ;;
    esac
 }

So compgen -dheißt es "Listen Sie die Ordner im aktuellen Verzeichnis auf" und -X "source"sagt "... aber filtern Sie alles heraus, was" Quelle "heißt.


0

Sie können in einer Schleife nach den Zeichenfolgen suchen, die Sie (nicht) möchten:

declare -a accept
declare -a reject
for s in "${COMPREPLY[@]}"; do
    if [[ "$s" =~ want ]]; then
        accept=( "${accept[@]}" "$s" )
    else
        reject=( "${reject[@]}" "$s" )
    fi
done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.