Bash autocompletion para uma variável de ambiente que contém um nome de diretório

7

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

Quando eu preenchei automaticamente o nome de uma variável de ambiente digitando Tab , ele expandiu para o nome da variável seguido por um espaço.

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

Por exemplo, se eu digitar:

$ ls $HOM<tab>

expande-se para:

$ ls $HOME _

em que _ marca a localização do cursor. O problema é que eu geralmente quero continuar digitando o nome de algum arquivo ou diretório sob o meu diretório home, o que significa que eu tenho que digitar backspace e então / .

Então, eu quero o exemplo acima para expandir para:

$ ls $HOME/_

O mesmo acontece quando eu digito o nome inteiro da variável; depois de ls $HOME , a aba adiciona um espaço, e eu quero adicionar um / .

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

Existe alguma maneira que eu possa dizer bash para se comportar da maneira que eu quero, seja através de comandos bash ou atualizando meu $HOME/.inputrc ?

Nota: Estou procurando especificamente uma maneira de fazer com que a guia se comporte como eu quero. Maneiras de atingir o mesmo comportamento com diferentes pressionamentos de tecla seriam interessantes, mas não responderiam à minha pergunta.

(Desativei /etc/profile.d/bash_completion.sh no meu sistema porque ele interage mal com set -o nounset . Uma experiência rápida indica que isso provavelmente não é relevante para minha pergunta.)

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

    
por Keith Thompson 22.01.2014 / 23:19

2 respostas

4

Este recurso é implementado no bash 4.3, lançado em 2014-02-26.

Citando o arquivo NEWS (incluído no nível mais alto de bash-4.3.tar.gz , veja também a assinatura GPG :

The word completion code checks whether or not a filename containing a shell variable expands to a directory name and appends / to the word as appropriate. The same code expands shell variables in command names when performing command completion.

Um experimento rápido 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.)

    
por 04.03.2014 / 22:01
1
shopt -s direxpand

ajudará, não haverá espaço para que você possa continuar digitando, mas substituirá a variável do ambiente por seu conteúdo.

Veja a coluna link

    
por 22.02.2016 / 11:22