2016-09-01 12 views
5

Czy istnieje inny sposób niż isatty, aby dowiedzieć się, czy cout wyprowadza się do terminala, który poprawnie odbiera kolory?Wykryto, czy `cout` wyprowadza na terminal, który akceptuje kolory poprawnie?

Używam this header kolorów, a ja już używam if(isatty(1)), aby wiedzieć, czy wyjście goes to a terminal.

Niestety kiedy kolory wyjściowe do konsoli Xcode jest uzyskać sekwencje kodów zmiany znaczenia - ale to działa dobrze podczas wykonywania aplikacji się od Terminal.app lub iTerm w OS X.

Przypuszczam, że konsola Xcode identyfikuje się jako terminal, ale nadal ignoruje sekwencje kolorów ...

Chciałbym więc mieć lepsze wykrywanie - jeśli to możliwe.

Sam Mój kod jest trywialne, coś takiego, wracając kolorowy łańcuch jeśli isatty jest prawdziwe, to idzie do cout:

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

wyjście Xcode za:

enter image description here

wyjście iTerm za :

enter image description here

+1

'isatty' identyfikuje tylko dane wyjściowe jako pewnego rodzaju terminal; Terminale niekoniecznie są kolorowe. Kiedy używasz XCode, '$ TERM' ma wartość null, ale bardziej niezawodnym rozwiązaniem jest prawdopodobnie użycie' ncurses'. – molbdnilo

+0

@molbdnilo Dzięki. To dobry początek: może uda mi się zdobyć $ TERM z getenv, a następnie sprawdzić czy null - jeśli tak, to jestem w konsoli Xcode'a (lub jakikolwiek inny głupi terminal, jak sądzę). Spróbuję tego. – Moritz

+0

Zrobiłem 'getenv (" TERM ") i otrzymałem null w XCode, a skonfigurowałem je w iTerm i Terminal. – molbdnilo

Odpowiedz

2

Dla XCode w szczególności możesz sprawdzić getenv("TERM"), ponieważ zwróci on wartość null wewnątrz XCode i nie powinno tego robić, jeśli używasz "prawdziwego" terminala.

Aby uzyskać bardziej niezawodny sposób określenia, czy posiadasz kolorowy terminal, prawdopodobnie jest to droga, którą można wykonać pod numerem ncurses.