paramètres urxvt - recharger sans redémarrer le terminal?

19

J'ai deux urxvtthèmes de couleurs que j'utilise, un pour l'arrière-plan clair et un pour l'obscurité, selon la luminosité de l'environnement.

Il est assez facile de les changer en les modifiant ~/.Xresourceset en les exécutant à xrdb ~/.Xresourcesnouveau, mais cela n'affecte pas les terminaux qui sont déjà en cours d'exécution.

J'utilise tmux pour pouvoir détacher, redémarrer le terminal et rattacher, mais cela devient très ennuyeux très rapidement quand 8 d'entre eux sont déjà disposés comme je le souhaite sur divers espaces de travail.

La solution, semble-t-il, est que urxvt recharge ses paramètres d'une manière ou d'une autre, mais je ne trouve aucune information sur la façon de procéder ou si c'est même possible. Est-ce que quelqu'un sait comment?

Remarque: je n'exécute aucun des principaux DE et je ne suis pas sur le point d'installer toutes les bibliothèques kde ou gnome uniquement pour un terminal.

Edit: man 7 urxvtmontre quelques codes à la recherche de sorciers à faire ... eh bien ... quelque chose . Je ne vois pas comment cela s'applique à la modification de jeux de couleurs entiers. Des conseils?

John Tyree
la source

Réponses:

12

Par hasard, j'ai trouvé le wiki de configuration pour mintty. Il contient de nombreuses suggestions intéressantes, dont la façon de définir diverses options à l'aide de séquences d'échappement destinées à xterm. Donc, cela fonctionne en ne relisant pas la configuration mais en interprétant les séquences d'échappement pour remplacer les sélections de couleurs existantes.

Nous pouvons l'utiliser à partir d'URxvt en liant une clé à une longue chaîne de commandes, dont chacune modifie l'une des 16 couleurs par défaut.

Par exemple, ici, je définis alt+ctrl+lpour changer chaque couleur en C0C0C0:

# This stupidly changes every color to grey.
URxvt.keysym.M-C-l: command:\033]11;#C0C0C0\007\033]10;#C0C0C0\007\033]4;0;#C0C0C0\007\033]4;1;#C0C0C0\007\033]4;2;#C0C0C0\007\033]4;3;#C0C0C0\007\033]4;4;#C0C0C0\007\033]4;5;#C0C0C0\007\033]4;6;#C0C0C0\007\033]4;7;#C0C0C0\007\033]4;8;#C0C0C0\007\033]4;9;#C0C0C0\007\033]4;10;#C0C0C0\007\033]4;11;#C0C0C0\007\033]4;12;#C0C0C0\007\033]4;13;#C0C0C0\007\033]4;14;#C0C0C0\007\033]4;15;#C0C0C0\007

Plugin Perl

Je le fais "fonctionner" mais pas vraiment, car il semble qu'il y ait une différence fondamentale entre les ressources définies comme

URxvt.keysym.M-1: command:\033].......

et toute tentative de faire de même avec $term->cmd_parse().

Y a-t-il quelque chose à faire à ce sujet? Jusqu'à présent, j'ai codé en dur des ensembles de couleurs claires et foncées en utilisant des séquences d'échappement (très longues):

URxvt.keysym.M-C-l: command:\033]4;12;#72729F9FCFCF\007\033]4;1;#CCCC00000000\007\033]4;15;#EEEEEEEEECEC\007\033]4;14;#3434E2E2E2E2\007\033]4;5;#757550507B7B\007\033]4;3;#C4C4A0A00000\007\033]4;7;#D3D3D7D7CFCF\007\033]4;4;#34346565A4A4\007\033]4;10;#8A8AE2E23434\007\033]4;13;#ADAD7F7FA8A8\007\033]4;8;#555557575353\007\033]11;#FFFFFFFFFFFF\007\033]4;9;#EFEF29292929\007\033]4;2;#4E4E9A9A0606\007\033]4;0;#2E2E34343636\007\033]4;11;#FCFCE9E94F4F\007\033]10;#000000000000\007\033]4;6;#060698209A9A\007
URxvt.keysym.M-C-d: command:\033]4;12;#9090FF\007\033]4;1;#AA0000\007\033]4;15;#FFFFFF\007\033]4;14;#55FFFF\007\033]4;5;#AA00AA\007\033]4;3;#AA5500\007\033]4;7;#AAAAAA\007\033]4;10;#55FF55\007\033]4;13;#FF55FF\007\033]4;4;#0000AD\007\033]4;8;#555555\007\033]11;#000000\007\033]4;9;#FF5555\007\033]4;2;#00AA00\007\033]\007\033]4;0;#000000\007\033]4;11;#FFFF55\007\033]10;#00FF00\007\033]5;0;#00FF00\007\033]4;6;#00AAAA\007

Cela fonctionne exactement comme je l'espérais et pourrait être basculé au moment de l'exécution, donc je marque cela comme répondu, mais pourquoi cela ne peut-il pas être fait dynamiquement depuis Perl? Voici ce que j'ai jusqu'à présent, je ne suis pas un grand codeur Perl, alors veuillez excuser le style sans aucun doute mauvais.

J'espère que quelqu'un pourra sonder le problème. Ce sera un joli plugin. L'amont est au github .

#! /usr/bin/env perl -w
# Author:  John Tyree
# Website: http://github.com/johntyree/urxvt-perls/blob/master/rotate-colors
# License: CCBYNC

# Use keyboard shortcuts to load colors of the form *.colorN:XXXXXX from a file
# This gives us "on demand" theme switching.

# Usage: put the following lines in your .Xdefaults/.Xresources:
#   URxvt.perl-ext-common: ...,rotate-colors
#   URxvt.colorFiles: ~/.Xresources,~/light.txt,~/dark.txt
#   URxvt.keysym.M-C-n:   perl:rotate-colors:forward
#   URxvt.keysym.M-C-p:   perl:rotate-colors:backward

use strict;


sub on_start {
    my ($self) = @_;
    $self->{current_index} = -1;
    my @arr = split(/,/, $self->x_resource('colorFiles') || '');
    $self->{color_files} = \@arr;
    ()
}

sub read_colors {
    my $fn = shift;
    open my $fin, $fn or print STDERR "Unable to open $fn for reading";
    my %colors;

    while (my $line = <$fin>) {
        if ($line =~ /(\w+)\s*:\s*(#[0-9a-fA-F]+)/) {
            $colors{$1} = $2;
        }
    }
    return %colors
}

sub escape_seq {
    my ($k, $v) = @_;
    my $cmd = "";
    if ($k =~ /^color(\d+)$/) {
        $cmd = "4;$1;$v";
    } elsif ($k =~ /^colorBD$/) {
        $cmd = "5;0;$v";
    } elsif ($k =~ /^colorUL$/) {
        $cmd = "5;1;$v";
    } elsif ($k =~ /^colorBL$/) {
        $cmd = "5;2;$v";
    } elsif ($k =~ /^colorRV$/) {
        $cmd = "5;3;$v";
    } elsif ($k =~ /^foreground$/) {
        $cmd = "10;$v";
    } elsif ($k =~ /^background$/) {
        $cmd = "11;$v";
    } elsif ($k =~ /^cursorColor$/) {
        $cmd = "12;$v";
    } elsif ($k =~ /^pointerColor$/) {
        $cmd = "13;$v";
    }
    return "\033]".$cmd."\007"
}

sub build_cmd {
    my $fn = shift;
    my %colors = read_colors($fn);
    my $s =  join("", map {escape_seq($_, $colors{$_})} keys %colors);
    return $s   # was implicit anyway
}

sub on_user_command {
    my ($self, $cmd) = @_;
    my @fs = @{$self->{color_files}};
    my $len = @fs;

    if ($cmd eq "rotate-colors:forward") {
        my $idx = $self->{current_index}++;
        my $fn = $fs[$idx % scalar(@fs)];
        $self->cmd_parse(build_cmd($fn));
    } elsif ($cmd eq "rotate-colors:backward") {
        my $idx = $self->{current_index}--;
        my $fn = $fs[$idx % scalar(@fs)];
        $self->cmd_parse(build_cmd($fn));
    }
    ()
}
John Tyree
la source
build_cmd ne renvoie pas la chaîne de couleurs et cmd_parse () est exécuté sans paramètres?
Ярослав Рахматуллин
Faute de frappe. Je ne l'ai pas remarqué car dans la sagesse infinie de perl, la valeur de retour est implicitement $slà.
John Tyree
1
Veuillez nous indiquer quand votre plugin fonctionne.
erik
4

J'ai créé une extension Perl qui recharge la configuration urxvt lors de la réception de SIGUSR1: https://github.com/regnarg/urxvt-config-reload

Actuellement, il ne prend en charge que le rechargement de la configuration des couleurs, mais d'autres éléments (comme les polices) peuvent être ajoutés facilement. Signalez les bogues comme problèmes de github.

regnarg
la source
Il prend désormais également en charge la configuration des polices et de la géométrie! :)
Powerman
Agréable! Relire toute la configuration n'est pas vraiment ce que je veux, mais peut-être avez-vous compris certaines choses que je n'ai pas. Avec nos pouvoirs combinés ...?
John Tyree
3

Le script suivant peut être utilisé avec URxvt (ou tout autre terminal prenant en charge les séquences d'échappement XTerm OSC) pour modifier le jeu de couleurs à la volée. Il accepte les définitions de style .Xresources en entrée et génère les séquences d'échappement. Le simple fait d'exécuter le script dans le terminal et d'y coller un schéma de couleurs changera la palette de couleurs - utile pour essayer rapidement différents schémas.

#!/bin/sh
tr -d ' \t' | sed -n '
s/.*background:/\x1b]11;/p
s/.*foreground:/\x1b]10;/p
s/.*color\([0-9][^:]*\):/\x1b]4;\1;/p
' | tr \\n \\a

Redirection Shell peut être utilisé aussi bien: ~/bin/term-recolor < .Xdefaults.solarized.dark.

amonakov
la source
0

La configuration est lue une fois dans la durée de vie d'un processus urxvtd ou d'un urxvt autonome. Il n'est pas possible de recharger la configuration et de faire en sorte que les effets se produisent dans une instance déjà en cours d'exécution du programme. Il existe des exceptions à cette règle, en ce qui concerne certains paramètres de police et de paramètres régionaux.

Vous pouvez faire défiler la page jusqu'à la section appropriée de votre terminal. Voici quelques FAQ pertinentes

Q Pourquoi rxvt-unicode ne lit-il pas mes ressources?

A (raccourci) Oui, utilisez xrdb. Vous devez vous reconnecter après chaque modification (ou exécuter xrdb -merge $ HOME / .Xresources).

Cela implique de recharger le terminal binaire pour moi.

Q Je n'aime pas les couleurs de l'écran. Comment les changer?

R Vous pouvez modifier les couleurs de l'écran au moment de l'exécution à l'aide des ressources ~ / .Xdefaults (ou en tant qu'options longues).

Je pense que cela signifie "lorsque vous démarrez l'application".


Vous pouvez faire apparaître certains textes dans une certaine couleur, mais les couleurs sont définies dans les fichiers x-resources et doivent être relues (en redémarrant) chaque fois qu'elles sont modifiées. Je peux me tromper, mais je ne pense pas que urxvt prend en charge la modification des définitions de couleurs après son démarrage. Il y a peut-être une séquence de contrôle pour cela, je n'en suis pas sûr.

PAR EXEMPLE

$ cat colors-in-bash
#!/bin/bash
for code in {0..255}; do
        if [[ code%8 -eq 0 ]];then echo ;fi
        printf "%5s" `echo -n -e "\e[38;05;${code}m $code: Test"`
done

informations plus pertinentes:

http://pod.tst.eu/http://cvs.schmorp.de/rxvt-unicode/doc/rxvt.7.pod#XTerm_Operating_System_Commands

http://www.xfree86.org/current/xterm.1.html#toc19

http://en.wikipedia.org/wiki/Control_Sequence_Introducer#Sequence_elements

http://invisible-island.net/xterm/ctlseqs/ctlseqs.html

Ярослав Рахматуллин
la source
Droite. Et les exceptions spéciales en ce qui concerne la police et les couleurs affichées man 7 urxvtsont ce qui m'intéresse. Je ne peux tout simplement pas dire comment cela fonctionne.
John Tyree
AFAIK, les séquences d'échappement de couleur sont utilisées pour dire "après vient le rouge" - texte rouge - "après ici le texte normal" - noir sur blanc - et ainsi de suite. Mais les définitions de rouge et blanc et noir sont lues à partir des ressources x disponibles uniquement lorsque le binaire démarre.
Ярослав Рахматуллин
J'ai trouvé cela aussi en regardant le wiki pour Mintty mais SU ne permet pas aux nouvelles personnes de répondre à leurs propres questions dans les 8 heures. J'écris actuellement un plugin perx urxvt pour faire exactement cela.
John Tyree
Il serait intéressant de voir vos résultats.
Ярослав Рахматуллин
J'ai résolu le problème de manière insatisfaisante. Les débuts d'un plugin sympa pour charger dynamiquement des fichiers couleur sont inclus. Aide appréciée.
John Tyree
0

Je sais que cela fait un moment, mais je regardais votre code Perl avec un œil sur la définition des couleurs urxvt par défaut en fonction de l'hôte ssh auquel j'étais connecté.

Ensuite, je suis tombé sur les définitions de séquence d'échappement OSC sur http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control , et j'ai trouvé ce qui suit:

printf '\x1b]10;%s\a\x1b]11;%s\a' yellow blue

Dans ce cas, "jaune" est le premier plan et "bleu" est la couleur d'arrière-plan. Les définitions de couleur peuvent être n'importe quelle chaîne acceptable pour XParseColor, par exemple LemonChiffon ou # FF4455.

Cela remplace définitivement les couleurs par défaut du terminal, de sorte qu'une réinitialisation du terminal utilise de nouvelles couleurs. Il est donc collant par rapport aux séquences d'échappement ANSI normales, ce qui était exactement ce dont j'avais besoin. Fonctionne sur rxvt et urxvt, probablement aussi sur d'autres consoles (OSC est même mentionné dans man console_codes).

Il semble également y avoir des codes pour remplacer les couleurs ANSI individuelles, je n'ai pas essayé ceux-ci, mais s'ils fonctionnent, je pense que c'est la meilleure façon de créer un thème dynamique pour votre console, vous pouvez littéralement simplement "chat sombre" ou "lumière chat".

riches
la source