Autovervollständigung des Dateinamens im Verzeichnis

16

Diese Frage ist ganz ähnlich wie diese , aber ich kann die Lösung nicht verstehen. Ich kenne dieses Tutorial auch , kann aber immer noch nicht verstehen, was ich falsch mache.

Ich versuche, die Liste der Verzeichnisse automatisch zu vervollständigen, in denen sich Folgendes befindet /something/:

$ ls /something/

One    Other    Three

auf eine Weise, die dies passieren wird:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Nur wenn das erste Wort ist hiund nicht nur drinnen /something/.

Das mache ich in .profile:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen `ls /something/` -- $cur) )

}
complete -F _codeComplete "hi "
Donovan
quelle

Antworten:

14

Versuchen:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}

complete -F _codeComplete hi

Sie müssen die -WOption in angeben compgenund den Befehl zitieren, der die Wortliste erzeugt.

Weitere Informationen zum Schreiben von Vervollständigungsfunktionen in diesem Blog: Schreiben Ihrer eigenen Bash-Vervollständigungsfunktion

Dogbane
quelle
6
Dies schlägt bei Dateinamen fehl, die Leerzeichen und andere Sonderzeichen enthalten.
Gilles 'SO- hör auf böse zu sein'
2
Es ist seltsam schwierig, den Namen des completeBefehls zu finden, wenn Sie ihn noch nicht kennen und nach autocompleteoder suchen tab-completion... Dies war der erste Ort, an dem ich den Befehlsnamen gefunden habe und worauf ich ihn beim ejectUpgrade auf Ubuntu korrigieren musste 14.04 ( $ complete -p ls-> complete -F _longopt ls, also das complete -F _longopt eject
Update war:)
1

Lassen Sie mich versuchen, die akzeptierte Antwort zu verbessern.

Die ursprüngliche Antwort schlägt mit Dateinamen fehl, die Leerzeichen enthalten. Nach einigen Nachforschungen ist mir klar, dass Sie das Eingabetrennzeichen in Zeilenende ändern können:

IFS=$'\n'

Stellen Sie sicher, dass die Funktion Leerzeichen korrekt verarbeitet.

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
    COMPREPLY=( "${tmp[@]// /\ }" )
}

complete -F _codeComplete hi
Eduardo Almeida dos Santos
quelle
1

Hier ist eine Version, die nicht nur mit Leerzeichen umgeht, sondern diese auch verschwindet:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local AUTO_COMPLETE_DIRS=$(ls /something/)

    IFS=$'\n' COMPREPLY1=( $(compgen -W "$AUTO_COMPLETE_DIRS" -- $cur))
    COMPREPLY2=( "${COMPREPLY1[@]// /\ }" )
    COMPREPLY=($(printf "%q\n" "${COMPREPLY2[@]}"))

}
complete -F _codeComplete "hi "

(Basierend auf den Antworten von dogbane und Eduardo Almeida dos Santos , jedoch mit Flucht, wie von antak auf SO bereitgestellt : /programming//a/11536437/1536933 )

EM0
quelle
0
_hi() {
    COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}

complete -o nospace -F _hi hi
xdch47
quelle