Wenn die preexec
Funktion aufgerufen wird, zle
ist sie bereits beendet und daher können Zle-Widgets nicht mehr verwendet werden.
Sie müssen also das Drücken der ENTER
Taste abbrechen, bevor Sie zle
abbrechen. Standardmäßig ENTER
ist dies an gebunden accept-line
, dies kann jedoch von anderen Tricks abhängen, die Sie bereits verwenden.
$ bindkey | grep '\^M' "^M" accept-line
Wir schreiben jetzt ein neues Widget, an das wir ENTER
stattdessen binden wollen :
del-prompt-accept-line() { OLD_PROMPT="$PROMPT" PROMPT="> " zle reset-prompt PROMPT="$OLD_PROMPT" zle accept-line }
Die Logik wird von Ihrem Ansatz übernommen. In der letzten Zeile wird das accept-line
Widget oder etwas anderes aufgerufen, das beim Drücken ausgeführt wurde ENTER
.
Zum Schluss stellen wir das neue Widget vor zle
und binden es an ENTER
:
zle -N del-prompt-accept-line bindkey "^M" del-prompt-accept-line
Et voilà:
> echo foo bar foo bar +------------ Long prompt ----------+ `> echo this is my new command... not pressed ENTER, yet!