【问题标题】:Eiffel: is there a way to print colorized characters into a terminal (console)埃菲尔:有没有办法将彩色字符打印到终端(控制台)
【发布时间】:2018-10-17 16:20:16
【问题描述】:

尝试编写一些记录器增强功能我想处理 ANSI 代码解释,似乎它不适用于标准 io.putstring 方法,也不适用于 print 我想知道有没有办法做一些事情,例如

echo -e "\u001B[31mSome_red_txt" 在 bash 中

似乎other languages 可以做到,但我在埃菲尔不能。

【问题讨论】:

    标签: linux colors terminal eiffel


    【解决方案1】:

    作为对 Jocelyn 的 answer 的补充,通过确保控制台已初始化以处理序列,可以在最近更新的 Windows 上使用相同的 ANSI 代码序列:

        -- Make sure the console is allocated in a non-console application.
    io.output.end_of_file.do_nothing
        -- Set console to terminal mode.
    initialize_terminal
        -- Use ANSI codes to color text.
    print ("%/27/[31mSome_red_txt")
    

    在哪里

    initialize_terminal
        external "C inline"
        alias "[
            #ifdef EIF_WINDOWS
                {
                    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
                    if (hOut == INVALID_HANDLE_VALUE) return;
                    DWORD dwMode = 0;
                    if (!GetConsoleMode(hOut, &dwMode)) return;
                    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
                    SetConsoleMode(hOut, dwMode);
                }
            #endif
        ]"
        end
    

    在这样的初始化之后,print 语句在 Windows 和 Linux 上的工作方式相同。

    如果输出不仅可以输出到控制台,还可以输出到文件、管道等,则可以在外部功能中记录在 Windows 控制台设置终端模式的错误状态,以便以后使用,以避免输出 ANSI 序列在这种情况下。

    【讨论】:

    • 基于亚历山大的回答。我很快建立了一个快速而肮脏的例子。请参阅gist.github.com/jocelyn/c2a211315898639fc65c3108343a950b(在 Windows 和 Debian 上测试)
    • ssh 从 MS 的 windows 到 Unix 或者从 Unix 到 MS 的 Windows 的情况如何(可能)?
    • @ctrl-alt-delor ssh使用标准输入输出,所以应该没有具体问题。
    • 期望程序会看到它在 Unix 上运行,而不是在 MS-Windows 终端上设置颜色。 (MS-Windows 是否支持任何标准,以允许这种情况发生。)
    • @ctrl-alt-delor 想要使用转义序列的程序还会检查它附加到什么样的标准输出,无论是终端还是其他东西,并且仅在以下情况下使用转义序列他们得到支持。例如,环境变量TERM 可用于传递有关终端功能的信息,shell 有自己的机制来启用彩色输出等。
    【解决方案2】:

    使用ANSI代码解释,你可以这样做

    print ("%/27/[31mSome_red_txt%N")
    print ("%/27/[1;31mbold red text%/27/[0m%N")
    

    您可以检查现有的 C 库,例如 ncurses。 请注意,它不能在 Windows 控制台上运行,因为它现在不再支持 ANSI 代码,因此您需要使用 Windows API。

    【讨论】:

    • 我建议您添加一些关于使用 Eiffel 转义字符的评论,这是我试图让它与 \001B 一起工作时的错误
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2010-10-28
    • 2015-01-31
    • 2010-09-22
    相关资源
    最近更新 更多