Mauvaises couleurs dans xterm
Je ne comprends pas très bien le comportement de XTerm (dans ce cas UXTerm) concernant les couleurs. J'utilise le thème de couleur Solarized Light pour Alacritty et UXTerm. Ils sont plus ou moins identiques:
~/.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
Session alacritty:
trueneu@pop-os:~$ env | grep TERM
COLORTERM=truecolor
TERM=xterm-256color
Session 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
Mais ils montrent des comportements complètement différents en termes de couleurs:
Alacritty:
UXTerm:
Bien que tout va bien dans emacs:
Alacritty:
UXTerm:
Les deux réussissent ce test que j'ai trouvé:
#!/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:
L'invite:
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
Pareil pour les lscouleurs.
UXTerm infocmp, si cela aide:
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,
Est-ce que je manque une configuration ici? Est-ce ainsi que fonctionne XTerm? Je ne comprends pas vraiment comment est-il capable de passer ce test.
EDIT: Après la réponse de Thomas Dickey, je l' ai bien essayé de redéfinir .Xresources être sans préprocesseur C #defines. Voici le résultat:
!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
Chargé les paramètres sans -mergejuste être sûr:
xrdb ~/.Xresources
Et a lancé UXTerm:
EDIT2: J'ai oublié de mentionner un détail (probablement pertinent): si je me débarrasse du jeu de couleurs, UXTerm commence à afficher des couleurs ressemblant au moins à celles d'Alacritty:
La direction est donc plutôt correcte. Mais c'est tout simplement inutilisable pour moi dans cet état.
Réponses
Alacritty ignore les paramètres des ressources, xterm les utilise. Ces S_xxxnoms sont post-traités avec le préprocesseur C avant que xterm ne les voit.
Copier ces .Xresourceséléments dans un fichier et essayer cela montre un problème avec les paramètres (certaines valeurs ne sont pas définies):
> 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
(J'ai passé du temps à étudier les palettes, par exemple, solarisées , il y a quelques mois, constatant que la plupart des pages Web répertoriant des ressources X comportent des erreurs comme celle-ci).
Avec la palette corrigée: par défaut, xterm mappe les 8 premières couleurs ANSI en 8-15 s'il y a un attribut gras (cette palette solarisée n'a pas de couleurs plus vives, bien sûr). Vous pouvez désactiver cela par +pc(option de ligne de commande), ou la ressource correspondanteboldColors:false
PS1 = '${debian_chroot:+($debian_chroot)} \ [\ 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,
Votre invite n'est pas correcte pour votre type de terminal. Il a des séquences de contrôle SGR codées en dur pour changer de couleur, et il a codé en dur les mauvaises , pour un autre type de terminal.
- Votre terminal définit les couleurs 8 à 15 en réponse aux SGR 90–97 et SGR 100–107, ce que fait en réalité tout le charabia du
setafetsetab. (Le reste du charabia spécifie qu'il définit les couleurs 16 et plus en réponse à SGR 38: 5 et SGR 48: 5, avec les séparateurs défectueux .) - Votre invite tente de définir les couleurs 8 à 15 en définissant les couleurs 0 à 7 à la place et en activant les caractères gras (avec SGR 1). Si vous regardez attentivement votre capture d'écran UXTerm, vous verrez que c'est exactement ce que UXTerm a en fait fait, définissez une couleur à faible numéro et activez les caractères gras , comme votre invite vous l'a demandé.
Les autres programmes ne sont pas des séquences de contrôle câblées , c'est pourquoi ils fonctionnent.
Ne câblez pas les séquences de contrôle. Générez-les avec tput setafet tput setabet utilisez la substitution de commande pour placer le résultat dans votre PS1variable shell. Ensuite, il fonctionnera avec de nombreux types de terminaux et pas seulement avec celui que vous avez câblé.
Ironiquement, le câblage que vous, ou la personne qui a fait cela dans votre invite, avez choisi s'applique à une petite minorité de types de terminaux. Seul le linux-16colortype de terminal dans la base de données terminfo essaie de définir les couleurs 8 à 15 de cette façon, en fait. Pour la majorité du monde des terminaux de nos jours, le caractère gras signifie le caractère gras réel , un changement de poids de police, pas de couleur. Ne l'utilisez pas comme s'il s'agissait d'un changement de couleur.
Lectures complémentaires
- https://github.com/microsoft/terminal/issues/5682#issuecomment-624583284
- https://unix.stackexchange.com/a/31697/5132 (la probabilité que vous ayez un terminfo manquant sur Pop-OS est mince de toute façon, même en ne tenant pas compte du fait que d'autres programmes peuvent l'utiliser et c'est évidemment là dans votre cas)
- 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
- … Et bien d'autres réponses affichées
tput. - https://unix.stackexchange.com/a/588898/5132