configuración de urxvt: ¿recargar sin reiniciar el terminal?


19

Tengo dos urxvttemas de color que uso, uno para fondo claro y otro para oscuro, dependiendo de qué tan soleado sea el ambiente.

Es bastante fácil cambiarlos modificando ~/.Xresourcesy ejecutando xrdb ~/.Xresourcesnuevamente, pero esto no afecta a los terminales que ya se están ejecutando.

Uso tmux para poder desconectar, reiniciar el terminal y volver a conectarlo, pero esto se vuelve muy molesto muy rápidamente cuando hay 8 de ellos ya establecidos como quiero en varios espacios de trabajo.

Parece que la solución es que urxvt vuelva a cargar su configuración de alguna manera, pero no puedo encontrar ninguna información sobre cómo hacerlo o si es posible. ¿Alguien sabe cómo?

Nota: No ejecuto ninguno de los principales DE y no estoy dispuesto a instalar todas las librerías kde o gnome solo para un terminal.

Editar: man 7 urxvtmuestra algunos códigos de aspecto mágico para hacer ... bueno ... algo . No veo cómo se aplica al cambio de conjuntos de colores completos. ¿Algun consejo?

Respuestas:


12

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+lpara 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));
    }
    ()
}

build_cmd no devuelve la cadena de colores y cmd_parse () se ejecuta sin parámetros?
Ярослав Рахматуллин

Error de tipografía. No me di cuenta porque en la sabiduría infinita de Perl, el valor de retorno está implícitamente $sallí.
John Tyree

1
Díganos cuándo funciona su complemento.
erik

4

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.


¡Ahora también admite la configuración de fuente y geometría! :)
Powerman

¡Agradable! Leer toda la configuración de nuevo no es realmente lo que quiero, pero tal vez hayas descubierto algunas cosas que no tengo. Con nuestros poderes combinados ...?
John Tyree

3

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.

#!/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

Shell redirección se puede utilizar así: ~/bin/term-recolor < .Xdefaults.solarized.dark.


0

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

P ¿Por qué rxvt-unicode no lee mis recursos?

A (acortado) Sí, usa xrdb. Debe volver a iniciar sesión después de cada cambio (o ejecutar xrdb -merge $ HOME / .Xresources).

Eso implica recargar el terminal binario para mí.

P No me gustan los colores de la pantalla. ¿Cómo los cambio?

A Puede cambiar los colores de la pantalla en tiempo de ejecución utilizando los recursos predeterminados ~ / .X (o como opciones largas).

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

$ 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

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


Correcto. Y las excepciones especiales con respecto a la fuente y los colores que se muestran man 7 urxvtson lo que me interesa. Simplemente no puedo decir cómo funciona.
John Tyree

AFAIK, las secuencias de escape de color se usan para decir "después de que aquí viene el rojo" - texto rojo-- "después de aquí el texto normal" - negro sobre blanco - y así sucesivamente. Pero las definiciones de rojo, blanco y negro se leen de los recursos x disponibles solo cuando comienza el binario.
Ярослав Рахматуллин

También encontré esto mirando el wiki de mintty, pero SU no permite que nuevas personas respondan sus propias preguntas en 8 horas. Actualmente estoy escribiendo un complemento urxvt perl para hacer justamente esto.
John Tyree

Sería interesante ver sus resultados.
Ярослав Рахматуллин

Resolví el problema de una manera insatisfactoria. Se incluye el comienzo de un buen complemento para cargar dinámicamente archivos de color. Ayuda apreciada.
John Tyree

0

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:

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.