【发布时间】:2018-10-17 16:20:16
【问题描述】:
尝试编写一些记录器增强功能我想处理 ANSI 代码解释,似乎它不适用于标准 io.putstring 方法,也不适用于 print 我想知道有没有办法做一些事情,例如
echo -e "\u001B[31mSome_red_txt" 在 bash 中
似乎other languages 可以做到,但我在埃菲尔不能。
【问题讨论】:
标签: linux colors terminal eiffel
尝试编写一些记录器增强功能我想处理 ANSI 代码解释,似乎它不适用于标准 io.putstring 方法,也不适用于 print 我想知道有没有办法做一些事情,例如
echo -e "\u001B[31mSome_red_txt" 在 bash 中
似乎other languages 可以做到,但我在埃菲尔不能。
【问题讨论】:
标签: linux colors terminal eiffel
作为对 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 序列在这种情况下。
【讨论】:
ssh使用标准输入输出,所以应该没有具体问题。
TERM 可用于传递有关终端功能的信息,shell 有自己的机制来启用彩色输出等。
使用ANSI代码解释,你可以这样做
print ("%/27/[31mSome_red_txt%N")
print ("%/27/[1;31mbold red text%/27/[0m%N")
您可以检查现有的 C 库,例如 ncurses。
请注意,它不能在 Windows 控制台上运行,因为它现在不再支持 ANSI 代码,因此您需要使用 Windows API。
【讨论】:
\001B 一起工作时的错误