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

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

ターミナルで clear を実行すると、画面の上から現在の行までのスクロールバック バッファが削除されます。xterm、st、urxvt で試してみましたが、問題は解決しません。スクロールバック バッファに影響しないように clear の動作を変更する方法はありますか?

答え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コンソールの拡張機能として実装されており、対応する端末の説明も含まれています。端末データベースでは、「その他の拡張機能」

現在、これらの端末の説明には次の機能があります:

VTE などの xterm 類似製品でサポートされているかどうかは、テストによって答える必要があります (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プログラムはxterm(またはおそらくxterm-256color)を使用していますが、私が のコピーを見たのは久しぶりです。それコメントするほど十分に機能しました。

ところで、あなたはできた指定されたエスケープ シーケンスを送信するエイリアスがありますclear(端末の説明は無視されます) が、これを報告した人はいません。

「上をクリア」したい場合、「クリア」と入力するほど簡単ではありません。エスケープは\033[1J左上から現在のカーソル位置までを消去します。これを実行するスクリプトを作成して、現在のカーソルの上:

  • カーソル位置レポートを使用して、現在カーソルが置かれている行/列を見つけ、
  • カーソルが最初の行にない場合は(その位置を保存して)、カーソルを1行上に移動してから(シーケンスでhpa)移動します。多数、
  • 「上記クリア」を発行し、
  • (カーソルアドレス指定)を使用して元の位置に戻りますcup

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

答え2

私も同じ問題を抱えていましたが、エイリアスを追加すると.bashrc解決しました:

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

注意: 変更は.bashrc新しいターミナルを開いた後に有効になります。

答え3

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

man ページを確認すると、次のように明記されています。

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

そこにはオプションもあります:

-x 拡張された「E3」機能を使用して端末のスクロールバック バッファをクリアしません。

それ以来、私はこれを ~/.bashrc のエイリアスのリストに追加しました:

alias clear='clear -x'

を実行すると、先頭に移動するように求めるプロンプトが引き続き表示されますclearが、必要に応じてさらに上にスクロールできるようになりました。

答え4

これを解決するには、次のエイリアスを.bashrc

alias clear='tput reset'

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

\clear

関連情報