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, mc
dass Sie in den Befehlsverlauf geschrieben werden). Während der zweite gerade beginnt mc
. zle reset-prompt
ist optional, mc
kann jedoch den Cursor beim Beenden an ungeraden Positionen belassen.