Completamento automatico di Bash per una variabile di ambiente che contiene un nome di directory


10

Sto usando, tra le altre cose, bash 4.2.37 su Linux Mint 14.

Quando compio il completamento automatico del nome di una variabile di ambiente digitando Tab, si espande al nome della variabile seguito da uno spazio.

Se il valore della variabile sembra essere un nome di directory, voglio che si espanda al nome della variabile seguito da /.

Ad esempio, se digito:

$ ls $HOM<tab>

si espande in:

$ ls $HOME _

dove _segna la posizione del cursore. Il problema è che di solito voglio continuare a digitare il nome di alcuni file o directory nella mia directory home, il che significa che devo digitare backspacee quindi /.

Quindi voglio che quanto sopra si espanda a:

$ ls $HOME/_

La stessa cosa accade quando ho digitato l'intero nome della variabile; dopo ls $HOME, tabaggiunge uno spazio e voglio che aggiunga a /.

(E ovviamente non voglio che aggiunga a /se il valore della variabile non è un nome di directory.)

C'è un modo in cui posso dire a bash di comportarsi nel modo che preferisco, tramite i comandi bash o aggiornando il mio $HOME/.inputrc?

Nota: sto specificatamente cercando un modo per tabcomportarmi come voglio. Modi per ottenere lo stesso comportamento con tasti diversi sarebbero interessanti, ma non risponderebbero alla mia domanda.

(Ho disabilitato /etc/profile.d/bash_completion.shil mio sistema perché interagisce male con set -o nounset. Un rapido esperimento indica che questo probabilmente non è rilevante per la mia domanda.)

Per inciso, tcsh fa questo: data una variabile d'ambiente $FOOBAR, digitando si $FOOBA<tab>espande $FOOBAR/se si riferisce a una directory, $FOOBAR(con uno spazio) se non lo fa. No, non è abbastanza per convincermi a tornare a tcsh. zsh fa anche questo.


+1 Se ti senti avventuroso, ecco il codice .
l0b0,

@ l0b0: (a) ce l'ho già. (b) Non mi sento così avventuroso. (c) Supponiamo che sia un completamento programmabile .
Keith Thompson,

Risposte:


6

Questa funzione è implementata in bash 4.3, rilasciato il 26/02/2014.

Citando il NEWSfile (incluso al livello più alto di bash-4.3.tar.gz, vedi anche la firma GPG ):

Il codice di completamento della parola controlla se un nome file contenente una variabile shell si espande o meno in un nome di directory e accoda /la parola come appropriato. Lo stesso codice espande le variabili della shell nei nomi dei comandi quando si esegue il completamento del comando.

Un rapido esperimento con una copia creata dalla fonte mostra che se scrivo

$ ls $HOM<tab>

ora si espande a

$ ls $HOME/

(Per inciso, anche zsh fa questo.)


1
Ho dovuto installare bash manualmente per questo. 4.3 non è nei fedora 20 repository.
jozxyqk,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.