In bash ist es einfach genug, die benutzerdefinierte Vervollständigung von Befehlsargumenten mithilfe der complete
integrierten Funktion einzurichten . Zum Beispiel, wenn Sie für einen hypothetischen Befehl mit einer Zusammenfassung von foo --a | --b | --c
tun könntencomplete -W '--a --b --c' foo
Sie können auch die Vervollständigung anpassen, die Sie erhalten, wenn Sie Taban einer leeren Eingabeaufforderung auf drücken complete -E
, z complete -E -W 'foo bar'
. B .. Dann würde das Drücken der Tabulatortaste an der leeren Eingabeaufforderung nur foo
und vorschlagen bar
.
Wie passe ich die Befehlsausführung an einer nicht leeren Eingabeaufforderung an? ZB wenn ich sitze bei:
anthony@Zia:~$ f
Wie kann die Vervollständigung angepasst werden, sodass das Drücken der Tabulatortaste immer zu vervollständigt wird foo
?
(Der tatsächliche Fall, den ich möchte, ist loc
TAB→ localc
. Und mein Bruder, der mich dazu aufgefordert hat, dies zu fragen, möchte es mit mplayer).
quelle
loc
zu erstellenlocalc
? Ich schlage Alternativen vor, da ich nach einiger Zeit beim Graben und Suchen keine Möglichkeit gefunden habe, die Bash-Vervollständigung auf diese Weise anzupassen. Möglicherweise ist dies nicht möglich.locate
,locale
,lockfile
oder eine der anderen Erweiterungenloc
. Vielleicht wäre es ein besserer Ansatz, einen anderen Schlüssel für diese bestimmte Vervollständigung abzubilden.loc<TAB>->localc
)?Antworten:
Die Vervollständigung des Befehls (zusammen mit anderen Dingen) wird über die Bash Readline-Vervollständigung abgewickelt . Dies funktioniert auf einer etwas niedrigeren Ebene als die übliche "programmierbare Vervollständigung" (die nur aufgerufen wird, wenn der Befehl identifiziert wurde und die beiden oben angegebenen Sonderfälle).
Update: Die neue Version von bash-5.0 (Januar 2019) ergänzt
complete -I
genau dieses Problem.Die relevanten Readline-Befehle sind:
In ähnlicher Weise wie üblich
complete -F
kann ein Teil davon durch Verwendung von an eine Funktion übergeben werdenbind -x
.Dies aktiviert Ihre eigenen Befehle oder Präfixzeichenfolgen
~/.complete.d/
. ZB wenn Sie eine ausführbare Datei erstellen~/.complete.d/loc
mit:Dies wird (ungefähr) das tun, was Sie erwarten.
Die obige Funktion emuliert das normale Verhalten beim Beenden von Bash-Befehlen, ist jedoch unvollkommen (insbesondere das zweifelhafte Vorgehen
sort | fmt | column
beim Anzeigen einer Liste von Übereinstimmungen).Ein nicht triviales Problem, bei dem nur eine Funktion zum Ersetzen der Bindung an die Hauptfunktion verwendet werden
complete
kann (standardmäßig mit TAB aufgerufen).Dieser Ansatz würde gut mit einer anderen Schlüsselbindung funktionieren, die nur für die Vervollständigung von benutzerdefinierten Befehlen verwendet wird, implementiert jedoch einfach nicht die Logik für die vollständige Vervollständigung danach (z. B. spätere Wörter in der Befehlszeile). Dazu müsste man die Befehlszeile analysieren, sich mit der Cursorposition und anderen kniffligen Dingen befassen, die in einem Shell-Skript wahrscheinlich nicht berücksichtigt werden sollten ...
quelle
Ich weiß nicht, ob ich Ihr Bedürfnis danach unterstütze ...
Dies würde bedeuten, dass Ihre Bash nur einen Befehl kennt, der mit beginnt
f
.Eine Grundidee der Vervollständigung ist: Wenn es mehrdeutig ist, drucken Sie die Möglichkeiten.
Sie können also
PATH
ein Verzeichnis festlegen, das nur diesen einen Befehl enthält, und alle integrierten Bash-Funktionen deaktivieren, um diese Funktion zu erhalten.Jedenfalls kann ich Ihnen auch eine Art Workaround geben:
Wenn Sie also Folgendes
_ <Tab>
eingeben, wird abgeschlossen,_ foo
was ausgeführt wirdfoo
.Aber das
alias f='foo'
wäre doch viel einfacher.quelle
Einfache Antwort für Sie wäre zu
nur die Grundausgänge
Fügen Sie einfach Ihr gewünschtes Programm hinzu, um es automatisch zu vervollständigen
quelle
Führen Sie den folgenden Befehl aus, um herauszufinden, wo mplayer binary installiert ist:
ODER verwenden Sie den Pfad zur mplayer-Binärdatei, wenn Sie dies bereits wissen, im folgenden Befehl:
Im Idealfall wird alles, was Sie eingeben, in allen in der
$PATH
Variablen angegebenen Verzeichnissen durchsucht .quelle
mplayer
ist bereits in ihrer$PATH
und sie möchten etwas wiemp<tab>
produzierenmplayer
, anstatt alle Binärdateien, die mitmp
(z. B.mpage
mpcd
mpartition
mplayer
usw.) beginnen