Bash saisie semi-automatique avec la commande vim

13

En bash, l'autocomplétion des chemins a récemment cessé de fonctionner lors de l'émission de vimcommandes où le chemin est plus profond que deux répertoires (il continue de fonctionner comme prévu avec d'autres commandes, telles que lset cd).

Par exemple, si je tape ls .config/btsync/btpuis appuie sur TAB, il se développe en ls .config/btsync/btsync.conf.

Si je tape vim .config/btpuis appuie sur TAB, il se développe en vim .config/btsync/.

Cependant, si je tape vim .config/btsync/btpuis appuie sur TAB, rien ne se passe (je m'attendrais à ce qu'il se développe vim .config/btsync/btsync.conf, comme dans l' lsexemple ci-dessus.

J'obtiens le même problème lors de l'exécution en tant que mon propre utilisateur et lors de l'exécution en tant que su.

J'ai lu cet article qui mentionnait un problème avec les anciennes versions de bash-complètement mais j'exécute 2.1-5.

MISE À JOUR: Après quelques tests supplémentaires, j'ai constaté que le problème racine est que bash ne terminera que les noms de répertoire, pas les noms de fichiers.

MISE À JOUR: Il s'avère que bash-completionc'était la cause globale. Voir mon deuxième commentaire sur la réponse acceptée.

Toutes les suggestions quant à la cause potentielle de ce comportement seraient reçues avec gratitude!

TheRogueWolf
la source
Postez votre .bashrc!
Gilles 'SO- arrête d'être méchant'
Lien vers mon .bashrcmessage, comme demandé.
TheRogueWolf du
Suppression des liens vers .bashrc, .aliases et .functions car ils ne sont pas pertinents pour le problème maintenant que la cause a été découverte.
TheRogueWolf du
même problème sur Debian 9, certaines installations mais pas toutes: $
Philippe Gachoud

Réponses:

10

J'ai fait d'autres recherches pour vous et voici ce que j'ai trouvé - la clé de la saisie semi-automatique est la bashcommande complete. Vous pouvez imprimer les règles d' vimutilisation:

complete -p vim

De même, vous pouvez supprimer ces règles spécifiques avec:

complete -r vim

Cette commande la réinitialise à ses valeurs par défaut - les chemins habituels et la complétion des noms de fichiers sans logique supplémentaire. C'est probablement ce que tu veux.

Pour plus d'informations, consultez help completeou man bashet recherchez la section sur la completecommande (c'est un bash intégré, donc il est documenté dans la page de manuel bash).

Un dernier point - les changements ci-dessus n'affectent que la bashsession en cours, si vous souhaitez supprimer les règles vim après chaque connexion, mettez-les complete -r vimsur votre ~/.bashrc.

J'espère que cela pourra aider :)

MLu
la source
Ça l'a fait. Merci beaucoup. La complete -p vimcommande est revenue, complete -F _filedir_xspec vimqui a été supprimée par la complete -r vimcommande, résolvant le problème. Je vais faire quelques lectures sur la completecommande et les informations retournées par le commutateur -p. Légèrement perplexe de savoir pourquoi ce comportement a changé, nous étudierons cela également.
TheRogueWolf
3
Il semble que le coup bash soit le coupable après tout. La _filedir_xspecfonction dans /usr/share/bash-completion/bash_completionne complète que les répertoires. J'ai désinstallé bash-completion, supprimé la complete -r vimligne de mon .bashrcet redémarré et vimse comporte maintenant comme prévu.
TheRogueWolf
3

Bash par défaut ne remplit automatiquement que les noms de chemin et de fichier. Cependant, le mécanisme est extensible et bash peut être appris à effectuer une autocomplétion différente pour différents programmes. Par exemple, gitil peut compléter automatiquement les noms des sous-commandes (cloner, valider) et les révisions au lieu de simplement les noms de chemin. Parfois, c'est pratique, parfois assez ennuyeux - par exemple, lorsqu'il gzip -drefuse de saisir automatiquement les noms de fichiers qui n'ont pas l' .gzextension.

L'achèvement de Bash est généralement configuré dans /etc/bash_completion.d- vous y trouverez probablement un fichier appelé vim. C'est le fichier qui contient les règles de saisie semi-automatique pour la vimligne de commande.

Maintenant, vous avez deux options:

  1. Soit corrigez le fichier sur des chemins de saisie semi-automatique comme les utilisateurs s'y attendent probablement de toute façon.
  2. Supprimez le fichier pour désactiver les vimrègles spéciales et effectuez uniquement la saisie automatique du chemin par défaut.

Et bien sûr, déposez un rapport de bogue qui décrit le problème afin qu'il soit corrigé dans les futures versions :)

MLu
la source
Merci beaucoup pour la grande explication :) J'ai jeté un œil /etc/bash_completion.det il n'y a qu'un hgfichier (pour Mercurial). Très étrange.
TheRogueWolf
1
Alors ça doit être ailleurs. Essayez /usr/share/bash-completion/ou répertoriez tous les fichiers du vimpackage ou de bashou des bash-completionpackages (vous ne savez pas comment cela s'appelle sur ArchLinux). Ce sera là quelque part.
MLu
1
La liste des fichiers du bash-completionpackage /usr/share/bash-completion/completionscontient des règles pour de nombreux programmes, mais pas vim. La liste des fichiers installés avec le vimpackage n'affiche aucun fichier lié à l'achèvement et la recherche sur l'ensemble du système à l'aide n'affiche find / -name vimégalement aucun fichier lié à l'achèvement.
TheRogueWolf
2

Peut-être pourriez-vous réinstaller bash-complètement: apt-get install --reinstall bash-completion

Et jetez un œil au fichier /etc/bash.bashrc: nano /etc/bash.bashrc

Et vérifiez que la ligne suivante n'est pas commentée:

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

Ensuite, redémarrez votre session de terminal

Djidiouf
la source
J'ai essayé de supprimer bash-completion, de tester le vimcomportement, puis de réinstaller bash-completionet de tester, mais j'ai toujours rencontré le même problème dans les deux circonstances. Les lignes que vous avez répertoriées ne sont pas présentes dans /etc/bash.bashrc. Cette ligne est cependant[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf