Подтвердить что ты не робот

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

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

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

Я использую Vim в Tmux, а в приложении Panic Prompt на моем iPhone5 у меня было поведение, которое не поддерживало 256 цветов, когда .vimrc устанавливал цвета с помощью директивы set t_Co=256. Здесь Vim правильно отображал цвета, когда он не запускался через Tmux. Кроме того, OS X Terminal.app правильно отображал цвета (я не тестировал 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, и это изменение не повлияло на поведение.

4b9b3361

Ответ 1

Если вы не используете 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: screen-256color
  • vim: nothing

и все готово.

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

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

Ответ 2

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

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

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

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

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