Проблеми з використанням кольорової схеми в NeoVim


16

У мене немає повного розуміння того, як моя колірна схема взаємодіє з termналаштуваннями vim, і це перешкоджає моїй здатності змусити її правильно відображатися в neovim.

У моєму файлі .vimrc правильна поведінка відповідної кольорової гами вимагає налаштування

set term=xterm
set t_Co=256

Якщо пропустити будь-яке з цих налаштувань, це призведе до неправильного відображення кольорової гами:

виправити Правильний кольоровий дисплей неправильно Неправильний кольоровий дисплей різні неправильні Різні невірні кольорові дисплеї

Схема виглядає приблизно так:

set background=dark
hi clear
if exists("syntax_on")
    syntax reset
endif
let g:colors_name="impact3"

if exists("g:impact_transbg")
    hi Normal       ctermfg=255 ctermbg=none
    hi NonText      ctermfg=DarkGray  ctermbg=none

    hi Statement    ctermfg=Blue      ctermbg=none
    hi Comment      ctermfg=DarkGray  ctermbg=none cterm=bold term=bold
    hi Constant     ctermfg=173  ctermbg=none
    hi Identifier   ctermfg=Cyan      ctermbg=none
    hi Type         ctermfg=DarkGreen ctermbg=none
    hi Folded       ctermfg=0 ctermbg=235 cterm=underline term=none
    hi Special      ctermfg=Blue      ctermbg=none
    hi PreProc      ctermfg=LightGray ctermbg=none cterm=bold term=bold
    hi Scrollbar    ctermfg=Blue      ctermbg=none
    hi Cursor       ctermfg=white     ctermbg=none
    hi ErrorMsg     ctermfg=Red       ctermbg=none cterm=bold term=bold
    hi WarningMsg   ctermfg=Yellow    ctermbg=none
    hi VertSplit    ctermfg=0     ctermbg=0
    hi Directory    ctermfg=Cyan      ctermbg=DarkBlue
    hi Visual       ctermfg=White     ctermbg=Gray cterm=underline term=none
    hi Title        ctermfg=255     ctermbg=Blue
    hi String       ctermfg=Blue   ctermbg=none

    hi StatusLine   term=bold cterm=bold,underline ctermfg=White ctermbg=Black
    hi StatusLineNC term=bold cterm=bold,underline ctermfg=Gray  ctermbg=Black
    hi LineNr       term=bold cterm=bold ctermfg=2 ctermbg=None
    hi Search       ctermfg=Black ctermbg=2
    hi TabLine      ctermfg=0 ctermbg=DarkGray
    hi TabLineFill  ctermfg=DarkGray ctermbg=DarkGray
else
    hi Normal       ctermfg=White ctermbg=Black
    hi NonText      ctermfg=DarkGray  ctermbg=Black

    hi Statement    ctermfg=Blue      ctermbg=Black
    hi Comment      ctermfg=DarkGray  ctermbg=Black cterm=bold term=bold
    hi Constant     ctermfg=DarkCyan  ctermbg=Black
    hi Identifier   ctermfg=Cyan      ctermbg=Black
    hi Type         ctermfg=DarkGreen ctermbg=Black
    hi Folded       ctermfg=DarkGreen ctermbg=Black cterm=underline term=none
    hi Special      ctermfg=Blue      ctermbg=Black
    hi PreProc      ctermfg=LightGray ctermbg=Black cterm=bold term=bold
    hi Scrollbar    ctermfg=Blue      ctermbg=Black
    hi Cursor       ctermfg=white     ctermbg=Black
    hi ErrorMsg     ctermfg=Red       ctermbg=Black cterm=bold term=bold
    hi WarningMsg   ctermfg=Yellow    ctermbg=Black
    hi VertSplit    ctermfg=White     ctermbg=Black
    hi Directory    ctermfg=Cyan      ctermbg=DarkBlue
    hi Visual       ctermfg=White     ctermbg=DarkGray cterm=underline term=none
    hi Title        ctermfg=White     ctermbg=DarkBlue

    hi StatusLine   term=bold cterm=bold,underline ctermfg=White ctermbg=Black
    hi StatusLineNC term=bold cterm=bold,underline ctermfg=Gray  ctermbg=Black
    hi LineNr       term=bold cterm=bold ctermfg=White ctermbg=Black
endif

У neovim termне можна встановити. Я спробував викликати neovim за допомогою встановленого вручну $ TERM так:

TERM=xterm nvim

Це призвело до правильного відображення кольорів у регулярному vim (тобто еквівалентному встановленню терміна в .vimrc), але в неовімі це виглядає приблизно так:

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

Чому поєднання set term=xtermта set t_Co=256необхідне для правильного відображення цієї кольорової гами в vim і чому еквівалентна комбінація налаштувань призводить до іншого результату в неовімі?

Редагувати:

Типовим є те $TERM=xterm256-color , що з певних причин доводиться переосмислювати xtermв звичайному форматі vim, щоб правильно відобразити кольори. Зі змінною середовища за замовчуванням 256, neovim виглядає так:

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

Це ідентично звичайному vim xterm256-color, але не за призначенням. Моя мета - зрозуміти, чому хакер xterm необхідний / працює в vim, і чому він не виглядає так само в neovim.

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


1
Ваш $ TERM вже налаштований на те, що зазвичай вважається "правильним" у сучасних системах - 256-кольоровий. Таким чином, опція t_Co, яка зазвичай відповідає сумісності зі старими терміналами, не повинна бути необхідною. Що робити, якщо ви прокоментуєте обидві лінії конфігурації?
Девід Лорд

@David Коментуючи обидві конфігураційні лінії виглядає так само, як коментувати set term=xterm.
Gall

Чи можете ви включити скріншот кольорової конфігурації iTerm, яку ви використовуєте, коли тема відображається правильно, а також вихід із запуску цього сценарію ?
Ерік Прутт

Відповіді:


11

Основне питання

Основна проблема, яку ви відчуваєте, викликана впорядкуванням команд у вашому .vimrc.

Ви встановлюєте g:impact_transbgзмінну після завантаження схеми кольорів, і тому змінна не існує, коли вона перевіряється ifтвердженням кольорової схеми , і використовується друга версія схеми кольорів (у elseблоці).

Щоб виправити, вам просто потрібно перемістити лінію, яка встановлює змінну над лінією, куди ви завантажуєте схему кольорів:

let g:impact_transbg=1
colorscheme impact3

Ви можете (і повинні!) Потім видалити непотрібні рядки зі свого .vimrc:

set term=xterm
set background=dark
set t_Co=256

Інші питання

Я також можу прояснити кілька інших помилок / плутань, які можуть виникнути щодо того, як це все працює:

Пояснення поведінки 'term'&'t_Co'

Для вашого $ TERM встановлено значення xterm256-color. Vim читає це і запитує terminfo (або termcap), щоб дізнатися, скільки кольорів підтримує термінал, а потім встановлює 't_Co'відповідно. Якщо припустити, що ваш $ TERM є правильним (ваше є), і ваша база даних terminfo містить правильну інформацію для цього терміналу (ваша робота), вам ніколи не потрібно вручну скидати 't_Co'.

Однак ви вручну встановлюєте Vim's 'term'на xterm. Ваш термфо повідомляє Vim, що цей термінал підтримує лише 8 кольорів, тому додавання цього призведе 't_Co'до неправильного встановлення значення 8. Ви вручну 't_Co' повертаєтесь до 256, але якби ви залишили 'term'налаштування у правильному значенні, вам би не потрібно було .

Між іншим, коли ви змінюєте 't_Co'вручну після встановлення g:impact_transbg, це призводить до перезавантаження схеми кольорів (щоб дозволити схемі кольорів адаптуватися до нової кількості кольорів), і тому g:impact_transbg , що зараз встановлено, ви отримуєте бажані кольори.

(Якщо параметр рядка 'term'опущено, 't_Co'він вже встановлений на 256, коли ви переходите до останнього рядка у вашому .vimrc, і тому кольорова схема не перезавантажується: отже, неправильні кольори.)

Отже, резюмувати:

term=xterm
colorscheme impact3
let g:impact_transbg=1
set t_Co=256

Результат: кольорова схема перезавантажується, коли 't_Co'встановлено значення 256, кольори правильні.

"term=xterm
colorscheme impact3
let g:impact_transbg=1
set t_Co=256

Результат: Colorscheme завантажується colorschemeкомандою, змінної не існує, кольори неправильні.

term=xterm
colorscheme impact3
let g:impact_transbg=1
"set t_Co=256

Результат: Colorscheme завантажується colorschemeкомандою, змінна не існує, а Vim використовує лише 8 кольорів, кольори неправильні.

"term=xterm
colorscheme impact3
let g:impact_transbg=1
"set t_Co=256

Результат: Colorscheme завантажується colorschemeкомандою, змінної не існує, кольори неправильні.

let g:impact_transbg=1
colorscheme impact3

Результат: ColorScheme завантажується colorschemeкомандою, змінна робить існує, тому кольори є правильними. (І як бонус, 'term'і 't_Co'також правильно!)

У NeoVim поведінка відрізняється просто тим, що виклик для встановлення 't_Co'ігнорується, як вже говорили інші відповіді.

'background'

Після встановлення схеми кольорів ви також встановите 'background'. Для цього конкретного ColorScheme, це абсолютно НЕ потрібно, тому що перше , що ColorScheme робить це набір 'background'до 'dark'.

Зауважте, що я не згоден з іншим відповідачем, який пропонує вам встановити його 'background'після завантаження вашої кольорової схеми. Колірка 'background'кольорів може використовувати значення для регулювання своїх кольорів, тому налаштування 'background'перед завантаженням схеми кольорів є більш очевидним впорядкуванням. (Хоча зауважте, що якщо ви зміните 'background'налаштування, Vim перезавантажить будь-які завантажені кольорові схеми, тому його встановлення 'background'також буде спрацьовувати: це просто неоптимально.)


1
Дякую, це надзвичайно ретельно, і я ціную додатковий контекст.
Конрад Мейєр

@ConradMeyer Я радий, що тобі було корисно!
Багатий

7

У випадку з Неовімом, t_Coі TERMне має значення.

Ви телефонуєте , set background=darkперш і після виклику colorscheme impact3. Перейдіть set background=darkдо нижньої частини кольорової схеми та видаліть інший дзвінок зі свого vimrc.

Від :help 'background':

When 'background' is set Vim will adjust the default color 
groups for the new value.
...
When a color scheme is loaded (the "g:colors_name" variable 
is set) setting 'background' will cause the color scheme to 
be reloaded.

Дивіться також: https://github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

Моя мета - зрозуміти, чому хакер xterm потрібен / працює в vim, і чому він не виглядає однаково в neovim.

  • Neovim це не хвилює, t_Coоскільки він передбачає 256, якщо ви не включите "справжній колір" .
    • Насправді Неовім ігнорує всі t_*варіанти, див :help t_xx.
  • Neovim не дозволяє &termвстановлювати його, оскільки це безглуздо. Neovim використовує unibilium та інші механізми для виявлення можливостей терміналу.

велике спасибі за вашу інформацію щодо виявлення можливостей терміну neovim та налаштувань `t_ *`. Видалення зайвої копії та перестановка set background=darkзаяви не мала ефекту, але ці деталі щодо основної реалізації для мене набагато цінніші.
Gall

2

Я бачу, що ви використовуєте iTerm2, тому ви можете спробувати це:

  1. Відкрити вікно переваг +,
  2. Перейдіть на profilesвкладку
  3. Перевірте свій поточний профіль у лівому списку
  4. Клацніть на вкладці terminalправоруч
  5. У Report terminal typeвиборіxterm-256color
  6. Зроблено.

Дякуємо за вашу пропозицію. Я редагував вище сказане із зауваженнями стосовно xterm-256color. Я дотримувався вашої процедури, щоб знайти тип терміналу, який уже встановлений таким чином.
Gall

2

Вам не вистачає дивовижної функції NeoVim. Є env var, який допомагає в цьому. Спробуйте вкласти це у свій nvimrc:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

Або

export NVIM_TUI_ENABLE_TRUE_COLOR=1

в оболонці.


FYI: для цього знадобиться використання guifgта guibg. Кольорова схема ОП використовує ctermfgта ctermbg.
Джастін М. Кеїс

О, ти маєш рацію. Вибачте!
Yann Vanhalewyn

2

Потрібно налаштувати параметри

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

у вашому .config/nvim/init.vim.


Ці параметри призначені для використання guifgта guibgзначення RGB для кольору. Кольорова гама питання використовує лише ctermfgта ctermbg.
Tommy A

1
Це зробило це для мене. TERM вже був xterm-256color. Спасибі!
Qix - МОНІКА ПОМИЛИ

1

Зауважте, що конкретна колірна гамма - це дійсно два набори кольорових схем в рамках if-else. Існування змінної g:impact_transbgвибирає бажаний набір кольорів і спочатку було призначене для обліку прозорих фонів у кольоровій гамі, з якої це походить .

Коментування 2-ї кольорової гами та твердження if-else (залишаючи лише потрібну кольорову схему g:impact_transbgта усуваючись) призводить до наміченої поведінки як vim, так і neovim, навіть із set term=xtermта set t_Co=256видаленими.

Це означає, що $TERM=xterm-256colorsяк в vim, так і в неовімі умовне if exists("g:impact_transbg")не вдається, але поєднання налаштування

set term=xterm
set t_co=256

дозволили умовному досягти успіху. Видалення фрази if-else, як описано вище, вирішує матеріальну проблему, але все ще залишається загадкою щодо взаємодії між парою параметрів терміна .vimrc та g:impact_transbg.


0

Спробуйте встановити $TERMзмінну середовища так:

TERM=xterm-256color

Спробуйте також запустити nvim так:

export TERM=xterm-256color; nvim

Якщо це працює, встановіть $TERMзмінну в оболонці назавжди.


Дякую за ідею, Джеффе. Я редагував своє запитання із зауваженнями стосовно xterm-256color. Встановлення $ TERM за допомогою експорту не мало ефекту.
Gall

0

Нещодавно у мене виникла ця проблема з соляризованою темою. Проблема виникла із TERMзмінної env.

Я виправив це, сказавши своєму емулятору терміналу (термінатору в моєму випадку) запустити, env TERM=xterm-256color zshа не просто запускати zsh як звичайне.


Термін OPs вже встановлений на xterm-256color. Я думаю, у вас виникли інші проблеми.
Багатий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.