Почему дисплей с 256 цветами не работает с консолью linux, а с экраном?

Я работаю над программой на Python с текстовым графическим интерфейсом на основе urwid. urwid - это библиотека для создания программ в стиле ncurses с python.

Операционная система - CentOS 7.

Все нормально работает в "нормальных" условиях (X-Server, окно терминала). Однако на консоли Linux без X-сервера urwid переключается в режим низкого цвета. (С неправильными цветовыми кодами на некоторых машинах я получаю раздражающе мигающий текст, чем)

Забавно, что при использовании консоли linux мне просто нужно запустить screen в качестве обходного пути. Внутри экрана все снова хорошо. Без какой-либо специальной конфигурации для экрана.

Я уже пытался сравнить много информации об окружающей среде между текстовой и экранной оболочками, но это не помогло. Например, локаль идентична, pythons sys.stdout.encoding одинакова, выполнение ":runtime syntax/colortest.vim" в vim выглядит правильно и красочно в обоих случаях.

1 ответ

Решение

Это нормально. Это происходит просто потому, что консоль ядра Linux не поддерживает 256-цветный режим. Он не был написан для 256 цветов, так как в текстовом режиме VGA это просто невозможно. (В режиме кадрового буфера это возможно, но код все еще имеет те же ограничения.) GNU Screen знает об этом и автоматически переводит из 256-цветовой палитры в ближайшую 16-цветную.

Только самые последние версии Linux (3.13 и более поздние) начали распознавать управляющие коды из 256 цветов, но даже тогда они по-прежнему отображают их в 16-цветную палитру, как это делает Screen.

Существуют эмуляторы терминалов на основе фреймбуфера, такие как kmscon или fbterm, которые реализуют свой собственный рендеринг и рисуют все через KMS. Используйте их, если вы хотите способный терминал, избегающий X11.


Мигание текста происходит потому, что 256-цветные коды очень легко спутать с 16-цветными. Например, ESC [38;5;35m может интерпретироваться как 256-цветный код или три ANSI (16-цветных) кода.

  • Консоль Linux не знает что 38 значит, так это просто интерпретирует 5 как "включить мигание" и 35 как "передний план - цвет #5 (пурпурный)" обычным способом.
    (См., Например, эту таблицу в разделе "SGR".)

  • Между тем, ваши терминалы X11 распознают 38 как магический код "передний план - дополнительные цвета", поэтому они интерпретируют 5 как "использовать 256-цветовую палитру" и 35 как "использовать цвет #35 (голубой)".
    (Есть также 24-битный режим RGB, как ESC [38;2;<r>;<g>;<b>m .)

Другие вопросы по тегам