Wie kann ich eine neue Zeile in meine zsh-Eingabeaufforderung einfügen, ohne dass Probleme beim erneuten Zeichnen des Terminals auftreten?

12

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

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

export PROMPT=">
"

Das ist eine zweizeilige Datei. Es gibt eine wörtliche Newline in der Zeichenfolge, die ich an mehreren ( zugegebenermaßen alten ) Stellen gelesen habe . Dies funktioniert so lange, bis ich die Größe des Terminalfensters verändere und dann doppelte Eingabeaufforderungszeichenfolgen erhalte. Wenn ich zum Beispiel ein neues Fenster öffne, sehe ich ( *als Platzhalter für meinen Cursor):

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

Wenn ich dann die Größe des Fensters verändere und es kürzer mache, erhalte ich:

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

Die Anzahl der Ausdrucke für zusätzliche Eingabeaufforderungen scheint in etwa proportional zu sein, wie stark ich die Fenstergröße ändere - normalerweise vertikal. Wenn ich den Zeilenvorschub aus der Eingabeaufforderungszeichenfolge entferne, verschwindet das Problem.

Ich habe verschiedene Dinge ausprobiert, zum Beispiel $(print ">\n"), oder ich habe versucht, den Zeilenvorschub einzuwickeln %{%}. Ich nehme an, das hat damit zu tun, dass Newline verwirrt, was auch immer zeichnet, wie lang die Eingabeaufforderungszeichenfolge tatsächlich ist oder so. Ist dieses Problem behebbar oder muss ich nur damit leben?


quelle

Antworten:

13

Dieses Problem ist darauf zurückzuführen, wie ZSH die Promt bei Größenänderungen nachdruckt, und hat mich auch schon früher geärgert. Die Lösung besteht darin, $PROMPTeinzeilig zu verfassen und die erste Zeile der Eingabeaufforderung mit einem Precmd zu drucken.

In Ihrem Beispiel wäre das einfach:

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

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

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

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

K-os
quelle
1
Für Neulinge wie mich können Sie hier nachlesen, was -rP bedeutet: cs.elte.hu/zsh-manual/zsh_17.html . Es scheint, dass dies printein ZSH-spezifischer Befehl ist, und Googeln unter "Linux Print" liefert keine sehr guten Ergebnisse.
MikeWyatt
printist ein Teil von zsh. Die Hilfe dazu finden Sie in man zshbuiltins. Bash hat seine eigene Entsprechung, aber ich bin nicht sicher, ob sie kompatibel sind.
Jim Stewart
10

Wie wäre es mit so etwas:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"
Đức Thanh Nguyễn
quelle
Diese Lösung gefällt mir besser als die akzeptierte Antwort. es ist mehr tragbar und ermöglicht es mir , das gleiche Skript zwischen meinem zsh und bash - Umgebungen zu halten
verboze