Bash-Autovervollständigung für eine Umgebungsvariable mit einem Verzeichnisnamen

10

Ich verwende unter anderem Bash 4.2.37 unter Linux Mint 14.

Wenn ich den Namen einer Umgebungsvariablen durch Eingabe automatisch vervollständige Tab, wird er auf den Namen der Variablen erweitert, gefolgt von einem Leerzeichen.

Wenn der Wert der Variablen zufällig ein Verzeichnisname ist, möchte ich, dass er auf den Namen der Variablen erweitert wird, gefolgt von /.

Zum Beispiel, wenn ich tippe:

$ ls $HOM<tab>

es erweitert sich zu:

$ ls $HOME _

Dabei _markiert die Position des Cursors. Das Problem ist, dass ich dann normalerweise weiterhin den Namen einer Datei oder eines Verzeichnisses unter meinem Ausgangsverzeichnis eingeben möchte, was bedeutet, dass ich backspaceund dann eingeben muss /.

Daher möchte ich Folgendes erweitern:

$ ls $HOME/_

Das gleiche passiert, wenn ich den gesamten Variablennamen eingegeben habe. nach ls $HOME, tabfügt ein Leerzeichen ein , und ich mag es hinzuzufügen /.

(Und natürlich möchte ich nicht, dass ein /Wert hinzugefügt wird, wenn der Wert der Variablen kein Verzeichnisname ist.)

Gibt es eine Möglichkeit, Bash anzuweisen, sich so zu verhalten, wie ich es möchte, entweder über Bash-Befehle oder durch Aktualisieren meiner $HOME/.inputrc?

Hinweis: Ich suche speziell nach einer Möglichkeit, mich so zu tabverhalten, wie ich es möchte. Möglichkeiten, dasselbe Verhalten mit verschiedenen Tastenanschlägen zu erreichen, wären interessant, würden aber meine Frage nicht beantworten.

(Ich habe /etc/profile.d/bash_completion.shmein System deaktiviert , weil es schlecht interagiert set -o nounset. Ein schnelles Experiment zeigt, dass dies für meine Frage wahrscheinlich nicht relevant ist.)

Übrigens macht tcsh dies: Bei einer gegebenen Umgebungsvariablen $FOOBARwird die Eingabe auf $FOOBA<tab>erweitert, $FOOBAR/wenn sie auf ein Verzeichnis verweist $FOOBAR(mit einem Leerzeichen), wenn dies nicht der Fall ist. Nein, das reicht nicht aus, um mich zu überzeugen, zu tcsh zurückzukehren. zsh macht das auch.

Keith Thompson
quelle
+1 Falls Sie sich abenteuerlustig fühlen, finden Sie hier den Code .
10b0
@ l0b0: (a) Ich habe es bereits. (b) Ich fühle mich nicht ganz , dass abenteuerlich. (c) Es wird angenommen, dass es sich um eine programmierbare Vervollständigung handelt.
Keith Thompson

Antworten:

6

Diese Funktion ist in Bash 4.3 implementiert, das am 26.02.2014 veröffentlicht wurde.

Zitieren der NEWSDatei (auf der obersten Ebene von enthalten bash-4.3.tar.gz, siehe auch die GPG-Signatur ):

Der Wortvervollständigungscode prüft, ob ein Dateiname, der eine Shell-Variable enthält, zu einem Verzeichnisnamen erweitert wird und /an das entsprechende Wort angehängt wird . Der gleiche Code erweitert Shell-Variablen in Befehlsnamen, wenn der Befehl abgeschlossen wird.

Ein kurzes Experiment mit einer aus dem Quellcode erstellten Kopie zeigt, dass ich tippe

$ ls $HOM<tab>

es erweitert sich jetzt zu

$ ls $HOME/

(Übrigens macht zsh das auch.)

Keith Thompson
quelle
1
Musste Bash dafür manuell installieren. 4.3 ist nicht in den Fedora 20 Repos.
jozxyqk