impostazioni urxvt - ricaricare senza riavviare il terminale?


19

Ho due urxvttemi di colore che uso, uno per lo sfondo chiaro e uno per il buio, a seconda di quanto sia soleggiato l'ambiente.

È abbastanza facile cambiarli modificando ~/.Xresourcese eseguendo di xrdb ~/.Xresourcesnuovo, ma ciò non influisce sui terminali che sono già in esecuzione.

Uso tmux in modo da poter staccare, riavviare il terminale e ricollegarlo, ma questo diventa molto fastidioso molto rapidamente quando ce ne sono 8 già disposti come voglio su vari spazi di lavoro.

La soluzione, a quanto pare, è che urxvt ricarichi le sue impostazioni in qualche modo, ma non riesco a trovare alcuna informazione su come farlo o se è persino possibile. Qualcuno sa come?

Nota: non eseguo nessuno dei principali DE e non sto per installare tutte le librerie kde o gnome solo per un terminale.

Modifica: man 7 urxvtmostra alcuni codici dall'aspetto magico per fare ... beh ... qualcosa . Non vedo come si applica al cambio di interi set di colori. Qualche consiglio?

Risposte:


12

Per caso, mi è capitato di trovare il wiki di configurazione per mintty. Ha molti ottimi suggerimenti, uno dei quali è come impostare varie opzioni usando sequenze di escape pensate per xterm. Quindi funziona non leggendo più la configurazione ma interpretando invece le sequenze di escape per sovrascrivere le selezioni di colore esistenti.

Possiamo usarlo da URxvt associando una chiave a una lunga catena di comandi, ognuno dei quali cambia uno dei 16 colori predefiniti.

Ad esempio, qui ho impostato alt+ctrl+lper cambiare ogni colore in 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

L'ho "funzionante" ma non proprio, perché sembra che ci sia una differenza fondamentale tra le risorse definite come

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

e qualsiasi tentativo di fare lo stesso con $term->cmd_parse().

C'è qualcosa che si può fare al riguardo? Finora ho hardcoded interi set di colori chiari e scuri usando sequenze di escape (molto lunghe):

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

Funziona esattamente come avevo sperato e potesse essere attivato in fase di esecuzione, quindi lo contrassegno come risposta, ma perché non è possibile farlo dinamicamente da Perl? Ecco quello che ho finora, non sono un grande programmatore Perl, quindi per favore scusa lo stile indubbiamente cattivo.

Spero che qualcuno possa parlare del problema. Questo sarà un bel plugin. L'upstream è su 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 non restituisce la stringa di colori e cmd_parse () viene eseguito senza parametri?
Ярослав Рахматуллин

Errore di battitura. Non ho notato perché nella saggezza infinita di perl, il valore di ritorno è implicitamente $slì.
John Tyree,

1
Comunicaci quando funziona il tuo plug-in.
Erik,

4

Ho creato un'estensione Perl che ricarica la configurazione di urxvt dopo aver ricevuto SIGUSR1: https://github.com/regnarg/urxvt-config-reload

Attualmente supporta solo il ricaricamento della configurazione del colore, ma è possibile aggiungere facilmente altre cose (come i caratteri). Segnala bug come problemi di github.


Ora supporta anche la configurazione di font e geometrie! :)
Powerman

Bello! Leggere di nuovo l'intera configurazione non è proprio quello che voglio, ma forse hai capito alcune cose che non ho. Con i nostri poteri combinati ...?
John Tyree,

3

Il seguente script può essere utilizzato con URxvt (o qualsiasi altro terminale che supporta le sequenze di escape XTerm OSC) per cambiare la combinazione di colori al volo. Accetta le definizioni in stile .Xresources come input e genera le sequenze di escape. Semplicemente eseguendo lo script nel terminale e incollando uno schema di colori in esso cambierà la tavolozza dei colori, utile per provare rapidamente schemi diversi.

#!/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 redirezione può essere utilizzato come bene: ~/bin/term-recolor < .Xdefaults.solarized.dark.


0

La configurazione viene letta una volta nella vita di un processo urxvtd o di un urxvt autonomo. Non è possibile ricaricare la configurazione e far sì che gli effetti abbiano luogo in un'istanza già in esecuzione del programma. Ci sono eccezioni a questa regola, quando si tratta di alcune impostazioni di font e impostazioni internazionali.

Puoi scorrere fino alla sezione appropriata nel tuo terminale. Ecco un paio di domande frequenti pertinenti

D Perché rxvt-unicode non legge le mie risorse?

A (abbreviato) Lo fa, usa xrdb. Devi ripetere il login dopo ogni modifica (o eseguire xrdb -merge $ HOME / .Xresources).

Ciò implica ricaricare il terminale binario per me.

D Non mi piacciono i colori dello schermo. Come li cambio?

A È possibile modificare i colori dello schermo in fase di esecuzione utilizzando le risorse ~ / .Xdefaults (o come opzioni lunghe).

Penso che significhi "quando si avvia l'applicazione".


È possibile far apparire un determinato testo in un determinato colore, ma i colori sono definiti nei file delle risorse x e devono essere riletti (riavviando) ogni volta che vengono modificati. Potrei sbagliarmi, ma non credo che urxvt supporti la modifica delle definizioni dei colori dopo l'avvio. Forse esiste una sequenza di controllo per questo, non ne sono sicuro.

PER ESEMPIO

$ 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

informazioni più rilevanti:

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


Giusto. E le eccezioni speciali per quanto riguarda il carattere e i colori mostrati man 7 urxvtsono ciò che mi interessa. Non riesco proprio a capire come funziona.
John Tyree,

AFAIK, le sequenze di escape del colore sono usate per dire "dopo che arriva rosso" - testo rosso - "dopo qui testo normale" - nero su bianco-- e così via. Ma le definizioni di rosso, bianco e nero vengono lette dalle risorse x disponibili solo all'avvio del file binario.
Ярослав Рахматуллин,

Ho trovato questo anche guardando il wiki alla menta, ma SU non consente a nuove persone di rispondere alle proprie domande entro 8 ore. Attualmente sto scrivendo un plug-in urxvt perl per fare proprio questo.
John Tyree,

Sarebbe interessante vedere i tuoi risultati.
Ярослав Рахматуллин,

Ho risolto il problema in modo insoddisfacente. Sono inclusi gli inizi di un bel plugin per caricare dinamicamente i file di colore. Aiuto apprezzato.
John Tyree,

0

So che è passato un po 'di tempo, ma stavo guardando il tuo codice perl con un occhio verso l'impostazione dei colori predefiniti di urxvt a seconda dell'host ssh a cui ero collegato.

Quindi mi sono imbattuto nelle definizioni della sequenza di escape dell'OSC su http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control e ho trovato quanto segue:

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

Dove in questo caso "giallo" è il primo piano e "blu" è il colore di sfondo. Le definizioni di colore possono essere qualsiasi stringa accettabile per XParseColor, ad esempio LemonChiffon o # FF4455.

Ciò sostituisce in modo permanente i colori predefiniti del terminale, in modo tale che un ripristino del terminale utilizzi nuovi colori. È quindi appiccicoso rispetto alle normali sequenze di escape ANSI, che è esattamente ciò di cui avevo bisogno. Funziona su rxvt e urxvt, probabilmente anche su altre console (OSC è anche menzionato in man console_codes).

Sembrano esserci anche dei codici per sovrascrivere i singoli colori ANSI, non li ho provati, ma se funzionassero penso che sia il modo migliore per abbellire dinamicamente la tua console, potresti letteralmente semplicemente "cat dark" o "cat light".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.