Apa sebenarnya itu scrollback dan buffer scrollback?

23

Apa itu "scrollback" dan "scrollback buffer" dalam program seperti bashdan screen, dan bagaimana hubungannya dengan tty, program yang sedang dijalankan, dan stdin / stdout / stderr?

Inilah satu-satunya definisi "scrollback" yang saya temukan sejauh ini (di archlinux wiki ):

Scrollback adalah fungsi yang diimplementasikan dalam konsol teks untuk memungkinkan pengguna kembali untuk melihat baris teks yang telah digulirkan dari layar. Ini dimungkinkan oleh buffer yang dibuat hanya untuk tujuan ini antara adaptor video dan perangkat layar; buffer scrollback.

Tapi, ini menimbulkan lebih banyak pertanyaan bagi saya:

  • Apakah ini berarti "berfungsi" seperti dalam "subrutin" atau seperti dalam "fitur"?
  • Apakah ada standar atau API Unix untuk buffer scrollback ini?
  • Dalam "tumpukan" program, seperti vimdiluncurkan di screendiluncurkan di bashdiluncurkan di sshdiluncurkan di emulator terminal, yang mana dari program-program ini mengendalikan buffer scrollback?

Saya juga menggunakan screenuntuk membuang scrollback ke file . File ini memiliki banyak ruang putih di bagian atas, dan tampaknya "tampilan" terminal emulator saya menunjukkan kepada saya hanyalah beberapa baris bawah buffer.

  • Apakah ini sebabnya program seperti vimdapat "menghapus" seluruh jendela terminal saya, karena ia mendapat akses sementara ke buffer scrollback shell induk?
  • Atau apakah vimmenggunakan buffer scrollback sendiri yang entah bagaimana ditindih di atas buffer scrollback induk?
Oleg
sumber

Jawaban:

28

Ini sedikit pertanyaan rumit. Saya akan mencoba menjawab pertanyaan Anda secara bergantian, tetapi pertama-tama uraian umum:

Buffer scrollback diterapkan oleh emulator terminal Anda ( xterm, Konsole, Terminal GNOME). Ini berisi semua teks yang telah ditampilkan di layar, termasuk output standar dan kesalahan standar dari setiap program yang Anda jalankan di terminal. Ini sepenuhnya fungsi terminal untuk membiarkan Anda melihat keluaran masa lalu yang mungkin telah menggulir melewati Anda atau untuk memeriksa apa yang dikatakan sesuatu sebelumnya.

Anda dapat menganggap buffer scrollback sebagai halaman panjang dari output yang dicatat dan jendela terminal Anda sebagai jendela yang melihat sebagian saja pada satu waktu. Jika Anda belum menggulirkan apa pun, yang Anda lihat adalah ujung ekor buffer. Biasanya akan ada batas yang dikonfigurasikan di terminal tentang berapa banyak jalur yang dilacak sebelum mulai lupa.

Misalkan batasnya adalah 1000 baris. Untuk seribu baris pertama output dalam sesi Anda, Anda hanya perlu menambahkan buffer, dan Anda dapat menggulir ke kanan ke awal sesi Anda. Segera setelah mendapatkan garis keluaran 1001, baris pertama dalam buffer dihapus, dan bagian terjauh yang dapat Anda gulirkan akan menjadi baris kedua dari sesi Anda. Buffer akan selalu berisi ribuan baris output terbaru yang ditampilkan di layar Anda, dan Anda dapat menggulir ke atas untuk melihat output sebelumnya kapan saja.

  • Apakah ini berarti "berfungsi" seperti dalam "subrutin" atau seperti dalam "fitur"?

    Ini adalah "fungsi" seperti dalam "fitur". Emulator terminal memiliki fungsi yang merekam apa yang ada di layar dan memungkinkan Anda menggulir ke atas dan ke bawah di dalamnya. Konsol pada beberapa sistem juga mendukung scrollback terbatas.

    Ini menjadi sedikit lebih rumit setelah Anda memasukkan screencampuran. Pada saat itu, screenmeniru buffer scrollback itu sendiri - itu sebabnya Anda dapat menyalin dan menempelnya di dalam program, bukan hanya dengan (katakanlah) pilihan X.

  • Apakah ada standar atau API Unix untuk buffer scrollback ini?

    Jawaban singkatnya adalah tidak, hanya disediakan oleh terminal Anda. Jawaban yang lebih panjang kita akan sampai di bawah.

  • Dalam "tumpukan" program, seperti vim diluncurkan di layar diluncurkan di bash diluncurkan di ssh diluncurkan di terminal emulator, yang mana dari program ini yang mengendalikan buffer scrollback?

    Dalam kasus vimdan bash, mereka sama sekali tidak mengendalikannya (peringatan, sekali lagi, di bawah). Terminal Anda menyediakan buffer scrollback untuk semua program di dalamnya, mulai dari shell Anda. screen, seperti yang disebutkan di atas, mensimulasikan scrollback itu sendiri.

  • Saya juga menggunakan layar untuk membuang scrollback ke file. File ini memiliki banyak ruang putih di bagian atas, dan tampaknya "tampilan" terminal emulator saya menunjukkan kepada saya hanyalah beberapa baris bawah buffer.

    Ini adalah screenbuffer internal. Apa yang ada di layar Anda pada saat itu umumnya adalah apa yang ada di bagian paling bawah buffer.

  • Apakah ini sebabnya program seperti vim dapat "menghapus" seluruh jendela terminal saya, karena ia mendapatkan akses sementara ke buffer scrollback shell induk?

    Inilah salah satu bagian di mana ia menjadi jauh lebih kompleks. Hampir semua emulator terminal berbasis-X sedang mensimulasikan VT100, dan satu hal yang mereka lakukan di sana adalah mendukung "Penyangga Layar Alternatif" . Berbeda dengan buffer biasa yang digunakan untuk sebagian besar interaksi terminal dengan output berurutan, buffer layar alternatif hanyalah ukuran persis terminal Anda. Tidak ada scroll ke atas atau ke bawah karena itu tidak lebih besar dari apa yang ditampilkan.

    Idenya adalah untuk memungkinkan aplikasi layar penuh untuk melakukan apa yang perlu dilakukan tanpa diganggu oleh apa pun yang sudah Anda miliki di layar, dan kemudian membiarkan Anda kembali ke tampilan yang Anda miliki sebelumnya. Itu sebabnya ketika Anda memasukkannya vimmengisi seluruh layar, tetapi ketika Anda meninggalkannya maka output terminal yang Anda miliki sebelumnya - semua permintaan masa lalu Anda dan perintah output - kembali lagi. vimberalih ke buffer layar alternatif ketika mulai dan kembali ke buffer normal ketika keluar.

    Buffer alternatif ini adalah salah satu peringatan yang saya sebutkan di atas. Terkadang, program benar-benar memiliki kemampuan untuk memberitahu terminal apa yang harus dilakukan dengan buffer.

    screenadalah program lain yang melakukan ini, itulah sebabnya fungsi gulir terminal Anda umumnya tidak berfungsi saat Anda berada di sesi layar -  screenmengemulasi buffer gulir mundur itu sendiri, jadi Anda harus menggunakan fungsionalitas internalnya untuk mendapatkan keluaran lama.

  • Atau apakah vim menggunakan buffer scrollback-nya sendiri yang entah bagaimana dilapiskan di atas buffer scrollback induk?

    Saya sebagian besar telah menjawab ini dalam pertanyaan sebelumnya, tetapi jawaban singkat untuk pertanyaan khusus ini adalah vimtidak mendapatkan buffer sementara sendiri, tanpa scrollback, dari terminal, dan kemudian melakukan semua pengguliran sendiri dokumen Anda secara internal.

Semua pengecualian yang saya sebutkan:

Menjadi sedikit lebih rumit lagi. Saya mengatakan bahwa aplikasi tidak memiliki kendali atas scrollback dan disediakan sepenuhnya oleh terminal. Dalam beberapa kasus, dengan beberapa terminal, ada interaksi terbatas. Program ini mencetak urutan pelarian tertentu - jika Anda pernah menggunakan pewarnaan terminal secara manual di masa lalu Anda akan melihat seperti apa tampilannya - dan terminal dapat menafsirkannya dan mengubah perilakunya, atau bahkan mengirim kembali informasi ke program. Urutan melarikan diri mana yang tersedia dijelaskan dalam basis data termcap (kemampuan terminal) .

Beberapa terminal mendukung permintaan terbatas dan manipulasi buffer scrollback. Banyak xtermturunan memiliki urutan pelarian yang mengarahkan terminal untuk menggulirkan pandangannya. Banyak terminal juga mendukung menentukan area tertentu dari layar untuk menggulir, membiarkan semua sisanya tetap utuh. Itu cenderung merusak buffer scrollback.

Hampir semua terminal mendukung urutan untuk memindahkan kursor di sekitar layar, yang merupakan cara ncursesperpustakaan dapat memperbarui semua bagian tampilan yang berbeda. Anda dapat melihat urutan VT100 yang didukung olehxterm . Cara ini berinteraksi dengan buffer scrollback kadang-kadang agak aneh, terutama dalam hal sesuatu yang mengimplementasikan perilaku penggulirannya sendiri, seperti lessperintah. Anda dapat berakhir dengan duplikat atau baris yang hilang di scrollback Anda karena lessmenggambar ulang teks di atas dengan cara yang tidak diharapkan terminal Anda. Program lain terkadang mengisi buffer Anda dengan banyak salinan dari seluruh tampilan.

Michael Homer
sumber
1
Terima kasih banyak atas jawaban yang bagus ini! Ini sangat lengkap dan mudah dimengerti meskipun topiknya kompleks. Detail ekstra membuat saya ingin belajar lebih banyak dan menunjukkan kepada saya di mana harus mencari.
Oleg
1
Beberapa terminal memiliki opsi untuk scrollback tanpa batas, apakah ini berarti seluruh scrollback adalah RAM (jadi pada titik tertentu kita akan mendapatkan kegagalan malloc atau OOM di terminal), atau apakah ia mencoba menulis ke disk dan memuat dari disk saat Anda gulir? Jenis program obrolan yang disukai.
CMCDragonkai
Escape sequence untuk query umumnya tidak dalam termcap (juga tidak umumnya dalam terminfo, yang akan lebih lengkap).
Thomas Dickey
@CMCDragonkai Konsole menyimpan scrollback terbatas di dalam memori, tetapi menempatkan scrollback tak terhingga pada disk tidak terenkripsi; Anda diperingatkan tentang hal itu pada dialog pengaturannya. VTE (gnome-terminal dan lainnya) menyimpan scrollback (terbatas atau tak terbatas) pada disk, dikompresi dan dienkripsi. Saya tidak tahu apa yang dilakukan emulator lain.
egmont