La complétion par tabulation ne fonctionne pas pour les commandes

50

J'essaie d'utiliser la complétion par tabulation pour les commandes dans Ubuntu 11.04 Bêta 1, en exécutant toutes les dernières mises à jour, mais cela ne semble pas fonctionner. (Bien que le paquet bash-completion soit installé)

La complétion par onglets ne fonctionne correctement que pour les répertoires ou les fichiers.

Des idées où creuser?

Screatch
la source
J'ai résolu ce problème en utilisant la solution proposée à askubuntu.com/questions/325807/…
DB

Réponses:

67

Vérifiez si vous avez le fragment suivant dans votre .bashrc (devrait être là par défaut)

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi
Adam Byrtek
la source
Merci! J'ai remplacé .bashrc par le mien et je ne pouvais donc pas comprendre le problème. Fonctionne parfaitement maintenant.
Screatch le
cela a corrigé mon auto-complétion de git bash sur xubuntu 12.04 aussi, merci beaucoup.
Palmic
Qu'en est-il de l'auto-complétion pour le commutateur et l'option des commandes ligne apt-get? c'est-à-dire lorsque vous entrez apt-get ins puis appuyez sur l'onglet pour le compléter automatiquement.
Reza Ghodsi
3
Je voudrais ajouter que le paquet bash-completionest nécessaire pour que cela fonctionne. Bizarrement, l'installation standard de mon entreprise ne contient pas ce package.
Edgar
13

Je pensais également ajouter l'explication supplémentaire suivante pour un échec d'achèvement de Bash - c'est trop long pour un commentaire et peut être utile pour quelqu'un qui a un problème avec l'achèvement de Bash, car il s'agit vraisemblablement de la question canonique «générale» à laquelle tous les doublons sont référés.

Même si vous avez la ligne appropriée dans votre .bashrc(comme dans la réponse ci-dessus) et le bash-completionpackage installé, la finalisation de bash peut tout de même ne pas fonctionner correctement si vous en avez un, shopt -s nullglobou shopt -s failglobdans votre .bashrcou .bash_aliases.

Les scénarios suivants ont été testés avec toutes les personnalisations de l'utilisateur .bashrcet .bash_aliasessupprimés pour donner un test correct, avec la ligne d'achèvement de bash appropriée .bashrcactuellement et bash-completioninstallée.

1) Le premier scénario est quand vous avez shopt -s failglobdans votre .bashrcou .bash_aliases.

Lorsque vous essayez de tabuler des répertoires et des fichiers complets, respectivement, ces erreurs se produisent:

cd Dbash: no match: "${COMP_WORDS[@]}"  
cat pabash: no match: words[0]=${!ref}${COMP_WORDS[i]}

Cependant, les commandes se termineront toujours avec succès.

2) Avec shopt -s nullglobenabled, essayer de compléter un répertoire ou un fichier mènera à la liste de tous les éléments, sans aucun achèvement:

cd Do
.adobe/                  .gimp-2.6/               Podcasts/
.aptitude/               .gnome2/                 Public/
.audacity-data/          .gnome2_private/         .pulse/
............

J'ai coupé la liste ici, car c'était très long et pas nécessaire de tout reproduire.

Encore une fois, l’achèvement de la commande fonctionnera toujours.

En supprimant shopt -s failglobou en shopt -s nullglobrésolvant le problème des erreurs d’achèvement en mode bash, vous devez donc disposer de la ligne appropriée .bashrcet l’ bash-completioninstaller.


la source
1
Belle explication, cela a résolu mon problème lorsque j'essaie de compléter un onglet et qu'une erreur s'est produite >> mots [0] = $ {! Ref} $ {COMP_WORDS [i]}
bagustris
Bien que cela fonctionne comme une solution de contournement, c'est un problème pour tout programmeur d'achèvement. Puisque nullglob (qui est nominalement meilleur pour beaucoup) et kin peuvent être définis, tout code compléteur nécessitant l'ancienne sémantique ancien paramètre glob par la suite, exactement comme IFS.
Alex North-Keys
10

En plus de modifier le /etc/bash.bashrcfichier (voir d’autres réponses), vous devrez peut-être installer le bash-completionpaquet.

Vérifiez si le /etc/bash_completionfichier existe. Sinon:

sudo apt-get install bash-completion

(Dans mon installation de Debian 7, il n'était pas installé initialement)

Sergent
la source
7

Aussi basique que cela puisse paraître, assurez-vous que bash est votre shell actif

echo $SHELL

Je viens de passer à Ubuntu 14.04.1 LTS et je n'avais pas de complétion automatique des onglets, même après avoir suivi les conseils donnés sur ce post, seulement pour me rendre compte que mon shell était réglé sur /bin/shet non /bin/bash.

nocdib
la source
2

Mise à jour vers Ubuntu 14.04.01

Vérifiez si vous avez le fragment suivant dans votre .bashrc (devrait être là par défaut)

sudo vim /etc/bash.bashrc (tapez "i" pour éditer le fichier)

    # enable bash completion in interactive shells
    if ! shopt -oq posix; then
     if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

Ne commentez pas 7 lignes ci-dessus

Enregistrer le fichier "esc + w + q + enter"

Redémarrer Bash

exec bash

Diego Arriola
la source
1
Qu'est-ce que cela va faire? N'est-ce pas comme ça par défaut?
Tim le
Comme @Tim dit, cette configuration est fournie par config par défaut.
Ssoto
Cela a fonctionné pour moi
Thamaraiselvam
Cette réponse a fonctionné comme un charme, et il a des votes négatifs ???
Greuze