¿Por qué los colores de Vim se ven diferentes dentro y fuera de tmux?

29

Medio ambiente:

  • Fedora 25 (4.9.12-200.fc25.x86_64)
  • Terminal 3.22.1 de GNOME con VTE versión 0.46.1 + GNUTLS
  • VIM - Vi IMproved 8.0 (12 de septiembre de 2016, compilado el 22 de febrero de 2017 16:26:11)
  • tmux 2.2

Recientemente comencé a usar tmux y he observado que los colores dentro de Vim cambian dependiendo de si estoy corriendo dentro o fuera de tmux. A continuación se muestran capturas de pantalla de Vim fuera (izquierda) y dentro (derecha) de tmux mientras se ve un Git diff:

ingrese la descripción de la imagen aquí

Mi TERMvariable es

  • Fuera de tmux: xterm-256color
  • Dentro de tmux: screen-256color

Vim informa estos tipos de terminales como se esperaba (a través de :set term?):

  • Fuera de tmux: term=xterm-256color
  • Dentro de tmux: term=screen-256color

Vim también informa que ambas instancias se ejecutan en modo de 256 colores (vía :set t_Co?):

  • Fuera de tmux: t_Co=256
  • Dentro de tmux: t_Co=256

Hay muchas preguntas similares con respecto a hacer que Vim se ejecute en modo de 256 colores dentro de tmux (la mejor respuesta que encontré está aquí ), pero no creo que ese sea mi problema dada la información anterior.

Puedo duplicar el problema fuera de tmux si ejecuto Vim con el tipo de terminal establecido en screen-256color:

$ TERM=screen-256color vim

Entonces eso me hace creer que simplemente hay alguna diferencia entre las capacidades de terminal xterm-256colory screen-256colorque causa la diferencia de color. Lo que lleva a la pregunta planteada en el título: ¿qué específicamente en las capacidades del terminal hace que los colores Vim sean diferentes? Veo las diferencias entre correr :set termcapdentro y fuera de tmux, pero tengo curiosidad sobre qué variables realmente causan la diferencia en el comportamiento.

Independientemente de la pregunta anterior, ¿ es posible que los colores de Vim sean consistentes cuando se ejecutan dentro o fuera de tmux? Algunas cosas que he probado incluyen:

  • Establecer explícitamente el terminal predeterminado que tmux usa en ~/.tmux.confvarios valores (algunos contra el consejo de las preguntas frecuentes de tmux ):
    set -g default-terminal "pantalla-256color"
    set -g default-terminal "xterm-256color"
    set -g default-terminal "screen.xterm-256color"
    set -g default-terminal "tmux-256color"
  • Iniciando tmux usando tmux -2.

En todos los casos, Vim continuó mostrando diferentes colores dentro de tmux.

Rusty Shackleford
fuente
¿Podría iniciar script, iniciar vim, salir vimy luego salir scriptdel shell y adjuntar el typescriptarchivo resultante ? Luego repita los mismos pasos con en su TERM=screen-256color vimlugar.
egmont
@egmont Aquí tienes: typescript-xterm-256color y typescript-screen-256color .
Rusty Shackleford
1
Puedo ver secuencias de escape de 256 colores en la xterm-256colorversión (buscar "38; 5;" en el archivo), pero no puedo en el screen-256color. Por ejemplo, donde hay una \e[38;5;81men xterm-256color(el color # 81 de la paleta de 256 colores, de un tono azul medio), screen-256colorcontiene \e[34men su lugar (el estándar de color azul de la paleta de 8 colores). Entonces, la pregunta principal es por qué vim no usa la paleta de 256 colores en caso de TERM=screen-256color.
egmont
Otra cosa interesante es que la xterm-256colorversión parece imprimir la pantalla dos veces, primero con los colores heredados y luego con la paleta de 256 colores. Busque, por ejemplo, "F1" en el archivo, encontrará dos coincidencias en xterm-256color, la primera con \e[34mcolor y la segunda con \e[38;5;81m. No sé lo que está pasando aquí.
egmont
Añadiendo set -g default-terminal "screen.xterm-256color"en ~/.tmux.confy volver a cargar la configuración en tmux (<Cs>: fuente-archivo ~ / .tmux.conf) trabajado para mí (tema más destacado). thx
dtrckd

Respuestas:

17

Tuve el problema similar antes. Los comentarios en azul en Vim fueron difíciles de leer. En .tmux.confconfigurar esto:

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

Y en .vimrc:

set background=dark

Ahora se ve de la siguiente manera y funciona tanto en Gnome Terminal como en Cygwin: ingrese la descripción de la imagen aquí

Vitalii Plagov
fuente
3
Esto lo resolvió para mí. Por alguna razón, dentro de tmux, vim no detectaba un fondo oscuro. La configuración explícita bg=darken mi vimrc lo arregló.
Adam Keenan
Extraño: $TERMtanto mi interior como el exterior tmux, "xterm-256color"y establecer explícitamente el fondo también lo hizo por mí. ¡Gracias!
nronnei
A mí también me funcionó. Pensé que el problema era sttermporque xfce4-terminaltodo parecía cómodo (aparecían comentarios en cyanlugar de los bluecuales es muy difícil de leer con un fondo oscuro). Después de este cambio todo funciona bien. Pero recuerde agregar unlet! skip_defaults_vim source $VIMRUNTIME/defaults.vimal archivo vimrc para usar el resaltado de sintaxis, etc ...
Abinash Dash
2

Gracias al análisis de @ egmont de qué colores estaba produciendo Vim cuando TERM=screen-256color, me inspiró para ver el esquema de colores que Vim está utilizando en los dos escenarios.

Vim informa que está utilizando el defaultesquema de color en ambos casos. Pensé que era extraño porque el defaultesquema de color en Fedora 25 ( /usr/share/vim/vim80/colors/default.vim) no parece coincidir con los colores que realmente veo cuando TERM=xterm-256color. Si configuro explícitamente la combinación de colores con :colorscheme defaultwhen TERM=xterm-256color, la apariencia de Vim cambia a esa cuando TERM=screen-256color. Para que los colores volvieran a ser lo que eran cuando comencé a usar Vim, tuve que usar el ronesquema de colores. ¡Progreso!

Encontré una respuesta a Ask Ubuntu que sugiere que cuando Vim informa que está usando el defaultesquema de color, no necesariamente significa default.vimsino un esquema de color específico del tema. Como señala la respuesta, un tema oscuro (que estoy usando) corresponde al ronesquema de color, tal como descubrí anteriormente. (Aunque esta publicación es con respecto a Ubuntu, supongo que el OP estaba usando GNOME).

También encontré otra pregunta que parece describir el mismo problema que estoy teniendo. Lo encontré mientras buscaba antes de publicar esta pregunta, pero, por alguna razón, el esquema de color no me pareció relevante.

Terminé haciendo lo que @LapshinDmitry hizo en su respuesta y lo configuré explícitamente colorscheme ronen mi ~/.vimrcarchivo. Ahora, ya sea que empiece Vim dentro o fuera de tmux, los colores aparecen igual. El único inconveniente es que si alguna vez cambio mi tema de escritorio de un sabor oscuro a un sabor claro, Vim no cambiará automáticamente al esquema de color del tema claro "predeterminado", que aparentemente es peachpuff. Puedo vivir con eso, ya que es poco probable que cambie mi tema.

No voy a aceptar esta respuesta porque considero establecer explícitamente el esquema de color en mi ~/.vimrcsolución alternativa en lugar de la solución. Si alguien puede explicar por qué Vim carga un esquema de color "predeterminado" diferente según el valor de TERM, me complacerá aceptar esa respuesta, ya que estoy más interesado en comprender la causa raíz. Sospecho que tiene algo que ver con cómo Vim interpreta las capacidades del terminal entre los dos archivos terminfo.

Rusty Shackleford
fuente
También tengo curiosidad por qué se vimcomporta de esta manera. Después de todo, la bcecapacidad no debería tener nada que ver con la cantidad de colores disponibles.
egmont
@egmont Interpreté la respuesta de @ ThomasDickey como: 1) Vim verifica la bcecapacidad del terminal, 2) si está presente, seleccione el esquema de color "A", 3) de lo contrario, seleccione el esquema de color "B". Creo que la profundidad de color es la misma en ambos casos (es decir, 256 colores, como se t_Comuestra). Es solo que el esquema de color "B" en mi sistema solo usa una paleta de 8 colores a pesar de que son posibles 256 colores (creo que eso explica lo que observó en su análisis mecanografiado; corríjame si me equivoco). Recuerde, después de correr :colorscheme ron, veo secuencias de escape de 256 colores en la misma sesión de Vim.
Rusty Shackleford
Gracias por la explicación, todavía no puedo ver ninguna razón detrás de esto. No importa. vimtiene decisiones de diseño realmente extrañas.
egmont
0

Mi variable TERM es Outside tmux: xterm-256color Inside tmux: screen-256color

Eso es correcto y funciona para mí. Pruébelo con un terminal diferente (uso urxvt) para ver si Gnome Terminal es el problema.

También verifique COLORTERM(el mío está configurado en rxvt) y unset TERMCAP.

laktak
fuente
Gracias por las sugerencias Ejecuté la misma prueba con urxvt (exterior TERM es rxvt-unicode-256color) usando un apropiado ~/.Xdefaultsy desafortunadamente aún observé diferentes colores dentro y fuera de tmux. Para el escenario gnome-terminal, COLORTERMestá truecolory TERMCAPestá vacío tanto dentro como fuera de tmux. Para el escenario urxvt, COLORTERMestá rxvt-xpmfuera y truecolordentro de tmux, mientras que TERMCAPestá vacío tanto dentro como fuera de tmux.
Rusty Shackleford
@RustyShackleford esto es solo para Vim? ¿Estás usando 'termguicolors'? Eche un vistazo :help xterm-true-coloro pruebe con una configuración de Vim más predeterminada.
laktak
Solo he notado el problema en Vim hasta ahora (como dije, solo recientemente comencé a usar tmux). Por ejemplo, mi mensaje de terminal y la salida de Git CLI parecen tener los mismos colores tanto dentro como fuera de tmux. No configuro termguicolorsen mi .vimrce :set termguicolors?informes notermguicolorsen ambos casos. Veré el tema de ayuda al que hizo referencia; ¡Gracias!
Rusty Shackleford
0

Para mi propia referencia más tarde, cuando indudablemente busqué en Google esta configuración de mi próxima máquina.

  • Vim8 / Neovim
  • Windows 10
  • Git bash
  • Tmux 2.7

Use estas instrucciones para obtener los archivos binarios y DLL necesarios en la RUTA de Git bash:

https://blog.pjsen.eu/?p=440

Use estos comandos para configurar:

echo 'set -g default-terminal "screen.xterm-256color"' > ~/.tmux.conf
tmux -2u
Josh Peak
fuente