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 screen
campuran. Pada saat itu, screen
meniru 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 vim
dan 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 screen
buffer 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 vim
mengisi seluruh layar, tetapi ketika Anda meninggalkannya maka output terminal yang Anda miliki sebelumnya - semua permintaan masa lalu Anda dan perintah output - kembali lagi. vim
beralih 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.
screen
adalah program lain yang melakukan ini, itulah sebabnya fungsi gulir terminal Anda umumnya tidak berfungsi saat Anda berada di sesi layar - screen
mengemulasi 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 vim
tidak 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 xterm
turunan 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 ncurses
perpustakaan 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 less
perintah. Anda dapat berakhir dengan duplikat atau baris yang hilang di scrollback Anda karena less
menggambar ulang teks di atas dengan cara yang tidak diharapkan terminal Anda. Program lain terkadang mengisi buffer Anda dengan banyak salinan dari seluruh tampilan.