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


12

私は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")、または改行をラップするなど、さまざまなことを試しました%{%}。これは、プロンプト文字列が実際にどれくらいの長さであるかなどについて、改行が描画しているものを混乱させるという事実に関係していると思います。この問題は解決可能ですか、それとも一緒に生きなければなりませんか?

回答:


13

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

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

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

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

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

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


1
:私のような初心者のために、あなたは-rpがここで何を意味するのか見ることができます cs.elte.hu/zsh-manual/zsh_17.html。これprintはZSH固有のコマンドであり、Googlingの「linux print」ではあまり良い結果が得られないようです。
-MikeWyatt

printzshの一部です。ヘルプはで見ることができますman zshbuiltins。Bashには同等の機能がありますが、互換性があるかどうかはわかりません。
ジムスチュワート

10

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

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

私はこの解決策が受け入れられている答えよりも好きです。それは、より移植性がある、と私は私のzshやbashの環境間で同じスクリプトを維持することができます
verboze
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.