テキストの書式設定に制御シーケンスを使用していますが、予期しない動作が見つかりました。出力するテキストがあり、そのテキストの中央に背景色で強調表示された小さなテキストブロックがあります。元のテキストは非常に長く、複数の行がかかる可能性があるため、中央のカラーテキストブロックが1行から始まり、他の行で終わる複数行になることがあります。端末ウィンドウの下部に到達し、多くのスペースが色に変わるまで、すべてがうまくいくようです。
再現可能なスクリプトは次のとおりです。
# color.sh
echo -e 'default \x1B[43m color \n color \x1B[49m default';
ご覧の\n
とおり、再現のためにテキストブロックに改行を追加しました。しかし、これが私の場合です。テキストが長く、1行に収まらない場合、カラーブロックは複数行に分割されます。結果は次のとおりです。テキストの後には同じ色のスペースが続きます。
# color-long.sh
echo -e 'default default default default default default default default default \x1B[43m color color \x1B[49m default';
Ubuntu 14.04でこの問題が発生しましたが、Yosemite 10.10でも同じ動作を再現できました。
echo
この動作の原因が何であるか、他の出力ユーティリティを使用せずに同じ制御シーケンスを使用して問題を解決する方法を知りたいです。テキストを制御できますが、出力プロセスは制御できません。
\[\x1B[43m\]
のようなシーケンスをラップしようとしましたが、\001\x1B[43m\002
結果が出ず、[]
テキストに内容を追加または認識できないシンボルが出力されるだけです。
答え1
これは最終的な特定の動作である@hildredに同意しますが、いくつかの意見の違いがあります。
- アプリケーションが代替画面(たとえば、適切な端末記述とともにxtermで実行されるフルスクリーンプログラム)に切り替えられると、スクロールバックバッファにテキストは移動されません。
- 「正しい」行動や「間違った」行動はなく、慣例だけがあるだけです。
- 端末設計には(おそらく)独立して関連するいくつかの機能があります。
- 慣例(およびLinuxコンソール、xterm、やや他のrxvtなどのいくつかの例)は、多くの色の端末が同様に動作します。
- ncurses FAQ私の端末に着色されていないスペースが表示されます。詳細については。
ルールは強力な論拠です。プログラムは変更されないこれらのデザインの選択に依存します。問題の原因のいくつかの例については、次のシナリオを検討してください。
- Linux 2.6.26 vt back_color_erase: Linux コンソールドライバの変更により bce モデルが破損しています。ノーウェル #418613。
- xtermの一部の更新により、カーソルの色が新しくスクロールされた行に広がります(xtermで参照)パッチ #242Debianについて#252873と Debian#522141)
最近のVTEバグレポート、#754596興味深い読書を提供します。 VTEの開発者は、動作を変更し、何が起こるのかを見るように提案するようです。
まず、次の開発サイクルでコードを「修正」し(_vte_terminal_cursor_down()で「xterm一致とスクロール時に新しい行を埋める」6行を削除)、問題に苦情を申し立てる人がいるかどうかを確認できます。そうすれば、状況をよりよく理解することができます。
答え2
これはbashとは何の関係もなく、純粋に端末操作(特にスクロール)の効果です。画面の下部に到達して次の行に入力を開始すると、端末はすべてを1行上にスライドして新しい空白行を作成します。 (以前の端末では一番上の行が破棄されます。最新の端末では、一番上の行がスクロールバックバッファにプッシュされます。)パズルは次のようになります。新しい行はどんな色ですか?前景色は見えないので問題ではありませんが、背景色が問題です。 。 。 (黒灰色や白(あるいは実際には同じインデックス黒緑、明緑、琥珀色)になると主張し始めていた時代、黒のみを使った実験もあったが、不満もありました。確かにnew行(または画面消去の場合は全画面)クリア)は現在の背景色を影響を受ける領域の背景色として使用するため、この動作はほとんどの場合正しい操作を実行することを目的としています。
それでは、あなたが望む行動を得るために何をしたいですか?黒い背景(または行の終わり)に戻すと、行の最後にクリアを送信すると、残りの行の背景色が設定されます。