นี่เป็นคำถามที่ซับซ้อนเล็กน้อย ฉันจะพยายามที่จะตอบคำถามของคุณในทางกลับกัน แต่ก่อนอื่นคำอธิบายทั่วไป:
ตัวเลื่อนเทอร์มินัลของคุณถูกนำไปใช้งานโดยโปรแกรมจำลองเทอร์มินัลของคุณ ( 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
ดึงข้อความขึ้นด้านบนในแบบที่เทอร์มินัลของคุณไม่ได้คาดหวัง บางครั้งโปรแกรมอื่น ๆ ก็เติมบัฟเฟอร์ของคุณด้วยหลายสำเนาของจอแสดงผลทั้งหมด