Colores incorrectos en xterm
No entiendo muy bien el comportamiento de XTerm (UXTerm en este caso) con respecto a los colores. Estoy usando el tema de color Solarized Light para Alacritty y UXTerm. Son más o menos idénticos:
~/.alacritty.yml:
# Colors (Solarized Light)
colors:
# Default colors
primary:
background: '0xfdf6e3'
foreground: '0x586e75'
# Normal colors
normal:
black: '0x073642'
red: '0xdc322f'
green: '0x859900'
yellow: '0xb58900'
blue: '0x268bd2'
magenta: '0xd33682'
cyan: '0x2aa198'
white: '0xeee8d5'
# Bright colors
bright:
black: '0x002b36'
red: '0xcb4b16'
green: '0x586e75'
yellow: '0x657b83'
blue: '0x839496'
magenta: '0x6c71c4'
cyan: '0x93a1a1'
white: '0xfdf6e3'
~/.Xresources:
#define S_base03 #002b36
#define S_base02 #073642
#define S_base01 #586e75
#define S_base00 #657b83
#define S_base0 #839496
#define S_base1 #93a1a1
#define S_base2 #eee8d5
#define S_base3 #fdf6e3
#define S_yellow #b58900
#define S_orange #cb4b16
#define S_red #dc322f
#define S_magenta #d33682
#define S_violet #6c71c4
#define S_blue #268bd2
#define S_cyan #2aa198
#define S_green #859900
!fonts&stuff
UXTerm*faceSize: 11
uxterm*eightBitInput: false
UXTerm*faceName: Fira Mono Regular
!Background & foreground
UXTerm*background: S_base3
UXTerm*foreground: S_base00
UXTerm*fading: 40
UXTerm*fadeColor: S_base3
UXTerm*cursorColor: S_base01
UXTerm*pointerColorBackground: S_base1
UXTerm*pointerColorForeground: S_base01
!UXTerm*borderColor: #343434
!Turning off scrollbar
UXTerm*scrollBar: off
!Starting up with a geometry
UXTerm*vt100*geometry: 160x50
!Colors
!-------------------------
!black
UXTerm*color0: S_base02
UXTerm*color8: S_base03
!red
UXTerm*color1: S_red
UXTerm*color9: S_orange
!green
UXTerm*color2: S_green
UXTerm*color10: S_base01
!yellow
UXTerm*color3: S_yellow
UXTerm*color11: S_base00
!blue
UXTerm*color4: S_blue
UXTerm*color12: S_base0
!magenta
UXTerm*color5: S_magenta
UXTerm*color13: S_violet
!cyan
UXTerm*color6: S_cyan
UXTerm*color14: S_base1
!white
UXTerm*color7: S_base2
UXTerm*color15: S_base3
Sesión de Alacritty:
trueneu@pop-os:~$ env | grep TERM
COLORTERM=truecolor
TERM=xterm-256color
Sesión de UXTerm:
trueneu@pop-os:~$ env | grep TERM
COLORTERM=truecolor
XTERM_VERSION=XTerm(353)
XTERM_SHELL=/bin/bash
XTERM_LOCALE=en_US.UTF-8
TERM=xterm-256color
Pero muestran comportamientos completamente diferentes en cuanto a colores:
Alacritty:
UXTerm:
Aunque todo está bien en emacs:
Alacritty:
UXTerm:
Ambos pasan esta prueba que encontré:
#!/usr/bin/env bash
awk 'BEGIN{
s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
for (colnum = 0; colnum<77; colnum++) {
r = 255-(colnum*255/76);
g = (colnum*510/76);
b = (colnum*255/76);
if (g>255) g = 510-g;
printf "\033[48;2;%d;%d;%dm", r,g,b;
printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
printf "%s\033[0m", substr(s,colnum+1,1);
}
printf "\n";
}'
Alacritty:
UXTerm:
El mensaje:
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
Lo mismo ocurre con los lscolores.
UXTerm infocmp, si ayuda:
Reconstructed via infocmp from file: /lib/terminfo/x/xterm-256color
xterm-256color|xterm with 256 colors,
am, bce, ccc, km, mc5i, mir, msgr, npc, xenl,
colors#0x100, cols#80, it#8, lines#24, pairs#0x10000,
acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=\r,
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
il=\E[%p1%dL, il1=\E[L, ind=\n, indn=\E[%p1%dS,
initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\,
invis=\E[8m, is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~,
kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D,
kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=^?,
kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~,
kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q,
kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~,
kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~,
kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~,
kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S,
kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~,
kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~,
kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q,
kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~,
kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~,
kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~,
kf48=\E[24;6~, kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q,
kf51=\E[1;3R, kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~,
kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~,
kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~,
kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~,
kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~,
kind=\E[1;2B, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
kri=\E[1;2A, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, meml=\El,
memu=\Em, oc=\E]104\007, op=\E[39;49m, rc=\E8, rev=\E[7m,
ri=\EM, rin=\E[%p1%dT, ritm=\E[23m, rmacs=\E(B,
rmam=\E[?7l, rmcup=\E[?1049l\E[23;0;0t, rmir=\E[4l,
rmkx=\E[?1l\E>, rmm=\E[?1034l, rmso=\E[27m, rmul=\E[24m,
rs1=\Ec\E]104\007, rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7,
setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
sgr0=\E(B\E[m, sitm=\E[3m, smacs=\E(0, smam=\E[?7h,
smcup=\E[?1049h\E[22;0;0t, smir=\E[4h, smkx=\E[?1h\E=,
smm=\E[?1034h, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?%[;0123456789]c,
u9=\E[c, vpa=\E[%i%p1%dd,
¿Me falta alguna configuración aquí? ¿Es así como funciona XTerm? Sin embargo, realmente no entiendo cómo es capaz de pasar esa prueba.
EDIT: Después de la respuesta de Thomas Dickey, he hecho trató de redefinir .Xresources estar sin preprocesador de C #defines. Aquí está el resultado:
!fonts&stuff
UXTerm*faceSize: 11
uxterm*eightBitInput: false
UXTerm*faceName: Fira Mono Regular
!Background & foreground
UXTerm*background: #fdf6e3
UXTerm*foreground: #657b83
UXTerm*fading: 40
UXTerm*fadeColor: #fdf6e3
UXTerm*cursorColor: #586e75
UXTerm*pointerColorBackground: #93a1a1
UXTerm*pointerColorForeground: #586e75
!UXTerm*borderColor: #343434
!Turning off scrollbar
UXTerm*scrollBar: off
!Starting up with a geometry
UXTerm*vt100*geometry: 160x50
!Colors
!-------------------------
!black
UXTerm*color0: #073642
UXTerm*color8: #002b36
!red
UXTerm*color1: #dc322f
UXTerm*color9: #cb4b16
!green
UXTerm*color2: #859900
UXTerm*color10: #586e75
!yellow
UXTerm*color3: #b58900
UXTerm*color11: #657b83
!blue
UXTerm*color4: #268bd2
UXTerm*color12: #839496
!magenta
UXTerm*color5: #d33682
UXTerm*color13: #6c71c4
!cyan
UXTerm*color6: #2aa198
UXTerm*color14: #93a1a1
!white
UXTerm*color7: #eee8d5
UXTerm*color15: #fdf6e3
Cargó la configuración sin -mergesolo estar seguro:
xrdb ~/.Xresources
Y lanzó UXTerm:
EDIT2: Olvidé mencionar un detalle (probablemente relevante): si me deshago de la combinación de colores, UXTerm comienza a mostrar colores que al menos se parecen a los de Alacritty:
Entonces la dirección es algo correcta. Pero es simplemente inutilizable para mí en este estado.
Respuestas
Alacritty ignora la configuración de recursos, xterm los usa. Esos S_xxxnombres se procesan posteriormente con el preprocesador de C antes de que xterm los vea.
Copiar esas .Xresourcescosas en un archivo e intentarlo muestra un problema con la configuración (algunos valores no están definidos):
> XAPPLRESDIR=/users/tom/app-defaults.orig uxterm
Warning: Color name "S_base3" is not defined
xterm: unable to allocate fg/bg colors
Warning: Color name "S_base1" is not defined
Warning: Color name "S_base00" is not defined
(Pasé algún tiempo investigando paletas, por ejemplo, solarizado , hace unos meses, y descubrí que la mayoría de las páginas web que enumeran recursos X tienen errores como este).
Con la paleta corregida: de forma predeterminada, xterm asigna los primeros 8 colores ANSI en 8-15 si hay un atributo en negrita (esa paleta solarizada no tiene colores más brillantes allí, por supuesto). Puede desactivar eso mediante +pc(opción de línea de comandos) o el recurso correspondienteboldColors:false
PS1 = '${debian_chroot:+($raíz_debian)} \ [\ 033 [01; 32m \] \ u @ \ h \ [\ 033 [00m \]: \ [\ 033 [01; 34m \] \ w \ [\ 033 [00m \] \ $ 'setab = \ E [%?% p1% {8}% <% t4% p1% d% e% p1% {16}% <% t10% p1% {8}% -% d% e48; 5;% p1 % d%; m, setaf = \ E [%?% p1% {8}% <% t3% p1% d% e% p1% {16}% <% t9% p1% {8}% -% d% e38; 5;% p1 % d%; m,
Su mensaje no es correcto para su tipo de terminal. Tiene secuencias de control SGR codificadas para cambiar de color, y codifica las incorrectas para otro tipo de terminal.
- Su terminal establece los colores de 8 a 15 en respuesta a SGR 90–97 y SGR 100–107, que es lo que hace todo el galimatías en
setafy ensetabrealidad. (El resto del galimatías especifica que establece colores 16 y hacia arriba en respuesta a SGR 38: 5 y SGR 48: 5, con los separadores defectuosos ). - Su mensaje intenta establecer los colores de 8 a 15 estableciendo los colores de 0 a 7 en su lugar y activando negrita (con SGR 1). Si observa detenidamente la captura de pantalla de UXTerm, verá que eso es exactamente lo que UXTerm ha hecho de hecho, establezca un color de número bajo y en negrita , tal como lo solicitó el mensaje.
Los otros programas no son secuencias de control de cableado , por eso funcionan.
No conecte las secuencias de control. Generelos con tput setafy tput setaby use la sustitución de comandos para colocar el resultado en su PS1variable de shell. Entonces funcionará con muchos tipos de terminal y no solo con el que tiene cableado.
Irónicamente, el cableado que usted, o la persona que hizo en su mensaje, ha elegido se aplica a una pequeña minoría de tipos de terminales. De hecho, solo el linux-16colortipo de terminal en la base de datos terminfo intenta establecer los colores del 8 al 15 de esa manera. Para la mayoría del mundo de los terminales hoy en día, negrita significa negrita real , un cambio en el peso de la fuente, no en el color. No lo use como si fuera un cambio de color.
Otras lecturas
- https://github.com/microsoft/terminal/issues/5682#issuecomment-624583284
- https://unix.stackexchange.com/a/31697/5132 (La probabilidad de que le falte un terminfo en Pop-OS es escasa de todos modos, incluso sin tener en cuenta que otros programas pueden usarlo y obviamente está ahí en su caso)
- https://unix.stackexchange.com/a/204187/5132
- https://unix.stackexchange.com/a/71012/5132
- https://unix.stackexchange.com/a/347446/5132
- https://unix.stackexchange.com/a/16123/5132
- … Y muchas más respuestas mostrando
tput. - https://unix.stackexchange.com/a/588898/5132