Bash Clearコマンドの奇妙な動作により、スクロールバックバッファが削除されます。

Bash Clearコマンドの奇妙な動作により、スクロールバックバッファが削除されます。

端末でClearを実行するたびに、画面の上部から現在の行までスクロールバックバッファが削除されます。 xterm、st、urxvtで試してみましたが、問題は同じです。スクロールバックバッファに触れないようにクリア動作を変更する方法はありますか?

答え1

「画面の上から現在の行まで」というコメントがあいまいです。上で言うなら見える部分画面に見えるのはそれではありません。ロールバック。ターミナルのスクロールバックは、スクロールバー(またはShift pageupなどの適切なキー)を使用してのみ表示できる部分です。

XTerm制御シーケンス関連エスケープシーケンスのロギング:

CSI Ps J  Erase in Display (ED).
            Ps = 0  -> Erase Below (default).
            Ps = 1  -> Erase Above.
            Ps = 2  -> Erase All.
            Ps = 3  -> Erase Saved Lines (xterm).

端末記述機能はclear最後から2番目を使用します。例:

clear=\E[H\E[2J

カーソルを左上に置き、全体(表示)画面を消去します。あなたできる使用以下を削除ただし、端末の説明には使用されません。

参照をクリアロールバック:これは元のxterm(1999年、記録済みctlseqs.msただし、変更には言及されていません)以降(2011年) は、Linuxコンソールとその端末記述の拡張として実装されています。ターミナルデータベースには、次のようにリストされます。「その他の拡張」

現在、これらの端末記述には次の特徴があります。

  • Linux3.0(現在のデフォルトは「linux」)
  • パテ
  • xterm+基本(ほとんどの「xterm」変形に使用されるビルディングブロック)

xtermなどのVTEでサポートされているかどうかは、テストで答える必要があります(VTEまたはKonsoleに関する有用な文書はありません)。

拡張機能を使用したくない場合は削除できます。E3使用中の端末記述の機能(例:

infocmp -1x >foo
edit foo, removing the line with "E3="
tic -x foo

オプションを使用することをお勧めします-1そして-xフォーマットを簡素化し、変更したい機能を表示します。に与えられた例https://ghostbin.com/paste/kfsbjこの推奨事項に従って:

  • /home/flowerpick/.terminfo/x/xtermncursesはパス名を使用します
  • 機能AXとは、オプションとともに表示されるXT拡張機能です。E3-x

複数の端末タイプを使用している場合は、各端末タイプ(値)に対して$TERMこれを行う必要があり、変更は実行中のコンピュータにのみ適用されますclear。出力の最初の数行は、現在infocmp処理中の出力行を示しています。

#   Reconstructed via infocmp from file: /home/flowerpick/.terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),

たとえば、次のようにuxrvt設定すると、次の行が生成されます。$TERMrxvt-unicodeinfocmp

#       Reconstructed via infocmp from file: /lib/terminfo/r/rxvt-unicode       
rxvt-unicode|rxvt-unicode terminal (X Window System),

このプログラムは(またはその可能性があります)をst使用しますが、しばらくこのプログラムのコピーを見たことがありません。xtermxterm-256colorそれそれはうまく機能し、レビューする価値があります。

しかし、あなたはできる特定のエスケープシーケンスを送信するエイリアスclear(ターミナル説明を無視)がありますが、それを報告する人は見たことがありません。

「上記の項目を消去」を実行するには、「消去」を入力するのと同じくらい簡単ではありません。エスケープ文字は\033[1J左上から現在のカーソル位置まで消去されます。これを行うスクリプトを作成できます。ワイヤー現在のカーソルの上:

  • カーソル位置レポートを使用して、現在カーソルがある行/列を見つけます。
  • カーソルが最初の行にない場合(該当する場所を保存)、カーソルを1行上に移動して(順番にhpa正しい多く、
  • 「上記の消去」問題を解決し、
  • cup(カーソルアドレス指定)を使用すると元の位置に戻ります.

カーソル位置報告機能がある部分が(たとえば)readlineバインディングと機能しないようでスクリプトを提案しました。最初の行に問題が存在しない場合は、保存/復元カーソル機能を使用するバインディングを作成できます。

答え2

.bashrc私は同じ問題があり、ヘルプにエイリアスを追加しました。

alias clear='printf "\E[H\E[2J"'

注意:.bashrc新しい端末を開くと、変更が適用されます!

答え3

私はしばしばclearコマンドプロンプトを使用して画面の上部に移動し、以前の操作の有用なエラーメッセージなどの重要なコンテンツを含むスクロールバックバッファを誤って削除します。

マニュアルページを確認すると、次のように明確に表示されます。

クリアは、可能であればスクロールバックバッファを含む画面を消去します(拡張「E3」機能が定義されている場合)。

そこには次のオプションもあります。

-x拡張「E3」機能を使用して端末のスクロールバックバッファを消去しようとしないでください。

それ以来、~/.bashrcのエイリアスリストに追加しました。

alias clear='clear -x'

実行すると、まだ上に移動するように求められますが、clear必要に応じてさらに上にスクロールできます。

答え4

私の解決策は、私の名前に次のエイリアスを追加することでした。.bashrc

alias clear='tput reset'

スクロールバックバッファから機密情報を消去するなどの元の動作を使用するには、\次のようにバックスラッシュを追加してエイリアシングされていないバージョンを簡単に呼び出すことができます。ここまたはここ。それは次のとおりです

\clear

関連情報