2013-03-13 2 views
27

Я тестирую различные терминалы, которые я обычно использую для SSH в ящики Linux, в которых я настроен Tmux.Vim: разница между t_Co = 256 и term = xterm-256color в сочетании с TMUX

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

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

+1

vim romainl

+4

У вас есть неправильный порядок: 'vim

+0

Смартфон часть сумасшедшая часть. – romainl

ответ

61

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

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

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

Если вы хотите более равномерным (и красочный) поведение, вы должны настроить их использовать «лучше» значение для $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 или любой другой.

+0

Я уже указал в вопросе, что это не ответ. Теперь я понимаю, что этот ответ может помочь другим читателям (потому что он касается вещей, которые я уже полностью рассмотрел и протестировал), но не является ответом на вопрос о различии между этими двумя настройками vim. –

+1

Это ответ на лежащую в основе проблему. Вам ничего не нужно делать в Виме. – romainl

+0

@StevenLu, см. Мое редактирование. – romainl

7

Вы можете использовать как 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 в качестве своего типа терминала.

+0

Я так и не понял, что могу установить оба одновременно. Я думаю, что, вероятно, лучшие шансы на то, чтобы «просто работать». Спасибо –

+0

Основная причина спора здесь, почему, когда я говорю Tmux указывать через 'set -g default-terminal 'xterm-256color" '* и * i проверить, выполнив в tmux' echo $ TERM', он сообщает 'xterm -256color', что vim, работающий внутри tmux, по-прежнему не может обеспечить правильную окраску, если я не использую «set term = xterm-256color» vim? По крайней мере, на моем iphone в подсказке он делает это. –

+0

@StevenLu, вы должны использовать 'screen-256color', а не' xterm-256color'. – romainl