Bagaimana cara mereset scrollback di terminal melalui perintah shell?

41

Saat menggunakan Terminal.app, Anda dapat menghapus layar dengan menggunakan shell builtin clearatau dengan menekan ^+ L(Control-L).

Namun, semua ini dilakukan adalah mendorong konten layar saat ini kembali satu ketinggian layar dan mengatur ulang kursor / input di baris pertama. Berarti Anda masih dapat menggulir ke belakang dan melihatnya.

Apa yang Anda juga dapat lakukan, adalah mengatur ulang seluruh scrollback Anda dengan menekan + K(Command-K).

Setelah melakukan ini, Anda tidak dapat menggulir kembali sama sekali.

Dalam situasi tertentu (terutama, sebelum menjalankan screenatau vim), saya ingin mengatur ulang gulir kembali sebelum perintah benar-benar dijalankan.

Apakah ada perintah (seperti clear) yang diterapkan di OS X yang memungkinkan saya untuk melakukan ini? Mengingat keberadaan pbcopydan pbpaste, saya berpikir mungkin ada sesuatu yang serupa yang akan memungkinkan saya untuk melakukan ini.

Jason Salaz
sumber
Seperti yang dikatakan oleh Chris Pages dalam perintah Terminal use: clear && printf '\e[3J' (Anda telah memilih jawaban yang salah sebagai jawaban yang benar!)
Cyborg

Jawaban:

57

Terminal mendukung ekstensi dari urutan pelepasan ED (Erase in Display) untuk menghapus scroll-back. Ini juga didukung oleh xterm. Perintah ED, yang dijelaskan dalam manual VT100 , menerima nilai-nilai ini untuk parameter Ps:

ESC [Ps J

Parameter Parameter Arti

0 Hapus dari posisi aktif ke ujung layar
1 Hapus dari awal layar ke posisi aktif
2 Hapus semua tampilan

Terminal ( dan xterm ) menambahkan:

3 Hapus scroll-back (alias “Garis Tersimpan”)

Perhatikan bahwa ini hanya menghapus scroll-back, bukan layar. Ini memungkinkan Anda untuk menghapus satu atau yang lain, atau keduanya dengan mengirimkan dua urutan pelarian.

Misalnya, Anda dapat menghapus layar dan scroll-back dengan perintah shell berikut: clear && printf '\e[3J'

( clearPerintah mencari urutan yang sesuai untuk membersihkan layar untuk terminal saat ini, tetapi urutan melarikan diri "hapus gulir-kembali" adalah adat dan harus dikodekan dengan keras. Jika Anda memasukkan ini ke dalam skrip shell yang tidak Anda ketahui pasti akan hanya pernah dijalankan dengan Terminal, Anda harus memeriksa bahwa $TERM_PROGRAMadalah Apple_Terminalsebelum mengirimnya.)

Chris Page
sumber
4
Ini jauh lebih cepat daripada osascript!
Sergei
3
Ini jawaban yang jauh lebih baik. Jadi, untuk menjadikan ini permanen, tambahkan ke ~ / .bash_profile Anda: alias clear="clear && printf '\e[3J'"
Tom
1
Saya meletakkan skrip ini di PATH saya:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV
2
@WalkerHaleIV Mengapa Anda membuat executable bukan hanya mencetak urutan escape ke stdout?
Chris Page
1
$ TERM_APPLICATION seharusnya $ TERM_PROGRAM
pbatey
30

⌘K, pintas ke “View> Clear scrollback”.

PEMBARUAN : Ini dapat diotomatisasi dengan AppleScript dengan perintah berikut:

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

... yang tentunya aliasdapat Anda lakukan untuk apa pun yang Anda inginkan, atau simpan dalam suatu fungsi di ~/.profileskrip login Anda :)

Sebagai pengamanan, untuk dapat menggunakan ini bahkan di latar belakang tanpa risiko mengeluarkan keystroke ke aplikasi depan yang salah, saya menyarankan mengatasinya dengan tes berikut:

if application "Terminal" is frontmost

... yang memberi kita kode berikut:

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

... yang pada gilirannya, lolos dan aliasdiedit dengan benar , berakhir dengan:

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

Dan ini baru Anda clear! :)

MattiSG
sumber
Intinya di sini adalah saya ingin mengatur sesuatu di lingkungan shell saya sehingga ketika saya menjalankan perintah (katakanlah vim), shell mengeksekusi "scrollback reset" sebelum menjalankan vim. Programatis, bukan interaktif.
Jason Salaz
1
@ Jason Salaz Ok, tidak mengerti, maaf. Kode tambahan untuk itu.
MattiSG
1
@JasonSalaz jika jawaban ini memang menyelesaikan masalah Anda, harap ingat untuk memvalidasinya. Jika tidak, silakan kembali ke kami di komentar :) Ingat, pengguna dari masa depan akan berterima kasih;)
MattiSG
Komik itu tentang saya, Anda tahu. Saya melakukan program di Denver, CO. (Tidak, tidak juga, itu akan menjadi gila jika memang demikian.)
Jason Salaz
Ini tidak bekerja untuk saya. Sejauh yang saya tahu, itu sama dengan mengetik clear; Yaitu, itu membersihkan layar, tapi saya masih bisa menggulir ke belakang. Memukul Command Kberfungsi normal.
Zev Eisenberg
7

Berikut kode yang berfungsi untuk Terminal macOS, dan iTerm2. Tidak perlu jendela berada di latar depan, baik.

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

Bagaimana itu bekerja

Ini adalah komposisi dari 3 urutan pelarian ANSI , khususnya perintah "Control Sequence Introducer" .

\033adalah urutan pelarian yang menyandikan titik kode untuk karakter yang diwakilinya. Pelopor 0menunjukkan bahwa sisa urutan mengkodekan nilai oktal, dalam hal ini, 33dalam oktal. Nilai desimalnya adalah 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27). Dalam ASCII, titik kode 27adalah karakter "ESC" (escape).

CSIperintah mulai dengan ESC [, alias \033[. Mengetahui hal ini, kita dapat membagi string menjadi 3 bagian.

  1. CSI 2 J
    • Ini adalah turunan dari perintah "ED - Erase in Display", yang memiliki formulir CSI n J
    • The nnilai diatur ke 2dalam kasus ini, yang memanggil varian kedua: "Jika n adalah 2, seluruh layar jelas (dan bergerak kursor ke atas kiri pada DOS ANSI.SYS)."
  2. CSI 3 J:
    • Ini adalah turunan dari perintah "ED - Erase in Display", yang memiliki formulir CSI n J
    • The nnilai diatur ke 3dalam kasus ini, yang memanggil ketiga varian: "Jika n adalah 3, seluruh layar jelas dan menghapus semua baris yang disimpan dalam buffer scrollback (fitur ini telah ditambahkan untuk xterm dan didukung oleh aplikasi terminal lain)."
  3. CSI 1 ; 1 H:
    • Ini adalah turunan dari perintah "ED - Erase in Display", yang memiliki formulir CSI n ; m H

      Memindahkan kursor ke baris n, kolom m. Nilai-nilai berbasis 1, dan default ke 1 (sudut kiri atas) jika dihilangkan. Urutan seperti CSI ;5Hsinonim untuk CSI 1;5Hdan CSI 17;Hsama dengan CSI 17H danCSI 17;1H

    • Nilai ndan mkeduanya diatur ke 1, yang berarti perintah ini memindahkan kursor ke sudut paling kiri atas.
Alexander - Pasang kembali Monica
sumber
Bisakah saya bertanya dari mana Anda mendapatkannya? +1 dari saya - tetap berfungsi
rbrtl
1
Saya tidak ingat, tapi ini adalah komposisi ini: en.wikipedia.org/wiki/ANSI_escape_code
Alexander - Reinstate Monica
1
Sepertinya itu " CSI n J" (di mana n = 2) + " CSI n J" (di mana n = 3) + " CSI n ; m H" (di mana n, m = 1, 1), yang diterjemahkan menjadi: "ED - Hapus dalam Tampilan" (varian 2), "ED - Hapus dalam Tampilan" (varian 3), "CUP - Posisi Kursor" (pindah ke 1, 1)
Alexander - Reinstate Monica