Soporte para tmux, TERM y 256 colores

48

Introducción

Mi pregunta surge de la necesidad de comprender por qué tengo ahora (después de varias pruebas) Terminal y tmux que admiten 256 colores y tput colorsme dicen que solo hay 8 de ellos.


Antecedentes

Vamos a empezar desde el principio.

Estoy usando una caja de Ubuntu , Guake , tmux , Vim y me encanta el tema Solarizado . Se veían bastante horribles, así que decidí habilitar el soporte de 256 colores y jugar un poco.

Veamos qué pasa con mi Terminal . tput colorsdice que hay 8 colores. Personalmente los puse en púrpura, a la izquierda, y por supuesto a la derecha tenemos 2 tonos de azul diferentes. $TERMdice xterm. (Tener el color lsI eval this en mi .bashrc.)

ingrese la descripción de la imagen aquí

Vim también se ve bien, a pesar del hecho de que lo llamo con la 256bandera en un entorno donde no se admiten 256 colores .

set t_Co=256
let g:solarized_termcolors=256
colorscheme solarized

El único tipo que se queja del espacio de color reducido es tmux . Llamar tmuxproporciona los resultados esperados "incorrectos".

ingrese la descripción de la imagen aquí

Pero llamar tmuxcon la -2bandera hace que todo funcione bien, mágicamente .

ingrese la descripción de la imagen aquí

Ahora lo único que entiendo es que -2es equivalente a export TERM=screen-256color( fuente ).

Guake se comporta de manera análoga a Terminal y ambos responden xterma la pregunta echo $TERM.


Pregunta

Básicamente, ¿alguien entiende por qué todo funciona incluso si no debería?

  • ¿Soy sádico porque me quejo por qué las cosas funcionan? Tal vez.
  • ¿Hay una mejor razón? Claro: me gustaría arreglar la apariencia de otras cajas de Ubuntu en mi oficina, y me gustaría entender por qué las cosas funcionan o no.

Experimentos adicionales

Ejecutar este script (ligeramente modificado) en mi xtermproporciona el siguiente resultado: 256 colores, pero solo 16 se muestran correctamente.

ingrese la descripción de la imagen aquí

Luego, cambiando el perfil del terminal, también cambian estos 16 colores.

ingrese la descripción de la imagen aquí

Más pruebas están siguiendo.

De izquierda a derecha, de arriba a abajo, tenemos un tema de color Solarizeddircolor ansi-dark y 256dark, luego , un esquema de color predeterminado ( Tango ) dircolor ansi-darky 256dark.

ingrese la descripción de la imagen aquí

Observación : en teoría, el esquema de color dircolor ansi-darken Solarized debería coincidir estrechamente con el dircolor 256dark. Esto no está sucediendo claramente para los archivos específicos enumerados. En cambio, esto sucede bastante cuando en el directorio de trabajo hay carpetas , archivos de texto y enlaces simbólicos . Conclusión : no se prestó mucha atención al codificar los 256darkcolores.


Conclusiones preliminares

xtermadmite 256 colores, a pesar de lo que tput colorsdice. Los programas pueden referirse a la ansipaleta (personalizable por el usuario) o definir sus colores, eligiendo entre un total de 256 colores.

Atcold
fuente
1
Lea esta respuesta y los comentarios a continuación. ¿Responde tu pregunta? También eche un vistazo a este script para obtener la cantidad real de colores admitidos.
terdon
Hum ... todavía estoy un poco confundido ... Pero, supongo que al menos entiendo que tput colorses una prueba poco confiable. ¿Podrías revisar mis conclusiones preliminares ?
Atcold
2
Mi lectura de la respuesta de Gilleś es que tput colorssolo puede devolver un valor y en terminales que admiten cualquiera de 2,8,16,88 o 256 colores, solo se devuelve el primer valor (8 en su caso). Para obtener el verdadero valor, use el script de mi último comentario. ¿Qué devuelve eso?
terdon
Compruebe mis experimentos adicionales arriba :)
Atcold
Ah, lo siento, mi mal.
terdon

Respuestas:

33

Hay alguna información sobre el soporte de 256 colores en las preguntas frecuentes de tmux .

Lamentablemente, detectar la cantidad de colores que admite el terminal no es sencillo, por razones históricas. Consulte Verificar cuántos colores admite mi emulador de terminal para obtener una explicación. Esto significa que

  • tmux no puede determinar de manera confiable si el terminal admite más de 8 colores;
  • tmux no puede comunicar de manera confiable a la aplicación que admite más de 8 colores.

Cuando estás en tmux, la terminal con la que estás interactuando es tmux. No es compatible con todas las secuencias de control de xterm. En particular, no admite la OSC 4 ; …secuencia de control para consultar o establecer valores de color. Debe usar eso mientras se ejecuta directamente en xterm, fuera de tmux.

Si ejecuta tmux -2, tmux comienza con compatibilidad con 256 colores, incluso si no cree que su terminal admite 256 colores (lo cual es bastante común).

Por defecto, tmux se anuncia a sí mismo como screensin soporte de 256 colores. Puede cambiar el valor de TERMin .tmux.confpara indicar compatibilidad con 256 colores:

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

Puedes usar TERM=xterm-256coloro TERM=screen-256coloren Ubuntu. Estos valores solo causarán problemas si inicia sesión en una máquina remota que no tiene una entrada termcap / terminfo para estos nombres. Puede copiar las entradas a su directorio de inicio en la máquina remota; esto funciona con la mayoría de las implementaciones de terminfo modernas.

# From the Ubuntu machine to a machine that doesn't have *-256color terminfo entries
ssh somewhere.example.com mkdir -p .terminfo/s .terminfo/x
scp -p /lib/terminfo/s/screen-256color somewhere.example.com:.terminfo/s/
scp -p /lib/terminfo/x/xterm-256color somewhere.example.com:.terminfo/x/
Gilles 'SO- deja de ser malvado'
fuente
Agradezco la explicación, pero no estoy seguro de que se dirija a mi pregunta ... Bueno, estoy de acuerdo en que mi pregunta era bastante amplia, pero no me estaba centrando específicamente en tmux . En realidad, tmux era el único tipo que se comportaba de acuerdo con las expectativas. Lo que fue mucho más misterioso fue cómo xtermfue capaz de mostrarme 256 colores a pesar de que tput colorsdecía 8. Supongo que la respuesta a esta pregunta específica ha sido abordada por @terdon en sus comentarios a la pregunta misma.
Atcold
@ Attold Es una pregunta larga, pero por lo que puedo decir, la he respondido. Las partes no relacionadas con tmux están cubiertas por la respuesta a la que terdon y yo vinculé (y que escribí). Su pregunta habría sido un duplicado de esa si no hubiera sido por el aspecto tmux. ¿Qué más esperabas de una respuesta?
Gilles 'SO- deja de ser malvado'
1
@Gilles , no quería sonar malvado . Estaba tratando de acreditar a @terdon la cosa de "respuesta aceptada", aunque él se refiere a su respuesta en otra pregunta. A pesar de esto, el set -g default_terminal "screen-256color"comando no es suficiente para habilitar los 256 colores en tmux . Necesitas alias tmux='export TERM=screen-256color; /usr/bin/tmux'( referencia ).
Atcold
@ Attold No, el alias no es necesario (lo probé). Además, este alias no tendría sentido: pretende tmux que se ejecuta dentro de la pantalla o tmux. Sin embargo, debe ejecutar tmux -2según mi párrafo anterior, si tmux no cree que su terminal actual admita 256 colores, entonces alias tmux='tmux -2'tendría sentido.
Gilles 'SO- deja de ser malvado'
2
@Atcold Esa respuesta U&L tiene TERM=xterm-256color tmux, lo cual es sensato, a diferencia TERM=screen-256color tmux. tmux -2es superior porque funciona incluso si screen-256colorno está en la base de datos terminfo local.
Gilles 'SO- deja de ser malvado'
20

Estoy impresionado sobre cuán ricamente formateadas y detalladas son las respuestas (¡y la pregunta!). Si bien brindan información y soluciones valiosas sobre las herramientas que mencionó, brindan muy poca información sobre lo que está sucediendo y, lo que es más importante, por qué las cosas funcionan (algo) para algunas herramientas cuando supuestamente no deberían.

Aquí hay algunas ideas sobre sus preguntas fundamentales:

  • Lo que admite un terminal y lo que informa son cosas diferentes. El terminal Gnome, por ejemplo, es capaz de mostrar 256 colores, pero se anuncia al entorno (a través de la $TERMvariable) como un xtermemulador (8 colores).

  • Las herramientas como tputseguir lo TERMque sea ​​que esté configurado en: tput colorspueden imprimir 8, mientras env TERM=xterm-256color tput colorsque imprimirán 256, independientemente de si su terminal realmente admite tales capacidades.

  • vimtambién sigue TERMde forma predeterminada, pero como le dijo que use 256 colores (a través de la bandera o el set t_Co=256), usará 256 colores. Y funciona porque su terminal realmente lo admite .

  • tmux, al igual que Gnome Terminal, también se presenta por defecto como un terminal de 8 colores. Pero, a diferencia de Gnome Terminal, solo habilita la capacidad de 256 colores si usa la -2bandera, lo que también hace que se informe como un xterm-256coloremulador compatible.

  • xterm, como en el software emulador de terminal para el X11 , admite 256 colores, seguro. Pero xtermcomo en TERM=xtermes un "estándar" de 8 colores. Significa las capacidades del original xterm . Cuando se actualizó para admitir 256 colores, hace mucho tiempo, acuñó el xterm-256colortérmino para eso.

Entonces todo se reduce a:

  • Qué capacidades admite realmente su terminal (y está habilitado para hacerlo)

  • Cómo informa tales capacidades al medio ambiente a través de TERM

  • Cómo las herramientas se interpretan TERMy se ajustan en consecuencia.

  • Como puede deducir de lo anterior, evite golpear export TERM=xterm-256colorsus ~/.bashrcguiones y otros . Como esos archivos se ejecutan independientemente del terminal que esté utilizando, hará que todos sus terminales, incluidas las conexiones remotas desde Windows con Putty, el terminal de consola Linux, etc., se notifiquen como compatibles con xterm-256color. Lo cual puede ser cierto para algunos, pero ciertamente no para todos. Por ejemplo, gettyla consola de Linux a la que accede CTRL+ALT+1..6no lo hace.

  • Los terminales deben informarse como el "estándar" con el que son más compatibles. Si sabe que pueden manejar 256 colores, configúrelos para anunciarse como tales.

Por último, pero no menos importante, una lectura sorprendente sobre TERM256 colores es:

http://blog.sanctum.geek.nz/term-strings/

http://blog.sanctum.geek.nz/256-colour-terminals/

MestreLion
fuente
Un ejemplo de escenario o dos serían buenas adiciones a esta respuesta.
Elijah Lynn el
5

Proporcionaré una respuesta complementaria que aborda solo sus experimentos adicionales en la medida en que se relacionen con los colores del directorio solarizado .

Preparar

Tenemos la misma salida de color del script de prueba. La única diferencia es que usé lxterminalen Openbox con slim , xcompmgr y sin DM. Por lo tanto, no puedo configurar fácilmente una paleta personalizada como lo hizo, ya que ese emulador de terminal no ofrece esa configuración en una GUI y no hay un tema específico para ella (solo existen para algunos emuladores de terminal). Así que solo uso un poco de translucidez, terminales sin decoración y ese azul como color de primer plano con un fondo azul de Gentoo . Como no puedo usar las versiones ansi de los archivos de color, me he centrado exclusivamente en obtener resultados, dircolors.256darkes decir, la versión simple "degradada".

Utilicé la siguiente configuración relevante y la fuente de medio inconsolata :

echo $TERM
xterm

.bashrc:
eval `dircolors /path/to/dircolors.256dark`

.vimrc:
set t_Co=256
let g:solarized_termcolors=256
syntax enable
set background=dark
colorscheme solarized

.tmux.conf:
nothing at all related to colors!
start tmux with "tmux -2"

Dircolors

La siguiente imagen muestra lo que sucede tanto dentro como fuera de tmux con esta configuración. El primer tercio a la izquierda muestra ventanas lxterminal sin decorar apiladas verticalmente (3). A la derecha tiene un ensamblaje tmux que muestra los mismos programas idénticos (3). También he incluido un 1 solarizado que muestra nano usando el archivo .Xresources incluido en el paquete completo (y muestreándolo con ):xtermxrdb -load ~/.Xresources

ingrese la descripción de la imagen aquí haga clic derecho / ver imagen para inspeccionar a resolución completa

El primer terminal en la esquina superior izquierda muestra los colores predeterminados del directorio. Justo debajo está la versión solarizada degradada . Excepto por el rosa sobre fondo azul para los .carchivos que agregué, es idéntico a lo que se espera de esto (vea la imagen a continuación como referencia). En comparación con los valores predeterminados, se basa más en los atributos extendidos, es decir, negrita / luz / reversa, etc. y los colores son obviamente diferentes. La asignación de color predeterminada para los .txtarchivos en muchas distribuciones es verde, pero en su lugar debería ser gris cuando se solariza . Un archivo ansi que representa un archivo .txt como verde no se procesa correctamente o no se procesa en absoluto. Los resultados del lado derecho que mostró son los correctos (256dark) en relación con la siguiente referencia:

ingrese la descripción de la imagen aquí mapa de referencia de colores dirigidos "degradados" solarizados

Observaciones

Con la configuración que utilicé, los resultados parecen idénticos dentro y fuera de tmux (he revertido los comentarios (#) en vi pero, de lo contrario, el complemento se comporta como debería y el multiplexor no tiene ningún impacto en esto). Las fuentes juegan un papel muy importante en la definición de características solarizadas , y se requiere una buena fuente para maximizar la experiencia. Los colores del directorio solarizado que utilizan el archivo 256dark coinciden con la referencia y no requieren una configuración específica del emulador de terminal.


Conclusión

En realidad, la representación ansi de los colores del directorio es completamente diferente de la solarizada degradada (256dark). Tanto es así que debajo de los archivos ansi .txt son verdes. Uno no puede usarse para validar la representación del otro. Ambas soluciones necesitan una configuración diferente y producen resultados completamente diferentes.


fuente
"No entiendo su conclusión acerca de que no se le ha prestado mucha atención a la codificación 256dark, donde de hecho es el único archivo de color que produce un listado de directorio solarizado". Mi confusión surge del hecho de que estaba considerando la ansi-darksalida correcta (ya que está usando la versión no degradada). Luego, si toma como referencia la salida de 256dark, entonces tiene la mentalidad invertida.
Atcold
"Con la configuración que utilicé, los resultados aparecen idénticos dentro y fuera de tmux" Claro, si está usando 256 colores, entonces, por supuesto, se mostrarán de la misma manera donde tenga 256 colores de soporte. "No está claro qué proporcionaría la solución ansi en este contexto ..." El resultado sería tener los verdaderos Solarized (en lugar de una aproximación).
Atcold
Entiendo. No he investigado la parte ansi realmente, así que no podía entender de dónde venías. En cualquier caso, encontré su Q bastante habilitante gracias. Tal vez usaré vi más ahora que lo encuentro bastante lol. En cuanto a los resultados del ANSI, de hecho ahora he visto cómo se ve ... sólo mostrar que para dir-colores aquí . ¿Por qué la h. ¿tienen una codificación diferente debajo de eso ... quiero decir que veo .txt verde ... ¿cómo es el gris cerca del verde? No entiendo su proyecto en serio.
Sí, contacté al autor personalmente y la respuesta es que "fue su personalización personal, ya que le gustó de esa manera". Estoy sin palabras ... me alegro de que mi Q haya ayudado a alguien :)
Atcold