web-dev-qa-db-ja.com

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

Zshプロンプトでマイナーな(しかし厄介な)問題を修正しようとしています。私が目にしている問題は、GUI OS環境(たとえば、Terminal.appまたはOS X 10.7.2の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")や、改行を_%{%}_でラップしようとするなど、さまざまなことを試しました。これは、改行が、プロンプト文字列が実際にどれくらいの長さであるか、または何かと描画されているものを混乱させるという事実に関係していると想定しています。この問題は修正可能ですか、それとも一緒に暮らす必要がありますか?

13
user45283

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

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

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

または、printステートメントでプロンプト拡張を使用したより高度な例では、-rPパラメーターを使用します。

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

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

13
K-os

このようなものはどうですか:

NEWLINE=$'\n'
Prompt="Line1${NEWLINE}LINE2"
11