Saisie semi-automatique du nom de fichier dans le répertoire

16

Cette question est assez similaire à celle-ci , mais je ne comprends pas la solution. Je connais également ce tutoriel , mais je n'arrive toujours pas à comprendre ce que je fais mal.

J'essaie de compléter automatiquement la liste des répertoires placés dans /something/:

$ ls /something/

One    Other    Three

d'une manière que cela se produira:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Seulement lorsque le premier mot est hiet pas seulement à l'intérieur /something/.

C'est ce que je fais dans .profile:

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

}
complete -F _codeComplete "hi "
Donovan
la source

Réponses:

15

Essayer:

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

complete -F _codeComplete hi

Vous devez spécifier l' -Woption dans compgenet également citer la commande qui produit la liste de mots.

Plus d'informations sur la façon d'écrire des fonctions d'achèvement sur ce blog: Écrire votre propre fonction d'achèvement de Bash

dogbane
la source
6
Cela échouera sur les noms de fichiers contenant des espaces et d'autres caractères spéciaux.
Gilles 'SO- arrête d'être méchant'
2
Il est étrangement difficile de trouver le nom de la completecommande si vous ne le connaissez pas déjà et que vous recherchez autocompleteou tab-completion... C'est le premier endroit où j'ai trouvé le nom de la commande, et ce dont j'avais besoin pour le corriger ejectlors de la mise à niveau vers Ubuntu 14.04 ( $ complete -p ls-> complete -F _longopt ls, donc le correctif était complete -F _longopt eject
:)
1

Permettez-moi d'essayer d'améliorer la réponse acceptée.

La réponse d'origine échouera avec les noms de fichiers contenant des espaces. Après quelques recherches, je me rends compte que vous pouvez changer le séparateur d'entrée en fin de ligne:

IFS=$'\n'

faire en sorte que la fonction gère correctement les espaces.

_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
la source
1

Voici une version qui non seulement gère les espaces, mais les échappe également:

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

(Basé sur les réponses de Dogbane et Eduardo Almeida dos Santos , mais avec échappement comme fourni par antak sur SO: /programming//a/11536437/1536933 )

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

complete -o nospace -F _hi hi
xdch47
la source