ターミナルの再描画の問題を起こさずに、zsh プロンプトに改行を挿入するにはどうすればよいですか?

ターミナルの再描画の問題を起こさずに、zsh プロンプトに改行を挿入するにはどうすればよいですか?

私は、zsh プロンプトの小さな (しかし厄介な) 問題を修正しようとしています。私が見ている問題は、GUI OS 環境 (たとえば、OS X 10.7.2 の Terminal.app または iTerm 2) でターミナルを使用していて、ターミナル ウィンドウのサイズを変更すると、ターミナルが追加のプロンプトで再描画されることです。

次の内容を含むクリーンな .zshrc で問題を再現しました。

export PROMPT=">
"

明確に言うと、これは2行のファイルです。文字列には文字通りの改行があり、私は何度かそれを読みました(確かに古い) の場所を使用するのが最善の方法です。これは、ターミナル ウィンドウのサイズを変更するまでは機能しますが、その時点でプロンプト文字列が重複してしまいます。たとえば、新しいウィンドウを開くと、*カーソルのプレースホルダーとして ( が使用されていることがわかります。

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

次に、ウィンドウのサイズを変更して短くすると、次のようになります。

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

追加のプロンプト出力の数は、ウィンドウ サイズ (通常は垂直方向) の変更量にほぼ比例しているようです。プロンプト文字列から改行を削除すると、問題は解決します。

$(print ">\n")や、改行を で囲むなど、さまざまなことを試しました%{%}。これは、改行によって、プロンプト文字列が実際にどのくらい長いかなど、描画しているものが混乱するという事実と関係があると思います。この問題は修正可能でしょうか、それともそのまま受け入れるしかないのでしょうか?

答え1

この問題は、ZSH がサイズ変更イベントでプロンプトを再印刷する方法が原因で、以前も私を悩ませていました。解決策は、$PROMPT単一行にして、precmd を使用してプロンプトの最初の行を印刷することです。

したがって、あなたの例では、次のようになります。

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

または、print ステートメントでプロンプトを展開するより洗練された例では、次の-rPパラメータを使用します。

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

複数の precmd が登録されている場合は、 を使用する必要がありますadd-zsh-hook precmd(を参照man zshcontrib)。

答え2

次のようなものはどうでしょうか:

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

関連情報