Problemy z używaniem schematu kolorów w NeoVim


16

Nie do końca rozumiem, w jaki sposób mój schemat kolorów wchodzi w interakcje z termustawieniem w vimie, a to utrudnia moją zdolność do prawidłowego wyświetlania w neovim.

W moim pliku .vimrc prawidłowe zachowanie danego schematu kolorów wymaga ustawienia

set term=xterm
set t_Co=256

Pominięcie któregokolwiek z tych ustawień powoduje nieprawidłowe wyświetlanie schematu kolorów:

popraw Prawidłowy kolorowy wyświetlacz niepoprawne Nieprawidłowy kolorowy wyświetlacz inne niepoprawne Inny nieprawidłowy kolorowy wyświetlacz

Schemat wygląda następująco:

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

W neovim termnie można ustawić. Próbowałem wywołać neovim z ręcznie ustawionym $ TERM tak:

TERM=xterm nvim

Spowodowało to prawidłowe wyświetlanie kolorów w zwykłym vimie (tj. Równoważne ustawieniu terminu w .vimrc), ale w neovim wygląda to tak:

wprowadź opis zdjęcia tutaj

Dlaczego kombinacja set term=xtermi set t_Co=256konieczna jest poprawna prezentacja tego schematu kolorów w vimie i dlaczego równoważna kombinacja ustawień daje inny efekt w neovimie?

Edytować:

Domyślnie jest to $TERM=xterm256-color , co z jakiegoś powodu musi zostać zastąpione xtermw zwykłym vimie, aby kolory były wyświetlane poprawnie. Z domyślną zmienną środowiskową 256, neovim wygląda następująco:

wprowadź opis zdjęcia tutaj

Jest to identyczne z regularnym vimem xterm256-color, ale nie zgodnie z przeznaczeniem. Moim celem jest zrozumienie, dlaczego hack Xterm jest konieczny / działa w vimie i dlaczego nie wygląda tak samo w neovimie.

Zauważ, że wiele kolorów pojawia się poprawnie z powyższym ustawieniem zmiennej env, przy czym znaczącymi wyjątkami są numery linii i tło. Podejrzewam, że może to dotyczyć sposobu, w jaki kolory są określone w tym konkretnym schemacie kolorów.


1
Twój $ TERM jest już ustawiony na coś, co jest ogólnie uważane za „prawidłowe” w nowoczesnych systemach - z włączoną obsługą 256 kolorów. Dlatego opcja t_Co, która jest zwykle zgodna ze starszymi terminalami, nie powinna być konieczna. Co jeśli skomentujesz obie linie konfiguracji?
David Lord

@David Komentowanie obu linii konfiguracji wygląda tak samo jak komentowanie set term=xterm.
Gall

Czy możesz dołączyć zrzut ekranu konfiguracji kolorów iTerm, której używasz, gdy motyw jest renderowany poprawnie, a także dane wyjściowe z uruchomienia tego skryptu ?
Eric Pruitt,

Odpowiedzi:


11

Główna kwestia

Główny napotkany problem jest spowodowany przez kolejność poleceń w twoim .vimrc.

Ustawić g:impact_transbgzmienną po załadowaniu colorscheme, a więc zmienna ma nie istnieć, gdy sprawdzana przez colorscheme w ifoświadczeniu, a druga wersja colorscheme (w elsebloku) jest używany.

Aby to naprawić, wystarczy przesunąć linię ustawiającą zmienną powyżej linii, w której ładujesz schemat kolorów:

let g:impact_transbg=1
colorscheme impact3

Możesz (i powinieneś!) Usunąć niepotrzebne linie z .vimrc:

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

Inne sprawy

Mogę również wyjaśnić kilka innych nieporozumień / nieporozumień związanych z tym, jak to wszystko działa:

Wyjaśnienie zachowania 'term'&'t_Co'

Twój $ TERM jest ustawiony na xterm256-color. Vim czyta to i pyta terminfo (lub termcap), aby dowiedzieć się, ile kolorów obsługuje terminal, a następnie 't_Co'odpowiednio ustawia . Zakładając, że Twój $ TERM jest poprawny (twój jest), a twoja baza terminfo zawiera poprawne informacje dla tego terminala (twoje), nigdy nie powinieneś ręcznie resetować 't_Co'.

Jednak ręcznie ustawiasz Vima na 'term'xterm. Twoje terminfo mówi Vimowi, że ten terminal obsługuje tylko 8 kolorów, więc dodanie tego spowoduje 't_Co'niepoprawne ustawienie na 8. Ustawiasz ręcznie z 't_Co' powrotem na 256, ale gdybyś pozostawił 'term'ustawienie z prawidłową wartością, nie musiałbyś .

Nawiasem mówiąc, zmiana 't_Co'ręczna po ustawieniu g:impact_transbgpowoduje przeładowanie schematu kolorów (aby umożliwić dostosowanie schematu kolorów do nowej liczby kolorów), a ponieważ g:impact_transbg jest teraz ustawiony, otrzymujesz pożądane kolory.

(Z 'term'pominiętym ustawieniem linii , 't_Co'jest już ustawione na 256, gdy dojdziesz do drugiej linii w .vimrc, więc schemat kolorów nie zostanie ponownie załadowany: stąd nieprawidłowe kolory.)

Podsumowując:

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

Wynik: Colorscheme zostanie ponownie załadowany, gdy 't_Co'jest ustawiony na 256, kolory są prawidłowe.

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

Wynik: Colorscheme jest ładowany colorschemepoleceniem, zmienna nie istnieje, kolory są nieprawidłowe.

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

Wynik: Colorscheme jest ładowany colorschemepoleceniem, zmienna nie istnieje, a Vim używa tylko 8 kolorów, kolory są nieprawidłowe.

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

Wynik: Colorscheme jest ładowany colorschemepoleceniem, zmienna nie istnieje, kolory są nieprawidłowe.

let g:impact_transbg=1
colorscheme impact3

Rezultat: Schemat kolorów został załadowany przez colorschemekomendę zmienna nie istnieje, więc kolory są prawidłowe. (I jako bonus 'term'i 't_Co'są również poprawne!)

Zachowanie jest inne w NeoVim po prostu dlatego, że wywołanie set 't_Co'jest ignorowane, jak już wspomnieli inni autorzy.

'background'

Po ustawieniu schematu kolorów ustawiasz również 'background'. W tym szczególnym colorscheme, jest to zupełnie niepotrzebne, ponieważ pierwsza rzeczą colorscheme nie jest zestaw 'background'do 'dark'.

Zauważ, że nie zgadzam się z drugim odpowiadającym, który sugeruje, że powinieneś ustawić 'background'po załadowaniu swojego schematu kolorów. Colorcheme może użyć wartości 'background'do dostosowania swoich kolorów, więc ustawienie 'background'przed załadowaniemchemchemchem jest bardziej oczywistym porządkiem. (Chociaż zauważ, że jeśli zmienisz 'background'ustawienie, Vim przeładuje wszystkie załadowane schematy kolorów, więc ustawienie go 'background'później również będzie działać: jest po prostu nieoptymalne.)


1
Dzięki, to jest bardzo dokładne i doceniam dodatkowy kontekst.
Conrad Meyer,

@ ConradMeyer Cieszę się, że było to dla Ciebie pomocne!
Rich

7

W przypadku Neovim t_Coi TERMnie ma znaczenia.

Dzwonisz set background=darkprzed i po połączeniu z colorscheme impact3. Przejdź set background=darkna dół schematu kolorów i usuń drugie połączenie z vimrc.

Od :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.

Zobacz także: https://github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

Moim celem jest zrozumienie, dlaczego hack Xterm jest konieczny / działa w vimie i dlaczego nie wygląda tak samo w neovimie.

  • Neovim nie dba o t_Coto, ponieważ zakłada 256, chyba że włączysz „prawdziwy kolor” .
    • W rzeczywistości Neovim ignoruje wszystkie t_*opcje, patrz :help t_xx.
  • Neovim nie pozwala &termna ustawienie, ponieważ jest bez znaczenia. Neovim wykorzystuje unibilium i inne mechanizmy do wykrywania możliwości terminalowych.

dziękuję bardzo za spostrzeżenia dotyczące wykrywania zdolności terminów neovim i ustawień `t_ *`. Usunięcie zbędnej kopii i zmiana położenia set background=darkinstrukcji nie przyniosło żadnego efektu, ale te szczegóły dotyczące podstawowej implementacji są dla mnie o wiele bardziej cenne.
Gall

2

Widzę, że używasz iTerm2, więc możesz spróbować:

  1. Otwórz okno preferencji +,
  2. Idź do profileszakładki
  3. Sprawdź swój aktualny profil na lewej liście
  4. Kliknij kartę terminalpo prawej stronie
  5. W Report terminal typewyborzexterm-256color
  6. Gotowy.

Dzięki za Twoją sugestię. Zredagowałem powyższe uwagi dotyczące xterm-256color. Następnie wykonałem procedurę, aby znaleźć typ terminala już ustawiony w ten sposób.
Gall

2

Brakuje Ci niesamowitej funkcji NeoVim. Istnieje env var, który pomaga w tych rzeczach. Spróbuj umieścić to w swoim nvimrc:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

Lub

export NVIM_TUI_ENABLE_TRUE_COLOR=1

w skorupce.


FYI: będzie to wymagało użycia guifgi guibg. Używa schematu kolorów OP ctermfgi ctermbg.
Justin M. Keyes,

Masz rację. Przepraszam!
Yann Vanhalewyn

2

Musisz skonfigurować opcje

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

w twoim .config/nvim/init.vim.


Te opcje dotyczą używania guifgi guibgwartości RGB koloru. Schemat kolorów pytania wykorzystuje tylko ctermfgi ctermbg.
Tommy A

1
Zrobiło to dla mnie. TERM był już xterm-256kolor. Dzięki!
Qix,

1

Zauważ, że konkretny schemat kolorów to tak naprawdę dwa zestawy schematów kolorów w klauzuli if-else. Istnienie zmiennej g:impact_transbgwybiera pożądany zestaw kolorów i pierwotnie miało na celu uwzględnienie przezroczystego tła w schemacie kolorów, z którego pochodzi .

Zakomentowanie 2nd kolorystykę oraz instrukcja if-else (wyjazd tylko pożądaną kolorystykę i rezygnacji z g:impact_transbg) daje zamierzone zachowanie zarówno vim i neovim nawet set term=xtermi set t_Co=256usunięte.

To implikuje, że $TERM=xterm-256colorszarówno w vimie, jak i neovimie warunek if exists("g:impact_transbg")zawodzi, ale kombinacja ustawienia

set term=xterm
set t_co=256

pozwolił warunkowi odnieść sukces. Usunięcie klauzuli if-else zgodnie z powyższym opisem rozwiązuje istotny problem, ale nadal istnieje tajemnica dotycząca interakcji między parą ustawień terminów .vimrc i g:impact_transbg.


0

Spróbuj ustawić $TERMzmienną środowiskową w następujący sposób:

TERM=xterm-256color

Spróbuj także uruchomić nvim w ten sposób:

export TERM=xterm-256color; nvim

Jeśli to zadziała, ustaw $TERMzmienną w swojej powłoce na stałe.


Dzięki za pomysł, Jeff. Zredagowałem swoje pytanie z uwagami dotyczącymi xterm-256color. Ustawienie $ TERM przez eksport nie miało żadnego efektu.
Gall

0

Ostatnio miałem ten problem z motywem solaryzowanym. Problem pochodzi ze TERMzmiennej env.

Naprawiłem to, mówiąc emulatorowi terminala (terminator w moim przypadku), aby uruchomił się env TERM=xterm-256color zshzamiast uruchamiać zsh jak zwykle.


TERM OPs jest już ustawiony na xterm-256color. Myślę, że masz inny problem.
Bogaty
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.