Проблема с использованием цветовой схемы в 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

В неовим, termнельзя установить. Я попытался вызвать neovim с установленным вручную $ TERM следующим образом:

TERM=xterm nvim

Это привело к правильному отображению цветов в обычном vim (т.е. эквивалентно установке термина в .vimrc), но в neovim это выглядит так:

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

Почему комбинация set term=xtermи set t_Co=256необходима для правильного отображения этой цветовой схемы в vim и почему эквивалентная комбинация настроек дает другой результат в neovim?

Редактировать:

По умолчанию используется значение $TERM=xterm256-color , которое по какой-то причине должно быть переопределено xtermв обычном vim для правильного отображения цвета. С переменной среды по умолчанию 256, neovim выглядит следующим образом:

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

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

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


1
Ваш $ TERM уже установлен на то, что обычно считается «правильным» в современных системах - 256 цветов. Поэтому опция t_Co, которая обычно предназначена для совместимости со старыми терминалами, не обязательна. Что если вы закомментируете обе строки конфигурации?
Дэвид Лорд

@David Комментирование обеих строк конфигурации выглядит так же, как и комментирование set term=xterm.
Галл

Не могли бы вы включить снимок экрана с конфигурацией цвета iTerm, которую вы используете, когда тема отображается правильно, а также с результатами выполнения этого скрипта ?
Эрик Прюитт

Ответы:


11

Главная проблема

Основная проблема, с которой вы столкнулись, связана с упорядочением команд в вашей .vimrc.

Вы устанавливаете g:impact_transbgпеременную после загрузки схемы цветов, поэтому переменная не существует, когда проверяется оператором colorscheme 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. Ваш terminfo говорит Vim, что этот терминал поддерживает только 8 цветов, поэтому добавление этого приведет 't_Co'к неправильной настройке на 8. Вы вручную устанавливаете 't_Co' обратно на 256, но если бы вы оставили 'term'настройку на правильное значение, вам не нужно было бы ,

Кстати, при изменении 't_Co'вручную после установки g:impact_transbg, это приводит к тому , ColorScheme перезагрузиться (чтобы позволить ColorScheme адаптироваться к новому количеству цветов), а также потому , что g:impact_transbg это теперь установлен, вы получите цвет , которые вы хотите.

(Если параметр линии 'term'не указан, 't_Co'он уже равен 256, когда вы переходите на последнюю строку в вашем .vimrc, и поэтому схема цветов не перезагружается: отсюда и неправильные цвета.)

Итак, резюмируем:

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

Результат: Colorscheme перезагружается, когда '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 просто потому, что вызов set '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, если вы не включите «истинный цвет» .
    • На самом деле Neovim игнорирует все t_*варианты, видите :help t_xx.
  • Неовим не позволяет &termбыть установленным, потому что это бессмысленно. Neovim использует unibilium и другие механизмы для определения возможностей терминала.

Большое спасибо за ваши идеи относительно определения возможностей неовим термина и настройки `t_ *`. Удаление избыточной копии и изменение положения set background=darkоператора не оказали никакого влияния, но эти подробности о базовой реализации гораздо более ценны для меня.
Галл

2

Я вижу, вы используете iTerm2, так что вы можете попробовать это:

  1. Открыть окно настроек +,
  2. Перейти на profilesвкладку
  3. Проверьте свой текущий профиль в левом списке
  4. Нажмите на вкладку terminalсправа
  5. В Report terminal typeвыбореxterm-256color
  6. Выполнено.

Спасибо за ваше предложение. Я отредактировал вышеизложенное с замечаниями относительно xterm-256color. Я выполнил вашу процедуру, чтобы найти уже установленный тип терминала.
Галл

2

Вам не хватает потрясающей функции NeoVim. Есть env var, который помогает с этим. Попробуйте добавить это в свой nvimrc:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

Или

export NVIM_TUI_ENABLE_TRUE_COLOR=1

в оболочке.


К вашему сведению: это потребует использования guifgи guibg. Цветовая схема ОП использует ctermfgи ctermbg.
Джастин М. Кейс

О, ты прав. Сожалею!
Янн Ванхалевин

2

Вам нужно настроить параметры

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

в вашем .config/nvim/init.vim.


Эти параметры предназначены для использования guifgи guibgзначения RGB для цвета. Цветовая схема вопроса использует только ctermfgи ctermbg.
Томми

1
Это сделало это для меня. ТЕРМИН был уже 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 и в neovim условное завершение 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 через экспорт не имела никакого эффекта.
Галл

0

У меня недавно была эта проблема с соляризованной темой. Проблема возникла из TERMпеременной env.

Я исправил это, сказав, что мой эмулятор терминала (в моем случае терминатор) запускается env TERM=xterm-256color zshвместо обычного запуска zsh.


Срок действия OPS уже установлен на xterm-256color. Я думаю, что вы столкнулись с другой проблемой.
Богатый
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.