Поддержка Tmux, TERM и 256 цветов

48

Введение

Мой вопрос возникает из-за необходимости понять, почему у меня сейчас (после нескольких испытаний) Terminal и tmux, поддерживающий 256 цветов, и tput colorsсказано, что их всего 8.


Фон

Начнем с самого начала.

Я использую Ubuntu box, Guake , tmux , Vim и мне нравится тема Solarized . Они выглядели довольно ужасно, поэтому я решил включить поддержку 256 цветов и немного поиграть.

Посмотрим, что будет с моим терминалом . tput colorsговорит, что есть 8 цветов. Я лично установил их на фиолетовый, слева, и, конечно, справа у нас есть 2 разных оттенка синего. $TERMговорит xterm. (Чтобы покрасить lsя eval это по моему .bashrc.)

введите описание изображения здесь

Vim также выглядит хорошо, несмотря на то, что я вызываю его с 256флагом в среде, где 256 цветов не поддерживаются.

set t_Co=256
let g:solarized_termcolors=256
colorscheme solarized

Единственный парень, который жалуется на ограниченное цветовое пространство, это tmux . Вызов tmuxдает «неправильные» ожидаемые результаты.

введите описание изображения здесь

Но колл tmuxс -2флагом заставляет все работать как по волшебству .

введите описание изображения здесь

Теперь единственное, что я понимаю, это то, что -2эквивалентно export TERM=screen-256color( источник ).

Guake ведет себя аналогично терминалу, и оба они отвечают xtermна вопрос echo $TERM.


Вопрос

В принципе, кто-нибудь понимает, почему все работает, даже если не должно?

  • Я садист, что жалуюсь, почему все работает? Может быть.
  • Есть ли лучшая причина? Конечно: я хотел бы исправить появление других коробок Ubuntu в моем офисе, и я хотел бы понять, почему все работает или не работает.

Дополнительные эксперименты

Запуск этого скрипта (слегка измененного) в my xtermдает следующий результат: 256 цветов, но только 16 отображаются правильно.

введите описание изображения здесь

Затем, меняя профиль терминала, меняются и эти 16 цветов.

введите описание изображения здесь

Следующие тесты

Слева направо, сверху вниз, у нас есть цветовая тема Solarized , dircolor ansi-darkа 256darkзатем цветовая схема по умолчанию ( Tango ) dircolor ansi-darkи 256dark.

введите описание изображения здесь

Замечание : в теории цветовая гамма dircolor ansi-darkна соляризации должна соответствовать dircolor 256dark. Это явно не происходит для конкретных перечисленных файлов. Вместо этого это происходит, когда в рабочем каталоге есть папки , текстовые файлы и символические ссылки . Вывод : не так много внимания уделено кодированию 256darkцветов.


Предварительные выводы

xtermподдерживает 256 цветов, несмотря на то, что tput colorsговорит. Программы могут ссылаться на ansiпалитру (настраиваемую пользователем) или определять свои цвета, выбирая в общей сложности 256 цветов.

Atcold
источник
1
Прочитайте этот ответ и комментарии под ним. Это отвечает на ваш вопрос? Также посмотрите на этот скрипт для получения реального количества поддерживаемых цветов.
Тердон
Хм ... Я все еще немного смущен ... Но, я думаю, я по крайней мере понимаю, что tput colorsэто ненадежный тест. Не могли бы вы проверить мои предварительные выводы ?
Atcold
2
Мое чтение ответа Гилле состоит в том, что tput colorsможет возвращаться только одно значение, а в терминалах, которые поддерживают любой из 2,8,16,88 или 256 цветов, возвращается только первое значение (8 в вашем случае). Чтобы получить истинное значение, используйте скрипт из моего последнего комментария. Что это возвращает?
Terdon
Проверьте мои дополнительные эксперименты выше :)
Atcold
Ах, прости, мой плохой.
Terdon

Ответы:

33

В FAQ по tmux есть информация о поддержке 256 цветов .

Определить количество цветов, поддерживаемых терминалом, к сожалению, не так просто по историческим причинам. См. Проверка количества цветов, поддерживаемых моим эмулятором терминала, для объяснения. Это значит, что

  • tmux не может достоверно определить, поддерживает ли терминал более 8 цветов;
  • tmux не может надежно сообщить приложению, что оно поддерживает более 8 цветов.

Когда вы находитесь в tmux, терминалом, с которым вы взаимодействуете, является tmux. Он не поддерживает все управляющие последовательности xterm. В частности, он не поддерживает OSC 4 ; …управляющую последовательность для запроса или установки значений цвета. Вы должны использовать это при непосредственном запуске в xterm, вне tmux.

Если вы запускаете tmux -2, то tmux запускается с поддержкой 256 цветов, даже если он не думает, что ваш терминал поддерживает 256 цветов (что довольно распространено).

По умолчанию tmux рекламирует себя screenбез поддержки 256 цветов. Вы можете изменить значение TERMв, .tmux.confчтобы указать поддержку 256 цветов:

set -g default-terminal "screen-256color"

Вы можете использовать TERM=xterm-256colorили TERM=screen-256colorна Ubuntu. Эти значения вызовут проблемы только в том случае, если вы войдете на удаленный компьютер, у которого нет записей termcap / terminfo для этих имен. Вы можете скопировать записи в свой домашний каталог на удаленной машине; это работает с большинством современных реализаций terminfo.

# From the Ubuntu machine to a machine that doesn't have *-256color terminfo entries
ssh somewhere.example.com mkdir -p .terminfo/s .terminfo/x
scp -p /lib/terminfo/s/screen-256color somewhere.example.com:.terminfo/s/
scp -p /lib/terminfo/x/xterm-256color somewhere.example.com:.terminfo/x/
Жиль "ТАК - перестань быть злым"
источник
Я ценю объяснение, но я не уверен , что он нацелен на мой вопрос .. Ну, я согласен , что мой вопрос был достаточно широк, но я не был особым акцентом на tmux . На самом деле, tmux был единственным, кто вел себя в соответствии с ожиданиями. Гораздо более загадочным было то, как xtermмне удалось показать 256 цветов, хотя tput colorsон и говорил 8. Я думаю, что ответ на этот конкретный вопрос был адресован @terdon в его комментариях к самому вопросу.
Atcold
@ Atcold Это длинный вопрос, но, насколько я могу судить, я ответил на него. Части, не относящиеся к tmux, охвачены ответом, с которым мы с Тердоном связались (и который я написал). Ваш вопрос был бы дубликатом этого вопроса, если бы не аспект tmux. Что еще вы ожидали от ответа?
Жиль "ТАК - перестань быть злым"
1
@ Жиль , я не хотел звучать злобно . Я пытался присвоить @terdon «принятый ответ», хотя он ссылается на ваш ответ в другом вопросе. Несмотря на это, set -g default_terminal "screen-256color"команды недостаточно для включения 256 цветов в tmux . Вам нужно alias tmux='export TERM=screen-256color; /usr/bin/tmux'( ссылка ).
Atcold
@ Atcold Нет, псевдоним не нужен (я проверял). Более того, этот псевдоним не имеет смысла: он притворяется, что tmux работает внутри screen или tmux. Тем не менее, вам нужно запустить tmux -2в соответствии с моим предыдущим параграфом, если tmux не думает, что ваш текущий терминал поддерживает 256 цветов, поэтому alias tmux='tmux -2'имеет смысл.
Жиль "ТАК - перестань быть злым"
2
@Atcold Этот ответ U & L имеет TERM=xterm-256color tmux, что разумно, в отличие от TERM=screen-256color tmux. tmux -2лучше, потому что он работает, даже если screen-256colorне находится в локальной базе данных terminfo.
Жиль "ТАК - перестань быть злым"
21

Я впечатлен тем, насколько богато отформатированы и подробны ответы (и вопрос!). Хотя они предоставляют ценную информацию и решения об инструментах, которые вы упомянули, они дают очень мало информации о том, что происходит , и, самое главное, почему (несколько) вещи работают для некоторых инструментов, когда они предположительно не должны.

Итак, вот несколько идей по вашим основным вопросам:

  • Что поддерживает терминал и что он сообщает, это разные вещи. Например, терминал Gnome способен отображать 256 цветов, но он объявляет себя (через $TERMпеременную) в качестве xtermэмулятора (8 цветов).

  • Инструменты, подобные тому, tputчто TERMустановлено: tput colorsмогут печатать 8, а env TERM=xterm-256color tput colorsпечатать 256, независимо от того, поддерживает ли ваш терминал такие возможности.

  • vimтакже следуйте TERMпо умолчанию, но, как вы сказали, чтобы использовать 256 цветов (через флаг или set t_Co=256), он будет использовать 256 цветов. И это работает, потому что ваш терминал на самом деле поддерживает это.

  • tmuxТак же, как Gnome Terminal, также по умолчанию сообщает о себе как 8-цветный терминал. Но, в отличие от Gnome Terminal, он позволяет использовать только 256 цветов, если вы используете -2флаг, что также позволяет ему сообщать о себе как о xterm-256colorсовместимом эмуляторе.

  • xterm, как и в программном обеспечении эмулятора терминала для X11 , точно поддерживает 256 цветов. Но, xtermкак в TERM=xterm8-цветном "стандарте". Это означает возможности оригинала xterm . Когда он был обновлен для поддержки 256 цветов, давным-давно он придумал xterm-256colorтермин для этого.

Итак, все сводится к:

  • Какие возможности ваш терминал на самом деле поддерживает (и включен для этого)

  • Как он сообщает о таких возможностях в окружающую среду через TERM

  • Как инструменты интерпретируют TERMи корректируют себя соответственно.

  • Как вы можете сделать из вышеизложенного, избегайте использования export TERM=xterm-256colorваших ~/.bashrcи подобных сценариев . Поскольку эти файлы выполняются независимо от того, какой терминал вы на самом деле используете, все ваши терминалы, включая удаленные соединения из Windows с Putty, консольный терминал Linux и т. Д., Будут сообщать о совместимости с xterm-256color. Что может быть правдой для некоторых, но, конечно, не для всех. Например getty, консоль linux, к которой вы обращаетесь CTRL+ALT+1..6, этого не делает.

  • Терминалы должны сообщать о себе как о «стандарте», с которым они наиболее совместимы. Если вы знаете, что они могут обрабатывать 256 цветов, настройте их для рекламы как таковой.

Последнее, но не менее важное, удивительное чтение TERMи 256 цветов:

http://blog.sanctum.geek.nz/term-strings/

http://blog.sanctum.geek.nz/256-colour-terminals/

MestreLion
источник
Пример сценария или два были бы хорошими дополнениями к этому ответу.
Элайджа Линн
5

Я предоставлю дополнительный ответ, который касается только ваших дополнительных экспериментов, если они связаны с цветами солнечного каталога .

Настроить

У нас такой же цветовой вывод из тестового скрипта. Единственное отличие состоит в том , что я использовал lxterminalна Openbox с тонким , xcompmgr и без СД. Поэтому я не могу легко установить пользовательскую палитру, как вы сделали, так как этот эмулятор терминала не предлагает эти настройки в графическом интерфейсе, и для него нет специальной темы (они существуют только для нескольких эмуляторов терминала). Поэтому я просто использую некоторые полупрозрачные, неокрашенные терминалы и этот синий в качестве цвета переднего плана на синем фоне Gentoo . Поскольку я не могу использовать ANSI- версии цветных файлов, я сосредоточился исключительно на получении результатов, dircolors.256darkто есть на «ухудшенной» простой версии.

Я использовал следующую соответствующую конфигурацию и средний шрифт inconsolata :

echo $TERM
xterm

.bashrc:
eval `dircolors /path/to/dircolors.256dark`

.vimrc:
set t_Co=256
let g:solarized_termcolors=256
syntax enable
set background=dark
colorscheme solarized

.tmux.conf:
nothing at all related to colors!
start tmux with "tmux -2"

Dircolors

На рисунке ниже показано, что происходит внутри и снаружи tmux с этими настройками. Первая треть слева показывает неокрашенные внутренние оконные окна, сложенные вертикально (3). Справа у вас есть сборка tmux, показывающая те же идентичные программы. (3) Я также включил соляризованную xterm1, показывающую nano, используя файл .Xresources, включенный в полный пакет (и сэмплируя его xrdb -load ~/.Xresources):

введите описание изображения здесь пожалуйста, щелкните правой кнопкой мыши / просмотрите изображение для проверки в полном разрешении

Первый терминал в верхнем левом углу демонстрирует цвета каталога по умолчанию. Чуть ниже - деградированная соляризованная версия. За исключением розового на синем фоне для .cфайлов, которые я добавил, он идентичен тому, что ожидается от этого (см. Изображение ниже для справки). По сравнению со значениями по умолчанию, он основывается на расширенных атрибутах, таких как полужирный / светлый / обратный и т. Д., И цвета, очевидно, отличаются. Цвет по умолчанию для .txtфайлов во многих дистрибутивах зеленый, но вместо солнечного он должен быть серым . Файл ANSI, отображающий файл с расширением TXT зеленого цвета, либо неправильно отображается, либо не отображается вообще. Результаты с правой стороны, которые вы показали, являются правильными (256 dark) по отношению к следующей ссылке:

введите описание изображения здесь соляризации «деградирует» dircolors ссылка на карту

наблюдения

В конфигурации, которую я использовал, результаты выглядят одинаково внутри и снаружи tmux (я перевернул комментарии (#) в vi, но в остальном плагин ведет себя так, как должен, и мультиплексор на это не влияет). Шрифты играют огромную роль в определении функций соляризации , и хороший шрифт необходим для максимального удобства . В соляризации цвета каталога с помощью 256dark файла соответствовать ссылке и не требует специальной настройки эмуляции терминала.


Заключение

На самом деле рендеринг ANSI цветов каталога просто полностью отличается от деградации соляризации (256 dark). Настолько, что под ANSI .txt файлы зеленые. Один не может быть использован для проверки рендеринга другого. Оба решения нуждаются в разной конфигурации и дают совершенно разные результаты.


источник
«Я не понимаю вашего вывода о том, что не так много внимания уделено кодированию 256-тьмы, где на самом деле это единственный цветовой файл, который дает соляризованный список каталогов?» Моя путаница возникает из-за того, что я считал ansi-darkправильный вывод (так как он использует не деградированную версию). Затем, если вы берете в качестве ссылки результат 256dark, то у вас обратное мышление.
Atcold
«В конфигурации, которую я использовал, результаты выглядят одинаково внутри и снаружи tmux» Конечно, если вы используете 256 цветов, то, конечно, они будут отображаться одинаково везде, где у вас есть поддержка 256 цветов. «Непонятно, что решение ANSI будет дальше предоставлять в этом контексте ...» В результате будет получен истинный Solarized их (вместо приблизительного).
Atcold
Я понимаю. Я действительно не исследовал ANSI-часть, поэтому не мог понять, откуда вы пришли. В любом случае, я нашел ваш Q довольно активным, спасибо. Может быть, я буду использовать vi больше сейчас, когда нахожу это довольно лол. Что касается результатов ANSI, на самом деле теперь я видел, как это выглядит ... они демонстрируют это только для цветов DIR . Почему ч. они имеют различную кодировку под этим ... Я имею в виду, я вижу .txt зеленый ... как серый близко к зеленому? Я не понимаю их проект всерьез.
Да, я связался с автором лично, и ответ таков: «Это была его личная настройка, так как ему это нравилось». Я потерял дар речи ... Я рад, что мой Q помог кому-то :)
Atcold