2016-09-01 5 views
5

isatty से कोई अन्य तरीका है यह जानने के लिए कि क्या cout एक टर्मिनल पर आउटपुट करता है जो रंगों को सही तरीके से स्वीकार करता है?पता लगाएं कि क्या टर्मिनल को 'cout` आउटपुट करता है जो रंगों को सही तरीके से स्वीकार करता है?

मैं रंग के लिए this header उपयोग कर रहा हूँ, और मैं पहले से ही पता है की if(isatty(1)) उपयोग कर रहा हूँ उत्पादन goes to a terminal है।

दुर्भाग्य से जब मैं Xcode के कंसोल के लिए उत्पादन रंग मैं नहीं छोड़ा जाएगा दृश्यों मिलता है - लेकिन यह ठीक काम करता है जब ओएस एक्स में Terminal.app या iTerm से एप्लिकेशन को स्वयं को क्रियान्वित करने

मुझे लगता है कि Xcode के कंसोल एक के रूप में खुद की पहचान करता है टर्मिनल लेकिन अभी भी रंग अनुक्रमों को अनदेखा करता है ...

तो यदि संभव हो तो मैं बेहतर पहचान करना चाहता हूं।

मेरे कोड में ही तुच्छ है, कुछ इस तरह, एक रंग का स्ट्रिंग लौटने अगर isatty सच है, तो यह cout को जाता है:

std::string Slot::description() 
{ 
    if(isatty(1)) 
    { 
     return FBLU("my_string"); 
    } 
    else 
    { 
     return "my_string"; 
    } 
} 

Xcode के उत्पादन:

enter image description here

iTerm के उत्पादन :

enter image description here

+1

'isatty' केवल आउटपुट को किसी प्रकार के टर्मिनल के रूप में पहचानता है; टर्मिनलों रंग में जरूरी नहीं हैं। जब आप एक्सकोड में चल रहे हैं, तो '$ TERM' शून्य है, लेकिन अधिक विश्वसनीय समाधान शायद' ncurses' का उपयोग करना है। – molbdnilo

+0

@molbdnilo धन्यवाद। यह एक अच्छी शुरुआत है: शायद मैं getenv के साथ $ TERM प्राप्त कर सकता हूं और फिर जांच कर सकता हूं कि शून्य है - अगर ऐसा है, तो मैं एक्सकोड के कंसोल (या किसी अन्य गूंगा टर्मिनल में अनुमान लगाता हूं) में हूं। मैं कोशिश करूँगा। – Moritz

+0

मैंने 'getenv (" TERM ") किया था और एक्सकोड में शून्य और आईटर्म और टर्मिनल में कॉन्फ़िगर किए गए थे। – molbdnilo

उत्तर

2

एक्सकोड विशेष रूप से, आप getenv("TERM") देख सकते हैं, क्योंकि यह एक्सकोड के अंदर शून्य वापस आ जाएगा और यदि आप "असली" टर्मिनल में चल रहे हैं तो ऐसा नहीं करना चाहिए।

यह निर्धारित करने के लिए एक और विश्वसनीय तरीका है कि आपके पास रंगीन टर्मिनल है, ncurses शायद जाने का तरीका है।

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