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.
screen
Karışıma attığınızda biraz daha karmaşıklaşır . Bu noktada, screen
scrollback 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 vim
ve bash
hiç kontrol etmiyorlar (yine ihmal etmeyin). Terminaliniz, kabuğunuzdan başlayarak içindeki tüm programlar için geri kaydırma tamponu sağlar. screen
yukarı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 screen
dahili 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 vim
tü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. vim
baş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.
screen
Bunu yapan başka bir programdır, bu nedenle terminalinizin kaydırma işlevselliği genellikle bir ekran oturumundayken çalışmaz - screen
kaydı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 xterm
tü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, ncurses
kü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 less
komut 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ü less
metni ü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.