Відповіді:
urxvt2.6 в 2004 році додала підтримку динамічної кольорової функції xterm . У контрольних послідовностях XTerm це OSC11. OSC10 встановлює колір тексту за замовчуванням. У журналі змін було зазначено частину зміни:
2.6 Fri Apr 2 03:24:10 CEST 2004
- minor doc corrections.
- WARNING: changed menu sequence from ESC ] 10 to ESC ] 703 to
avoid clashes with xterm.
- changed OSC701/OSC702 sequence to return standard escaped reports.
- xterm-compat: make set window colour and other requests report
window colour when arg is "?".
але вихідний код розповідає історію, як завжди:
/*
* XTerm escape sequences: ESC ] Ps;Pt (ST|BEL)
* 0 = change iconName/title
* 1 = change iconName
* 2 = change title
* 4 = change color
+ * 10 = change fg color
+ * 11 = change bg color
* 12 = change text color
* 13 = change mouse foreground color
* 17 = change highlight character colour
@@ -2949,20 +3236,21 @@
* 50 = change font
*
* rxvt extensions:
- * 10 = menu (may change in future)
* 20 = bg pixmap
* 39 = change default fg color
* 49 = change default bg color
* 55 = dump scrollback buffer and all of screen
* 701 = change locale
* 702 = find font
+ * 703 = menu
*/
Посібник rxvt(7)не дає корисної інформації:
Команди операційної системи XTerm
"ESC] Ps; Pt ST"
Встановіть параметри XTerm. 8-бітний ST: 0x9c, 7-бітна послідовність ST: ESC \
(0x1b, 0x5c), також сумісний назад термінатор BEL (0x07)
прийнято. будь-який октет можна уникнути, приєднавши його до SYN (0x16,
^ V).
Цей простий приклад встановлює як кольори переднього плану (текст), так і фонові кольори за замовчуванням :
#!/bin/sh
printf '\033]10;red\007'
printf '\033]11;green\007'
Можливо xterm, ці кольори за замовчуванням можна тимчасово змінити кольорами "ANSI".
Функцію можна відключити при xtermвикористанні dynamicColorsресурсу. На відміну від цього xterm, urxvtне має ресурсу для функції.
VTE також реалізує цю функцію, а також не документує її. urxvtпринаймні почали з документації від rxvt. Для VTE потрібно прочитати вихідний код. Відповідна функція vteseq.ccвиглядає так:
/* Change the default background cursor, BEL terminated */
static void
vte_sequence_handler_change_background_color_bel (VteTerminalPrivate *that, GValueArray *params)
{
vte_sequence_handler_change_special_color_internal (that, params,
VTE_DEFAULT_BG, -1, 11, BEL);
}
/* Change the default background cursor, ST terminated */
static void
vte_sequence_handler_change_background_color_st (VteTerminalPrivate *that, GValueArray *params)
{
vte_sequence_handler_change_special_color_internal (that, params,
VTE_DEFAULT_BG, -1, 11, ST);
}
Цей код датується колись у 2003 році (коли він був написаний на С):
commit f39e281529827f68fd0e9bba41785d66a21efc1c
Author: Nalin Dahyabhai <nalin@src.gnome.org>
Date: Wed Jan 22 21:35:22 2003 +0000
accept OSC{number};{string}ST as set-text-parameters, per XTerm docs (part
* src/caps.c: accept OSC{number};{string}ST as set-text-parameters, per XTerm
docs (part of #104154).
* src/keymap.c: revert change to prepend "1;" to keys with modifiers (#104139).
Подальше читання:
Я додав у свій ~/.Xresourcesфайл наступне, щоб змінити кольори під час натискання Ctrlта 7або 8або 9.
! change to red background
URxvt.keysym.C-7: command:\033]11;#ff0000\007
! change to light background
URxvt.keysym.C-8: command:\033]11;#ffffff\007
! change to dark gray background
URxvt.keysym.C-9: command:\033]11;#777777\007
Якщо ви хочете одночасно встановити колір переднього плану та фону, просто з'єднайте команди (деякі кольори визначаються іменами):
! change to red background
URxvt.keysym.C-7: command:\033]11;#ff0000\007\033]10;yellow\007
Ви можете протестувати свої кольори за допомогою простої echoкоманди, як ця:
echo -e '\033]11;#ff0000\007\033]10;yellow\007' # changes to red background and yellow foreground
Я використовував код 11 для кольору фону та код 10 для кольору переднього плану . Визначення Urxvt, цитовані Томасом Дікі, вказують на використання 49 та 39 (що я тестував і також працюю).
Динамічні кольори - приклад динамічного перемикання кольорів. Він починається з використання цих двох .Xresources:
xterm*dynamicColors: true
urxvt*dynamicColors: on
Незважаючи на ведучі, я не отримав зміни кольору, працюючи з urxvt! Ця методика чудово працює з xterm. Dynamic Colors називає ці "послідовності втечі OSC", які змінюють термінал, наприклад, щоб зробити фон червоним:echo -e "\03echo -e "\033]11;#ff0000\007"3]11;#ff0000\007"
echo -e "\033]11;#ff0000\007"
У моїх Xresources є наступне для швидкого перемикання (так, це засновано на динамічних кольорах).
URxvt*keysym.Control-Shift-F10: command:\033]11;#2c2c2c\007\033]10;#dcdcdc\007\033]12;#dcdcdc\007\033]4;0;#3f3f3f\007\033]4;1;#705050\007\033]4;2;#60b48a\007\033]4;3;#dfaf8f\007\033]4;4;#9ab8d7\007\033]4;5;#dc8cc3\007\033]4;6;#8cd0d3\007\033]4;7;#dcdcdc\007\033]4;8;#709080\007\033]4;9;#dca3a3\007\033]4;10;#72d5a3\007\033]4;11;#f0dfaf\007\033]4;12;#94bff3\007\033]4;13;#ec93d3\007\033]4;14;#93e0e3\007\033]4;15;#ffffff\007
URxvt*keysym.Control-Shift-F11: command:\033]11;#000000\007\033]10;#ffffff\007\033]12;#ffffff\007\033]4;0;#000000\007\033]4;1;#cc0000\007\033]4;2;#4e9a06\007\033]4;3;#c4a000\007\033]4;4;#3465a4\007\033]4;5;#75507b\007\033]4;6;#06989a\007\033]4;7;#d3d7cf\007\033]4;8;#555753\007\033]4;9;#ef2929\007\033]4;10;#8ae234\007\033]4;11;#fce94f\007\033]4;12;#729fcf\007\033]4;13;#ad7fa8\007\033]4;14;#34e2e2\007\033]4;15;#eeeeec\007
URxvt*keysym.Control-Shift-F12: command:\033]11;#000000\007\033]10;#a9a9a9\007\033]12;#a9a9a9\007\033]4;0;#000000\007\033]4;1;#cc0000\007\033]4;2;#00cc00\007\033]4;3;#cccc00\007\033]4;4;#0000cc\007\033]4;5;#cc00cc\007\033]4;6;#00cccc\007\033]4;7;#cccccc\007\033]4;8;#555555\007\033]4;9;#ff0000\007\033]4;10;#00ff00\007\033]4;11;#ffff00\007\033]4;12;#0000ff\007\033]4;13;#ff00ff\007\033]4;14;#00ffff\007\033]4;15;#ffffff\007
Ви також можете поглянути на інший підхід тут: https://github.com/sos4nt/dynamic-colors
Я написав розширення з назвою urxvt-тема, яке додає цю функціональність до rxvt-unicode (з простим контекстним меню), використовуючи ресурси X та динамічні кольори.