Autouzupełnianie Bash dla zmiennej środowiskowej o nazwie katalogu

10

Używam między innymi bash 4.2.37 na Linux Mint 14.

Kiedy automatycznie uzupełniam nazwę zmiennej środowiskowej, pisząc Tab, rozwija się ona do nazwy zmiennej, po której następuje spacja.

Jeśli wartością zmiennej jest nazwa katalogu, chcę, aby rozwijała się do nazwy zmiennej, po której następuje /.

Na przykład, jeśli napiszę:

$ ls $HOM<tab>

rozwija się do:

$ ls $HOME _

gdzie _oznacza lokalizację kursora. Problem polega na tym, że zwykle chcę kontynuować wpisywanie nazwy jakiegoś pliku lub katalogu w moim katalogu domowym, co oznacza, że ​​muszę wpisać, backspacea następnie /.

Chcę, aby powyższe rozszerzyło się na:

$ ls $HOME/_

To samo dzieje się, gdy wpisałem całą nazwę zmiennej; po ls $HOME, tabdodaje spację i chcę, aby dodać /.

(I oczywiście nie chcę, aby dodawał a, /jeśli wartość zmiennej nie jest nazwą katalogu).

Czy mogę w jakiś sposób powiedzieć bashowi, aby zachowywał się tak, jak chcę, albo za pomocą poleceń bash, albo poprzez aktualizację mojego $HOME/.inputrc?

Uwaga: szukam sposobu, aby tabzachować się tak, jak chcę. Sposoby osiągnięcia tego samego zachowania przy różnych naciśnięciach klawiszy byłyby interesujące, ale nie odpowiadałyby na moje pytanie.

(Wyłączyłem /etc/profile.d/bash_completion.shsystem, ponieważ źle współdziała set -o nounset. Szybki eksperyment wskazuje, że prawdopodobnie nie ma to związku z moim pytaniem).

Nawiasem mówiąc, tcsh robi to: biorąc pod uwagę zmienną środowiskową $FOOBAR, pisanie $FOOBA<tab>rozwija się, $FOOBAR/jeśli odnosi się do katalogu, $FOOBAR(ze spacją), jeśli nie. Nie, to nie wystarczy, aby przekonać mnie do powrotu do tcsh. Zsh też to robi.

Keith Thompson
źródło
+1 Jeśli masz ochotę na przygodę, oto kod .
l0b0
@ l0b0: (a) Już to mam. (b) Nie czuję się aż tak ryzykowny. (c) Przypuszczalnie ma to być programowalne zakończenie.
Keith Thompson

Odpowiedzi:

6

Ta funkcja jest zaimplementowana w bash 4.3, wydanym 26.02.2014.

Cytując NEWSplik (zawarty na najwyższym poziomie bash-4.3.tar.gz, patrz także podpis GPG ):

Kod zakończenia słowa sprawdza, czy nazwa pliku zawierająca zmienną powłoki jest interpretowana jako nazwa katalogu i odpowiednio dołączana /do słowa. Ten sam kod rozwija zmienne powłoki w nazwach poleceń podczas wykonywania polecenia.

Szybki eksperyment z kopią zbudowaną ze źródła pokazuje, że jeśli piszę

$ ls $HOM<tab>

teraz rozwija się do

$ ls $HOME/

(Nawiasem mówiąc, zsh też to robi.)

Keith Thompson
źródło
1
Musiałem zainstalować bash ręcznie w tym celu. 4.3 nie znajduje się w repozytorium fedora 20.
jozxyqk