Autocompletar bash para una variable de entorno que contiene un nombre de directorio

10

Estoy usando, entre otras cosas, bash 4.2.37 en Linux Mint 14.

Cuando autocompleto el nombre de una variable de entorno escribiendo Tab, se expande al nombre de la variable seguido de un espacio.

Si el valor de la variable es un nombre de directorio, quiero que se expanda al nombre de la variable seguido de /.

Por ejemplo, si escribo:

$ ls $HOM<tab>

se expande a:

$ ls $HOME _

donde _marca la ubicación del cursor. El problema es que normalmente quiero seguir escribiendo el nombre de algún archivo o directorio en mi directorio de inicio, lo que significa que tengo que escribir backspacey luego /.

Entonces, quiero que lo anterior se expanda a:

$ ls $HOME/_

Lo mismo sucede cuando escribí el nombre completo de la variable; después ls $HOME, tabagrega un espacio, y quiero que agregue un /.

(Y, por supuesto, no quiero que agregue un /si el valor de la variable no es un nombre de directorio).

¿Hay alguna forma de decirle a bash que se comporte de la manera que quiero, ya sea a través de comandos bash o actualizando mi $HOME/.inputrc?

Nota: Estoy buscando específicamente una forma de hacer que se tabcomporte de la manera que quiero. Las formas de lograr el mismo comportamiento con diferentes teclas serían interesantes, pero no responderían a mi pregunta.

(He desactivado /etc/profile.d/bash_completion.shen mi sistema porque interactúa mal con él set -o nounset. Un experimento rápido indica que esto probablemente no sea relevante para mi pregunta).

Por cierto, tcsh hace esto: dada una variable de entorno $FOOBAR, la escritura se $FOOBA<tab>expande $FOOBAR/si se refiere a un directorio, $FOOBAR(con un espacio) si no lo hace. No, eso no es suficiente para convencerme de volver a tcsh. zsh hace esto también.

Keith Thompson
fuente
+1 En caso de que te sientas aventurero, aquí está el código .
l0b0
@ l0b0: (a) Ya lo tengo. (b) No me siento bastante que aventurero. (c) Se supone que es una terminación programable .
Keith Thompson

Respuestas:

6

Esta característica se implementa en bash 4.3, lanzado el 26/02/2014.

Citando el NEWSarchivo (incluido en el nivel superior de bash-4.3.tar.gz, vea también la firma GPG ):

El código de finalización de palabra verifica si un nombre de archivo que contiene una variable de shell se expande a un nombre de directorio y se agrega /a la palabra según corresponda. El mismo código expande las variables de shell en los nombres de los comandos cuando se completa el comando.

Un experimento rápido con una copia creada a partir de la fuente muestra que si escribo

$ ls $HOM<tab>

ahora se expande a

$ ls $HOME/

(Por cierto, zsh también hace esto).

Keith Thompson
fuente
1
Tuve que instalar bash manualmente para esto. 4.3 no está en los repositorios de fedora 20.
jozxyqk