อะไรคือ scrollback และ scrollback buffer?


23

อะไรคือ "scrollback" และ "scrollback บัฟเฟอร์" ในโปรแกรมเช่นbashและscreenและวิธีการทำพวกเขาเกี่ยวข้องกับ TTY ที่โปรแกรมถูกเรียกใช้และ stdin / stdout / stderr?

นี่คือคำจำกัดความเดียวของ "scrollback" ที่ฉันพบจนถึงตอนนี้ (ในarchlinux wiki ):

Scrollback เป็นฟังก์ชั่นที่นำมาใช้ในคอนโซลข้อความเพื่อให้ผู้ใช้กลับไปดูบรรทัดข้อความที่เลื่อนออกจากหน้าจอ สิ่งนี้เกิดขึ้นได้โดยบัฟเฟอร์ที่สร้างขึ้นสำหรับวัตถุประสงค์นี้ระหว่างอะแดปเตอร์วิดีโอและอุปกรณ์แสดงผลเท่านั้น บัฟเฟอร์ scrollback

แต่นี่ทำให้เกิดคำถามเพิ่มเติมสำหรับฉัน:

  • มันหมายความว่า "ฟังก์ชั่น" ใน "subroutine" หรือใน "คุณสมบัติ"?
  • มีมาตรฐาน Unix หรือ API สำหรับบัฟเฟอร์การเลื่อนนี้หรือไม่?
  • ใน "สแต็ค" ของโปรแกรมเช่นvimเปิดตัวในscreenเปิดตัวในbashเปิดตัวในsshเปิดตัวเทอร์มินัลอีมูเลเตอร์โปรแกรมใดบ้างที่ควบคุมการเลื่อนบัฟเฟอร์?

ฉันยังใช้screenในการถ่ายโอนข้อมูล scrollback ไปยังแฟ้ม ไฟล์นี้มีพื้นที่สีขาวจำนวนมากที่ด้านบนและดูเหมือนว่า "มุมมอง" ตัวจำลองเทอร์มินัลของฉันแสดงให้ฉันเห็นว่าเป็นเพียงไม่กี่บรรทัดด้านล่างของบัฟเฟอร์

  • นี่เป็นสาเหตุที่โปรแกรมอย่างเช่นvim"ล้าง" หน้าต่างเทอร์มินัลทั้งหมดของฉันเพราะได้รับการเข้าถึงชั่วคราวกับบัฟเฟอร์การเลื่อนกลับของพาเรนต์เชลล์หรือไม่?
  • หรือไม่vimใช้ buffer scrollback ของตัวเองที่มีการซ้อนทับอย่างใดอย่างหนึ่งที่ด้านบนของบัฟเฟอร์ scrollback หลัก?

คำตอบ:


28

นี่เป็นคำถามที่ซับซ้อนเล็กน้อย ฉันจะพยายามที่จะตอบคำถามของคุณในทางกลับกัน แต่ก่อนอื่นคำอธิบายทั่วไป:

ตัวเลื่อนเทอร์มินัลของคุณถูกนำไปใช้งานโดยโปรแกรมจำลองเทอร์มินัลของคุณ ( xterm, Konsole, เทอร์มินัล GNOME) มันมีข้อความทั้งหมดที่แสดงบนหน้าจอรวมถึงเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานจากทุกโปรแกรมที่คุณรันในเทอร์มินัล มันคือฟังก์ชั่นการทำงานทั้งหมดเพื่อให้คุณดูผลลัพธ์ที่ผ่านมาที่อาจเลื่อนผ่านมาคุณหรือตรวจสอบสิ่งที่พูดก่อนหน้านี้

คุณสามารถนึกถึงบัฟเฟอร์การเลื่อนกลับเป็นหน้ายาวของเอาต์พุตที่บันทึกไว้และหน้าต่างเทอร์มินัลของคุณเป็นหน้าต่างที่มองเพียงบางส่วนในเวลาใดก็ได้ หากคุณยังไม่ได้เลื่อนสิ่งใด ๆ สิ่งที่คุณกำลังดูคือส่วนท้ายของบัฟเฟอร์ โดยปกติจะมีการกำหนดค่าขีด จำกัด ในเทอร์มินัลว่ามีกี่บรรทัดที่ติดตามก่อนที่จะเริ่มลืม

สมมติว่าขีด จำกัด นั้นคือ 1,000 บรรทัด สำหรับเอาต์พุตบรรทัดแรกในเซสชั่นของคุณคุณเพียงแค่ผนวกกับบัฟเฟอร์และคุณสามารถเลื่อนขึ้นไปทางขวาเพื่อเริ่มต้นเซสชั่นของคุณ ทันทีที่ได้รับบรรทัด 1001st บรรทัดแรกในบัฟเฟอร์จะถูกลบและด้านหลังสุดที่คุณสามารถเลื่อนจะเป็นบรรทัดที่สองของเซสชันของคุณ บัฟเฟอร์จะมีเอาต์พุตจำนวนพันบรรทัดล่าสุดที่แสดงบนหน้าจอของคุณเสมอและคุณสามารถเลื่อนขึ้นเพื่อดูเอาต์พุตก่อนหน้าได้ทุกเมื่อ

  • มันหมายความว่า "ฟังก์ชั่น" ใน "subroutine" หรือใน "คุณสมบัติ"?

    นี่คือ "ฟังก์ชั่น" ใน "คุณสมบัติ" เทอร์มินัลอีมูเลเตอร์มีฟังก์ชันการทำงานที่บันทึกสิ่งที่อยู่บนหน้าจอและให้คุณเลื่อนขึ้นและลง คอนโซลในบางระบบยังสนับสนุนการเลื่อนกลับที่ จำกัด

    มันจะซับซ้อนกว่านี้เล็กน้อยเมื่อคุณscreenเข้าไปผสม ณ จุดนั้นscreenมีการเลียนแบบบัฟเฟอร์การเลื่อนตัวเอง - นั่นคือเหตุผลที่คุณสามารถคัดลอกและวางจากมันภายในโปรแกรมมากกว่าการเลือก (พูด) X เท่านั้น

  • มีมาตรฐาน Unix หรือ API สำหรับบัฟเฟอร์การเลื่อนนี้หรือไม่?

    คำตอบสั้น ๆ คือไม่มันเป็นเพียงแค่ให้โดยสถานีของคุณ คำตอบอีกต่อไปเราจะไปที่ด้านล่าง

  • ใน "สแต็ค" ของโปรแกรมเช่นเสียงเรียกเข้าที่เปิดตัวในหน้าจอเปิดตัวใน bash เปิดตัวใน ssh เปิดตัวใน terminal emulator โปรแกรมใดบ้างที่ควบคุมการเลื่อนบัฟเฟอร์

    ในกรณีของvimและbashพวกเขาไม่ได้ควบคุมเลย (ข้อแม้อีกครั้งด้านล่าง) เทอร์มินัลของคุณมีบัฟเฟอร์การเลื่อนกลับสำหรับโปรแกรมทั้งหมดที่อยู่ภายในเริ่มต้นจากเชลล์ของคุณ screenดังที่ได้กล่าวมาแล้วคือการจำลอง scrollback เอง

  • ฉันยังใช้หน้าจอเพื่อถ่ายโอนข้อมูลการเลื่อนไปยังไฟล์ ไฟล์นี้มีพื้นที่สีขาวจำนวนมากที่ด้านบนและดูเหมือนว่า "มุมมอง" ตัวจำลองเทอร์มินัลของฉันแสดงให้ฉันเห็นว่าเป็นเพียงไม่กี่บรรทัดด้านล่างของบัฟเฟอร์

    นี่คือscreenบัฟเฟอร์ภายในของ สิ่งที่อยู่บนหน้าจอของคุณในเวลานั้นโดยทั่วไปจะเป็นสิ่งที่อยู่ด้านล่างสุดของบัฟเฟอร์

  • นี่เป็นสาเหตุที่โปรแกรมอย่างเช่น vim สามารถ "ล้าง" หน้าต่างเทอร์มินัลทั้งหมดของฉันได้หรือไม่เพราะมันได้รับการเข้าถึงบัฟเฟอร์ scrollback ของพาเรนต์เชลล์ชั่วคราว

    นี่คือส่วนหนึ่งที่ทำให้มันซับซ้อนมากขึ้น แทบทุก X-based เลียนแบบขั้วจะจำลอง VT100 และสิ่งหนึ่งที่พวกเขาทำมีการสนับสนุน"หน้าจอสลับบัฟเฟอร์" ซึ่งแตกต่างจากบัฟเฟอร์สามัญที่ใช้สำหรับการโต้ตอบขั้วส่วนใหญ่กับการส่งออกตามลำดับบัฟเฟอร์หน้าจอทางเลือกเป็นเพียงขนาดที่แน่นอนของ terminal ของคุณ ไม่มีการเลื่อนขึ้นหรือลงเพราะมันไม่ใหญ่กว่าที่แสดง

    แนวคิดที่จะอนุญาตให้แอปพลิเคชันแบบเต็มหน้าจอทำสิ่งที่จำเป็นต้องทำโดยไม่รบกวนสิ่งใดก็ตามที่คุณมีบนหน้าจอจากนั้นให้คุณกลับไปที่หน้าจอที่คุณเคยทำมาก่อน นั่นเป็นเหตุผลที่เมื่อคุณป้อนvimเต็มหน้าจอ แต่เมื่อคุณออกจากนั้นขั้วเอาท์พุทที่คุณมีไว้ล่วงหน้า - พรอมต์ที่ผ่านมาของคุณทั้งหมดและออกคำสั่ง - กลับมาอีกครั้ง vimสลับเป็นบัฟเฟอร์หน้าจอทางเลือกเมื่อเริ่มต้นและกลับไปเป็นบัฟเฟอร์ปกติเมื่อออก

    บัฟเฟอร์สำรองนี้เป็นหนึ่งในคำเตือนที่ฉันกล่าวถึงข้างต้น บางครั้งโปรแกรมมีความสามารถในการบอกเทอร์มินัลว่าจะทำอย่างไรกับบัฟเฟอร์

    screenเป็นอีกหนึ่งโปรแกรมที่ทำสิ่งนี้ซึ่งเป็นเหตุให้ฟังก์ชันการเลื่อนของเทอร์มินัลโดยทั่วไปไม่ทำงานในขณะที่คุณอยู่ในเซสชันหน้าจอ -  screenเลียนแบบบัฟเฟอร์การเลื่อนตัวเองดังนั้นคุณต้องใช้ฟังก์ชันการทำงานภายในเพื่อรับเอาต์พุตเก่า

  • หรือเป็นกลุ่มใช้บัฟเฟอร์การเลื่อนของตัวเองที่จะซ้อนทับอย่างใดอย่างหนึ่งที่ด้านบนของบัฟเฟอร์การเลื่อนแม่หรือไม่

    ฉันส่วนใหญ่ตอบคำถามนี้ก่อนหน้านี้ แต่คำตอบสั้น ๆ สำหรับคำถามนี้คือvimรับบัฟเฟอร์ชั่วคราวของตัวเองโดยไม่มี scrollback จากเทอร์มินัลแล้วทำการเลื่อนเอกสารของคุณเองภายในทั้งหมด

ข้อยกเว้นทั้งหมดที่ฉันพูดถึง:

มันซับซ้อนขึ้นอีกเล็กน้อย ฉันบอกว่าแอพพลิเคชั่นไม่มีการควบคุม scrollback และแอพพลิเคชั่นนั้นมีให้โดยสิ้นเชิง ในบางกรณีมีเทอร์มินัลบางอย่างมีปฏิสัมพันธ์ที่ จำกัด โปรแกรมจะพิมพ์ลำดับการหลีกเลี่ยงบางอย่าง - หากคุณเคยใช้การระบายสีเทอร์มินัลด้วยตนเองในอดีตคุณจะเห็นสิ่งที่ดูเหมือน - และเทอร์มินัลสามารถตีความสิ่งเหล่านั้นและเปลี่ยนพฤติกรรมของมันหรือแม้แต่ส่งข้อมูลกลับไปยังโปรแกรม มี escape sequences ใดบ้างที่อธิบายไว้ในฐานข้อมูล termcap (ความสามารถของเทอร์มินัล)

เทอร์มินัลบางตัวรองรับการสืบค้นและการ จำกัด การใช้งานของ scrollback buffer ที่ จำกัด xtermอนุพันธ์จำนวนมากมีลำดับการหลีกเลี่ยงที่กำหนดให้เทอร์มินัลเลื่อนมุมมอง เทอร์มินัลจำนวนมากยังรองรับการระบุพื้นที่เฉพาะของหน้าจอเพื่อเลื่อนทำให้ส่วนที่เหลือทั้งหมดไม่เสียหาย ที่มีแนวโน้มที่จะทำลายบัฟเฟอร์เลื่อน

เทอร์มินัลเกือบทั้งหมดรองรับลำดับการย้ายเคอร์เซอร์ไปรอบ ๆ หน้าจอซึ่งเป็นวิธีที่ncursesไลบรารีสามารถอัพเดตส่วนต่าง ๆ ทั้งหมดของจอแสดงผล คุณสามารถดูลำดับ VT100 xtermรับการสนับสนุนโดย วิธีที่สิ่งเหล่านี้มีปฏิกิริยากับบัฟเฟอร์การเลื่อนกลับอาจจะแปลกเล็กน้อยในบางครั้งโดยเฉพาะอย่างยิ่งในกรณีของบางสิ่งบางอย่างที่ใช้พฤติกรรมการเลื่อนของตัวเองเช่นlessคำสั่ง คุณสามารถจบด้วยบรรทัดที่ซ้ำกันหรือขาดหายไปใน scrollback ของคุณเพราะlessดึงข้อความขึ้นด้านบนในแบบที่เทอร์มินัลของคุณไม่ได้คาดหวัง บางครั้งโปรแกรมอื่น ๆ ก็เติมบัฟเฟอร์ของคุณด้วยหลายสำเนาของจอแสดงผลทั้งหมด


1
ขอบคุณมากสำหรับคำตอบที่ยอดเยี่ยมนี้! มันสมบูรณ์มากและเข้าใจง่ายแม้จะมีหัวข้อที่ซับซ้อน รายละเอียดพิเศษทั้งสองทำให้ฉันต้องการเรียนรู้เพิ่มเติมและแสดงให้ฉันดู
Oleg

1
เทอร์มินัลบางตัวมีตัวเลือกสำหรับการเลื่อนแบบไม่ จำกัด หมายความว่าการเลื่อนทั้งหมดเป็นแรม (ดังนั้นเมื่อถึงจุดหนึ่งเราจะได้รับความล้มเหลว malloc หรือ OOM บนเทอร์มินัล) หรือลองเขียนลงดิสก์และโหลดจากดิสก์ตามที่คุณ เลื่อน? โปรแกรมแชทที่ชอบ
CMCDragonkai

Escape sequences สำหรับการสืบค้นโดยทั่วไปจะไม่อยู่ใน termcap (และโดยทั่วไปแล้วจะไม่อยู่ใน terminfo ซึ่งจะสมบูรณ์กว่า)
โทมัส Dickey

@CMCDragonkai Konsole เก็บ scrollback อัน จำกัด ไว้ในหน่วยความจำ แต่วาง infitnite scrollback บนดิสก์ที่ไม่ได้เข้ารหัส คุณได้รับคำเตือนเกี่ยวกับมันในกล่องโต้ตอบการตั้งค่า VTE (gnome-terminal และอื่น ๆ ) เก็บ scrollback (จำกัด หรือไม่สิ้นสุด) บนดิสก์บีบอัดและเข้ารหัส ฉันไม่รู้ว่าตัวเลียนแบบอื่นทำอะไร
egmont
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.