尝试编写一些记录器增强功能,我想处理ANSI代码解释,而且看来io.putstring
和标准print
方法都不起作用,我想知道是否有办法做诸如
echo -e "\u001B[31mSome_red_txt"
(bash)
似乎other languages可以做到,但我不能在埃菲尔(Eiffel)。
答案 0 :(得分:3)
要补充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序列在这种情况下。
答案 1 :(得分:2)
使用ANSI代码解释,您可以
print ("%/27/[31mSome_red_txt%N")
print ("%/27/[1;31mbold red text%/27/[0m%N")
您可以检查现有的C库,例如ncurses
。
请注意,它现在无法在Windows控制台上运行,因为它现在不再支持ANSI代码,因此您需要使用Windows API。