Пытаясь написать некоторые улучшения регистратора, я хотел бы иметь дело с интерпретацией кодов ANSI, и кажется, что он не работает ни со стандартным методом io.putstring
, ни с print
. Интересно, что есть способ сделать что-то вроде
echo -e "\u001B[31mSome_red_txt"
в bash
Кажется, Другие языки может это сделать, но я не могу в Eiffel.
Используя интерпретацию кодов ANSI, вы можете сделать
print ("%/27/[31mSome_red_txt%N")
print ("%/27/[1;31mbold red text%/27/[0m%N")
Вы можете проверить существующие библиотеки C, такие как ncurses
.
Обратите внимание, что он не будет работать на консоли Windows, так как теперь он больше не поддерживает код ANSI, поэтому вам нужно использовать Windows API.
Чтобы дополнить отвечать Джоселин, те же последовательности кода ANSI можно использовать в Windows с последним обновлением, убедившись, что консоль инициализирована для обработки последовательностей:
-- 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 в Unix или из Unix в Windows MS (возможно ли это)?
@ ctrl-alt-delor ssh
использует стандартный ввод и вывод, поэтому особых проблем возникнуть не должно.
Ожидайте, что программа увидит, что она работает в Unix, а не настроит цвет на терминале MS-Windows. (Поддерживает ли MS-Windows какие-либо стандарты, чтобы это произошло?)
@ ctrl-alt-delor Программа, которая хочет использовать escape-последовательности, также проверяет, к какому типу стандартного вывода она прикреплена, является ли это терминалом или чем-то еще, и использует escape-последовательности только тогда, когда они поддерживаются. Например, переменная среды TERM
может использоваться для передачи информации о возможностях терминала, оболочки имеют свои собственные механизмы для включения цветного вывода и т. д.
@AlexanderKogtenkov Да вы понимаете, моя точка зрения и как это нужно делать. Однако ваша программа не этим занимается. (или я ошибаюсь?)
@ ctrl-alt-delor Вопрос о возможности делать цветной вывод, когда известно, что вывод идет на терминал. Другой вопрос, как определить, действительно ли вывод поступает на терминал.
@ ctrl-alt-delor Хорошо, я упустил вашу точку зрения. Действительно, результат функций GetConsoleMode
и SetConsoleMode
можно использовать, чтобы узнать, поддерживаются ли терминальные средства (например, цветной вывод) соответствующим потоком вывода в Windows. Аналогичная функциональность существуют в Linux. Для этого следует использовать другие средства, когда вывод, сгенерированный на одной машине, должен отображаться на другой.
Вы никогда не узнаете, на какой машине он отображается, до времени выполнения. Поэтому для этого вам нужно написать код. Я знаю, что в Unix это возможно. Но не знаю о MS или терминале cmd.
Могу я предложить вам добавить комментарий об экранировании символов с помощью Eiffel, что было моей ошибкой, пытаясь заставить его работать с
\001B
.