Erstellen erweiterbarer Befehle

Erstellen erweiterbarer Befehle

Ich verwende ZSH über Oh-my-zsh und habe eine nette Funktion entdeckt: Die Shell erweitert meine Befehle, wenn sie in Backticks stehen.

Beispielsweise wird `pwd`+ durch meinen aktuellen Pfad tabersetzt :`pwd`

https://infinit.io/_/DjmxTCK.gif

Ich frage mich, ob es eine relativ einfache Möglichkeit gibt, dasselbe für einige Befehle zu tun, ohne die Backticks verwenden zu müssen. Ich würde das gerne auf einige Aliase (oder Funktionen) anwenden.

Um es klarzustellen: Ich spreche nicht über die Erweiterung von Argumenten eines Befehls, sondern über den Befehl selbst.


Dies ist eine wirklich erstaunliche Funktion, aber nicht genau das, wonach ich gesucht habe. Sofern ich nichts falsch gemacht habe, wird mein Alias ​​dadurch auf das erweitert, wofür der Alias ​​definiert wurde, aber nicht auf das, was das Ergebnis ist. Zum Beispiel hier:

Bildbeschreibung hier eingeben

Ich möchte das Ergebnis dieses Befehls statt des vollständigen Befehls sehen.

Antwort1

Sie können hierfür ein benutzerdefiniertes Zle-Widget verwenden und es per Tastenkombination aufrufen, zum Beispiel Alt+ Tab(identisch mit Esc, Tab).

expand-to-output () {
    BUFFER='$('$BUFFER')'
    CURSOR=0
    zle redisplay
    zle expand-word
}
zle -N expand-to-output
bindkey "^[^I" expand-to-output

Wenn Sie nun einen beliebigen Befehl gefolgt von Alt+ eingeben Tab, wird der gesamte Befehl durch seine Ausgabe ersetzt.Wennder Befehl konnte erfolgreich ausgeführt werden. Wenn der Befehl nicht erfolgreich ausgeführt werden kann, wird die eingegebene Befehlszeile nur umschlossen, $(...)aber nicht erweitert. Wenn Fehlermeldungen aufgetreten sind, sollten diese über dem Bearbeitungspuffer gedruckt werden. Dies funktioniert möglicherweise bei mehrzeiligen Eingabeaufforderungen nicht zuverlässig.

Erläuterung:

  • expand-to-output () {...}definiert die (neue) expand-to-outputFunktion.
  • BUFFERenthält die aktuelle Befehlszeile
  • BUFFER='$('$BUFFER')'Stellen $(vor und )nach der Befehlszeile. $(...)ist gleichwertig, `...`kann aber verschachtelt werden.
  • CURSORist die Position des Cursors auf der Befehlszeile
  • CURSOR=0setzt den Cursor an den Anfang der (bearbeiteten) Befehlszeile, also auf $. Ohne den Cursor dorthin zu bewegen, kann es passieren, dass zshversucht wird, ein Wort innerhalb von zu erweitern, $(...)anstatt den gesamten Prozess der Ersetzung durchzuführen.
  • zle redisplayzeigt den Editierpuffer erneut an. Dies verhindert Anzeigefehler, falls der erweiterte Befehl etwas ausgibt,stderr(Hinweis: Bei mehrzeiligen Eingabeaufforderungen kann es zu Problemen kommen.)
  • zle expand-wordruft das expand-wordWidget auf, das normalerweise oft im Rahmen der Tab-Vervollständigung aufgerufen wird.
  • zle -N expand-to-outputregistriert die Funktion als gleichnamiges Widget.
  • bindkey "^[^I" expand-to-outputbindet das expand-to-outputWidget an Alt+ Tab.

verwandte Informationen