xterm

2010-12-02 28 views
16

में वर्तमान टेक्स्ट रंग पढ़ें मैं विभिन्न उपयोगिताओं को लिख रहा हूं, और मुझे वास्तव में रंगीन टेक्स्ट पसंद है। बचपन के दृश्यों का उपयोग करके, कुछ भी कल्पना नहीं। मैंने एक साधारण वर्ग बनाया है जिसमें एक पप्रिंट (msg, रंग) फ़ंक्शन है। कोड here कोड खोजने के बाद मुझे यह आसानी से काम मिल गया है।xterm

मेरी समस्या यह है कि मुझे प्रिंटिंग के बाद रंग बंद करने में सक्षम होना चाहिए। उदाहरण के लिए, मान लीजिए कि कोई उपयोगकर्ता मेरा प्रोग्राम चलाता है जो डिफ़ॉल्ट टर्मिनल रंग में लगभग सब कुछ प्रिंट करता है, लेकिन एक त्रुटि है, और मैं त्रुटि को लाल रंग में प्रिंट करना चाहता हूं। मैं अपने त्रुटि संदेश को '\ 033 [0; 32 मीटर' के साथ उपसर्ग करता हूं, और संदेश लाल रंग में है। दुर्भाग्यवश, जब तक मैं इसे बदल नहीं जाता तब तक सभी पाठ लाल होते हैं। यह आमतौर पर ठीक है जबकि मेरा प्रोग्राम चल रहा है क्योंकि मुझे पता है कि संदेशों का रंग क्या होना चाहिए। हालांकि, मेरे कार्यक्रम समाप्त होने के बाद रंग बना रहता है। असल में, जब मेरा प्रोग्राम शुरू होता है तो मैं वर्तमान रंग पढ़ना चाहता हूं, और समाप्त होने पर इसे पुनर्स्थापित करना चाहता हूं। वही तरीका जब स्क्रिप्ट बाहर निकलने पर pwd को पुनर्स्थापित करते हैं।

मैं वर्तमान भागने अनुक्रम कैसे पढ़ूं?

सिस्टम: रेड हैट 5.x बैश अजगर 2.3

मदद के लिए धन्यवाद।

उत्तर

2

मुझे विश्वास नहीं है कि यह संभव है और यह unlikely to be portable है यदि यह था। सबसे अच्छा आप कर सकते हैं sgr0 भेजता है जो सभी विशेषताओं को डिफ़ॉल्ट रूप से रीसेट करता है (पिछला नहीं)। Xterms पर, sgr0Esc[m है। यदि आप रंगों को रीसेट करना चाहते हैं और अन्य विशेषताओं को प्रभावित नहीं करना चाहते हैं, तो op भेजें जो xterms पर Esc[39;49m है।

इन कोडों को हार्डकोड नहीं किया जाना चाहिए। आपको टर्मिनो, टर्म कैप या [एन] शाप का उपयोग करना चाहिए।

+0

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

+0

@ फ़ंडिंगो: लिंक का बिंदु यह है कि कई टर्मिनल अनुकरणकर्ता जो xterm संगत होने का दावा करते हैं, वे xterm के कई नियंत्रण अनुक्रमों का समर्थन नहीं करते हैं, इस प्रकार अधिक अस्पष्ट क्षमताओं की पोर्टेबिलिटी को प्रभावित करते हैं। आप [मैन 5 टर्मिनोफ़ो] (http://linux.die.net/man/5/terminfo) और xterm नियंत्रण अनुक्रमों में टर्मिनो के बारे में अधिक जानकारी प्राप्त कर सकते हैं [यहां] (http://invisible-island.net/xterm/ ctlseqs/ctlseqs.html)। –

75

obfuscated escape sequences का उपयोग करने के बजाय, tput सुविधा का उपयोग करें।

BLACK=$(tput setaf 0) 
RED=$(tput setaf 1) 
GREEN=$(tput setaf 2) 
YELLOW=$(tput setaf 3) 
LIME_YELLOW=$(tput setaf 190) 
POWDER_BLUE=$(tput setaf 153) 
BLUE=$(tput setaf 4) 
MAGENTA=$(tput setaf 5) 
CYAN=$(tput setaf 6) 
WHITE=$(tput setaf 7) 
BRIGHT=$(tput bold) 
NORMAL=$(tput sgr0) 
BLINK=$(tput blink) 
REVERSE=$(tput smso) 
UNDERLINE=$(tput smul) 

सामान्य टर्मिनल रंग में रंग जानकारी रीसेट करने के लिए बाद में पाठ है ऐसी है कि तुम इतनी तरह समाप्त करने के लिए ${NORMAL} संलग्न करेंगे: यहाँ मेरी ~/.bashrc है कि मैं अपने PS1 शीघ्र के लिए उपयोग से एक अंश है

echo "${RED}this is red ${NORMAL}this is normal"

+3

उपयोगी, लेकिन जैसा कि मैंने इसे पढ़ा है, सवाल का जवाब नहीं देता है।स्क्रिप्ट चलाने से पहले उपयोगकर्ता को टर्मिनल को "सामान्य" रंग में सेट नहीं करना था, और हो सकता है कि स्क्रिप्ट बाद में "सामान्य" रंग सेट न करे। –

+0

उत्तर के लिए धन्यवाद, लेकिन कार्ल सही है। मुझे इसे पायथन स्क्रिप्ट के भीतर सेट करने की आवश्यकता है, इसलिए जब बीएएसएच उपनाम काम करेगा, तो वे सबसे अच्छा समाधान नहीं लगते हैं। नहीं कि बचने के दृश्य बहुत बेहतर हैं ... – fandingo

+0

एक और निर्भरता .. आखिरी चीज़ जो मुझे चाहिए। – Dan

4
RED = 31 
GREEN = 32 
ESCAPE = '%s[' % chr(27) 
RESET = '%s0m' % ESCAPE 
FORMAT = '1;%dm' 

def colorize(text, color): 
    return ESCAPE + (FORMAT % (color,)) + text + RESET 

यह समारोह एक स्ट्रिंग है रंगीन प्रिंट होगा, टर्मिनल स्वचालित रूप से बाद में रीसेट किया जा रहा है वापस आ जाएगी।

+0

बचने के दृश्यों में एक समस्या है। जब मैं इसके साथ प्रिंट करता हूं, तो मुझे पाठ और सभी भागने के दृश्य दिखाई देते हैं। – fandingo

0

वास्तव में, यह xterm के लिए संभव — है, और संगत टर्मिनलों।

उदाहरण के लिए xtermcontrolडिफ़ॉल्ट अग्रभूमि/पृष्ठभूमि रंग को पुनः प्राप्त करने OSC 10 नियंत्रण अनुक्रम का उपयोग करता है। यह टर्म में 2002 के बाद से

अन्य टर्मिनलों के लिए दर्ज किया गया है:

  • RHEL 5 में, "टर्मिनल" कार्यक्रम GNOME टर्मिनल 2.16.0 है; वह संस्करण OSC 10 (समकक्ष CentOS 5 के साथ परीक्षण) को पहचान नहीं करता है।
  • सवाल 2010 में पूछा गया था, रेड हैट उद्यम संस्करण है, जो कुछ भी करता है, तो, डेबियन से अद्यतन करने के लिए धीमी है का जिक्र है।
  • समय में आगे चल कर, डेबियन 7 पर GNOME टर्मिनल 3.4.1.1 (2012 जल्दी) भी नियंत्रण अनुक्रम को नहीं पहचाना।
  • अंत में, 3.14.1 (2014 के आखिर में) के साथ डेबियन 8 में सुविधा पहचानी जाती है।
  • CentOS 7 के gnome-terminal 3.14.3 नियंत्रण अनुक्रम को पहचानता है।

जब इसे जोड़ा गया तो उत्सुकता से ध्यान रखें कि वीटीई के डेवलपर्स दस्तावेज नहीं लिखते हैं। तो ... Git लॉग का अध्ययन

commit 1b8c6b1aac587b79476a60a5830385abc939430d 
Author: Egmont Koblinger <[email protected]> 
Date: Wed Jan 22 00:13:51 2014 +0100 

    emulation: Add support for OSC 1?1[017] (fg, bg, highlight colors) 

    https://bugzilla.gnome.org/show_bug.cgi?id=567444 

दूसरी ओर पता चलता है, डिफ़ॉल्ट रंग वर्तमान रंग के रूप में ही नहीं हैं। उपयोगकर्ता DECRQSS नियंत्रण अनुक्रम का उपयोग patch #93 in 1999 के बाद से टर्म के साथ ऐसा करने में सक्षम है। यही कारण है कि जैसे

printf '\033P$m\033\\' 

कच्चे मोड में टर्मिनल लगाने और कुछ कर रही यह SGR मानकों के साथ बाहर भरा तार के साथ जवाब देने के लिए मिलेगा, है।

रंग SGR का उपयोग कर स्थापित किए गए हैं, उन कोड जबाब, उदा का हिस्सा होगा

\033P1$r0;33m\033\\ 

अग्रभूमि रंग संख्या 3 (33 के रूप में एन्कोड) निरूपित करने के लिए।

तुम वहाँ रोक सकता है (क्योंकि आप उन पैरामीटर निकालने और उन्हें पुन: उपयोग बाद में एक ही राज्य के लिए टर्मिनल स्थापित करने के लिए कर सकते हैं), लेकिन फिर OSC 4 का उपयोग कर रही वास्तविक आरजीबी रंग संभव हो जाएगा। आप (SGR अनुक्रम से) रंग नंबर का उपयोग करना चाहते हैं, और कुछ इस तरह भेजें:

printf '\033]4;3;?\033\\' 

तो यह निश्चित रूप से टर्म के साथ संभव है। वहाँ एक डेमो/के लिए DECRQSS टर्म के लिए अगले अद्यतन में परीक्षण स्क्रिप्ट हो जाएगा।

  • xtermcontrol के डेवलपर अनदेखी DECRQSS (स्थापित/SGR कोड प्राप्त करने के लिए कोई सुविधा है):

    अन्य कार्यक्रमों के लिए, आप और अधिक समय की जरूरत है।

  • VTE डेवलपर्स बग रिपोर्ट के जवाब में टर्म सुविधाओं कॉपी; वीटीई स्रोत का उल्लेख DECRQSS का उल्लेख नहीं करता है। इसके Git लॉग उल्लेख OSC 4 2009 में, लेकिन कार्यान्वयन अधूरा है (यह केवल एक को एक रंग सेट की अनुमति देता है, नहीं रंग प्राप्त)।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^