Scrollback ve scrollback buffer tam olarak nedir?


23

Ne "scrollback" ve benzeri programlarda "Scrollback tampon" dir bashve screenve bunlar tty'den nasıl bir ilişkileri, koşmak olmak programları ve Stdin / stdout / stderr?

İşte şimdiye kadar bulduğum "scrollback" nin tek tanımı ( archlinux wiki'de ):

Scrollback, bir metin konsolunda uygulanan ve kullanıcının ekrandan kayan metin satırlarını görüntülemesine izin veren bir fonksiyondur. Bu, yalnızca bu amaç için video bağdaştırıcısı ve görüntü aygıtı arasında oluşturulan bir arabellekle mümkün olur; kaydırma tamponu.

Ancak, bu benim için daha fazla soru ortaya çıkarır:

  • "Alt yordam" veya "özellik" gibi "işlev" anlamına mı geliyor?
  • Bu geri kaydırma tamponu için bir Unix standardı veya API var mı?
  • Gibi programlar bir "yığın", in vimbaşlatılan screenbaşlatılan bashbaşlatılan sshscrollback tampon kontrol edilmektedir Bu programların olan, bir terminal emülatörü başlatılan?

Ben de kullanılabilir screenüzere bir dosyaya scrollback dökümü . Bu dosyanın üstünde çok fazla beyaz boşluk vardı ve uçbirim öykünücüsünün bana sadece tamponun altındaki birkaç satır olduğunu gösteriyor.

  • Bu nedenle, böyle bir program vimana pencerenin kaydırma kaydırma arabelleğine geçici olarak erişebildiği için tüm terminal penceremi "temizleyebilir" mi?
  • Yoksa bir vimşekilde üst kaydırma kaydırma arabelleğinin üzerine bindirilmiş kendi kaydırma kaydırma tamponunu mu kullanıyor?

Yanıtlar:


28

Bu biraz karmaşık bir soru. Sorularınıza sırayla cevap vermeye çalışacağım ama önce genel bir açıklama:

Scrollback buffer, terminal emülatörünüz ( xterm, Konsole, GNOME Terminal) tarafından uygulanır. Terminalde çalıştırdığınız her programdan hem standart çıktı hem de standart hata dahil olmak üzere ekranda görüntülenen tüm metni içerir. Geçmişte ilerlemiş olabilecek geçmiş çıktılara bakmanıza veya daha önce ne söylediğini kontrol etmenize izin vermek tamamen terminal işlevselliğidir.

Kaydırma arabelleğini uzun bir giriş çıktısı sayfası ve terminal pencerenizin herhangi bir zamanda bir kısmına bakan bir pencere olarak düşünebilirsiniz. Eğer yukarı kaydırmadıysanız, aradığınız şey tamponun arka ucu. Genellikle, terminalde, unutmaya başlamadan önce kaç tane hattın tutulduğu hakkında bir sınırlama olacaktır.

Bu sınırın 1000 satır olduğunu varsayalım. Oturumunuzdaki ilk bin çıktı satırı için yalnızca arabellek eklersiniz ve oturumunuzun başlangıcına doğru yukarı ilerleyebilirsiniz. 1001'inci çıktı çizgisini alır almaz arabellekteki ilk satır silinir ve kaydırma yapabileceğiniz en geri kısım, oturumunuzun ikinci satırı olur. Arabellek her zaman ekranınızda görüntülenen en son bin çıktı satırını içerecektir ve istediğiniz zaman önceki çıktılara bakmak için yukarı kaydırın.

  • "Alt yordam" veya "özellik" gibi "işlev" anlamına mı geliyor?

    Bu, "özellik" te olduğu gibi "işlev" dir. Terminal emülatörü ekranda olanları kaydeden bir fonksiyona sahiptir ve içinde aşağı ve yukarı kaydırmanıza izin verir. Bazı sistemlerdeki konsollar ayrıca sınırlı geri sarma işlemini de destekler.

    screenKarışıma attığınızda biraz daha karmaşıklaşır . Bu noktada, screenscrollback buffer'ın kendisini taklit ediyor - işte bu yüzden programdan kopyalayıp yapıştırabilirsiniz, yalnızca (say) X seçimiyle.

  • Bu geri kaydırma tamponu için bir Unix standardı veya API var mı?

    Kısa cevap hayır, sadece terminaliniz tarafından sağlanıyor. Ne kadar uzun cevap dibe ulaşacağız.

  • Bir terminal öykünücüsünde başlatılan ssh'de başlatılan bass içinde başlatılan vim ekranında başlatılan vim gibi programların bir "yığınında", bu programlardan hangisi geri kaydırma arabelleğini kontrol ediyor?

    Durumda vimve bashhiç kontrol etmiyorlar (yine ihmal etmeyin). Terminaliniz, kabuğunuzdan başlayarak içindeki tüm programlar için geri kaydırma tamponu sağlar. screenyukarıda bahsedildiği gibi, geri tepme kendini simüle ediyor.

  • Ayrıca, geri kaydırma işlemini bir dosyaya aktarmak için ekranı kullandım. Bu dosyanın üstünde çok fazla beyaz boşluk vardı ve uçbirim öykünücüsünün bana sadece tamponun altındaki birkaç satır olduğunu gösteriyor.

    Bu screendahili tampon. O sırada ekranınızdakiler genellikle arabelleklerin en altındakileri olacaktır.

  • Bu nedenle vim gibi bir program, ana kabuğun kaydırma kaydırma arabelleğine geçici olarak erişebildiği için tüm terminal penceremi "temizleyebilir" mi?

    İşte daha karmaşık hale geldiği yerin bir kısmı. Hemen hemen tüm X tabanlı terminal emülatörleri bir VT100'ü simüle ediyor ve orada yaptıkları bir şey "Alternatif Ekran Tamponunu" destekliyor . Sıralı çıkışla çoğu terminal etkileşimi için kullanılan sıradan tamponun aksine, alternatif ekran tamponu terminalinizin tam boyutudur. Yukarı veya aşağı kaydırma yok çünkü gösterilenden daha büyük değil.

    Buradaki fikir, tam ekran bir uygulamanın, ekranda bulunan herhangi bir şey tarafından engellenmeden yapılması gerekenleri yapmasına izin vermek ve daha sonra tam olarak önceki ekrana geri dönmenizi sağlamaktır. Bu yüzden girdiğinizde vimtüm ekranı doldurur, ancak bıraktığınızda daha önce sahip olduğunuz terminal çıkışı - tüm geçmiş istemleriniz ve komut çıkışı- tekrar gelir. vimbaşladığında alternatif ekran arabelleğine ve çıkışta normal arabelleğe geri döner.

    Bu alternatif tampon, yukarıda bahsettiğim uyarılardan biri. Bazen, program gerçekten terminale arabellek ile ne yapacağını söyleyebiliyor.

    screenBunu yapan başka bir programdır, bu nedenle terminalinizin kaydırma işlevselliği genellikle bir ekran oturumundayken çalışmaz -  screenkaydırma geri alma arabelleğini taklit eder, bu nedenle eski çıkışa ulaşmak için kendi iç işlevselliğini kullanmanız gerekir.

  • Veya vim, üst kaydırma kaydırma arabelleğinin üzerine bir şekilde kaplanmış olan kendi kaydırma kaydırma tamponunu mu kullanıyor?

    Bunu önceki soruda çoğunlukla cevapladım, ancak bu özel sorunun kısa cevabı vim, terminalden geri kaydırma olmadan kendi geçici arabelleğini alıp, belgelerinizin dahili olarak kendi kaydırmasını gerçekleştirmesidir.

Bahsettiğim tüm bu istisnalar:

Yine biraz daha karmaşıklaşıyor. Uygulamaların geri kaydırma üzerinde herhangi bir kontrolü olmadığını ve tamamen terminal tarafından sağlandığını söyledim. Bazı durumlarda, bazı terminallerde sınırlı etkileşim vardır. Program bazı kaçış dizileri basıyor - geçmişte terminal renklendirmeyi manuel olarak kullandıysanız, neye benzediğini göreceksiniz - ve terminal bunları yorumlayabilir ve davranışını değiştirebilir, hatta programa bilgi geri gönderebilir. Hangi kaçış sekansları mevcuttur termcap (terminal yetenek) veritabanında tanımlanmıştır .

Bazı terminaller kaydırma geri alma arabelleğinin sınırlı sorgulanmasını ve değiştirilmesini destekler. Pek çok xtermtürev, terminali görünümünü kaydırmaya yönlendiren kaçış dizilerine sahiptir. Birçok terminal aynı zamanda ekranın belirli bir alanını belirtmeyi de destekler, böylece tüm kalanlar bozulmaz. Bu kaydırma kaydırma arabelleğini kırma eğilimindedir.

Neredeyse tüm terminaller, imleci ekranda hareket ettirmek için sekansları destekler; bu şekilde, ncurseskütüphane ekranın farklı bölümlerini güncelleyebilir. Tarafından desteklenen VT100 dizilerinexterm bakabilirsiniz . Bunların kaydırma kaydırma tamponu ile etkileşime girme biçimi, özellikle lesskomut gibi kendi kaydırma davranışını uygulayan bir şey söz konusu olduğunda, zaman zaman biraz tuhaf olabilir . Scrollback'inizdeki kopyalanmış veya eksik çizgiler olabilir; çünkü lessmetni üstünüzden terminalinizin beklemeyeceği şekilde yeniden çizdi. Diğer programlar bazen arabelleklerini tüm ekranlarının birden fazla kopyasıyla dolduruyor olabilir.


1
Bu harika cevap için çok teşekkür ederim! Çok karmaşık ve konuya rağmen anlaşılması kolaydır. Ekstra ayrıntı hem daha fazla şey öğrenmek istiyor hem de nereye bakmam gerektiğini gösteriyor.
Oleg,

1
Bazı terminaller sınırsız kaydırma için bir seçeneğe sahiptir, bunun anlamı kaydırma kaydının tamamının RAM olduğu anlamına gelir (yani bir noktada terminalde bir malloc hatası veya OOM alırız) veya diske yazmayı ve sizin gibi diskten yüklemeyi dener mi kaydırma? Bir çeşit sohbet programı.
CMCDragonkai

Sorgulama için kaçış dizileri genellikle termcap'te değildir (ya da genellikle daha eksiksiz olan terminfoda değildirler).
Thomas Dickey,

@ CMCDragonkai Konsole, sonlandırılmış kaydırma işlemini bellekte tutar, ancak şifrelenmemiş diske sonsuz kaydırma yapar; ayarları iletişim kutusundan bunun hakkında uyarılırsınız. VTE (gnome-terminal ve diğerleri), geri sarma işlemini (sonlu veya sonsuz), sıkıştırılmış ve şifrelenmiş diskte saklar. Diğer emülatörlerin ne yaptığını bilmiyorum.
egmont
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.