Eiffel: есть ли способ печати цветных символов в терминале (консоли) - PullRequest
0 голосов
/ 17 октября 2018

Пытаясь написать некоторые улучшения в логгере, я хотел бы иметь дело с интерпретацией кодов ANSI, и кажется, что он не работает ни со стандартным методом io.putstring, ни с print Интересно, есть способ сделать что-то такое, как

echo -e "\u001B[31mSome_red_txt" в bash

Кажется, другие языки могут это сделать, но я не могу в Eiffel.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

В дополнение к ответу Джоселин те же последовательности кодов 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 в таких случаях.

0 голосов
/ 17 октября 2018

Используя интерпретацию кодов ANSI, вы можете сделать

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

Вы можете проверить наличие существующих библиотек C, таких как ncurses.Обратите внимание, что он не будет работать на консоли Windows, так как теперь он больше не поддерживает код ANSI, поэтому вам нужно использовать Windows API.

...