स्क्रोलबैक और स्क्रॉलबैक बफर वास्तव में क्या है?


23

"स्क्रॉल बैक" और "स्क्रॉल बैक बफर" जैसे कार्यक्रमों में क्या हैं bashऔर screenकार्यक्रमों रन किया जा रहा है, और वे tty के लिए कैसे संबंधित हैं, और stdin / stdout / stderr?

यहाँ "स्क्रॉलबैक" की एकमात्र परिभाषा मुझे अब तक ( आर्च्लिनक्स विकी में ) मिली है :

स्क्रॉलबैक एक फ़ंक्शन है जिसे टेक्स्ट कंसोल में कार्यान्वित किया जाता है, जिससे उपयोगकर्ता को पाठ की उन पंक्तियों को देखने के लिए वापस जाने की अनुमति मिलती है, जिन्होंने स्क्रीन को स्क्रॉल किया है। यह केवल वीडियो एडेप्टर और डिस्प्ले डिवाइस के बीच इस उद्देश्य के लिए बनाए गए बफर द्वारा संभव है; स्क्रॉलबैक बफर।

लेकिन, यह मेरे लिए और सवाल खड़े करता है:

  • क्या इसका अर्थ "फ़ंक्शन" "सबरूटीन" के रूप में या "फ़ीचर" के रूप में है?
  • क्या इस स्क्रॉलबैक बफर के लिए एक यूनिक्स मानक या एपीआई है?
  • एक जैसे कार्यक्रमों की "ढेर", में vimमें शुरू screenमें शुरू bashशुरू की में sshएक टर्मिनल एमुलेटर में शुरू की है, जो इन कार्यक्रमों का स्क्रॉल बैक बफर को नियंत्रित कर रहे हैं?

मैं भी इस्तेमाल किया screenकरने के लिए एक फाइल करने के लिए स्क्रॉल बैक डंप । इस फ़ाइल में शीर्ष पर बहुत सी सफ़ेद जगह थी, और ऐसा लगता है कि मेरा टर्मिनल एमुलेटर "व्यू" मुझे दिखाता है बस बफर की कुछ पंक्तियाँ है।

  • क्या यह ऐसा प्रोग्राम है, जैसे vimमेरी पूरी टर्मिनल विंडो को "क्लियर" कर सकता है, क्योंकि इसे पेरेंट शेल के स्क्रॉलबैक बफर में अस्थायी एक्सेस मिलता है?
  • या vimअपने स्वयं के स्क्रॉलबैक बफर का उपयोग करता है जो किसी भी तरह से मूल स्क्रॉलबैक बफर के ऊपर से निकल जाता है?

जवाबों:


28

यह थोड़ा जटिल प्रश्न है। मैं आपके सवालों के जवाब देने की कोशिश करूंगा, लेकिन पहले एक सामान्य विवरण:

स्क्रॉलबैक बफर आपके टर्मिनल एमुलेटर ( xterm, कोनो कंसोल, GNOME टर्मिनल) द्वारा कार्यान्वित किया जाता है । इसमें वह सभी पाठ शामिल हैं जो स्क्रीन पर प्रदर्शित किए गए हैं, जिसमें टर्मिनल में चलने वाले प्रत्येक प्रोग्राम से मानक आउटपुट और मानक त्रुटि दोनों शामिल हैं। यह पूरी तरह से टर्मिनल कार्यक्षमता है जो आपको पिछले आउटपुट को देखने देती है जो आपके अतीत को स्क्रॉल कर सकती है या जो कुछ पहले कहा था उस पर जांच करने के लिए।

आप स्क्रॉलबैक बफर को लॉग इन आउटपुट के लंबे पृष्ठ के रूप में और अपने टर्मिनल विंडो को किसी भी एक समय में इसके एक हिस्से के रूप में देख सकते हैं। यदि आपने कोई स्क्रॉल नहीं किया है, तो आप जो देख रहे हैं, वह बफर का टेल एंड है। आम तौर पर टर्मिनल में कॉन्फ़िगर की गई एक सीमा होगी कि वह भूल जाने से पहले कितनी लाइनों को ट्रैक करता है।

मान लीजिए कि सीमा 1000 लाइनें है। अपने सत्र में आउटपुट की पहली हज़ार पंक्तियों के लिए आप बस बफर को जोड़ते हैं, और आप अपने सत्र की शुरुआत तक सही स्क्रॉल कर सकते हैं। जैसे ही आउटपुट की 1001 वीं पंक्ति प्राप्त होती है बफर में पहली पंक्ति मिट जाती है, और सबसे पीछे की ओर आप स्क्रॉल कर सकते हैं जो आपके सत्र की दूसरी पंक्ति होगी। बफर में हमेशा आउटपुट की सबसे हालिया लाइनें शामिल होंगी जो आपकी स्क्रीन पर प्रदर्शित की गई थीं, और आप किसी भी समय पहले के आउटपुट को देखने के लिए स्क्रॉल कर सकते हैं।

  • क्या इसका अर्थ "फ़ंक्शन" "सबरूटीन" के रूप में या "फ़ीचर" के रूप में है?

    यह "सुविधा" के रूप में "फ़ंक्शन" है। टर्मिनल एमुलेटर में एक कार्यक्षमता होती है जो स्क्रीन पर क्या रिकॉर्ड करती है और आपको इसमें ऊपर और नीचे स्क्रॉल करने की सुविधा देती है। कुछ सिस्टम पर कंसोल सीमित स्क्रॉलबैक का भी समर्थन करते हैं।

    screenमिश्रण में फेंकने पर यह थोड़ा और अधिक जटिल हो जाता है । उस बिंदु पर, screenस्वयं स्क्रॉलबैक बफर का अनुकरण किया जा रहा है - यही कारण है कि आप इसे (केवल) एक्स चयन के बजाय कार्यक्रम के भीतर से कॉपी और पेस्ट कर सकते हैं।

  • क्या इस स्क्रॉलबैक बफर के लिए एक यूनिक्स मानक या एपीआई है?

    संक्षिप्त उत्तर नहीं है, यह सिर्फ आपके टर्मिनल द्वारा प्रदान किया गया है। लंबे समय तक जवाब हम तल पर प्राप्त करेंगे।

  • कार्यक्रमों के "स्टैक" में, जैसे कि vim को स्क्रीन में लॉन्च किए गए bash में लॉन्च किया गया ssh में एक टर्मिनल एमुलेटर में लॉन्च किया गया है, इनमें से कौन सा प्रोग्राम स्क्रॉलबैक बफर को नियंत्रित कर रहा है?

    के मामले में vimऔर bash, वे इसे नियंत्रित नहीं कर रहे हैं (चेतावनी, फिर से, नीचे)। आपका टर्मिनल आपके शेल से शुरू होकर, इसके अंदर के सभी कार्यक्रमों के लिए स्क्रॉलबैक बफर प्रदान करता है। screen, जैसा कि ऊपर बताया गया है, स्क्रोलबैक का अनुकरण स्वयं कर रहा है।

  • मैंने स्क्रोलबैक को फ़ाइल में डंप करने के लिए स्क्रीन का भी उपयोग किया है। इस फ़ाइल में शीर्ष पर बहुत सी सफ़ेद जगह थी, और ऐसा लगता है कि मेरा टर्मिनल एमुलेटर "व्यू" मुझे दिखाता है बस बफर की कुछ पंक्तियाँ है।

    यह screenआंतरिक बफर है। उस समय आपकी स्क्रीन पर क्या होगा आमतौर पर बफर के बहुत नीचे क्या होता है।

  • क्या इसीलिए विम जैसा प्रोग्राम मेरी पूरी टर्मिनल विंडो को "क्लियर" कर सकता है, क्योंकि इसे पेरेंट शेल के स्क्रॉलबैक बफर में अस्थायी एक्सेस मिलता है?

    यहाँ एक हिस्सा है जहाँ यह बहुत अधिक जटिल हो जाता है। वस्तुतः सभी एक्स-आधारित टर्मिनल एमुलेटर एक वीटी 100 का अनुकरण कर रहे हैं, और एक चीज जो वे करते हैं वह एक "वैकल्पिक स्क्रीन बफर" का समर्थन है । अनुक्रमिक आउटपुट के साथ अधिकांश टर्मिनल इंटरैक्शन के लिए उपयोग किए जाने वाले साधारण बफर के विपरीत, वैकल्पिक स्क्रीन बफर आपके टर्मिनल का सटीक आकार है। इसमें ऊपर या नीचे कोई स्क्रॉलिंग नहीं है क्योंकि यह प्रदर्शित किए जाने वाले से बड़ा नहीं है।

    विचार यह है कि एक फुल-स्क्रीन एप्लिकेशन को वह करने की अनुमति दी जाए जो आपके द्वारा पहले से ही स्क्रीन पर मौजूद किसी भी चीज से हस्तक्षेप किए बिना करने की आवश्यकता है, और फिर आपको आपके द्वारा पहले प्रदर्शित डिस्प्ले पर वापस जाने के लिए। इसीलिए जब आप इसमें प्रवेश vimकरते हैं तो पूरी स्क्रीन भर जाती है, लेकिन जब आप इसे छोड़ देते हैं तो आपके द्वारा पहले से जारी टर्मिनल आउटपुट - आपके सभी पिछले संकेत और कमांड आउटपुट - फिर से वापस आ जाता है। vimवैकल्पिक स्क्रीन बफर में स्विच जब यह शुरू होता है और सामान्य बफर में वापस आता है जब यह बाहर निकलता है।

    यह वैकल्पिक बफर मेरे द्वारा उल्लिखित कैवियट में से एक है। कभी-कभी, प्रोग्राम वास्तव में टर्मिनल को यह बताने की क्षमता रखता है कि बफर के साथ क्या करना है।

    screenएक और प्रोग्राम है जो ऐसा करता है, यही कारण है कि आपके टर्मिनल की स्क्रॉलिंग कार्यक्षमता आमतौर पर काम नहीं करती है जब आप एक स्क्रीन सत्र में होते हैं -  screenस्क्रॉलबैक बफर का स्वयं अनुकरण करता है, इसलिए आपको पुराने आउटपुट के लिए इसकी आंतरिक कार्यक्षमता का उपयोग करना होगा।

  • या अपने स्वयं के स्क्रॉलबैक बफर का उपयोग नहीं करता है जो कि किसी भी तरह से मूल स्क्रॉलबैक बफर के शीर्ष पर होता है?

    मैंने ज्यादातर इसका उत्तर पिछले प्रश्न में दिया है, लेकिन इस विशेष प्रश्न का संक्षिप्त उत्तर यह है कि vimटर्मिनल से बिना किसी स्क्रॉलबैक के, अपना अस्थायी बफर प्राप्त करता है, और फिर आंतरिक रूप से आपके सभी दस्तावेजों की अपनी स्क्रॉलिंग करता है।

उन सभी अपवादों का मैंने उल्लेख किया है:

यह फिर से थोड़ा और अधिक जटिल हो जाता है। मैंने कहा कि एप्लिकेशन का स्क्रॉलबैक पर कोई नियंत्रण नहीं है और यह पूरी तरह से टर्मिनल द्वारा प्रदान किया गया है। कुछ मामलों में, कुछ टर्मिनलों के साथ, सीमित बातचीत होती है। प्रोग्राम कुछ भागने के दृश्यों को प्रिंट करता है - यदि आपने कभी अतीत में मैन्युअल रूप से टर्मिनल कलरिंग का उपयोग किया है, तो आपने देखा होगा कि वे क्या दिखते हैं - और टर्मिनल उन लोगों की व्याख्या कर सकता है और उनके व्यवहार को बदल सकता है, या प्रोग्राम को वापस जानकारी भी भेज सकता है। जो एस्केप सीक्वेंस उपलब्ध हैं, उन्हें टर्मकैप (टर्मिनल क्षमता) डेटाबेस में वर्णित किया गया है ।

कुछ टर्मिनल स्क्रॉलबैक बफर के सीमित क्वेरी और हेरफेर का समर्थन करते हैं। कई xtermव्युत्पन्न दृश्यों से बच निकलते हैं जो टर्मिनल को अपने दृश्य को स्क्रॉल करने के लिए निर्देशित करते हैं। कई टर्मिनलों को स्क्रॉल करने के लिए स्क्रीन के किसी विशेष क्षेत्र को निर्दिष्ट करने का भी समर्थन किया जाता है, बाकी सभी को बरकरार रखते हुए। यह स्क्रॉलबैक बफ़र को तोड़ता है।

लगभग सभी टर्मिनल स्क्रीन के चारों ओर कर्सर को स्थानांतरित करने के लिए दृश्यों का समर्थन करते हैं, जो कि कैसे ncursesपुस्तकालय प्रदर्शन के सभी विभिन्न हिस्सों को अपडेट करने में सक्षम है। आप VT100 द्वारा समर्थित दृश्योंxterm को देख सकते हैं । जिस तरह से ये स्क्रॉलबैक बफर के साथ इंटरैक्ट करते हैं, वह कई बार थोड़ा अजीब हो सकता है, विशेष रूप से ऐसी चीज के मामले में जो lessकमांड की तरह अपने स्क्रॉलिंग व्यवहार को लागू करता है । आप अपने स्क्रॉलबैक में डुप्लिकेट या लापता लाइनों के साथ समाप्त कर सकते हैं क्योंकि lessआपके टर्मिनल ने अपेक्षा नहीं की थी कि एक तरह से शीर्ष पर पाठ को फिर से तैयार किया। अन्य कार्यक्रम कभी-कभी आपके पूरे प्रदर्शन की कई प्रतियों के साथ आपके बफ़र को समाप्त करते हैं।


1
इस बेहतरीन जवाब के लिए बहुत-बहुत धन्यवाद! यह बहुत संपूर्ण है और जटिल विषय के बावजूद समझने में आसान है। अतिरिक्त विस्तार दोनों मुझे और सीखना चाहते हैं और मुझे दिखाते हैं कि मुझे कहाँ देखना है।
ओलेग

1
कुछ टर्मिनलों में असीमित स्क्रॉलबैक का विकल्प होता है, क्या इसका मतलब है कि पूरा स्क्रॉलबैक रैम है (इसलिए कुछ बिंदु पर हमें एक मॉलोक विफलता या टर्मिनल पर OOM मिलेगा), या क्या यह डिस्क को लिखने और डिस्क से लोड करने की कोशिश करता है जैसा कि आप पुस्तक? चैट कार्यक्रमों की तरह।
CMCDragonkai

क्वेरी के लिए एस्केप सीक्वेंस आमतौर पर टर्मकैप में नहीं होते हैं (न ही वे आम तौर पर टर्मो में होते हैं, जो अधिक पूर्ण होते हैं)।
थॉमस डिकी

@CMCDragonkai कोनसोल स्मृति में परिमित स्क्रॉलबैक रखता है, लेकिन डिस्क पर अनफिट स्क्रॉलबैक को अनियंत्रित करता है; आपको इसकी सेटिंग संवाद पर इसके बारे में चेतावनी दी गई है। VTE (सूक्ति-टर्मिनल और अन्य) डिस्क, संकुचित और एन्क्रिप्टेड पर स्क्रॉलबैक (परिमित या अनंत) संग्रहीत करता है। मुझे नहीं पता कि अन्य एमुलेटर क्या करते हैं।
egmont
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.