ZSHがハイライトされたパーセント記号で行を終了するのはなぜですか?


46

さまざまなアプリケーションでこれに気づいたことがあります。出力が早期にキャンセルされたため(たとえば、ctrl + cなど)、またはzshが新しい行の文字を埋めているためだとよく考えていました。しかし、今では好奇心が最高になりました。これはbashでこれを行うようには思えないからです。

zsh

zsh

バッシュ

ここに画像の説明を入力してください

このSequenceプログラムは、Java認定を読んでいる間に本から引用したもので、コンパイルして実行できるかどうかを確認したかっただけです。パッケージ/クラスのprintln()メソッドを使用しないことに気付きましたSystem.out。代わりに、単純な古いを使用しprint()ます。

この記号が表示される理由は、改行文字がないことですか?

回答:


57

はい、これは「部分線」であるために発生します。デフォルトでは、zshは次の行に進み、プロンプトで覆われないようにします

部分的な行が保存されると、デフォルトでは、部分的な行の終わりに逆+太字が表示されます。通常のユーザーの場合は「%」、ルートの場合は「#」です。設定されている場合、シェルパラメータPROMPT_EOL_MARKを使用して、部分的な行の終わりの表示方法をカスタマイズできます。


3
これをテストするために: print -n "this is a test"その後print "this is a test"
SergioAraujo

5
PROMPT_EOL_MARK=''.zshrcに入れて、コマンド出力での末尾の改行とそうでないのとの違いを隠しました。
geekQ

14

これは、コマンドの出力で終端されていない行を明確に表示できるようにするための特定の機能ですzsh(現在fishも同様です)。

従来のシェルでは、コマンドが最後の改行文字の後にデータを出力する場合、つまり、端末カーソルを行の先頭に残さない場合、シェルによる次のプロンプトは最後の終了行に追加されます次のように:

bash-4.4$ printf XXX
XXXbash-4.4$

それはプロンプトを破壊し、特にそのような手の込んだプロンプトXXXを持っている場合、それを見逃すのは簡単です。また、カーソルの位置に影響を与えるため、カーソルを動かしたときに表示の不具合が発生します。

zsh出力%に太字で反転したビデオの文字を含む未終端の行があることを示すことにより、それを回避し、次の行の先頭に次のプロンプトを発行します。

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$

すべてのコマンド%の最後(各プロンプトの前)にその反転ビデオを出力しますが、79スペース(80文字幅の端末を想定)、CR文字(カーソルを最初に戻すもの)が続きます列)および行の最後まで消去するシーケンス(およびプロンプト)。

このように、カーソルが最初の位置にないため、未終了の行があった場合、それらの80文字はカーソルを次の行に移動させます(そして、それ%は残ります)。そうでない場合%、その79個のスペースは1行になり、後で削除されます。

これは、端末が行を折り返す場合にのみ機能します(たとえば、後に正常に機能しませんtput rmam)。遅い端末(9600ボーシリアルラインなど)がある場合は、実際%に表示され、各コマンドの後に削除されるので、zshその機能を無効にできます。

unsetopt prompt_cr prompt_sp

そのように、zsh従来のシェルのように動作します。

$PROMPT_EOL_MARK変数でそのマークを変更することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.