Màu sắc sai trong xterm

Sep 11 2020

Tôi không hoàn toàn hiểu hành vi của XTerm (trong trường hợp này là UXTerm) liên quan đến màu sắc. Tôi đang sử dụng chủ đề màu Solarized Light cho Alacritty và UXTerm. Chúng ít nhiều giống nhau:

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

Phiên Alacritty:

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

Phiên 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

Nhưng chúng thể hiện những hành vi hoàn toàn khác nhau về màu sắc:

Alacritty:

UXTerm:

Mặc dù tất cả đều ổn trong emacs:

Alacritty:

UXTerm:

Cả hai đều vượt qua bài kiểm tra này mà tôi đã tìm thấy:

#!/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ời nhắc:

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

Tương tự với lsmàu sắc.

UXTerm's infocmp, nếu nó giúp:

    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,

Tôi có thiếu một số cấu hình ở đây không? Đây có phải là cách XTerm hoạt động không? Tôi thực sự không hiểu làm thế nào nó có thể vượt qua bài kiểm tra đó.

CHỈNH SỬA: Sau câu trả lời của Thomas Dickey, tôi đã thực sự cố gắng xác định lại .Xresources không có C tiền xử lý #define. Đây là kết quả:

!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

Đã tải các cài đặt mà không -mergecần chắc chắn:

xrdb ~/.Xresources

Và khởi chạy UXTerm:

EDIT2: Quên đề cập đến một chi tiết (có thể có liên quan): nếu tôi loại bỏ bất kỳ bảng màu nào, UXTerm bắt đầu hiển thị các màu ít nhất là giống với Alacritty:

Vì vậy, hướng đi là đúng. Nhưng nó rõ ràng là không thể sử dụng được đối với tôi trong trạng thái này.

Trả lời

2 ThomasDickey Sep 11 2020 at 04:57

Alacritty bỏ qua cài đặt tài nguyên, xterm sử dụng chúng. Những S_xxxtên đó được xử lý sau với bộ tiền xử lý C trước khi xterm nhìn thấy chúng.

Sao chép .Xresourcesnội dung đó vào một tệp và thử điều đó cho thấy có sự cố với cài đặt (một số giá trị không được xác định):

> 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

(Tôi đã dành một chút thời gian để điều tra các bảng màu, ví dụ: solarized , vài tháng trước, nhận thấy rằng hầu hết các trang liệt kê tài nguyên X đều có lỗi như thế này).

Với bảng màu đã sửa: theo mặc định, xterm ánh xạ 8 màu ANSI đầu tiên thành 8-15 nếu có thuộc tính đậm (tất nhiên bảng phân cực đó không có màu sáng hơn). Bạn có thể vô hiệu hóa điều đó bằng +pc(tùy chọn dòng lệnh) hoặc tài nguyên tương ứngboldColors:false

1 JdeBP Sep 11 2020 at 15:12
 PS1 = '${debian_chroot:+($debian_chroot)} \ [\ 033 [01; 32 phút \] \ u @ \ h \ [\ 033 [00 phút \]: \ [\ 033 [01; 34 phút \] \ w \ [\ 033 [00 phút \] \ $ '
  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,

Lời nhắc của bạn không đúng với loại thiết bị đầu cuối của bạn. Nó có các chuỗi điều khiển SGR được mã hóa cứng để thay đổi màu sắc và nó đã mã hóa sai các chuỗi điều khiển cho một loại thiết bị đầu cuối khác.

  • Thiết bị đầu cuối của bạn đặt các màu từ 8 đến 15 tương ứng với SGR 90–97 và SGR 100–107, đó là những gì mà tất cả những gì vô nghĩa trong setafvà setabthực tế làm. (Phần còn lại của chữ gibberish chỉ định rằng nó đặt màu 16 trở lên để đáp ứng SGR 38: 5 và SGR 48: 5, với các dấu phân cách bị lỗi .)
  • Lời nhắc của bạn đang cố gắng đặt màu từ 8 đến 15 bằng cách đặt màu 0–7 thay vào đó và bật tính năng in đậm (với SGR 1). Nếu bạn xem kỹ ảnh chụp màn hình UXTerm của mình, bạn sẽ thấy đó chính xác là những gì UXTerm đã thực hiện trên thực tế, hãy đặt màu được đánh số thấp và bật kiểu chữ đậm , giống như lời nhắc của bạn.

Các chương trình khác không phải là chuỗi điều khiển hardwiring , đó là lý do tại sao chúng hoạt động.

Đừng làm khó các trình tự điều khiển. Tạo chúng bằng tput setafvà tput setabvà sử dụng thay thế lệnh để đặt kết quả vào PS1biến shell của bạn . Sau đó, nó sẽ hoạt động với nhiều loại thiết bị đầu cuối chứ không chỉ với một thiết bị đầu cuối mà bạn đã cài đặt sẵn.

Trớ trêu thay, cách hardwiring mà bạn hoặc người đã làm điều đó trong lời nhắc của bạn, đã chọn áp dụng cho một số ít loại thiết bị đầu cuối. Trên thực tế, chỉ có linux-16colorkiểu đầu cuối trong cơ sở dữ liệu ga cuối mới cố gắng đặt màu từ 8 đến 15 theo cách đó. Đối với phần lớn thế giới của các thiết bị đầu cuối ngày nay, boldface có nghĩa là chữ in đậm thực tế , một sự thay đổi về độ đậm của phông chữ chứ không phải màu sắc. Không sử dụng nó như thể nó là một sự thay đổi màu sắc.

đọc thêm

  • https://github.com/microsoft/terminal/issues/5682#issuecomment-624583284
  • https://unix.stackexchange.com/a/31697/5132 (Dù sao thì khả năng bạn bị thiếu cổng kết nối trên Pop-OS là rất nhỏ, thậm chí không tính đến việc các chương trình khác có thể sử dụng nó và rõ ràng là có trong trường hợp của bạn)
  • 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
  • … Và nhiều câu trả lời khác đang hiển thị tput.
  • https://unix.stackexchange.com/a/588898/5132