Vim: Разница между t_Co=256 и term=xterm-256color в сочетании с TMUX

Я тестирую различные терминалы, которые я склонен использовать для SSH, в Linux-боксы, на которых у меня установлен Tmux.

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

Я использую Vim в Tmux, и в приложении Panic's Prompt на моем iPhone5 у меня было такое поведение, что 256 цветов не были включены, когда .vimrc установить цвета с помощью set t_Co=256 директивы. Здесь Vim правильно отображал цвета, когда он не запускался через Tmux. Кроме того, Terminal.app в OS X правильно отображал цвета (к сожалению, я не проверял PuTTY на Windows) с Vim в Tmux.

Тогда я поменялся set t_Co=256 за set term=xterm-256color и теперь цвета работают при использовании Vim через Tmux.

Обратите внимание, что я проверил оба set -g default-terminal "xterm-256color" а также set -g default-terminal "screen-256color" настройки для Tmux и это изменение не повлияло на поведение.

2 ответа

Решение

Когда вы не используете tmux или же screenвам нужно всего лишь настроить эмуляторы терминала, чтобы они рекламировали себя как "способные отображать 256 цветов", устанавливая их TERM в xterm-256color или любое сопоставимое значение, которое работает с вашими терминалами и платформами. То, как вы это сделаете, будет зависеть от эмулятора терминала и выходит за рамки вашего вопроса и этого ответа.

Вам не нужно ничего делать в Vim, так как он вполне способен делать правильные вещи сам по себе.

Когда вы используете tmux или же screenэти программы устанавливают свои собственные значения по умолчанию для $TERM, обычно screenи Vim делает то, что имеет отношение к предоставленной информации.

Если вы хотите более равномерное (и красочное) поведение, вы должны настроить их на использование "лучшего" значения для $TERM:

  • tmux

    Добавить эту строку в ~/.tmux.conf:

    set -g default-terminal "screen-256color"
    
  • экран

    Добавить эту строку в ~/.screenrc:

    term "screen-256color"
    

Теперь оба мультиплексора сообщат Vim, что они поддерживают 256 цветов, и Vim сделает то, что вы ожидаете.

редактировать

Мой ответ предполагает, что вы можете редактировать эти файлы конфигурации, но, так как вы можете редактировать свои ~/.vimrcЯ не думаю, что я так далеко от цели.

редактировать 2

Значение term опция (извлекается с помощью &term) - это имя терминала, выбранное Vim при запуске. Это имя, которое вы должны установить в самом эмуляторе терминала.

Значение t_Co вариант (&t_Co) - это то, что Vim считает максимальным количеством цветов, которое может отображать хост-терминал. Он определяется в соответствии с записью, соответствующей $TERM в terminfo:

 term            | t_Co
-----------------+------ 
 xterm           | 8
 xterm-256color  | 256
 screen          | 8
 screen-256color | 256

Когда Vim запускается, он получает значение TERM переменная окружения, запрашивает terminfo базы данных с этим значением и хранит ряд информации о своей среде в нескольких t_… переменные, среди которых... количество цветов, доступных в t_Co, Учитывая "допустимый" тип терминала (тот, который Vim может искать), Vim всегда принимает правильное количество цветов.

настройка t_Co в 256 оставляя term к его Vim-определенному значению - или, в более общем случае, установка t_Co и / или term значения, которые не совпадают с терминалом хоста - не имеет смысла и, скорее всего, создадут проблемы, когда Vim отправит сигнал, который не понят терминалом или наоборот.

Хотя это вполне возможно сделать, возиться с t_Co а также term в Vim это абсолютно бесполезно и, возможно, вредно.

Опять же, просто правильно настройте эмуляторы терминала и терминальные мультиплексоры. Это действительно все, что вам нужно.

Если вы оказались в терминальном мультиплексоре или эмуляторе терминала, где вы не можете определить правильный TERMТогда и только тогда вы можете заставить Vim принять 256 цветов. С этой целью, изменение значения t_Co это единственное, что имеет смысл:

if &term == "screen"
  set t_Co=256
endif

Итак... если вы можете настроить каждую отдельную часть:

  • эмулятор терминала: xterm-256color
  • tmux / экран: screen-256color
  • vim: ничего

и вы сделали.

Если вы не можете контролировать каждую часть, используйте простое ~/.vimrc установить t_Co в соответствии с &term но не меняйте значение term,

Но если вы можете редактировать ~/.vimrc нет причин, по которым вы не можете редактировать ~/.screenrc или же ~/.tmux.conf или же ~/.bashrc или что угодно.

Вы можете использовать оба set t_Co=256 а также set term=xterm-256color все вместе.

term сообщает Vim, какой тип терминала использовать, который управляет отображением / рендерингом всех аспектов Vim, включая способ сопоставления ввода с клавиатуры, перерисовки экрана, перемещения курсора, отображения цветов и т. д. Обычно Vim может выяснить это самостоятельно. через TERM переменная окружения, предоставляемая вашей ОС.

Часто бывает полезно установить его явно, если значение ОС неверно. Это особенно верно, если вы подключаетесь по сети из эмулятора терминала, который не обеспечивает правильное значение.

t_Co является одним из многих вариантов терминала (используется системой termcap, которую Vim использует для управления терминалом). Это конкретно относится к количеству цветов, поддерживаемых терминалом. Иногда вам нужно переопределить это, если эмуляция терминала в основном корректна, но Vim неправильно определяет количество поддерживаемых цветов.

Я использую оба этих варианта в моем .vimrc чтобы убедиться, что Vim использует 256 цветов в tmux, используя все понравившиеся мне терминалы (терминал gnome в Ubuntu, iTerm2 в OSX и KiTTY в Windows). У меня также есть большинство из этих терминалов, явно настроенных для отправки xterm-256color как их тип терминала.

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