シェルコマンドを使用してターミナルのスクロールバックをリセットするにはどうすればよいですか?


41

Terminal.appを使用している場合は、組み込みのシェルを使用するclearか、^+ L(Control-L)を押して画面をクリアできます。

ただし、これはすべて、現在の画面コンテンツを1画面高さに戻し、最初の行でカーソル/入力をリセットするだけです。つまり、スクロールバックして表示できます。

また、+ K(Command-K)を押すと、スクロールバック全体がリセットされます。

これを行った後は、まったくスクロールバックできません。

特定の状況(特に、実行前screenまたはvim)で、コマンドが実際に実行される前にスクロールをリセットしたいと思います。

clearOS Xに実装され、これを実行できるコマンド(など)はありますか?との存在を考えるpbcopypbpaste、これを可能にする同様の何かが存在するかもしれないと考えています。


ターミナル使用コマンドでChris Pagesの回答にあるようにclear && printf '\e[3J' (正しい答えとして間違った答えを選択しました!)
サイボーグ

回答:


57

ターミナルは、スクロールバックを消去するためのED(ディスプレイの消去)エスケープシーケンスの拡張をサポートしています。xtermでもサポートされています。VT100マニュアルで説明されているEDコマンドは、Psパラメーターにこれらの値を受け入れます。

ESC [Ps J

パラメータパラメータ意味

0アクティブな位置から画面の最後まで消去します
1画面の先頭からアクティブな位置まで消去します
2ディスプレイをすべて消去します

ターミナル(およびxterm)は以下を追加します:

3スクロールバックを消去します(別名「保存された行」)

これは、画面ではなくスクロールバックのみを消去することに注意してください。これにより、2つのエスケープシーケンスを送信して、どちらか、または両方を消去できます。

たとえば、次のシェルコマンドを使用して、画面とスクロールバックをクリアできます。 clear && printf '\e[3J'

clearコマンドは、現在の端末の画面をクリアするための適切なシーケンスを検索しますが、「スクロールバックの消去」エスケープシーケンスはカスタムであり、ハードコーディングする必要があります。これを知らないシェルスクリプトに入れた場合ターミナルで実行する特定の意志のために、あなたはそれが確認すべき$TERM_PROGRAMであるApple_Terminal、それを送信する前に。)


4
これはosascriptよりもはるかに高速です!
セルゲイ

3
これははるかに良い答えです。したがって、これを永続的にするには、〜/ .bash_profileに追加します。– alias clear="clear && printf '\e[3J'"
トム

1
私は私のPATHにこのスクリプトを置く:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
ウォーカー・ヘイルIV

2
@WalkerHaleIVエスケープシーケンスを標準出力に出力するだけでなく、実行可能ファイルを作成するのはなぜですか?
クリスページ

1
$ TERM_APPLICATIONは$ TERM_PROGRAMである必要があります
pbatey

30

⌘K、「表示>スクロールバックのクリア」へのショートカット。

更新:これは、次のコマンドによってAppleScriptで自動化できます。

osascript -e 'tell application "System Events" to keystroke "k" using command down'

…もちろんalias、あなたが望むものなら何でも、あるいは~/.profileログインスクリプトの関数に保存できます:)

ただし、セキュリティとして、間違ったフロントアプリにキーストロークを発行するリスクを負うことなくバックグラウンドでもこれを使用できるようにするには、次のテストでそれを囲むことをお勧めします。

if application "Terminal" is frontmost

…次のコードが得られます。

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

…次に、適切にエスケープされてalias編集され、次のようになります。

alias clear="osascript -e 'if application \"Terminal\" is frontmost then tell application \"System Events\" to keystroke \"k\" using command down'"

そして、ここにあなたの新しいclearです!:)


ここでのポイントは、シェル環境で何かを設定して、コマンド(たとえばvim)を実行すると、vimを実行する前に「スクロールリセット」が実行されるようにすることです。インタラクティブではなく、プログラムです。
ジェイソンサラズ

1
@JasonSalazわかりました、わかりませんでした、ごめんなさい。そのためのコードを追加しました。
MattiSG

1
@JasonSalazこの回答で問題が解決した場合は、忘れずに検証してください。そうでなかったら、コメントで私達に戻ってください:) 未来のユーザーはあなたに感謝することを忘れないでください;)
MattiSG

あの漫画は私に関するものですよね。Iコロラド州デンバーでプログラムを実行します(それがなかった場合は、[いいえ、本当に、それは非常識だろうではない、けれども。)。
ジェイソンSalaz

これは私には機能しません。私が知る限り、これはタイピングclearと同等です。つまり、画面はクリアされますが、スクロールバックできます。打撃Command Kは正常に機能します。
ゼフアイゼンバーグ14年

7

以下は、macOSのターミナルとiTerm2の両方で機能するコードです。ウィンドウが前面にある必要もありません。

printf '\033[2J\033[3J\033[1;1H'

使い方

これは、3つのANSIエスケープシーケンス、特に「Control Sequence Introducer」コマンドの構成です。

\033は、それが表す文字のコードポイントをハードコードするエスケープシーケンスです。先頭0は、シーケンスの残りの部分が8進数(この場合は8進数)をエンコードすることを示します33。その10進値は273 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27)です。ASCIIでは、コードポイント27は「ESC」(エスケープ)文字です。

CSIコマンドはESC [、akaで始まります\033[。これを知って、文字列を3つの部分に分割できます。

  1. CSI 2 J
    • これは、「ED –ディスプレイで消去」コマンドのインスタンスで、次の形式をとります。 CSI n J
    • n値に設定されている2第二の変形例を呼び出すこの場合、「nが2、クリア画面全体である(そして移動は、上部DOS ANSI.SYSに左にカーソル)場合。」
  2. CSI 3 J
    • これは、「ED –ディスプレイで消去」コマンドのインスタンスで、次の形式をとります。 CSI n J
    • n値に設定されている3「(この機能はxtermのために加え、他の端末のアプリケーションによってサポートされている)場合はnは3であり、明確な全体画面スクロールバックバッファに保存されたすべての行を削除します。」:第三の変異体を呼び出しており、この場合には
  3. CSI 1 ; 1 H
    • これは、「ED –ディスプレイで消去」コマンドのインスタンスで、次の形式をとります。 CSI n ; m H

      カーソルをrow n、columnに移動しますm。値は1から始まり、省略した場合のデフォルトは1(左上隅)です。このような配列CSI ;5Hの同義語であるCSI 1;5Hと同様にCSI 17;HCSIの17Hと同じであり、CSI 17;1H

    • 値の両方にセットされ、このコマンドは、最左端の隅にカーソルを移動させる意味します。nm1

どこから来たのか聞いてもいいですか?1私から-それはとにかく動作します
rbrtl

1
覚えていませんが、これらの構成です: en.wikipedia.org/wiki/ANSI_escape_code
Alexander-Reinstate Monica

1
" CSI n J"(where n = 2)+ " CSI n J"(where n = 3)+ " CSI n ; m H"(where n、m = 1、1)のように見えます。これは、「ED-ディスプレイの消去」(バリアント2)、 「ED-ディスプレイの消去」(バリアント3)、「CUP-カーソル位置」(1、1に移動)
アレクサンダー-モニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.