Autocomplétion basique pour une variable d'environnement contenant un nom de répertoire

10

J'utilise, entre autres, bash 4.2.37 sur Linux Mint 14.

Lorsque j'autocomplète le nom d'une variable d'environnement en tapant Tab, il se développe jusqu'au nom de la variable suivi d'un espace.

Si la valeur de la variable se trouve être un nom de répertoire, je veux qu'elle s'étende au nom de la variable suivie de /.

Par exemple, si je tape:

$ ls $HOM<tab>

il s'étend à:

$ ls $HOME _

_marque l'emplacement du curseur. Le problème est que je veux généralement continuer à taper le nom d'un fichier ou d'un répertoire sous mon répertoire personnel, ce qui signifie que je dois taper backspacepuis /.

Je veux donc que ce qui précède s'étende:

$ ls $HOME/_

La même chose se produit lorsque j'ai tapé le nom complet de la variable; après ls $HOME, tabajoute un espace, et je veux qu'il ajoute un /.

(Et bien sûr, je ne veux pas qu'il ajoute un /si la valeur de la variable n'est pas un nom de répertoire.)

Existe-t-il un moyen de dire à bash de se comporter comme je le souhaite, soit via les commandes bash, soit en mettant à jour mon $HOME/.inputrc?

Remarque: je recherche spécifiquement un moyen de tabme comporter comme je le souhaite. Les façons d'obtenir le même comportement avec différentes frappes seraient intéressantes, mais ne répondraient pas à ma question.

(J'ai désactivé /etc/profile.d/bash_completion.shmon système car il interagit mal avec set -o nounset. Une expérience rapide indique que ce n'est probablement pas pertinent pour ma question.)

Incidemment, tcsh fait ceci: étant donné une variable d'environnement $FOOBAR, la frappe se $FOOBA<tab>développe $FOOBAR/si elle fait référence à un répertoire, $FOOBAR(avec un espace) si ce n'est pas le cas. Non, ce n'est pas suffisant pour me persuader de retourner à tcsh. zsh le fait aussi.

Keith Thompson
la source
+1 Si vous vous sentez aventureux, voici le code .
l0b0
@ l0b0: (a) Je l'ai déjà. (b) Je ne me sens pas aussi aventureux. (c) C'est supposé être un achèvement programmable .
Keith Thompson

Réponses:

6

Cette fonctionnalité est implémentée dans bash 4.3, publiée le 2014-02-26.

Citant le NEWSfichier (inclus au niveau supérieur de bash-4.3.tar.gz, voir également la signature GPG ):

Le code d'achèvement de mot vérifie si un nom de fichier contenant une variable shell se développe en nom de répertoire et s'ajoute /au mot comme il convient. Le même code développe les variables shell dans les noms de commande lors de l'exécution de la commande.

Une expérience rapide avec une copie construite à partir de la source montre que si je tape

$ ls $HOM<tab>

il s'étend maintenant à

$ ls $HOME/

(Soit dit en passant, zsh fait également cela.)

Keith Thompson
la source
1
J'ai dû installer bash manuellement pour cela. 4.3 n'est pas dans les dépôts fedora 20.
jozxyqk