Completamento automatico del nome file nella directory


16

Questa domanda è abbastanza simile a questa , ma non riesco a capire la soluzione. Conosco anche questo tutorial , ma non riesco ancora a capire cosa sto facendo di sbagliato.

Sto cercando di completare automaticamente l'elenco delle directory in cui sono inserite /something/ :

$ ls /something/

One    Other    Three

in modo che ciò accada:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Solo quando la prima parola è hi e non solo dentro /something/.

Questo è quello che sto facendo in .profile:

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

}
complete -F _codeComplete "hi "

Risposte:


15

Provare:

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

complete -F _codeComplete hi

Devi specificare l' -Wopzione incompgen e anche citare il comando che produce l'elenco di parole.

Maggiori informazioni su come scrivere funzioni di completamento su questo blog: Scrivere la propria funzione di completamento Bash


6
Questo fallirà sui nomi dei file contenenti spazi bianchi e altri caratteri speciali.
Gilles 'SO- smetti di essere malvagio' il

2
È stranamente difficile trovare il nome del completecomando se non lo conosci già e lo stai cercando autocompleteo tab-completion... Questo è stato il primo posto in cui ho trovato il nome del comando e ciò di cui avevo bisogno per risolverlo durante ejectl'aggiornamento a Ubuntu 14.04 ( $ complete -p ls-> complete -F _longopt ls, quindi la correzione è stata complete -F _longopt eject
:)

1

Vorrei provare a migliorare la risposta accettata.

La risposta originale avrà esito negativo con nomi di file contenenti spazi bianchi. Dopo alcune indagini, mi rendo conto che è possibile modificare il separatore di input in fine linea:

IFS=$'\n'

rendendo la funzione gestire correttamente gli spazi.

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

complete -F _codeComplete hi

1

Ecco una versione che non solo gestisce gli spazi, ma li sfugge anche:

_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 "

(Basato sulle risposte di dogbane ed Eduardo Almeida dos Santos , ma con la fuga fornita da antak su SO: /programming//a/11536437/1536933 )


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

complete -o nospace -F _hi hi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.