Problemas al usar el esquema de colores en NeoVim


16

No tengo una comprensión completa de cómo mi esquema de color está interactuando con la termconfiguración en vim y esto está impidiendo mi capacidad para que se muestre correctamente en neovim.

En mi archivo .vimrc, el comportamiento correcto del esquema de color en cuestión requiere configuración

set term=xterm
set t_Co=256

Omitir cualquiera de esas configuraciones da como resultado una visualización incorrecta de la combinación de colores:

correcto Pantalla a color correcta incorrecto Pantalla de color incorrecta diferente incorrecto Pantalla de color incorrecta diferente

El esquema se ve así:

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

En neovim, termno se puede configurar. Intenté invocar a neovim con un $ TERM establecido manualmente de la siguiente manera:

TERM=xterm nvim

Esto produjo la visualización correcta de colores en vim regular (es decir, equivalente a establecer el término en .vimrc), pero en neovim se ve así:

ingrese la descripción de la imagen aquí

¿Por qué la combinación de set term=xtermy es set t_Co=256necesaria para producir la visualización correcta de este esquema de color en vim y por qué la combinación equivalente de configuraciones produce un resultado diferente en neovim?

Editar:

El valor predeterminado es que$TERM=xterm256-color , por alguna razón, debe anularse xtermen vim regular para que la visualización del color sea correcta. Con la variable de entorno en el valor predeterminado 256, neovim se ve así:

ingrese la descripción de la imagen aquí

Esto es idéntico a vim regular con xterm256-color, pero no como se pretendía. Mi objetivo es entender por qué el hack xterm es necesario / funciona en vim, y por qué no se ve igual en neovim.

Tenga en cuenta que muchos de los colores aparecen correctamente con la configuración de la variable env del término anterior, con excepciones notables como números de línea y fondo. Sospecho que la forma en que se especifican los colores en este esquema de color específico puede estar involucrada.


1
Su $ TERM ya está configurado en lo que generalmente se considera "correcto" en los sistemas modernos: 256 colores habilitados. Por lo tanto, la opción t_Co, que normalmente es para compatibilidad con terminales más antiguas, no debería ser necesaria. ¿Qué pasa si comentas ambas líneas de configuración?
David Lord

@David comentar ambas líneas de configuración tiene el mismo aspecto que comentar set term=xterm.
Gall

¿Podría incluir una captura de pantalla de la configuración de color iTerm que utiliza cuando el tema se representa correctamente, así como la salida de la ejecución de este script ?
Eric Pruitt

Respuestas:


11

Tema principal

El principal problema que está experimentando es causado por el orden de los comandos en su .vimrc.

Establece la g:impact_transbgvariable después de cargar el esquema de colores, por lo que la variable no existe cuando se verifica mediante la ifdeclaración del esquema de colores , y elsese utiliza la segunda versión del esquema de colores (en el bloque).

Para solucionarlo, simplemente necesita mover la línea que establece la variable sobre la línea donde carga el esquema de colores:

let g:impact_transbg=1
colorscheme impact3

Puede (y debería) eliminar las líneas innecesarias de su .vimrc:

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

Otros asuntos

También puedo aclarar algunas otras ideas falsas / confusiones que pueda tener sobre cómo funciona todo esto:

Explicando el comportamiento de 'term'&'t_Co'

Su $ TERM está establecido en xterm256-color. Vim lee esto y consulta terminfo (o termcap) para averiguar cuántos colores admite el terminal, y luego establece en 't_Co'consecuencia. Suponiendo que su $ TERM es correcto (el suyo es) y su base de datos terminfo contiene la información correcta para ese terminal (el suyo sí lo hace) que nunca debería necesitar restablecer manualmente 't_Co'.

Sin embargo, entonces está configurando manualmente Vim's 'term'a xterm. Su terminfo le dice a Vim que este terminal solo admite 8 colores, por lo que al agregar esto se 't_Co'configurará incorrectamente a 8. Está configurando manualmente 't_Co' nuevamente a 256, pero si hubiera dejado la 'term'configuración en el valor correcto, no habría necesitado .

Por cierto, cuando cambia 't_Co'manualmente después de la configuración g:impact_transbg, hace que el esquema de colores se vuelva a cargar (para permitir que el esquema de colores se adapte a la nueva cantidad de colores), y como ahora g:impact_transbg está configurado, obtiene los colores que desea.

(Con la configuración de línea 'term'omitida, ya't_Co' está establecida en 256 cuando llega a la última línea en su .vimrc, por lo que el esquema de colores no se vuelve a cargar: por lo tanto, colores incorrectos).

Entonces, para recapitular:

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

Resultado: Colorscheme se vuelve a cargar cuando 't_Co'se establece en 256, los colores son correctos.

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

Resultado: Colorscheme se carga por colorschemecomando, la variable no existe, los colores son incorrectos.

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

Resultado: Colorscheme se carga por colorschemecomando, la variable no existe y Vim solo usa 8 colores, los colores son incorrectos.

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

Resultado: Colorscheme se carga por colorschemecomando, la variable no existe, los colores son incorrectos.

let g:impact_transbg=1
colorscheme impact3

Resultado: Colorscheme se carga mediante colorschemecomandos, variables hace existir, por lo que los colores son correctos. (Y como un bono 'term'y 't_Co'también son correctos!)

El comportamiento es diferente en NeoVim simplemente porque 't_Co'se ignora la llamada a establecer , como ya han mencionado otros respondedores.

'background'

Después de configurar el esquema de colores, también se configura 'background'. Para este particular, colorscheme, esto es totalmente innecesario, porque lo primero que hace es el esquema de colores a juego 'background'a 'dark'.

Tenga en cuenta que no estoy de acuerdo con el otro respondedor que sugiere que debe configurar 'background'después de cargar su esquema de colores. El esquema de colores puede usar el valor de 'background'para ajustar sus colores, por lo que la configuración 'background'antes de cargar el esquema de colores es el orden más obvio. (Aunque tenga en cuenta que si cambia la 'background'configuración, Vim volverá a cargar los esquemas de colores cargados, por lo que configurarlo 'background'después también funcionaría: simplemente no es óptimo).


1
Gracias, esto es extremadamente completo y aprecio el contexto adicional.
Conrad Meyer

@ConradMeyer ¡Me alegra que haya sido útil para ti!
Rico

7

En el caso de Neovim, t_Coy TERMno hay diferencia.

Está llamando set background=darkantes y después de la llamada colorscheme impact3. Vaya set background=darkal final del esquema de colores y elimine la otra llamada de su vimrc.

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

Ver también: https://github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

Mi objetivo es entender por qué el hack xterm es necesario / funciona en vim, y por qué no se ve igual en neovim.

  • A Neovim no le importa t_Coporque asume 256 a menos que habilite el "color verdadero" .
    • De hecho, Neovim ignora todas las t_*opciones, ver :help t_xx.
  • Neovim no permite &termque se configure porque no tiene sentido. Neovim utiliza unibilium y otros mecanismos para detectar capacidades terminales.

muchas gracias por sus ideas sobre la detección de capacidad de término de neovim y la configuración de `t_ *`. Eliminar la copia redundante y volver a colocar la set background=darkdeclaración no tuvo efecto, pero esos detalles sobre la implementación subyacente son mucho más valiosos para mí.
Gall

2

Veo que usas iTerm2, así que puedes probar esto:

  1. Abrir ventana de preferencias +,
  2. Ir a la profilespestaña
  3. Verifica tu perfil actual en la lista de la izquierda
  4. Haga clic en la pestaña terminala la derecha
  5. En el Report terminal typeelegirxterm-256color
  6. Hecho.

Gracias por tu sugerencia. Edité lo anterior con comentarios al respecto xterm-256color. Seguí su procedimiento para encontrar el tipo de terminal ya configurado de esta manera.
Gall

2

Te estás perdiendo una característica impresionante de NeoVim. Hay una env var que ayuda con estas cosas. Intenta poner esto en tu nvimrc:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

O

export NVIM_TUI_ENABLE_TRUE_COLOR=1

en el caparazón


FYI: esto requerirá el uso de guifgy guibg. El esquema de colores de OP utiliza ctermfgy ctermbg.
Justin M. Keyes

Oh tienes razon. ¡Lo siento!
Yann Vanhalewyn

2

Necesitas configurar opciones

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

en su .config/nvim/init.vim.


Esas opciones son para usar guifgy guibgvalores RGB para color. El esquema de color de la pregunta solo usa ctermfgy ctermbg.
Tommy A

1
Esto lo hizo por mí. TERM ya era xterm-256color. ¡Gracias!
Qix

1

Tenga en cuenta que el esquema de color específico es realmente dos conjuntos de esquemas de color dentro de una cláusula if-else. La existencia de la variable g:impact_transbgselecciona el conjunto de colores deseado, y originalmente estaba destinada a tener en cuenta los fondos transparentes en el esquema de color del que se deriva .

Comentando el segundo esquema de color y la declaración if-else (dejando solo el esquema de color deseado y eliminando g:impact_transbg) produce el comportamiento deseado tanto en vim como en neovim, incluso con set term=xtermy set t_Co=256eliminado.

Esto implica que $TERM=xterm-256colorstanto en vim como en neovim, el condicional if exists("g:impact_transbg")falla, pero que la combinación de configuración

set term=xterm
set t_co=256

permitió que el condicional tuviera éxito. Eliminar la cláusula if-else como se describió anteriormente resuelve el problema material, pero todavía hay un misterio con respecto a la interacción entre el par de configuraciones de términos .vimrc y g:impact_transbg.


0

Intente configurar su $TERMvariable de entorno de esta manera:

TERM=xterm-256color

También intente iniciar nvim de esta manera:

export TERM=xterm-256color; nvim

Si eso funciona, establezca la $TERMvariable en su shell de forma permanente.


Gracias por la idea, Jeff. Edité mi pregunta con comentarios al respecto xterm-256color. Establecer $ TERM a través de la exportación no tuvo ningún efecto.
Gall

0

Recientemente tuve este problema con el tema solarizado. El problema vino de la TERMvariable env.

Lo arreglé diciéndole a mi emulador de terminal (terminador en mi caso) que se ejecute en env TERM=xterm-256color zshlugar de simplemente iniciar zsh como de costumbre.


El OPs TERM ya está configurado en xterm-256color. Creo que estabas experimentando un problema diferente.
Rico
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.