- El problema de los colores en la terminal tiene menos que ver con gustos y más con la falta de estándares y las diferencias de implementación: la misma salida de un comando puede volverse difícil de leer según la combinación de terminal, tema y app
- Se usan en conjunto los 16 colores ANSI básicos, 256 colores y colores hexadecimales de 24 bits, pero el color real que corresponde a cada número puede variar según el emulador de terminal
- Contrastes como texto azul sobre fondo negro, amarillo brillante sobre fondo blanco, el mapeo de grises de Solarized o el color de fondo de
ngrokmuestran choques de contraste cuando las suposiciones del programa no coinciden con el tema del usuario - Las respuestas se dividen en varias capas: reconfigurar la paleta,
base16-shell,LS_COLORS,NO_COLOR=true,--color=always,unbuffery el soporte de color de 24 bits en Vim/Neovim - Las funciones de minimum contrast de iTerm2, tabby, kitty, Ghostty y Windows Terminal no son una solución perfecta, pero reducen el riesgo de obtener salidas ilegibles
Colores ANSI y diferencias entre terminales
- Las terminales suelen tener 16 colores ANSI, compuestos por negro, rojo, verde, amarillo, azul, magenta, cian, blanco y sus respectivas versiones brillantes
- Los programas especifican colores imprimiendo ANSI escape codes
- Por ejemplo, se puede especificar el número del color de primer plano con una forma como
\033[38;5;{num}m
- Por ejemplo, se puede especificar el número del color de primer plano con una forma como
- El problema es que no hay un estándar consistente que indique a qué color hex corresponde realmente cada número de color ANSI
- Cada emulador de terminal elige los colores por su cuenta
- Incluso en la tabla de colores de ANSI escape code de Wikipedia hay grandes diferencias entre implementaciones
- Debido a esta diferencia, el azul que
lsusa para los directorios puede no verse bien sobre un fondo negro - La combinación de amarillo brillante con fondo blanco también es casi ilegible, y pueden aparecer problemas similares con otros colores, como el verde brillante
Cómo reconfigurar la paleta de colores
- Si no te gustan los colores ANSI predeterminados o hay problemas de contraste, puedes responder con una reconfiguración de la paleta
-
Configuración desde el emulador de terminal
- La mayoría de los emuladores de terminal modernos ofrecen una función para reconfigurar colores
- Algunos incluyen temas por defecto
- Cuanto más popular sea el emulador de terminal, más temas disponibles suele haber
-
Configuración con scripts de shell
- Se puede cambiar la paleta de colores del emulador de terminal imprimiendo ANSI escape codes
- El script Solarized Light de base16-shell usa varias convenciones de escape codes específicas de distintas terminales
- El script intenta elegir el estilo de escape code adecuado según la variable de entorno
TERM - El enfoque con scripts de shell facilita mantener la misma configuración de colores aunque cambies de emulador de terminal
- Sin embargo, no todos los emuladores de terminal admiten cambios de paleta de esta forma y, aun cuando los admiten, los resultados pueden variar un poco
256 colores, color de 24 bits y temas por herramienta
- Muchas terminales admiten tres formas de especificar colores
- 16 colores ANSI
- 256 colores extendidos
- Colores hexadecimales de 24 bits como
#ffea03
fdusa escape codes como^[[38;5;48men su salida para especificar el color de primer plano número 48- Ese color puede verse como un verde lima que no aparece en la tabla de colores general de la terminal
- Puede tener mal contraste con la tabla de colores que estés usando
batusa colores de forma similar, pero su salida predeterminada parece intentar funcionar con diversos temas de terminal- Algunas herramientas modernas de terminal, como
fd,batydelta, admiten temas personalizados arbitrarios- El tema predeterminado puede chocar con el fondo de la terminal
- A cambio, permite controlar el tema de la salida de la herramienta con más detalle que si solo se eligieran los 16 colores ANSI
- Si usas
bat --theme ansi,batutiliza los colores ANSI definidos en la tabla de colores normal de la terminal
Conflictos que aparecen con Solarized y base16
- Solarized Light puede mostrar distintos mapeos de colores bright según la implementación
- El tema Solarized Light predeterminado de iTerm mapea los colores 9 a 14, es decir, “bright blue”, “bright red”, etc., a tonos de gris, como en el diseño original de Solarized
- Si
lsusa colores bright para directorios y ejecutables, pueden verse en gris
- Si
- base16 Solarized Light puede usarse como una variante que mantiene los colores bright como colores reales, no como grises
- Esta diferencia parece ser resultado de que Solarized se diseñó originalmente para que el esquema de colores de Vim pudiera usar grises
base16-shellconfigura los colores 16 a 21 para proporcionar colores adicionales abase16-vim- Cuando
ngrokintenta configurar el fondo con el color 16, “black”, si ese color fue remapeado a un naranja brillante, aparece un fondo muy extraño - Estos conflictos son fáciles de provocar cuando un programa especifica un color ANSI de fondo y el usuario remapea ese color con otro significado
- Cuando
Reducir problemas de contraste con minimum contrast
- Algunas terminales tienen una función de minimum contrast que ajusta automáticamente los colores cuando el contraste entre primer plano y fondo no es suficiente
- iTerm2, tabby, text_fg_override_threshold de kitty, Ghostty y Windows Terminal ofrecen esta función
- Si en iTerm se configura el valor de minimum contrast en 40, incluso salidas difíciles de leer, como el conflicto con el color de fondo de
ngrok, se vuelven más legibles - Cuando la configuración de colores es incorrecta o un programa choca con el tema, minimum contrast es una salvaguarda práctica para reducir problemas accidentales de legibilidad
TERM, pipes y desactivación del color
- Si el sistema al que te conectas por SSH no admite el valor de la variable de entorno local
TERM, los colores pueden no funcionar correctamente - El sistema usa la base de datos
terminfo, y si el valor deTERMno está en esa base de datos, es difícil saber qué salida de color corresponde a la terminal - Aunque no hubo un entorno reproducible, una respuesta de Stack Overflow propone usar una forma como
TERM=xterm sshen lugar dessh - Cuando se encadenan comandos con pipes, a veces se desactiva el color
fd | lesspuede mostrar salida sin color- En general, cuando se pasa la salida a herramientas como
grep, es útil que llegue solo texto plano sin escape codes
- Si quieres conservar el color, puedes usar
unbuffer fd | less -runbufferabre una tty para que el comando crea que está escribiendo en una TTY- También resuelve el problema de buffering en la salida del programa al escribir en un pipe
- Algunos comandos, como
fd, pueden imprimir colores siempre usando el flag--color=always
Desactivar o cambiar los colores de ls
- Algunos usuarios no quieren la salida con colores de
ls- Porque el azul es difícil de leer sobre fondo negro
- Porque no quieren ajustar la tabla de colores de la terminal
- O porque el color en sí puede no ser útil
- Hay varias opciones
- Se puede desactivar el color con
ls --color=never - Se pueden personalizar los colores que usa
lscon la variable de entornoLS_COLORS - Algunos programas admiten
NO_COLOR=true, y hay una lista en no-color.org
- Se puede desactivar el color con
- Por ejemplo, si se configura algo como
LS_COLORS="fi=0:di=0:ln=0:pi=0:so=0:bd=0:cd=0:or=0:ex=0" ls, se pueden establecer en 0 los estilos de color de varios tipos de archivo
Cambios en Vim y Neovim
- La configuración de colores de Vim solía tener muchos problemas porque había que alinear la tabla de colores de la terminal con el esquema de colores de Vim
- Dentro de la terminal, la configuración de colores de Vim tiene dos enfoques principales
- Mapear clases de color de Vim a números de color ANSI
- Hacer que el esquema de colores use directamente colores hexadecimales de 24 bits como
#faea99
- Hace 20 años no era común que las terminales admitieran colores hexadecimales de 24 bits, y Vim tampoco admitía el uso de color de 24 bits en la terminal
- Vim agregó soporte de color de 24 bits en 2016
- Neovim 0.10 se lanzó en mayo de 2024, y en terminales con soporte de color de 24 bits,
termguicolorsestá activado por defecto - Si en 2024 no planeas usar una terminal sin soporte de color de 24 bits, desaparece la carga de tener que sincronizar obligatoriamente la tabla de colores de la terminal con el esquema de colores de Vim
- Con este cambio, se reduce la necesidad de que
base16-shellconfigure de forma especial los colores 16 a 21 para integrarse con Vim- Si se elimina esa parte, se pueden evitar conflictos como el fondo naranja de
ngrok
- Si se elimina esa parte, se pueden evitar conflictos como el fondo naranja de
Experiencia de uso y límites de base16
- Usar base16-shell junto con base16-vim facilita alinear los colores de la terminal y de Vim
- Se puede configurar agregando unas líneas a la configuración de fish y unas líneas a
.vimrc - base16 no es una solución para todos
- La cantidad de temas incluidos es limitada, y puede que no haya ninguno que te guste
- El tema Solarized de base16 configura los colores ANSI bright igual que los colores normales, lo que puede ser un problema en casos de uso que requieren que los colores bright sean distintos
- El enfoque de configurar los colores 16 a 21 para proporcionar más colores a
base16-vimpuede no ser necesario en entornos donde solo se usan terminales con soporte de color de 24 bits - La configuración de los colores 16 a 21 puede causar problemas en terminales que no admiten 256 colores, como la Linux framebuffer terminal
- Existe un fork comunitario de base16 llamado tinted-theming
Herramientas para paletas de colores y temas populares
- rootloops.sh es una herramienta para generar paletas de colores
- Como lectura relacionada, está “let’s create a terminal color scheme”
- Las paletas populares mencionadas en respuestas de Mastodon son las siguientes
Problemas que siguen pendientes
- En puntos donde se cruzan varios programas, como la combinación de
tmux, SSH y Vim, pueden aparecer problemas de color adicionales - Elegir una buena paleta de colores también es difícil en sí mismo
- Para usuarios con alteraciones en la percepción del color, puede ser difícil encontrar una paleta adecuada
- Si el color de fondo se parece demasiado al color del cursor o de la selección, puede ser difícil ubicar la posición
- Es difícil encontrar colores que funcionen bien en todos los programas, y pueden aparecer conflictos como el caso de
ngrok
- Los programas que esperan un aspecto “clásico” específico basado en colores ANSI predeterminados, como Nethack o Midnight Commander, pueden verse extraños con temas como Solarized
- Una forma de responder es cambiar la paleta ANSI justo antes de ejecutar el programa
- Por ejemplo, se puede remapear el amarillo a un amarillo más brillante antes de ejecutar Nethack
- Para usuarios que solo quieren que los colores funcionen bien, tanta configuración manual es una carga; por eso son importantes valores predeterminados razonables y funciones como minimum contrast
1 comentarios
Opiniones de Hacker News
Al intentar crear correctamente un tema de colores claros para el sistema, me topé con este y muchos otros problemas; dos en particular me parecieron interesantes.
En retrospectiva es obvio, pero me sorprendió que los temas claros se vean mucho más sutilmente distintos entre pantallas que los temas oscuros. Aunque la configuración de hardware y software genera diferencias en la salida de color, los cambios centrados en áreas claras se perciben mucho más que los cambios en áreas oscuras.
Además, a veces hay que bajar a entornos con soporte limitado de fuentes y colores vistosos, como la consola de Linux o BSD; entonces
fdoexa/lsd/whateverpueden volverse incómodos o directamente inutilizables, sobre todo si mapeaste este último als. Después de una larga batalla configuré fbterm para tener funciones de terminal aceptables incluso sin X, pero fbterm también tiene sus propios problemas. Al configurar la paleta de colores de Vim, conviene preparar un tema alternativo para consolas con pocas capacidades, o practicar mucho escribir comandos de Vim sin mirarlos :DEdición: no es para trabajo serio, pero una pantalla de fbterm estilizada que muestra lo que se puede hacer incluso sin X: https://i.imgur.com/RbDRgtD.png
Por eso, al ajustar la exposición y el contraste adecuados, se dedica bastante tiempo a hacer que las altas luces se vean “justo bien”. No hago copias digitales, pero supongo que se aplica el mismo principio.
Lamentablemente, los frameworks de herramientas de línea de comandos “modernas”, muchas veces escritos en JavaScript, tienden a ignorar esto.
https://www.gnu.org/software/gettext/manual/html_node/The-TE...
También hay una configuración que aplica a los puntos de datos un efecto tenue de “resplandor” del mismo color, para que parezcan puntos brillantes. Tiene sentido que, desde el punto de vista de la saturación del color, es decir, de la relación señal-ruido en todo el espectro, el fondo negro sea mejor.
Se pueden usar unos 10 colores distintos casi sin problemas. Además, tiene la ventaja de transmitir información de orden/distancia, como que el amarillo está entre el rojo y el verde, o el naranja entre el rojo y el amarillo, lo que facilita subdividir e interpretar qué tan cerca están dos colores.
En realidad no me parece tan difícil
Paso 1: la mayoría de los emuladores de terminal tienen una paleta de colores predeterminada pésima, así que basta con cambiarla. En lo personal me gusta Solarized, especialmente el tema oscuro, aunque el tema claro también está bien. Incluso si no es Solarized, hay muchos temas en los que cualquier color se puede leer sobre el fondo predeterminado
Paso 2: hay que evitar las herramientas de línea de comandos que usan por defecto secuencias de escape de color de 8 bits o 24 bits. Puede ser polémico, pero personalmente lo veo como algo hostil hacia el usuario. Yo ya elegí la mejor paleta de colores de terminal para mis necesidades de legibilidad, y no ayuda que un desarrollador se crea una especie de diseñador de mentiras y la sobrescriba. Se puede ofrecer una opción para activar temas dentro de la herramienta, pero debería ser algo opcional, no el valor predeterminado
Como alguien que pasa la mayor parte de su vida en la terminal, con solo seguir estas dos reglas se puede crear un entorno de terminal consistente y fácil de leer casi sin carga de configuración. El verdadero problema es que toleramos demasiado que los desarrolladores usen códigos de escape de color de 8 bits y 24 bits
Con los años llegué a la conclusión de que las funciones nuevas hay que ponerlas frente a los ojos del usuario y que los buenos valores predeterminados hay que impulsarlos con fuerza. De lo contrario, las funciones casi no se usan
Los colores de 8 bits y 24 bits ya son funciones de uso opcional y también se pueden configurar. En un programa de terminal que funcione bien, las variables de entorno TERM y COLORTERM determinan si se deben usar esos colores
Muchas aplicaciones esperan que el texto “bright black” sea visible sobre el fondo. Hay muchos ejemplos aquí: https://github.com/altercation/solarized/issues/220
Casi todas las demás paletas de colores representan “bright black” como un gris legible sobre un fondo negro
Por ejemplo, pamix establece el fondo en negro, y la barra de estado de tmux o ngrok hacen algo parecido. Entonces uno termina cayendo en una madriguera de conejo tratando de manejar eso
Ambas cosas sugieren que la solución debería estar en la terminal. Para empezar, el programa de terminal debería tener colores predeterminados razonables; el azul debería reconocerse como azul, y también deberían considerarse las formas comunes de daltonismo. Por ejemplo, el rojo puro sobre un fondo negro es difícil de leer, así que es mejor no usar solo
ff0000y mezclarlo aunque sea un pocoUna vez que la terminal tenga valores predeterminados razonables, los programas de línea de comandos pueden usar los 16 colores estándar. Intentar usar color de 24 bits aquí es casi decir “renuncié a que la terminal proporcione sensatez” o “yo sé más que todos”, y al final el usuario tiene que configurar N programas por separado. Creo que lo mejor es no definir temas dentro de las apps de línea de comandos
Veo de forma similar los sitios web y las fuentes. El contenido debería ofrecerse en HTML para que el usuario pueda verlo como quiera, y el diseño de la página no debería fijarse como el de una revista, sino fluir
Con el software de escritorio pasa algo parecido. El compositor de Wayland debería recordar la posición de las ventanas. Era absurdo que cada programa de X guardara y restaurara la posición de su propia ventana. Wayland dice que conocer información del entorno es un problema de seguridad, y estoy de acuerdo, pero entonces ese recuerdo pasa a ser responsabilidad del entorno de escritorio. También se podría quitar ese código de todas las apps
La pregunta “¿en qué parte de la pila de software debería manejarse esto?” se repite en muchas áreas. Al elegir dónde ponerlo, primero hay que responder cuál es el objetivo, y mi respuesta siempre se inclina por la simplicidad y la mantenibilidad
El artículo de Julia también menciona esta idea, pero no entra en detalles sobre las dificultades concretas. En relación con eso, también me pregunto si la paleta de colores de la terminal solo maneja los 16 colores básicos, o si también toca los rangos RGB y de escala de grises. Porque los colores de 8 bits y 16 bits también podrían ajustarse para cumplir con los requisitos de legibilidad
Si estás eligiendo colores, convendría revisarlos con el nuevo algoritmo APCA (Advanced Perception of Colour)
APCA está previsto como reemplazo del método actual de contraste x:y en WCAG 3.0, aunque puede tardar algunos años más. Según se dice, considera el tamaño de la fuente, el peso, el primer plano/fondo, e incluso la iluminación y el entorno circundantes, además del uso previsto
Sería bastante bueno que un emulador de terminal pudiera usar el sensor de luz del dispositivo para optimizar el contraste según los factores del entorno
También hay completos lunáticos que quieren apagar los colores por completo[0]. A mí me dan ganas de probarlo, aunque también me gustan los colores bonitos
[0] https://no-color.org/
:syntax offes mi única configuración de Vim. Porque los conjuntos de colores de terminal fueron diseñados por programadores de computadoras, ingenieros eléctricos y gente que no sabe que lo importante en el color no es el color en sí, sino el brilloMe pregunto si habrá correlación entre la gente que no quiere colores en la terminal y la gente que usa bloqueadores de anuncios fuertes en el navegador o usa mucho el modo lectura
Cuando pasas la salida por un pipe, el color no aporta ningún beneficio y se vuelve solo una deuda. El punto central es más bien tener la opción
Es peor cuando alternas entre Linux y Windows. El uso de colores por defecto en muchas herramientas es casi inutilizable o directamente las vuelve inutilizables
Algunas herramientas ofrecen la opción
--color=never, y bastantes respetan NO_COLOR. Lamentablemente no todas, e incluso algunas herramientas que dicen hacerlo asumen que ese modo solo se usará para pipelines o interfaces de programación. Eso genera toda clase de comportamientos desafortunadosTiene un concepto coherente de paleta con una temperatura de color significativa, y se inclina hacia lo cálido para cansar menos los ojos de tanto mirar tonos azulados. También incluye una paleta para alacritty
Desde hace mucho quería usar un tema claro en la terminal, pero siempre terminaba desistiendo porque demasiados programas usan colores personalizados no ANSI optimizados para fondos oscuros de terminal
Algunos programas permiten configurar los colores, pero configurar todos los programas uno por uno me parecía demasiado engorroso. Así que ahora uso un fondo oscuro de terminal, pero elijo yo mismo un tema ANSI donde todos los colores tengan suficiente contraste según mi criterio y también pasen la verificación de contraste APCA/WCAG 3. Estoy conforme :)
Con la secuencia de control OSC 11, un programa puede averiguar el color de fondo, pero casi ningún programa se preocupa por eso. Normalmente, si alguien piensa que un mensaje de advertencia amarillo se ve genial, ahí termina todo
Esto lleva a otro problema: hay terminales populares que no son compatibles con xterm pero configuran
TERM=xterm256-colorpor defectoEdición: acabo de descubrir
xtermcontrol, que permite abstraer la comprobación del fondo en scripts y está disponible en todos los gestores de paquetes principalesHoy en día me rendí y configuro manualmente la mayoría de las apps para que usen colores ANSI. Por ejemplo, cosas como fzf tienen un switch de línea de comandos. Dejo solo Vim y Emacs como apps no ANSI, y las configuro para que coincidan con la paleta que uso en el resto de la terminal. Si quieres, puedes ir un paso más allá con algo como vim-dim
Emacs tiene una opción poco descubierta llamada
frame-background-mode[0], que en la práctica eslightodarkCuando te preguntas por qué Emacs eligió un color raro para algún elemento, muchas veces es porque frame-background-mode está mal configurado
[0]https://doc.endlessparentheses.com/Var/frame-background-mode...
En una terminal con fondo oscuro y texto blanco:
export COLORFGBG='15;0'En una terminal con fondo claro y texto negro:
export COLORFGBG='0;15'Llevo casi 10 años usando una paleta FlatUI ligeramente modificada, y casi nunca me ha causado problemas en la práctica
Archivo png: https://drive.google.com/file/d/1mkMESeGf7MNdKa-rPDx7Yf9BDit...
Enlace de imgur: https://imgur.com/a/flatui-7mqVZAY
Basada en: https://flatuicolors.com/palette/defo
Yo también llevo casi 10 años usando mi tema. Funciona bien en iTerm, vim, Emacs, vscode, etc.
He usado Apple Terminal durante mucho tiempo, y antes había una buena colección de paletas llamada “Terminal Fructose”, así que solía usar distintos colores de fondo según la tarea. Apple también la incorporó como temas en algún momento.
Pero Apple ha dejado abandonado el soporte de Terminal, no admite más de 256 colores y también le faltan funciones más modernas. Tampoco encaja bien con una configuración de Neovim+LazyVim.
Para encontrar una terminal mejor, estuve saltando entre iTerm2, Kitty, Alacritty y Wezterm, pero aunque todas eran más modernas, no parecían tener la opción básica “New Window with Profile ...” para abrir rápidamente ventanas con distintos colores de fondo/temas. Al menos no sin tener que trastear un poco.
Ahora me quedé con Wezterm, principalmente porque también funciona en Windows y puedo compartir la configuración
wezterm.lua. Por cierto, Windows Terminal también es bastante decente en realidad. Aun así, para tareas rápidas, por ejemplo usarpython3como REPL para hacer cálculos o probar hexadecimal/binario, todavía suelo abrir Apple Terminal.Hay algunas funciones de iTerm2 que extraño, aunque casi todas están relacionadas con el mouse. Fuera de eso, lo configuré a mi gusto durante algunas noches y, desde que hice que
cmd-nabra una ventana nueva en el directorio predeterminado y no en el directorio actual, lo uso satisfecho.launch_menu[1], que inicia otro shell, o conaugment-command-palette[2], que agrega elementos a la paleta de comandos.[1] https://wezfurlong.org/wezterm/config/lua/config/launch_menu...
[2] https://wezfurlong.org/wezterm/config/lua/window-events/augm...
Sí, requiere un poco de trasteo. Pero programar una función muy específica exactamente como la quieres es la cúspide de la experiencia WezTerm.
No solo en las terminales: en letreros de neón o de LED, el azul también es el color que más cansa la vista de noche.
Desde lejos siempre se ve borroso y fuera de foco. Cuando veo que grandes empresas ponen letreros enormes con iluminación azul, me sorprende que gasten tanto dinero sin siquiera darse cuenta de que la gente no puede leerlos.
En mi laptop tengo configurado el cambio automático entre modo claro/oscuro según el ciclo de luz solar, y es sorprendente la cantidad de aplicaciones con salida en color que se rompen al cambiar al modo de fondo claro con texto oscuro.
Si estás creando una herramienta de línea de comandos y de verdad necesitas usar colores, deberías limitarte a los 16 colores ANSI o permitir que el usuario final cambie la paleta.