Preenchimento automático de bash para uma variável de ambiente que contém um nome de diretório

10

Estou usando, entre outras coisas, o bash 4.2.37 no Linux Mint 14.

Quando eu preencho automaticamente o nome de uma variável de ambiente digitando Tab, ela se expande para o nome da variável seguida por um espaço.

Se o valor da variável for um nome de diretório, quero que ele se expanda para o nome da variável seguido por /.

Por exemplo, se eu digitar:

$ ls $HOM<tab>

expande para:

$ ls $HOME _

onde _marca a localização do cursor. O problema é que, normalmente, desejo continuar digitando o nome de algum arquivo ou diretório no meu diretório pessoal, o que significa que preciso digitar backspacee depois /.

Então, eu quero que o acima expanda para:

$ ls $HOME/_

O mesmo acontece quando eu digitei o nome inteiro da variável; depois ls $HOME, tabadiciona um espaço, e eu quero-o para adicionar um /.

(E é claro que não quero adicionar a /se o valor da variável não for um nome de diretório.)

Existe alguma maneira de dizer ao bash que se comporte da maneira que eu quero, através dos comandos do bash ou atualizando o meu $HOME/.inputrc?

Nota: Estou procurando especificamente uma maneira de fazer o tabcomportamento que eu quero. Maneiras de atingir o mesmo comportamento com pressionamentos de tecla diferentes seria interessante, mas não responderia à minha pergunta.

(Desativei /etc/profile.d/bash_completion.shmeu sistema porque ele interage mal set -o nounset. Um experimento rápido indica que isso provavelmente não é relevante para minha pergunta.)

Aliás, o tcsh faz isso: dada uma variável de ambiente $FOOBAR, a digitação se $FOOBA<tab>expande para $FOOBAR/se se referir a um diretório, $FOOBAR(com um espaço) se não. Não, isso não é suficiente para me convencer a voltar ao tcsh. O zsh também faz isso.

Keith Thompson
fonte
+1 Caso você se sinta aventureiro, aqui está o código .
L0b0
@ l0b0: (a) eu já tenho. (b) Não estou me sentindo muito que aventureiros. (c) Supõe-se que seja a conclusão programável .
Keith Thompson

Respostas:

6

Esse recurso foi implementado no bash 4.3, lançado em 26/02/2014.

Citando o NEWSarquivo (incluído no nível superior de bash-4.3.tar.gz, consulte também a assinatura GPG ):

O código de conclusão da palavra verifica se um nome de arquivo que contém uma variável de shell se expande para um nome de diretório e anexa /à palavra conforme apropriado. O mesmo código expande variáveis ​​de shell nos nomes de comando ao executar a conclusão do comando.

Uma experiência rápida com uma cópia criada a partir da fonte mostra que, se eu digitar

$ ls $HOM<tab>

agora se expande para

$ ls $HOME/

(Aliás, o zsh também faz isso.)

Keith Thompson
fonte
1
Teve que instalar o bash manualmente para isso. 4.3 não está nos 20 repositórios do fedora.
Jozxyqk