Urxvt: changer la couleur d'arrière-plan à la volée

12

Est-il possible de modifier la couleur d'arrière-plan d'une session rxvt-unicode à la volée? Comme avec la Ctrlclé?

J'ai un tas de fenêtres Urxvt et je voudrais en colorier dynamiquement pour m'aider à les distinguer. Mais encore une fois, je veux dire à la volée ...

dman
la source
1
Non, vous pouvez avec Termite , cependant ...
jasonwryan

Réponses:

16

urxvt2.6 en 2004 a ajouté la prise en charge de la fonction de couleurs dynamiques de xterm . Dans XTerm Control Sequences , il s'agit de OSC11. OSC10 définit la couleur de texte par défaut. Le changelog mentionne une partie du changement:

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 "?".

mais le code source raconte l'histoire, comme d'habitude:

 /*
  * 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 
  */

Le manuel rxvt(7)ne donne aucune information utile:

   Commandes du système d'exploitation XTerm
       "ESC] Ps; Pt ST"
           Définissez les paramètres XTerm. ST 8 bits: 0x9c, séquence ST 7 bits: ESC \
           (0x1b, 0x5c), le terminateur rétrocompatible BEL (0x07) est également
           accepté. tout octet peut être échappé en le préfixant avec SYN (0x16,
           ^ V).

Cet exemple simple définit les couleurs par défaut du premier plan (texte) et du fond :

#!/bin/sh
printf '\033]10;red\007'
printf '\033]11;green\007'

Comme xterm, ces couleurs par défaut peuvent être remplacées temporairement par des couleurs "ANSI".

La fonctionnalité peut être désactivée lors de l' xtermutilisation de la dynamicColorsressource. Contrairement à xterm, urxvtn'a aucun paramètre de ressources pour la fonctionnalité.

VTE implémente également la fonctionnalité et ne la documente pas non plus. urxvtau moins commencé avec la documentation de rxvt. Pour VTE, vous devez lire le code source. La fonctionnalité pertinente dans vteseq.ccressemble à ceci:

/* 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);
}

Ce code remonte à quelque temps en 2003 (quand il a été écrit en C):

commit f39e281529827f68fd0e9bba41785d66a21efc1c
Author: Nalin Dahyabhai <[email protected]>
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).

Lectures complémentaires:

Thomas Dickey
la source
Je n'ai pas essayé ceci mais c'est tellement impressionnant et difficile à trouver que je le ferai accepter! J'espère que cela fonctionne dans URXVT.
dman
1
Je l'ai testé hier soir avec urxvt 9.15 sur ma Debian 7 (pour être certain que je lisais correctement la source).
Thomas Dickey
Je voulais juste faire un suivi à ce sujet et dire que cela fonctionne comme un rêve. Merci encore car cette information serait difficile à trouver.
dman
7

J'ai ajouté ce qui suit à mon ~/.Xresourcesfichier pour changer les couleurs à la volée en appuyant sur Ctrlet 7ou 8ou 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

Si vous souhaitez définir la couleur de premier plan et d'arrière-plan en même temps, il suffit de concaténer les commandes (certaines couleurs sont définies par des noms):

! change to red background
URxvt.keysym.C-7: command:\033]11;#ff0000\007\033]10;yellow\007

Vous pouvez tester vos couleurs avec une simple echocommande, comme celle-ci:

echo -e '\033]11;#ff0000\007\033]10;yellow\007'   # changes to red background and yellow foreground

Attention

J'ai utilisé le code 11 pour la couleur d' arrière-plan et le code 10 pour la couleur de premier plan . Les définitions d'Urxvt citées par Thomas Dickey indiquent d'utiliser 49 et 39 à la place (que j'ai testé et aussi travaillé).

erik
la source
2

Dynamic Colors est un exemple de changement de couleur dynamique. Il commence par utiliser ces deux .Xresources:

xterm*dynamicColors: true urxvt*dynamicColors: on

Malgré le plomb, je n'ai pas réussi à changer de couleur avec urxvt! Cette technique fonctionne très bien avec xterm. Dynamic Colors appelle ces "séquences d'échappement OSC" qui modifient le terminal, l'exemple pour rendre l'arrière-plan rouge est:echo -e "\03echo -e "\033]11;#ff0000\007"3]11;#ff0000\007"

rektide
la source
Pour moi, la couleur de l'arrière-plan passe au rouge si je mets cela dans la ligne de commande:echo -e "\033]11;#ff0000\007"
erik
2

J'ai les éléments suivants dans mes Xresources pour une commutation rapide (oui, c'est basé sur des couleurs dynamiques).

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

Vous pouvez également consulter une autre approche ici: https://github.com/sos4nt/dynamic-colors

coding_drunk
la source
1

J'ai écrit une extension appelée urxvt-theme qui ajoute cette fonctionnalité à rxvt-unicode (avec un menu contextuel simple) en utilisant des ressources X et des couleurs dynamiques.

pera
la source