ZSH: Wie kann man Widgets direkt ZLE?

12

In der Dokumentation in Abschnitt 18.4 Widgets heißt es , dass die Aufgabe eines Widgets einfach darin besteht, eine kleine Aktion auszuführen. Ich kann jedoch keine allgemeine Beschreibung finden, wie diese Aktionen aufgerufen werden, dh wie ein Widget aufgerufen wird.

Ich habe in Beispielen gesehen (siehe zum Beispiel diese Fragen und Antworten ), dass Widgets mithilfe von Schlüsseln an Schlüssel gebunden werden können bindkey KEY WIDGET. Dann kann man das Widget mit aufrufen KEY.

Ich wollte umschalten set-local-historyund versuchte:

$ zle set-local-history 1
zle: widgets can only be called when ZLE is active

zle -hfunktioniert nicht, aber ich habe hier eine Beschreibung der Argumente gefunden . Aber es scheint nicht so etwas zu geben --call.

Was mache ich falsch? Wie ist es möglich, das Widget ohne Bindkey aufzurufen? Wie kann ich den aktuellen Status drucken? ( set-local-historyschaltet den Status um)

lumbrisch
quelle

Antworten:

9

Sie können das Widget über das Widget ausführen execute-named-cmd, das an ESC-x(Emacs-Bindungen) oder :(vi-Bindungen) gebunden ist :

execute-named-cmd (ESC-x) (:) (unbound)

Lesen Sie den Namen eines Editorbefehls und führen Sie ihn aus.

Es öffnet sich ein nach oben Mini-Puffer unterhalb der Befehlszeile, wo Sie zle Widgets beginnen können. (Autocompletion ist verfügbar!):

$ [ESC-x]
execute: set-[TAB]
set-local-history  set-mark-command

zleVerwenden Sie zum Abfragen des Status von (einschließlich des lokalen Verlaufs) die Variable $ZLE_STATE(nur innerhalb der Widget-Funktionen verfügbar):

ZLE_STATE (scalar)

Enthält eine Reihe von durch Leerzeichen getrennten Wörtern, die den aktuellen Zle-Status beschreiben.

Derzeit sind die angezeigten Zustände der Einfügemodus, der durch die Widgets "Überschreibmodus" oder "vi-Ersetzen" festgelegt wurde, und ob Verlaufsbefehle importierte Einträge besuchen, die vom Widget "Set-local-history" gesteuert werden. Die Zeichenfolge enthält, insert ob Zeichen, die in die Befehlszeile eingefügt werden sollen, vorhandene Zeichen nach rechts verschieben oder overwriteob einzufügende Zeichen vorhandene Zeichen überschreiben. Es enthält, localhistoryob nur lokale Verlaufsbefehle besucht werden oder globalhistoryob auch importierte Verlaufsbefehle besucht werden.

Die Teilzeichenfolgen sind in alphabetischer Reihenfolge sortiert. Wenn Sie also zukunftssicher auf zwei bestimmte Teilzeichenfolgen testen möchten, können Sie Folgendes tun:

if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi

Alle Zitate aus man zshzle.

mpy
quelle
Äh ja, ich glaube, ich habe beide Zitate bereits gesehen, aber ich habe den Wert in den drei Klammern nicht verstanden. Auf der Manpage heißt es: "Diese speziellen Parameter sind immer in Widget-Funktionen verfügbar, aber außerhalb von ZLE in keiner Weise speziell." Das heißt, um ZLE_STATE zu erhalten, muss ich eine Funktion und ein benutzerdefiniertes Widget definieren, oder?
Lumbric
@ Lumbric: Sie haben Recht, ZLE_STATEwird nur innerhalb von Widget-Funktionen definiert. Ich habe meine Antwort verfeinert. Was ist dein Ziel? [Wilde Vermutung: Um den lokalen / globalen Verlauf in meiner Eingabeaufforderung anzuzeigen, verwende ich ein Widget, um (i.) Eine Shell-Variable zle set-local-history
festzulegen
Mein primäres Ziel war es, das Konzept der Zle-Widgets zu verstehen. Ich spielte mit set-local-history und wollte wissen, ob es derzeit auf global oder lokal eingestellt ist. Ich dachte, es muss ein We geben, um den aktuellen Status zu erhalten (ähnlich wie beim Aufrufen von "setopt", um die aktuell aktivierten Optionen zu erhalten). Mein ursprüngliches Ziel wurde bereits in diesem Q & A gelöst .
Lumbric
1
Ich würde erwarten, dass die Zeichenfolge im if-Test " *globalhistory*insert*" statt " " lautet *insert*globalhistory*, basierend auf dem Lesen des Satzes vor dem Beispiel?
Volker Siegel
@VolkerSiegel: Ein sehr guter Punkt, danke! Ich habe den Quellcode überprüft und das angegebene Beispiel selbst ausprobiert. Dabei bin ich zu dem Schluss gekommen, dass das Beispiel auf der Manpage falsch ist und nicht die Anweisung ("alphabetisch sortiert"). Ich habe meine Antwort bearbeitet und werde einen Pfad zur Mailingliste von zsh-worker senden .
Mpy
1

Wenn Sie verwenden tmux, können Sie den gebundenen Schlüssel mit aufrufen send-keys.

Beispiele:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
Eyal Levin
quelle