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+l
pour 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));
}
()
}
$s
là.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.
la source
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.
Redirection Shell peut être utilisé aussi bien:
~/bin/term-recolor < .Xdefaults.solarized.dark
.la source
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
Cela implique de recharger le terminal binaire pour moi.
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
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
man 7 urxvt
sont ce qui m'intéresse. Je ne peux tout simplement pas dire comment cela fonctionne.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:
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".
la source