Почему цвета Vim выглядят по-разному внутри и вне tmux?

Окружающая среда:

  • Fedora 25 (4.9.12-200.fc25.x86_64)
  • Терминал GNOME 3.22.1 Использование версии VTE 0.46.1 + GNUTLS
  • VIM – Vi IMproved 8.0 (2016 12 сентября, скомпилировано 22 февраля 2017 16:26:11)
  • tmux 2.2

Недавно я начал использовать tmux и заметил, что цвета внутри Vim меняются в зависимости от того, запущен ли я внутри или вне tmux. Ниже приведены скриншоты Vim снаружи (слева) и внутри (справа) tmux при просмотре Git diff:

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

Моя переменная TERM

  • Внешний tmux: xterm-256color
  • Внутри tmux: screen-256color

Vim сообщает эти типы терминалов, как ожидалось (через :set term? ):

  • Вне tmux: term=xterm-256color
  • Внутри tmux: term=screen-256color

Vim также сообщает, что оба экземпляра работают в 256-цветном режиме (через :set t_Co? ):

  • Внешний tmux: t_Co=256
  • Внутри tmux: t_Co=256

Есть много похожих вопросов о том, как заставить Vim работать в режиме 256 цветов внутри tmux (лучший ответ, который я нашел здесь ), но я не думаю, что это моя проблема, учитывая приведенную выше информацию.

Я могу дублировать проблему за пределами tmux, если я запустил Vim с типом терминала, установленным на screen-256color :

 $ TERM=screen-256color vim 

Поэтому я считаю, что существует простое различие между возможностями терминала xterm-256color и screen-256color , которые вызывают разницу в цвете. Что приводит к вопросу, заданному в названии: что конкретно в терминальных возможностях заставляет цвета Vim отличаться? Я вижу различия между запуском :set termcap внутри и вне tmux, но мне любопытно, какие переменные фактически вызывают разницу в поведении.

Независимо от предыдущего вопроса, возможно ли, чтобы цвета Vim были согласованными при работе внутри или вне tmux? Некоторые вещи, которые я пробовал, включают:

  • Явно устанавливая терминал tmux по умолчанию, используется в ~/.tmux.conf для разных значений (некоторые из них ~/.tmux.conf к ~/.tmux.conf по ~/.tmux.conf параметру tmux):
     set -g default-terminal "screen-256color"
     set -g default-terminal "xterm-256color"
     set -g default-terminal "screen.xterm-256color"
     set -g default-terminal "tmux-256color"
  • Запуск tmux с использованием tmux -2 .

Во всех случаях Vim продолжал отображать разные цвета внутри tmux.

tmux не поддерживает функцию terminfo bce ( bce цвета в фоновом режиме), которую vim проверяет, чтобы решить, использовать ли ее схему «по умолчанию».

Эта характеристика tmux была упомянута несколько раз –

  • Сбросить фон до прозрачного с помощью tmux?
  • Сброс до конца строки использует неправильный цвет фона в tmux

Благодаря анализу @ egmont того, какие цвета выводил Vim, когда TERM=screen-256color , я был вдохновлен взглядом на цветовой гамме, которую использует Vim в двух сценариях.

Vim сообщает, что в обоих случаях default цветовую схему по default . Я подумал, что это странно, потому что цветовая схема по default для Fedora 25 ( /usr/share/vim/vim80/colors/default.vim ) не соответствует цветам, которые я на самом деле вижу, когда TERM=xterm-256color . Если я явно устанавливаю цветовую схему, используя :colorscheme default когда TERM=xterm-256color , внешний вид Vim изменяется на это, когда TERM=screen-256color . Чтобы вернуть цвета к тем, какими они были, когда я впервые начал Vim, мне пришлось использовать цветовую схему ron . Прогресс!

Я нашел ответ Ask Ubuntu, который предполагает, что, когда Vim сообщает, что использует цветовую схему по default , это не обязательно означает default.vim а скорее некоторую цветовую схему для конкретной темы. Как отмечается в ответе, темная тема (которую я использую) соответствует цветовой схеме ron , как я обнаружил выше. (Хотя этот пост относится к Ubuntu, я предполагаю, что OP использует GNOME.)

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

Я закончил тем, что сделал @LapshinDmitry в своем ответе, и явно установил colorscheme ron в моем файле ~/.vimrc . Теперь, независимо от того, запускаю ли я Vim внутри или вне tmux, цвета выглядят одинаково. Единственным недостатком является то, что если я когда-либо изменю тему рабочего стола от темного вкуса до легкого вкуса, Vim не будет автоматически переключаться на цветовую схему цвета «по умолчанию», которая, по-видимому, является peachpuff . Я могу жить с этим, так как вряд ли когда-либо изменю свою тему.

Я не собираюсь принимать этот ответ, потому что я рассматриваю явно задание цветовой схемы в моем ~/.vimrc пути, а не в решении. Если кто-то может объяснить, почему Vim загружает другую цветовую схему по умолчанию, в зависимости от значения TERM , я буду рад принять этот ответ, поскольку меня больше интересует понимание основной причины. Я подозреваю, что это имеет какое-то отношение к тому, как Vim интерпретирует возможности терминала между двумя файлами terminfo.

Раньше у меня была аналогичная проблема. Комментарии в синем в Vim, где трудно читать. В .tmux.conf я установил это:

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

И в .vimrc :

 set background=dark 

Теперь он выглядит следующим образом и работает как в терминале Gnome, так и в Cygwin: введите описание изображения здесь

Моя переменная TERM – внешняя tmux: xterm-256color Inside tmux: screen-256color

Это правильно и работает для меня. Попробуйте использовать другой терминал (я использую urxvt), чтобы узнать, является ли проблема с Gnome Terminal.

Также проверьте COLORTERM (мой установлен на rxvt ) и unset TERMCAP .