Почему дисплей с 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
.)