Auto-complétion Bash avec des espaces ajoutés - pourquoi et comment y remédier?

29

J'utilise l'achèvement des tabulations plus que la saisie de lettres. J'avais l'habitude de taper rm ~/De<TAB>et ce serait terminé pour rm ~/Desktop/que je puisse continuer au niveau suivant.

Récemment, ce comportement a changé. L'achèvement donne maintenant rm ~/Desktop<SPACE>, ce qui signifie que je dois revenir en arrière et taper la barre oblique si je veux continuer. Cela me fait pleurer.

Les changements semblent se situer dans la fonction _longopt()en /etc/bash_completion, mais c'est aussi loin que je puisse suivre. Ce changement est-il intentionnel, et si oui, à quoi sert-il? Puis-je récupérer l'ancien comportement, de préférence par une option de configuration au lieu de simplement copier l'ancien code à partir d'un autre système?

Edit: La fonction de référence.

_longopt()
{
    local cur prev split=false
    _get_comp_words_by_ref -n = cur prev

    _split_longopt && split=true

    case "$prev" in
        --*[Dd][Ii][Rr]*)
            _filedir -d
            return 0
            ;;
        --*[Ff][Ii][Ll][Ee]*|--*[Pp][Aa][Tt][Hh]*)
            _filedir
            return 0
            ;;
    esac

    $split && return 0

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W "$( $1 --help 2>&1 | \
            sed -ne 's/.*\(--[-A-Za-z0-9]\{1,\}\).*/\1/p' | sort -u )" \
            -- "$cur" ) )
    elif [[ "$1" == @(mk|rm)dir ]]; then
        _filedir -d
    else
        _filedir
    fi
}
MPi
la source
La seule façon dont je pouvais voir que cela aurait un sens est si ~ / Desktop est un fichier ou un répertoire vide . Et dans le deuxième cas, cela n'est utile que pour des commandes comme rmdir, pas pour mkdirou touch.
l0b0
Pourriez-vous publier le corps de votre _longopt()fonction?
Aleksandr Levchuk
@MPi: sachez que la complétion pourrait dépendre de la commande (premier mot de la ligne de commande). Cela dépend également des readlineparamètres (avez-vous un ~/inputrcfichier?) Et du fait que l'élément est un véritable répertoire ou un lien symbolique vers un répertoire.
enzotib
Bien sûr, l'achèvement dépend du premier mot de la ligne. C'est pourquoi j'utilise parfois une commande fantasy pour tromper l'achèvement, et je la change uniquement en vraie commande avant de l'envoyer. Et je n'ai plus .inputrcsur ce système. (C'étaient les jours, fixant le retour arrière et les touches de curseur…) Et ça arrive pour tous les éléments, répertoire ou fichier, lien symbolique ou pas.
MPi
1
Excellente question, j'ai observé exactement le même comportement, et cela m'énerve. Aucune idée de la raison, cependant.
Christoph

Réponses:

22

C'est un bug connu. Voir cette question LP et ces bugs 1 2 .

Ce commentaire semble être la solution. Si vous ne pouvez pas attendre qu'un correctif pénètre dans les canaux normaux, modifiez la /etc/bash_completionligne 1587, changez defaulten filenames(effectuez d'abord une sauvegarde).

Christoph
la source
3
Résumé: C'est un bug, vous pouvez le corriger localement jusqu'à ce que le patch arrive en éditant la /etc/bash_completionligne 1587, changez defaultpour filenames.
MPi
modifié ma réponse
Christoph
9

J'ai eu et résolu le même problème après l'installation d'Adobe Reader sur Ubuntu 12.04.

J'ai commenté le _filedirbloc /etc/bash_completion.d/acroread.shet cela a de nouveau fonctionné normalement.

hiteshradia
la source
À la date d'aujourd'hui, c'est aussi ce qui a fonctionné pour moi.
John Moeller
1
Idem ici: acroread l'a déclenché et commenté le _filedirbloc (juste en haut) l'a corrigé. Vous devez vous déconnecter ou exécuter 'exec bash' dans tous vos shells pour voir l'effet, voir cette question .
dirkjot
2

J'ai eu le même problème et je l'ai résolu en supprimant le répertoire /etc/bash_completion.d/, puis en réinstallant bash_completion. Je suppose qu'un ancien fichier était dans ce répertoire ... Espérons que cela résoudra votre problème aussi.

PatrickM
la source
comme ce gars: timlabath.com/words/2011/05/10/…
tapez
2
Cela - en effet - l'a corrigé. Cependant, cette méthode est beaucoup trop radicale, car elle jette de nombreux achèvements. Après avoir supprimé le package bash-completion, l'un des fichiers restants /etc/bash_completion.d/doit être le coupable. C'était acroread.shdans mon cas - ça redéfinit _filedir.
MPi