【问题标题】:Detect if `cout` outputs to a terminal which accepts colors properly?检测“cout”是否输出到正确接受颜色的终端?
【发布时间】:2017-01-09 13:35:38
【问题描述】:

除了isatty,还有其他方法可以知道cout 是否输出到正确接受颜色的终端?

我正在使用this header 作为颜色,并且我已经在使用if(isatty(1)) 来了解输出是否为goes to a terminal

不幸的是,当我将颜色输出到 Xcode 的控制台时,我得到了未转义的序列 - 但在 OS X 中从 Terminal.app 或 iTerm 执行应用程序本身时它工作正常。

我想 Xcode 的控制台将自己标识为终端,但仍然忽略颜色序列...

所以我希望有更好的检测 - 如果可能的话。

我的代码本身很简单,像这样,如果isatty 为真,则返回一个彩色字符串,然后转到cout

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

Xcode 的输出:

iTerm 的输出:

【问题讨论】:

  • isatty 仅将输出标识为某种终端;终端不一定是彩色的。在 XCode 中运行时,$TERM 为 null,但更可靠的解决方案可能是使用 ncurses
  • @molbdnilo 谢谢。这是一个好的开始:也许我可以使用 getenv 获取 $TERM,然后检查是否为 null - 如果是,我在 Xcode 的控制台(或我猜的任何其他哑终端)中。我会试试的。
  • 我做了getenv("TERM"),在 XCode 中得到了 null,在 iTerm 和 Terminal 中配置了。
  • @molbdnilo 是的,这行得通,它回答了我的问题。如果您想发布答案,我会很乐意接受。一个简单的 if/else 检查 getenv("TERM") 是否为空告诉我我是否在一个哑终端中,这是完美的。

标签: c++ xcode terminal


【解决方案1】:

特别是对于 XCode,您可以检查 getenv("TERM"),因为这将在 XCode 中返回 null,如果您在“真实”终端中运行,则不应这样做。

要更可靠地确定您是否有彩色终端,ncurses 可能是要走的路。

【讨论】:

    猜你喜欢
    • 2014-11-18
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2018-01-07
    • 2012-08-30
    • 2010-11-27
    • 2011-01-28
    • 2010-11-07
    相关资源
    最近更新 更多