Чому кольори Vim виглядають по-різному всередині і зовні tmux?


29

Середовище:

  • 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для різних значень (деякі проти порад FAQ tmux FAQ ):
    встановити -g за замовчуванням-термінал "screen-256color"
    встановити -g за замовчуванням-термінал "xterm-256color"
    встановити -g за замовчуванням-термінал "screen.xterm-256color"
    встановити -g за замовчуванням-термінал "tmux-256color"
  • Початок використання tmux tmux -2.

У всіх випадках Vim продовжував відображати різні кольори всередині tmux.


Чи можете ви, будь ласка, запустити script, запустити vim, вийти, vimа потім вийти scriptз оболонки та приєднати отриманий typescriptфайл? Потім повторіть ті самі кроки, як TERM=screen-256color vimзамість цього.
Егмонт


1
Я бачу 256-кольорові послідовності втечі у xterm-256colorверсії (пошук у файлі "38; 5;"), але не можна в screen-256color. Наприклад , там , де є \e[38;5;81mв xterm-256color(колір # 81 з 256-кольорової палітри, середній блакитний відтінок), screen-256colorмістить \e[34mзамість цього (стандартний синій колір 8-колірної гами). Тому головне питання, чому vim не використовує 256-кольорову палітру у випадку TERM=screen-256color.
Егмонт

Ще одна цікава річ у тому, що, xterm-256colorздається, версія друкує екран двічі, спочатку із застарілими кольорами, а потім із 256-кольоровою палітрою. Шукайте, наприклад, "F1" у файлі, ви знайдете дві збіги xterm-256color, перше з \e[34mкольором, друге з \e[38;5;81m. Я не знаю, що тут відбувається.
Егмонт

Додавання set -g default-terminal "screen.xterm-256color"в ~/.tmux.confі перезавантажити конфігурації в tmux (<Cs>: джерело-файл ~ / .tmux.conf) працював для мене (питання виділення). thx
dtrckd

Відповіді:


16

tmuxне підтримує можливість terminfo bce(стирання зворотного кольору), який vimперевіряє, щоб вирішити, чи використовувати його схему "колір за замовчуванням".

Про цю характеристику tmuxзгадували вже кілька разів -


Саме таку інтелектуально відповідальну відповідь я шукав. Дякую!
Rusty Shackleford

17

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

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

І в .vimrc:

set background=dark

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


3
Це вирішило це для мене. Чомусь у tmux vim не виявив темний фон. Явно налаштування bg=darkв моєму vimrc виправили це.
Адам Кінан

Дивно - моє $TERMяк всередині, так і зовні tmuxбуло, "xterm-256color"і явно встановлення backgroun зробило це і для мене. Дякую!
nronnei

Працював і для мене. Я думав, що проблема полягає в 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 відповідь , який передбачає , що , коли Вім повідомляє він використовує defaultколірну схему, це не обов'язково означає , default.vimа деякі теми конкретної колірної гамі. Як зазначається у відповіді, темна тема (яку я використовую) відповідає ronколірній гамі, як я виявив вище. (Хоча ця посада стосується Ubuntu, я припускаю, що ОП використовував GNOME.)

Я також знайшов ще одне питання, яке, схоже, описує ту саму проблему, що і у мене. Я натрапив на це під час пошуку, перш ніж я розмістив це питання, але, чомусь, колірна схема не вразила мене актуальною.

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

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


Мені також цікаво, чому так vimповодиться. Зрештою, bceможливість не повинна мати нічого спільного з наявною кількістю кольорів.
Егмонт

@egmont Я інтерпретував відповідь @ ThomasDickey як: 1) Vim перевіряє bceздатність терміналу; 2) якщо є, виберіть кольорову схему "A", 3) в іншому випадку виберіть кольорову схему "B". Я вважаю, що глибина кольору однакова в обох випадках (тобто 256 кольорів, як t_Coпоказано). Це просто те, що в моїй системі кольорова схема "B" використовує лише 8-кольорову палітру, навіть якщо можливі 256 кольорів (я думаю, це пояснює те, що ви спостерігали під час аналізу машинопису; будь ласка, виправте мене, якщо я помиляюся) Пам'ятайте, що після запуску :colorscheme ronя бачу 256 кольорові послідовності втечі в тому ж сеансі Vim.
Rusty Shackleford

Дякую за пояснення - я все ще не бачу жодного обґрунтування цього. Не звертай уваги. vimмає дійсно дивні дизайнерські рішення.
egmont

0

Мій змінний TERM є зовнішнім tmux: xterm-256color Всередині tmux: screen-256color

Це правильно і працює для мене. Спробуйте це з іншим терміналом (я використовую urxvt), щоб дізнатися, чи проблема Gnome Terminal. Сігналы абмеркавання 

Також перевірте COLORTERM(для мене встановлено значення rxvt) і unset TERMCAP.


Дякуємо за пропозиції. Я побіг же тест з urxvt (зовнішній TERM це rxvt-unicode-256color) , використовуючи відповідний ~/.Xdefaultsі , до жаль , до сих пір спостерігаються різні кольори всередині і зовні tmux. Для сценарію gnome-terminal, COLORTERMє truecolorта TERMCAPпорожній як всередині, так і зовні tmux. Для сценарію urxvt COLORTERMзнаходиться rxvt-xpmзовні і truecolorвсередині tmux, а TERMCAPпорожній як всередині, так і зовні tmux.
Rusty Shackleford

@RustyShackleford це лише для Vim? Чи використовуєте ви термін "кольори"? Погляньте :help xterm-true-colorабо спробуйте скористатись більш конфігурацією Vim за замовчуванням.
лактак

Я поки що помітив проблему у Vim (як я вже сказав, я нещодавно почав використовувати tmux). Наприклад, мої термінальні підказки та вихід Git CLI мають однакові кольори як всередині, так і зовні tmux. Я не встановлюю termguicolorsсвоїх .vimrcі :set termguicolors?звітів notermguicolorsв обох випадках. Я перегляну тему довідки, на яку ви посилалися; Спасибі!
Rusty Shackleford

0

Для моєї власної довідки пізніше, коли я, безсумнівно, google це налаштування моєї наступної машини.

  • Vim8 / Neovim
  • 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.