Wie kann ich in meine ZSH-Eingabeaufforderung eine neue Zeile einfügen, ohne dass es zu Problemen beim Neuzeichnen des Terminals kommt?

Wie kann ich in meine ZSH-Eingabeaufforderung eine neue Zeile einfügen, ohne dass es zu Problemen beim Neuzeichnen des Terminals kommt?

Ich versuche, ein kleines (aber nerviges) Problem mit meiner Zsh-Eingabeaufforderung zu beheben. Das Problem, das ich sehe, ist, dass, wenn ich ein Terminal in einer GUI-Betriebssystemumgebung verwende (z. B. Terminal.app oder iTerm 2 unter OS X 10.7.2) und die Größe des Terminalfensters ändere, das Terminal mit zusätzlichen Eingabeaufforderungen neu gezeichnet wird.

Ich habe das Problem auf einer sauberen .zshrc-Datei reproduziert, die Folgendes enthält:

export PROMPT=">
"

Um es klarzustellen, das ist eine zweizeilige Datei. Es gibt einen wörtlichen Zeilenumbruch in der Zeichenfolge, den ich in mehreren gelesen habe (zugegebenermaßen alt) Stellen ist der richtige Weg. Das funktioniert, bis ich die Größe des Terminalfensters ändere. An diesem Punkt lande ich mit doppelten Eingabeaufforderungszeichenfolgen. Wenn ich beispielsweise ein neues Fenster öffne, sehe ich ( *wird als Platzhalter für meinen Cursor verwendet):

Last login: Wed Jan 25 19:05:06 on ttys000
>
*

Wenn ich dann die Fenstergröße ändere und es kürzer mache, erhalte ich Folgendes:

Last login: Wed Jan 25 19:05:06 on ttys000
>
>
>
>
*

Die Anzahl der zusätzlichen Prompt-Ausdrucke scheint ungefähr proportional dazu zu sein, wie stark ich die Fenstergröße ändere – normalerweise vertikal. Wenn ich die neue Zeile aus der Prompt-Zeichenfolge entferne, ist das Problem behoben.

Ich habe verschiedene Dinge ausprobiert, wie zum Beispiel $(print ">\n"), oder ich habe versucht, die neue Zeile in einzuschließen %{%}. Ich nehme an, das hat damit zu tun, dass die neue Zeile das, was gerade gezeichnet wird, verwirrt, was die Länge der Eingabeaufforderungszeichenfolge betrifft, oder so etwas. Ist dieses Problem behebbar oder muss ich einfach damit leben?

Antwort1

Dieses Problem liegt daran, wie ZSH die Eingabeaufforderung bei Größenänderungsereignissen erneut druckt, und hat mich auch schon früher geärgert. Die Lösung besteht darin, $PROMPTeine einzelne Zeile zu erstellen und die erste Zeile der Eingabeaufforderung mithilfe eines Precmds auszudrucken.

In Ihrem Beispiel wäre das also einfach:

precmd() { print ">" }
export PROMPT=""

oder verwenden Sie für ein anspruchsvolleres Beispiel mit Prompt-Erweiterung in der Druckanweisung die -rPParameter:

precmd() { print -rP "%~" }
export PROMPT="%# "

Wenn Sie mehr als einen Precmd registriert haben, müssen Sie verwenden add-zsh-hook precmd(siehe man zshcontrib).

Antwort2

Wie wäre es mit etwas wie Folgendem:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"

verwandte Informationen