Вопрос или проблема
Я не совсем понимаю поведение XTerm (в данном случае UXTerm) в отношении цветов. Я использую цветовую тему Solarized Light для Alacritty и UXTerm. Они более-менее идентичны:
~/.alacritty.yml
:
# Цвета (Solarized Light)
colors:
# Основные цвета
primary:
background: '0xfdf6e3'
foreground: '0x586e75'
# Обычные цвета
normal:
black: '0x073642'
red: '0xdc322f'
green: '0x859900'
yellow: '0xb58900'
blue: '0x268bd2'
magenta: '0xd33682'
cyan: '0x2aa198'
white: '0xeee8d5'
# Яркие цвета
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
! шрифты и другие параметры
UXTerm*faceSize: 11
uxterm*eightBitInput: false
UXTerm*faceName: Fira Mono Regular
! Фон и передний план
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
! Отключение полосы прокрутки
UXTerm*scrollBar: off
! Запуск с геометрией
UXTerm*vt100*geometry: 160x50
! Цвета
!-------------------------
! черный
UXTerm*color0: S_base02
UXTerm*color8: S_base03
! красный
UXTerm*color1: S_red
UXTerm*color9: S_orange
! зеленый
UXTerm*color2: S_green
UXTerm*color10: S_base01
! желтый
UXTerm*color3: S_yellow
UXTerm*color11: S_base00
! синий
UXTerm*color4: S_blue
UXTerm*color12: S_base0
! пурпурный
UXTerm*color5: S_magenta
UXTerm*color13: S_violet
! циан
UXTerm*color6: S_cyan
UXTerm*color14: S_base1
! белый
UXTerm*color7: S_base2
UXTerm*color15: S_base3
Сессия Alacritty:
trueneu@pop-os:~$ env | grep TERM
COLORTERM=truecolor
TERM=xterm-256color
Сессия 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
Но они показывают совершенно разные поведения в отношении цветов:
Alacritty:
UXTerm:
Хотя в emacs всё хорошо:
Alacritty:
UXTerm:
Обе проходят этот тест, который я нашел:
#!/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:
Подсказка:
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
То же самое с цветами ls
.
UXTerm’s infocmp
, если это помогает:
Восстановлено через infocmp из файла: /lib/terminfo/x/xterm-256color
xterm-256color|xterm с 256 цветами,
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,
Я что-то пропускаю в конфигурации? Так работает XTerm? Я не совсем понимаю, как он способен пройти этот тест.
ИЗМЕНИТЬ:
После ответа Thomas Dickey я действительно попытался переопределить .Xresources без препроцессора C #define
. Вот результат:
! шрифты и другие параметры
UXTerm*faceSize: 11
uxterm*eightBitInput: false
UXTerm*faceName: Fira Mono Regular
! Фон и передний план
UXTerm*background: #fdf6e3
UXTerm*foreground: #657b83
UXTerm*fading: 40
UXTerm*fadeColor: #fdf6e3
UXTerm*cursorColor: #586e75
UXTerm*pointerColorBackground: #93a1a1
UXTerm*pointerColorForeground: #586e75
! UXTerm*borderColor: #343434
! Отключение полосы прокрутки
UXTerm*scrollBar: off
! Запуск с геометрией
UXTerm*vt100*geometry: 160x50
! Цвета
!-------------------------
! черный
UXTerm*color0: #073642
UXTerm*color8: #002b36
! красный
UXTerm*color1: #dc322f
UXTerm*color9: #cb4b16
! зеленый
UXTerm*color2: #859900
UXTerm*color10: #586e75
! желтый
UXTerm*color3: #b58900
UXTerm*color11: #657b83
! синий
UXTerm*color4: #268bd2
UXTerm*color12: #839496
! пурпурный
UXTerm*color5: #d33682
UXTerm*color13: #6c71c4
! циан
UXTerm*color6: #2aa198
UXTerm*color14: #93a1a1
! белый
UXTerm*color7: #eee8d5
UXTerm*color15: #fdf6e3
Загрузил настройки без -merge
, чтобы быть уверенным:
xrdb ~/.Xresources
И запустил UXTerm:
ИЗМЕНИТЬ2: Забыл упомянуть одну (возможно, актуальную) деталь: если я избавлюсь от цветовой схемы, UXTerm начнет показывать цвета, по крайней мере, напоминающие цветовые схемы Alacritty:
Так что направление вроде правильное. Но в таком состоянии использовать это невозможно.
Alacritty игнорирует настройки ресурсов, xterm их использует. Те имена S_xxx
обрабатываются с помощью препроцессора C перед тем, как xterm их видит.
Скопировав это в файл .Xresources
и попробовав его, я обнаружил проблему с настройками (некоторые значения не определены):
> 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
(Я потратил некоторое время на исследование палитр, например, solarized, несколько месяцев назад, обнаружив, что большинство веб-страниц с перечислением X ресурсов имеют такие ошибки).
С исправленной палитрой: по умолчанию, xterm отображает первые 8 ANSI цветов в 8-15, если включен атрибут жирного шрифта (эта палитра solarized, конечно, не имеет более ярких цветов). Вы можете отключить это с помощью +pc
(опция командной строки) или соответствующего ресурса boldColors: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,
Ваш запрос некорректен для вашего типа терминала.
Он имеет жестко запрограммированные последовательности управления для изменения цвета, и они жестко запрограммированы неправильно, для другого типа терминала.
- Ваш терминал устанавливает цвета 8-15 в ответ на SGR 90–97 и SGR 100–107, что и делает весь этот набор в
setaf
иsetab
. (Остальная часть задает, что он устанавливает цвета 16 и выше в ответ на SGR 38:5 и SGR 48:5, с неправильными разделителями.) - Ваш запрос пытается установить цвета 8-15, устанавливая вместо этого цвета 0-7 и автоматически устанавливая полужирный шрифт (с SGR 1). Если внимательно посмотреть на ваш скриншот UXTerm, вы увидите, что именно это и сделал UXTerm: установил цвет с низким номером и включил полужирный шрифт, как и запросил ваш запрос.
Другие программы не жестко запрограммированы для последовательностей управления, поэтому они работают.
Не жестко программируйте последовательности управления.
Генерируйте их с помощью tput setaf
и tput setab
, и используйте командное замещение для размещения результата в вашей переменной PS1
shell.
Тогда это будет работать с многими типами терминалов, а не только с тем, который вы жестко запрограммировали.
Ирония в том, что жесткое программирование, которое вы или человек, который это сделал в вашем запросе, выбрали, применимо к небольшому количеству типов терминалов.
Только тип терминала linux-16color
в базе данных terminfo пытается установить цвета 8-15 таким образом.
Для большинства мира терминалов в настоящее время жирный шрифт означает фактический жирный шрифт, изменение веса шрифта, а не цвет.
Не используйте его, как если бы это было изменение цвета.
Дальнейшее чтение
- https://github.com/microsoft/terminal/issues/5682#issuecomment-624583284
- https://unix.stackexchange.com/a/31697/5132 (возможность отсутствия terminfo на Pop-OS маловероятна, даже не беря в расчет тот факт, что другие программы могут ее использовать, и она явно есть в вашем случае)
- 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
- … и многие другие ответы, показывающие
tput
. - https://unix.stackexchange.com/a/588898/5132
Для меня эта проблема оказалась специфичной для Debian — в файле /etc/X11/Xresources/x11-common
в системе Debian 12 имеется такой блок:
#ifdef COLOR
*customization: -color
#endif
Это приводит к тому, что *customization: -color
появляется в активных Xресурсах для каждого пользователя в каждой среды рабочего стола, и кажется, что он невосприимчив ко всему, кроме xrdb -remove
. Вы можете проверить это:
$ xrdb -q
*customization: -color
Если это присутствует в выводе xrdb -q
, xterm
будет вести себя странно и игнорировать некоторые (но не все!) другие X ресурсы. Настройка «обратного видео» также станет двойной обратной.
man xterm
содержит запутанный абзац о влиянии *customization: -color
; кажется, что это должно заставить использовать содержимое /usr/share/X11/app-defaults/XTerm-color
вместо /usr/share/X11/app-defaults/XTerm
в качестве значений по умолчанию, если они не переопределены локальными настройками, но на практике кажется, что он фактически приоритизирует эту Xterm-color
файл выше ваших локальных настроек.
В любом случае, я обнаружил, что как только я удалил *customization: -color
из своей среды, всё стало работать, как ожидалось.
Ответ или решение
Проблема отображения неправильных цветов в терминале XTerm является распространенной и может возникнуть из-за различных настроек и конфигураций. Давайте рассмотрим несколько аспектов, чтобы понять, почему UXTerm может отображать цвета иначе, чем ожидается.
Теоретическая база
Терминалы, такие как Alacritty и UXTerm, используют различные подходы к управлению цветами. Alacritty больше ориентирован на современные графические возможности и использует настройки, заданные в конфигурационном файле YAML. В отличие от него, UXTerm полагается на настройки, описанные в файле .Xresources
, который обрабатывается с использованием препроцессора C. Это может приводить к некорректной интерпретации цветовых кодов.
Во многих системах, например, на Debian, используются предустановленные Xresources, которые могут переопределять пользовательские настройки. Это может стать причиной того, что UXTerm игнорирует некоторые указанные цветовые параметры.
Пример настройки
Предположим, у вас есть два файла конфигурации: один для Alacritty (.alacritty.yml
), а другой для UXTerm (.Xresources
). В Alacritty вы определяете цвета напрямую с использованием шестнадцатеричных кодов. Например:
# Цвета (Solarized Light)
colors:
primary:
background: '0xfdf6e3'
foreground: '0x586e75'
В то время как в .Xresources
используются макросы определения #define
для подобных цветов, которые позже обрабатываются C-препроцессором:
#define S_base03 #002b36
#define S_base3 #fdf6e3
UXTerm*background: S_base3
UXTerm*foreground: S_base00
Применение на практике
Существуют несколько шагов, которые вы можете предпринять, чтобы решить проблему с цветами в UXTerm:
-
Удаление макросов в
.Xresources
: После замечания разработчика XTerm, отказ от использования макросов#define
и прямое указание шестнадцатеричных значений может помочь избежать неправильной интерпретации. Это позволяет избежать потенциальных ошибок, связанных с их обработкой. -
Обновление настроек с помощью
xrdb
: При обновлении конфигурации черезxrdb
, убедитесь, что вы используете флаг-merge
только при необходимости, чтобы избежать зависания старых настроек:
xrdb ~/.Xresources
- Проверка системных Xresources: На системах типа Debian может быть настройка
*customization: -color
, которая вызывает конфликты с пользовательскими цветами. Проверяйте активные Xresources с помощью:
xrdb -q
Если видите *customization: -color
, попробуйте его удалить с помощью:
xrdb -remove
- Использование
tput
для генерации цветовых кодов в PS1: Вместо жестко закодированных цветовых кодов используйтеtput
для совместимости с разными типами терминалов. Например:
PS1='${debian_chroot:+($debian_chroot)}$(tput setaf 2)\u@\h$(tput sgr0):$(tput setaf 4)\w$(tput sgr0)\$ '
- Тестирование с использованием контрольного скрипта: Убедитесь, что ваш терминал корректно интерпретирует цвета с помощью скрипта на bash, который отобразит спектр градиентных цветов, как вы уже пробовали.
Заключение
Разрешение проблемы отображения цветов в терминале UXTerm требует внимательного подхода к конфигурации и понимания особенностей работы приложения. Путем корректной настройки Xresources и избегания использования устаревших или ошибочных цветовых кодов, можно добиться точного воспроизведения цветов и улучшения опыта работы с терминалом. Эти шаги и примеры помогут сделать UXTerm более предсказуемым и соответствующим вашим ожиданиям в отображении цветной палитры.