Falsche Farben in xterm

Sep 11 2020

Ich verstehe das Verhalten von XTerm (in diesem Fall UXTerm) in Bezug auf Farben nicht ganz. Ich verwende das Solarized Light-Farbthema für Alacritty und UXTerm. Sie sind mehr oder weniger identisch:

~/.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

Alacritty-Sitzung:

trueneu@pop-os:~$ env | grep TERM
COLORTERM=truecolor
TERM=xterm-256color

UXTerm-Sitzung:

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

Aber sie zeigen farblich völlig unterschiedliche Verhaltensweisen:

Alacritty:

UXTerm:

Obwohl in Emacs alles in Ordnung ist:

Alacritty:

UXTerm:

Beide bestehen diesen Test, den ich gefunden habe:

#!/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:

Die Eingabeaufforderung:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

Gleiches gilt für lsFarben.

UXTerm's infocmp, wenn es hilft:

    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,

Fehlt mir hier eine Konfiguration? Funktioniert XTerm so? Ich verstehe allerdings nicht wirklich, wie es diesen Test bestehen kann.

EDIT: Nach der Antwort von Thomas Dickey habe ich tatsächlich versucht, .Xresources neu zu definieren, um ohne C-Präprozessor zu sein #define. Hier ist das Ergebnis:

!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

Lade die Einstellungen ohne -mergenur um sicher zu gehen:

xrdb ~/.Xresources

Und startete UXTerm:

EDIT2: Ich habe vergessen, ein (wahrscheinlich relevantes) Detail zu erwähnen: Wenn ich das Farbschema überhaupt los werde, zeigt UXTerm Farben, die zumindest denen von Alacritty ähneln :

Die Richtung ist also irgendwie richtig. Aber in diesem Zustand ist es für mich einfach unbrauchbar.

Antworten

2 ThomasDickey Sep 11 2020 at 04:57

Alacritty ignoriert die Ressourceneinstellungen, xterm verwendet sie. Diese S_xxxNamen werden mit dem C-Präprozessor nachbearbeitet, bevor xterm sie sieht.

Das Kopieren dieses .XresourcesMaterials in eine Datei und das Ausprobieren zeigen ein Problem mit den Einstellungen (einige Werte sind undefiniert):

> 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

(Ich habe vor einigen Monaten einige Zeit damit verbracht, Paletten zu untersuchen, z. B. solarisiert , und festgestellt, dass die meisten Webseiten, auf denen X-Ressourcen aufgelistet sind, solche Fehler aufweisen.)

Mit der korrigierten Palette: Standardmäßig ordnet xterm die ersten 8 ANSI-Farben 8-15 zu, wenn ein fettgedrucktes Attribut vorhanden ist (diese solarisierte Palette hat dort natürlich keine helleren Farben). Sie können dies über +pc(Befehlszeilenoption) oder die entsprechende Ressource deaktivierenboldColors:false

1 JdeBP Sep 11 2020 at 15:12
 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 %dm,
  setaf = \ E [%?% p1% {8}% <% t3% p1% d% e% p1% {16}% <% t9% p1% {8}% -% d% e38; 5;% p1 %dm,

Ihre Eingabeaufforderung ist für Ihren Terminaltyp nicht korrekt. Es hat fest codierte SGR-Steuersequenzen zum Ändern der Farbe und es hat die falschen für einen anderen Terminaltyp fest codiert.

  • Ihr Terminal setzt die Farben 8 bis 15 als Reaktion auf SGR 90–97 und SGR 100–107, was der ganze Kauderwelsch im setafund setabtatsächlich tut. (Der Rest des Kauderwels gibt an, dass die Farben 16 und höher als Reaktion auf SGR 38: 5 und SGR 48: 5 mit den fehlerhaften Trennzeichen festgelegt werden .)
  • Ihre Eingabeaufforderung versucht, die Farben 8 bis 15 einzustellen, indem Sie stattdessen die Farben 0 bis 7 einstellen und Fettdruck aktivieren (mit SGR 1). Wenn Sie sich Ihren UXTerm-Screenshot genau ansehen, werden Sie feststellen, dass UXTerm genau das getan hat. Stellen Sie eine niedrig nummerierte Farbe ein und schalten Sie Fettdruck ein , genau wie Ihre Aufforderung es verlangt hat.

Die anderen Programme sind keine festverdrahteten Steuersequenzen , weshalb sie funktionieren.

Verdrahten Sie die Kontrollsequenzen nicht fest. Generieren Sie sie mit tput setafund tput setabund verwenden Sie die Befehlssubstitution, um das Ergebnis in Ihre PS1Shell-Variable einzufügen. Dann funktioniert es mit vielen Arten von Terminals und nicht nur mit denen, die Sie fest verdrahtet haben.

Ironischerweise gilt die Festverdrahtung, die Sie oder die Person, die dies in Ihrer Eingabeaufforderung getan hat, gewählt haben, für eine kleine Minderheit von Terminaltypen. Tatsächlich versucht nur der linux-16colorTerminaltyp in der terminfo-Datenbank, die Farben 8 bis 15 auf diese Weise festzulegen. Für die Mehrheit der Terminals bedeutet Fettdruck heutzutage tatsächlich Fettdruck , eine Änderung der Schriftgröße und nicht der Farbe. Verwenden Sie es nicht so, als wäre es ein Farbwechsel.

Weiterführende Literatur

  • https://github.com/microsoft/terminal/issues/5682#issuecomment-624583284
  • https://unix.stackexchange.com/a/31697/5132 (Die Wahrscheinlichkeit, dass Sie unter Pop-OS ein fehlendes Terminfo haben, ist ohnehin gering, auch wenn Sie nicht berücksichtigen, dass andere Programme es verwenden können, und es ist offensichtlich in Ihrem Fall vorhanden.)
  • 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
  • … Und viele weitere Antworten tput.
  • https://unix.stackexchange.com/a/588898/5132