Das benutzerdefinierte Widget von ZSH funktioniert nicht wie ich es sollte

549
Brian Myers

Ich versuche, eine Funktion zu definieren, damit ich den Midnight Commander durch Drücken von Alt- starten kann, aber die Funktion funktioniert einfach nicht.

Ich habe eine Funktion auf einer anderen Site gefunden und geändert und sie so geändert:

function _midnight { zle kill-whole-line zle -U "mc" zle accept-line } zle -N _midnight bindkey '\e,' _midnight 

Und ich denke, ich sage es zu tun:

define _midnight as { erase everything on the line insert "mc" on the command line execute as a shell command } create _midnight as a custom widget bind alt-comma to the widget 

Tatsächlich senden Sie einfach einen Wagenrücklauf und fügen dann mc in die nächste Zeile ein, ohne ihn zu senden.

Ich benutze dies stattdessen, bindkey -s '\e,' '^Umc^Mweil ich irgendwann einen Weg finden möchte, Midnight Commander auszuführen, ohne dass etwas in der Befehlszeile erscheint.

2

1 Antwort auf die Frage

2
Adaephon

Der Grund, warum dies nicht funktioniert, liegt darin, dass zle -U "mc""mc" auf den Eingabestapel verschoben wird und der aktuelle Befehlspuffer nicht ersetzt wird.

Was macht dein Widget eigentlich:

  • leere Zeile
  • setze "mc" auf den Eingabestapel
  • akzeptieren Sie die leere Zeile

Nachdem die Zeile akzeptiert wurde, zieht zsh "mc" aus dem Eingabestapel und fügt den jetzt aktuellen Puffer ein. Daher scheint es, dass das Widget nur "mc" druckt, ohne etwas anderes zu tun.

Das beabsichtigte Ergebnis könnte mit erreicht werden

function _midnight { BUFFER="mc" zle accept-line } 

Man könnte aber auch nur:

function _midnight { mc zle reset-prompt } 

Der Hauptunterschied besteht darin, dass die erste Lösung das emuliert, was Sie tun würden, z. B. indem Sie den Befehl eingeben und ihn akzeptieren (dazu gehört auch, mcdass Sie in den Befehlsverlauf geschrieben werden). Während der zweite gerade beginnt mc. zle reset-promptist optional, mckann jedoch den Cursor beim Beenden an ungeraden Positionen belassen.

Ich habe viel zu lernen. Ich habe den Teil, in dem nothign eigentlich auf die Eingabeaufforderung geschrieben werden muss, völlig verfehlt. Die zweite Lösung ist so elegant. Brian Myers vor 9 Jahren 0