ZSH: Eingabeaufforderung kurz vor dem Ausführen des Befehls ändern - zsh, prompt, hook

Ich hätte gerne eine zweizeilige Eingabeaufforderung zsh, aber kurz nach dem Drücken auf eine sehr kleine zusammenklappen ENTERNach der Eingabe von zwei Befehlen sollte das Terminal bei der Eingabe des dritten wie folgt aussehen:

> echo Command 1
Command 1
> echo Command 2
Command 2
+------------ Long prompt ----------+
`> echo typing a new command here…

Ich habe versucht, etwas mit dem zu bekommen preexec Haken und zle reset prompt, aber ich bekomme den Fehler widgets can only be called when ZLE is active:

$ autoload -U add-zsh-hook
$ hook_function() { OLD_PROMPT="$PROMPT"; export PROMPT="> "; zle reset-prompt; export PROMPT="$OLD_PROMPT"; }
$ PROMPT=$"+------------ Long prompt ----------+n`> "
+------------ Long prompt ----------+
`> add-zsh-hook preexec hook_function
+------------ Long prompt ----------+
`> echo Test
hook_function:zle: widgets can only be called when ZLE is active
Test
+------------ Long prompt ----------+
`>

Antworten:

6 fĂĽr Antwort â„– 1

Wenn der preexec Funktion heißt, zle ist bereits fertig und daher können zle - Widgets nicht mehr verwendet werden.

Sie müssen also das Drücken der Taste abfangen ENTER Schlüssel vor zle beendet. Standardmäßig ENTER ist gebunden an accept-lineDies kann jedoch von anderen Tricks abhängen, die Sie bereits anwenden.

$ bindkey | grep "^M"
"^M" accept-line

Wir schreiben jetzt ein neues Widget, an das wir binden möchten ENTER stattdessen:

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 nennen wir die accept-line Widget oder irgendetwas anderes, das beim DrĂĽcken ausgefĂĽhrt wurde ENTER.

Zum Schluss stellen wir Ihnen das neue Widget vor zle und binde 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!