Est-il possible de forcer les suggestions de complétion d’onglet bash à être listées dans une seule colonne?

6

Lorsque je tape un nom de fichier et que je double presse Tab, une liste de répertoires apparaît pour suggérer toutes les options pour la complétion des tabulations. Par défaut, il est répertorié dans le même format que ls cependant, je préférerais qu'il énumère les options plus en ligne avec ls -l. Est-ce possible?

Je suis également intéressé de voir si d'autres personnalisations peuvent être apportées dans cette voie, bien que je ne sois pas vraiment sûr de ce que j'aimerais, mais quelques exemples d'idées seraient bien aussi.

DanH
la source

Réponses:

5

Tout simplement, non.

Raison:

  1. Il n'y a pas d'option dans "set" ou "shopt", pour spécifier le format de sortie des suggestions de complétion de tabulation. La seule exception est COLONNES environ, cependant, vous ne pouvez pas le changer pour une valeur différente.

  2. Pour les complétions personnalisées (comme --option Completion), vous pouvez remplacer la fonction d'achèvement par une sortie vers stdout / stderr ls -l avec les suggestions d'achèvement. Cependant, l’achèvement du nom de fichier est codé en dur, vous ne pouvez pas le remplacer par le complete intégré

Voici un court exemple incorrect pour afficher des informations détaillées ainsi que des suggestions pour compléter les onglets. Imaginez que vous avez un programme foo et il accepte quatre options bar, barr, barrr, car, la fonction d'achèvement sale serait:

function _foo() {
    local cmds=(bar barr barrr car)
    local cur n s
    if [ $COMP_CWORD = 1 ]; then
        cur="${COMP_WORDS[1]}"
        n="${#cur}"

        # -- dirty hack begin --
        echo
        cat <<EOT | while read s; do [ "${s:0:n}" = "$cur" ] && echo "$s"; done
bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving
car:      choose this option if you want a car
EOT
        # ++ dirty hack end ++

        COMPREPLY=($(compgen -W "${cmds[*]}" "$cur"))
    fi
} && complete -F _foo foo

Maintenant, vous pouvez voir un court helpdoc avant les suggestions:

$ foo ba<tab>
bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving
r

(Le seul caractère 'r' dans la dernière ligne est l'auto-complétion du préfixe ba.)

Et, lorsque le préfixe est ambigu, la fonction d'achèvement est évaluée deux fois, la liste de suggestions arrive à la fin:

$ foo bar<tab><tab>
bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving

bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving

bar    barr   barrr
Xiè Jìléi
la source
+1 Un sale bidouillage, peut-être, mais je parie qu'il pourrait se généraliser en le lisant depuis un fichier au lieu d'un document local.
chepner