When the preexec
function is called, zle
is already finished and hence, zle widgets can't be used any more.
So, you have to intercept the pressing of the ENTER
key before zle
terminates. By default ENTER
is bound to accept-line
, but this might depend on other tricks you already use;
$ bindkey | grep '\^M' "^M" accept-line
We now write a new widget we want to bind to ENTER
instead:
del-prompt-accept-line() { OLD_PROMPT="$PROMPT" PROMPT="> " zle reset-prompt PROMPT="$OLD_PROMPT" zle accept-line }
The logic is taken from your approach. In the last line we call the accept-line
widget or anything else which was executed on pressing ENTER
.
Finally we introduce the new widget to zle
and bind it to 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!