私は、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"