कंसोल आउटपुट का वर्तमान रंग कैसे निर्धारित करें?


14

मुझे पता है कि, यदि एक रंगीन टर्मिनल उपलब्ध है, तो कोई बच पात्रों का उपयोग करके इसका उत्पादन रंग कर सकता है

लेकिन क्या यह पता लगाने की संभावना है कि वर्तमान में किस रंग का उत्पादन प्रदर्शित किया जा रहा है? या बेहतर है, अगर मैं अभी इसका उत्पादन करूंगा तो पाठ किस रंग का होगा?

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


टर्मकैप और टर्मफ्लो वैरिएबल को देखकर ऐसा लगता है कि यह संभव नहीं है। उदाहरण के लिए आप के साथ अपने टर्मिनल का समर्थन करता है कि रंग की संख्या प्राप्त कर सकते हैं echotc Coया echoti colors, लेकिन वहाँ बस कोई चर जो भंडार वर्तमान रंग कोड परिभाषा है।
जिमीज

@ जिमीज मैं ऐसा सोच रहा था और उम्मीद कर रहा था, कि मुझे कुछ याद आया। यदि आप इसके बारे में सुनिश्चित हैं कि यह संभव नहीं है, तो इसे एक उत्तर दें और मैं अंततः इसे स्वीकार कर लूंगा, अगर इसके बाद कुछ और न हो। आपके समय के लिए धन्यवाद।
मिनिक्स डे

जवाबों:


11

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

उस ने कहा, कुछ टर्मिनलों में उनके टर्मिनल प्रोटोकॉल के हिस्से के रूप में इस तरह की जानकारी को पढ़ने के लिए एक तंत्र शामिल है, जो उस धारावाहिक लिंक पर भेजा जाता है। वे नियंत्रण अनुक्रम प्रदान करते हैं जो कि एक कार्यक्रम टर्मिनल को भेज सकता है, जिससे यह टर्मिनल इनपुट के रूप में अपनी आंतरिक स्थिति के बारे में जानकारी वापस भेज सकता है । टर्मिनल एमुलेटर के प्रति प्रतिक्रिया देने mikeservवाले नियंत्रण दृश्यों को आपको दिखाया xtermहै। लेकिन ये विशिष्ट हैं xterm। लिनक्स कर्नेल और विभिन्न BSD कर्नेल में अंतर्निहित टर्मिनल एमुलेटर विभिन्न टर्मिनल प्रकार हैं, उदाहरण के लिए, और इस तरह के किसी भी नियंत्रण अनुक्रम को लागू नहीं करते हैं। वही वास्तविक टर्मिनलों के पूरे परिवारों के लिए जाता है।

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

  1. होस्ट भेजता है: DCS $ q mST (सेटिंग के रूप में SGR के नियंत्रण समारोह भाग के साथ DECRQSS)
  2. टर्मिनल उत्तर: DCS 0 $ r 0 ; 3 3 ; 4 4 mST (एक SGR नियंत्रण अनुक्रम के मापदंडों और नियंत्रण समारोह के साथ DECRPSS जो वर्तमान अग्रभूमि और पृष्ठभूमि रंग सेट करता है)

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

समाप्त प्रविष्टियाँ हैं scऔर rc। Termfo प्रविष्टियाँ हैं save_cursorऔर restore_cursor। प्रभाव के रूप में नाम कुछ भ्रामक हैं (हालांकि वे एक चेतावनी के रूप में कार्य करते हैं कि आप उस चीज़ पर भरोसा कर रहे हैं जो डी जुरे के बजाय डी फैक्टो है )। वास्तविक DECSC, DECRC, SCOSC, और SCORC नियंत्रण दृश्यों को सहेजते हैं और साथ ही साथ वर्तमान ग्राफिक प्रतिपादन को पुनर्स्थापित करते हैं।

यह देखते हुए कि आपने जिस लेख को इंगित किया है, वह सभी शेल स्क्रिप्ट्स से नियंत्रण अनुक्रम उत्पन्न करने के बारे में है, जिस कमांड को अब आप देख रहे हैंtput

आगे की पढाई


बहुत बढ़िया जवाब। खुशी है कि मैं इसके लिए वापस चला गया। बहुत बहुत धन्यवाद।
13:20 पर मिनिक्स

@Minix - इसके अलावा scऔर rc, आप चाहें तो वैकल्पिक बफर में भी देख सकते हैं यदि आपका टर्मिनल इसका समर्थन करता है। और हां, यह एक शानदार जवाब है। Minix, शायद इस पर भी ध्यान दें: यूजरस्पेस से कंसोल के रूप में / dev / fb0 का उपयोग कैसे करेंnoshवह जिस सुइट की सिफारिश करता है, वह उसका अपना है।
mikeserv

@mikeserv मैं एक नज़र डालूंगा, लिंक के लिए धन्यवाद :)
Minix

2
यह "xterm द्वारा उपयोग किए जाने वाले लोगों के लिए कोई संबंध नहीं है" - हालांकि, xterm ने काफी समय तक DECRQSS का समर्थन किया। रंग की तारीखों सहित एसजीआर प्रतिक्रिया के साथ हिस्सा 1996 तक।
थॉमस डिकी

2
देखें अतिरिक्त पठन , टर्म के नियंत्रण-दृश्यों प्रलेखन, जो बताते हैं कि VT520 / आदि प्रलेखन उपलब्ध जब टर्म में रंग प्रदान करना शुरू नहीं किया गया था में DECRQSS(7 के बारे में साल में देरी ...)।
थॉमस डिकी

10

एक में xtermआप वर्तमान रंग आरजीबी रंग एक प्रश्न के लिए एक रंग बदलने से बच बदलकर सूचना दी कोड प्राप्त कर सकते हैं। का उपयोग करें ESC ] Ps m- लेकिन एक ?प्रश्न चिह्न जोड़ें । से डॉक्स :

  • यदि कोई "?"नाम या RGB विनिर्देश के बजाय दिया जाता है, xtermतो उसी रूप के नियंत्रण अनुक्रम के साथ उत्तर दिया जाता है जिसे संबंधित गतिशील रंग सेट करने के लिए उपयोग किया जा सकता है। क्योंकि एक नियंत्रण अनुक्रम में एक से अधिक जोड़ी रंग संख्या और विनिर्देश दिए जा xtermसकते हैं , एक से अधिक उत्तर दे सकते हैं।
    • P s = 1 0 → P के लिए VT100 पाठ अग्रभूमि रंग बदलें।
    • P s = 1 1 → VT100 टेक्स्ट बैकग्राउंड कलर को P t में बदलें।
    • P s = 1 2 → टेक्स्ट कर्सर का रंग P t में बदलें।
    • P s = 1 3 → माउस अग्रभूमि रंग को P t में बदलें।
    • P s = 1 4 → माउस पृष्ठभूमि रंग को P t में बदलें।
    • P s = 1 5 → Tektronix अग्रभूमि का रंग बदलकर P t करें।
    • P s = 1 6 → Tektronix पृष्ठभूमि का रंग बदलकर P t करें।
    • P s = 1 7 → हाइलाइट पृष्ठभूमि रंग को P t में बदलें।
    • P s = 1 8 → Tektronix कर्सर का रंग बदलकर P t करें।
    • P s = 1 9 → P को टी में उजागर अग्रभूमि रंग बदलें।

मुझे संदेह है कि अगर यह दूसरे टर्मिनल एमुलेटर में काम करने की संभावना है, लेकिन xtermअगर आप चलाते हैं ...

printf '\033]11;?\007'

... xtermआपके टर्मिनल के इनपुट बफ़र को एक क्रम में पीछे धकेल देगा जैसे निम्नलिखित ...

11;rgb:ffff/ffff/ffff

... पृष्ठभूमि के लिए या अग्रभूमि के लिए:

printf '\033]10;?\007'

10;rgb:0000/0000/0000

इसलिए जब मैं दौड़ता हूं printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007, तो पहले "सामान्य" टर्मिनल में सभी पाठ हल्के नीले रंग में बदल जाते थे। इसके बाद, रनिंग printf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'सभी हल्के नीले पाठ को वापस "सामान्य" में बदल देता है। मैं इस मूल्य का उपयोग केवल आगे बढ़ने वाले पाठ के रंग को बदलने के लिए कैसे करूं?
चारपश्चमी की रात

@fourpastmidnight: शायद clearपहले?
mikeserv

मैं सोच रहा हूँ कि मैं प्रलेखन को नहीं समझ रहा हूँ। यह स्पष्ट रूप से कहता है "P s = 1 0 -> VT100 अग्रभूमि रंग बदलें", और अच्छी तरह से, कि यह क्या कर रहा प्रतीत होता है। ;) लेकिन यह वह नहीं है जिसकी मुझे उम्मीद थी। मुझे "P s = 1 0; Pt =?" से प्राप्त RGB मान का उपयोग करने की आवश्यकता हो सकती है। जो मैं चाहता हूं उसे हासिल करने के लिए एक और बची हुई कमान के साथ।
चारपश्चमी की रात

ठीक है, इसलिए printf '\033]10;?\007'टर्मिनल के वर्तमान अग्रभूमि रंग के लिए xterm क्वेरी करता है। यदि आपका टर्मिनल "सामान्य" (अग्रभूमि रंग के रूप में 7) के साथ शुरू किया गया था, लेकिन आप कमांड चलाने tput setaf 3से पहले चलाते हैं printf, तो printfऊपर दिया गया कमांड अभी भी "सामान्य" है - और यह सही है, क्योंकि यह आपके टर्मिनल का वर्तमान अग्रभूमि रंग है। मैं जिस चीज की उम्मीद कर रहा था, वह वर्तमान कर्सर स्थिति के वर्तमान रंग को पुनः प्राप्त करने का एक तरीका था, ताकि मैं इसे बाद में "पुनर्स्थापित" करने के लिए बचा सकूं - ओपी के अनुसार।
चारपश्चमी की रात

1
@fourpastmidnight - क्या आपने उत्तर में लिंक का अनुसरण किया है? यह भी, थॉमस डिकी - (उन्होंने इस प्रश्न के अन्य उत्तर पर टिप्पणी की) का xtermअनुचर है और यहाँ एक सक्रिय सदस्य है। (लिंक उनकी वेबसाइट पर है - xterm'एस्केप एस्केप डॉक्स व्यापक हैं - और मूल रूप से टर्मिनल लिखने के इच्छुक किसी अन्य प्रोग्रामर के लिए मानक संदर्भ)
mikeserv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.