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

29

Среда:

  • Fedora 25 (4.9.12-200.fc25.x86_64)
  • GNOME Terminal 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на различные значения (некоторые вопреки рекомендациям FAQ по tmux ):
    установить -g default-terminal "screen-256color"
    установить -g default-terminal "xterm-256color"
    установить -g default-terminal "screen.xterm-256color"
    установить -g default-terminal "tmux-256color"
  • Начиная использовать Tmux tmux -2.

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

Расти Шеклфорд
источник
Не могли бы вы запустить script, запустить vim, выйти, vimа затем выйти из scriptоболочки и прикрепить полученный typescriptфайл? Затем повторите те же шаги с TERM=screen-256color vimвместо.
egmont
@egmont А вот и вы: typescript-xterm-256color и typcript -screen-256color .
Расти Шеклфорд
1
Я вижу 256-цветные escape-последовательности в xterm-256colorверсии (поиск «38; 5;» в файле), но не могу в screen-256color. Например, везде, где есть \e[38;5;81min xterm-256color(цвет № 81 из 256-цветовой палитры, средний синий оттенок), вместо него screen-256colorсодержится \e[34m(стандартный синий из 8-цветовой палитры). Поэтому главный вопрос - почему vim не использует 256-цветовую палитру в случае TERM=screen-256color.
egmont
Другая интересная вещь заключается в том, что xterm-256colorверсия, кажется, печатает экран дважды, сначала с устаревшими цветами, а затем с 256-цветовой палитрой. Ищите, например, «F1» в файле, вы найдете два совпадения xterm-256color, первое с \e[34mцветом, второе с \e[38;5;81m. Я не знаю, что здесь происходит.
egmont
Добавление set -g default-terminal "screen.xterm-256color"в ~/.tmux.confи перезагрузить конфигурации в tmux (<Cs>: источник-файл ~ / .tmux.conf) работал для меня (вопрос выделения). thx
dtrckd

Ответы:

16

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

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

Томас Дики
источник
Именно такой интеллектуально удовлетворительный ответ я искал. Спасибо!
Расти Шеклфорд
17

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

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

И в .vimrc:

set background=dark

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

Виталий Плагов
источник
3
Это решило это для меня. По какой-то причине в tmux vim не обнаружил темный фон. Явная установка bg=darkв моем vimrc исправила это.
Адам Кинан
Странно - мой $TERMкак внутри, так и снаружи tmuxбыл "xterm-256color"и явно задание фона делал это и для меня. Спасибо!
Нронней
У меня тоже сработало. Я думал, что проблема была с sttermтем, что во xfce4-terminalвсем выглядело удобно (комментарии, cyanвместо blueкоторых очень трудно читать с темным фоном). после этого изменения все работает нормально. Но не забудьте добавить unlet! skip_defaults_vim source $VIMRUNTIME/defaults.vimв файл vimrc, чтобы использовать подсветку синтаксиса и т. Д.
Abinash Dash
2

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

Vim сообщает, что использует 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себя ведет. В конце концов, bceспособность не должна иметь ничего общего с доступным количеством цветов.
egmont
@egmont Я интерпретировал ответ @ ThomasDickey следующим образом: 1) Vim проверяет bceработоспособность терминала, 2) если присутствует, выберите цветовую схему «A», 3) в противном случае выберите цветовую схему «B». Я считаю, что глубина цвета одинакова в обоих случаях (то есть 256 цветов, как t_Coпоказано). Это просто , что цветовая схема «B» на моей системе происходит только использовать 8-цветовую палитру , даже если 256 цветов можнодумаю , что объясняет то , что вы наблюдали в анализе машинописи, пожалуйста , поправьте меня , если я ошибаюсь). Помните, что после запуска :colorscheme ronя вижу escape-последовательности из 256 цветов в том же сеансе Vim.
Расти Шеклфорд
Спасибо за объяснение - я все еще не вижу никакого объяснения этому. Не берите в голову. vimимеет действительно странные дизайнерские решения.
egmont
0

Моя переменная TERM - снаружи tmux: xterm-256color, внутри tmux: screen-256color.

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

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

laktak
источник
Спасибо за предложения. Я выполнил тот же тест с urxvt (external TERM is rxvt-unicode-256color), используя соответствующий, ~/.Xdefaultsи, к сожалению, все еще наблюдал разные цвета внутри и снаружи tmux. Для сценария gnome-терминала, COLORTERMесть truecolorи TERMCAPпусто как внутри, так и снаружи tmux. Для сценария urxvt COLORTERMнаходится rxvt-xpmснаружи и truecolorвнутри tmux, а TERMCAPпусто как внутри, так и снаружи tmux.
Расти Шеклфорд
@RustyShackleford это только для Vim? Вы используете «termguicolors»? Взгляните :help xterm-true-colorили попробуйте использовать более стандартный конфиг Vim.
Лактак
Я только заметил проблему в Vim (как я уже сказал, я только недавно начал использовать tmux). Например, мой вывод терминала и вывод Git CLI имеют одинаковые цвета как внутри, так и снаружи tmux. Я не ставлю termguicolorsсвои .vimrcи :set termguicolors?отчеты notermguicolorsв обоих случаях. Я посмотрю на тему справки, на которую вы ссылались; Благодарность!
Расти Шеклфорд
0

Для моей справки позже, когда я, несомненно, Google это настройка моей следующей машины.

  • Вим8 / Неовим
  • Windows 10
  • Git Bash
  • Tmux 2.7

Используйте эти инструкции, чтобы получить необходимые двоичные файлы и библиотеки DLL в PATH Git bash:

https://blog.pjsen.eu/?p=440

Используйте эти команды для настройки:

echo 'set -g default-terminal "screen.xterm-256color"' > ~/.tmux.conf
tmux -2u
Джош Пик
источник