Por casualidad, encontré el wiki de configuración para mintty
. Tiene muchas sugerencias geniales, una de las cuales es cómo configurar varias opciones utilizando secuencias de escape destinadas a xterm
. Entonces esto funciona al no volver a leer la configuración, sino al interpretar las secuencias de escape para anular las selecciones de color existentes.
Podemos usar esto desde URxvt vinculando una tecla a una larga cadena de comandos, cada uno de los cuales cambia uno de los 16 colores predeterminados.
Por ejemplo, aquí configuré alt+ctrl+l
para cambiar cada color a 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
Perl Plugin
Lo tengo "funcionando" pero no realmente, porque parece que hay una diferencia fundamental entre los recursos definidos como
URxvt.keysym.M-1: command:\033].......
y cualquier intento de hacer lo mismo con $term->cmd_parse()
.
¿Hay algo que se pueda hacer al respecto? Hasta ahora, he codificado conjuntos completos de colores claros y oscuros utilizando secuencias de escape (muy largas):
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
Esto funciona exactamente como esperaba y se puede activar en tiempo de ejecución, así que lo marco como respondido, pero ¿por qué no se puede hacer esto dinámicamente desde Perl? Esto es lo que tengo hasta ahora, no soy un gran programador de Perl, así que disculpen el indudable mal estilo.
Esperemos que alguien pueda comentar cuál es el problema. Este será un buen complemento. Upstream está en 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
allí.Creé una extensión de Perl que recarga la configuración de urxvt al recibir SIGUSR1: https://github.com/regnarg/urxvt-config-reload
Actualmente solo admite la recarga de la configuración de color, pero se pueden agregar fácilmente otras cosas (como las fuentes). Informar errores como problemas de github.
fuente
El siguiente script se puede usar con URxvt (o cualquier otro terminal que admita secuencias de escape XTerm OSC) para cambiar la combinación de colores sobre la marcha. Acepta definiciones de estilo .Xresources como entrada y genera las secuencias de escape. Simplemente ejecutando el script en la terminal y pegando un esquema de colores en él cambiará la paleta de colores, útil para probar rápidamente diferentes esquemas.
Shell redirección se puede utilizar así:
~/bin/term-recolor < .Xdefaults.solarized.dark
.fuente
La configuración se lee una vez en la vida de un proceso urxvtd o un urxvt independiente. No es posible volver a cargar la configuración y hacer que los efectos tengan lugar en una instancia del programa que ya se está ejecutando. Hay excepciones a esta regla, cuando se trata de algunas configuraciones de fuente y configuración regional.
Puede desplazarse hacia abajo a la sección correspondiente en su terminal. Aquí hay un par de preguntas frecuentes relevantes
Eso implica recargar el terminal binario para mí.
Creo que eso significa "cuando inicias la aplicación".
Puede hacer que cierto texto aparezca en un color determinado, pero los colores se definen en los archivos x-resources y deben volver a leerse (reiniciando) cada vez que se cambian. Puede que me equivoque, pero no creo que urxvt admita cambiar las definiciones de color después de que haya comenzado. Quizás haya una secuencia de control para eso, no estoy seguro.
P.EJ
información más relevante:
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
fuente
man 7 urxvt
son lo que me interesa. Simplemente no puedo decir cómo funciona.Sé que ha pasado un tiempo, pero estaba mirando su código perl con miras a configurar los colores de urxvt predeterminados dependiendo del host ssh al que estaba conectado.
Luego me topé con las definiciones de secuencia de escape de OSC en http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control , y se me ocurrió lo siguiente:
Donde en este caso "amarillo" es el primer plano y "azul" es el color de fondo. Las definiciones de color pueden ser cualquier cadena aceptable para XParseColor, por ejemplo, LemonChiffon o # FF4455.
Esto anula permanentemente los colores predeterminados del terminal, de modo que un reinicio del terminal usará nuevos colores. Por lo tanto, es pegajoso con respecto a las secuencias de escape ANSI normales, que es exactamente lo que necesitaba. Funciona en rxvt y urxvt, probablemente también en otras consolas (OSC incluso se menciona en man console_codes).
También parece haber códigos para anular los colores ANSI individuales, no los he probado, pero si funcionan creo que esa es la mejor manera de crear un tema dinámico para su consola, literalmente podría simplemente "cat dark" o "cat light".
fuente