ZSHが強調表示されたパーセント記号で行を終了するのはなぜですか?

ZSHが強調表示されたパーセント記号で行を終了するのはなぜですか?

私は時々さまざまなアプリケーションでこれを見つけました。私はしばしばこれが出力が早く取り消され(例えば、ctrl + c)、zshが改行文字を埋めているからだと思います。しかし、今ではbashでは実行されていないようだったので、好奇心が大きくなりました。

扱いにくい

扱いにくい

強く打つ

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

このSequenceプログラムは、コンパイルして実行されていることを確認するためにJava認証のために読んでいた本からのものです。私はそれがprintln()パッケージ/クラスのメソッドを使用しないことがわかりました。System.out代わりに通常のoldを使用してくださいprint()

改行がないため、この記号は表示されますか?

答え1

はい、これは「部分線」なので発生します。そして基本的にzshの上書きを求めるメッセージを避けるには、次の行に進みます。

部分行を維持すると、デフォルトでは部分行の末尾に反転+太字が表示されます。一般ユーザーの場合は「%」、ルートの場合は「#」と表示されます。設定されている場合は、シェルパラメータPROMPT_EOL_MARKを使用して部分行末の表示方法をカスタマイズできます。

答え2

zshfishこれは、コマンド出力で終了していない行を明確に見ることができる特定の機能でした。

既存のシェルでは、コマンドが最後の改行文字の後にいくつかのデータを出力する場合、つまりターミナルカーソルを超えている場合いいえ行の先頭で、シェルの次のプロンプトは最終的に次のように終了しなかった最後の行に追加されます。

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文字はカーソルを次の位置に移動します。Next行(そして%維持されます)。それ以外の場合は、スペースと%79個のスペースが1行に表示され、削除されます。

これは、端末が実際にラップされている場合にのみ機能します(例:afterは正しく機能しませんtput rmam)。遅い端末(9600ボードのシリアルラインなど)を使用している場合は、これらの項目が実際に%表示され、各コマンドの後に削除され、zsh機能を無効にすることができます。

set +o prompt_cr +o prompt_sp

このようにして、zsh既存のシェルのように動作します。

$PROMPT_EOL_MARK変数を使用してこのタグを変更することもできます。

答え3

説明する:

%行末のパーセント記号()は、改行文字(\n)が欠落していることを示します。

たとえば、printf "foo"結果は次のようになりますfoo%。文字列に改行文字を追加すると、がprintf "foo\n"生成されますfoo

パーセント記号()を削除する方法%

パーセント記号を削除するには; echo

例:

# Issue
$ print -n "foo"
foo%

# Solution
$ print -n "foo"; echo
foo

関連情報