web-dev-qa-db-ja.com

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

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

zsh

zsh

bash

enter image description here

Sequenceプログラムは、Java認定を読んでいるときに本から引き出したものであり、コンパイルして実行するかどうかを確認したいと思っていました。 _System.out_パッケージ/クラスのprintln()メソッドではなく、プレーンな古いprint()を使用します。

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

56
jktravis

はい、これは「部分的な行」であるために起こります。そしてデフォルトでは zshは次の行に進み、プロンプトでそれをカバーしないようにします

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

66
Leiaz

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

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

bash-4.4$ printf XXX
XXXbash-4.4$

これはプロンプトを壊します。特に、そのようなより洗練されたプロンプトを持っている場合は、XXXを見逃しがちです。また、カーソルの位置にも影響し、カーソルを移動すると表示に不具合が発生します。

zshは、出力に%文字が太字で反転したビデオで終了していないことを示し、次のプロンプトを次の行の先頭に発行することで、これを回避します。

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

everyコマンドの最後に(各プロンプトの前に)その逆のビデオ%を出力し、その後に79スペース(80文字幅の端末を想定)、CR文字(カーソルが最初の列に戻る原因となる行)と、シーケンスが行の終わりまで消去されます(その後プロンプト)。

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

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

unsetopt Prompt_cr Prompt_sp

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

$Prompt_EOL_MARK変数を使用してそのマークを変更することもできます。

18