configurações urxvt - recarregar sem reiniciar o terminal?


19

Eu tenho dois urxvttemas de cores que eu uso, um para fundo claro e outro para escuro, dependendo da luminosidade do ambiente.

É fácil alterá-los modificando ~/.Xresourcese executando xrdb ~/.Xresourcesnovamente, mas isso não afeta os terminais que já estão em execução.

Eu uso o tmux para que eu possa desconectar, reiniciar o terminal e reconectar, mas isso fica muito irritante muito rapidamente quando há 8 deles já dispostos como eu quero em vários espaços de trabalho.

A solução, ao que parece, é para o urxvt recarregar suas configurações de alguma forma, mas não consigo encontrar nenhuma informação sobre como fazer isso ou se é possível. Alguém sabe como?

Nota: Eu não corro nenhum dos principais DEs e não estou prestes a instalar todas as bibliotecas do kde ou do gnome apenas para um terminal.

Edit: man 7 urxvtmostra alguns códigos mágicos para fazer ... bem ... alguma coisa . Não vejo como isso se aplica à alteração de conjuntos de cores inteiros. Alguma dica?

Respostas:


12

Por acaso, encontrei o wiki de configuração mintty. Tem muitas ótimas sugestões, uma das quais é como definir várias opções usando as seqüências de escape pretendidas xterm. Portanto, isso funciona não lendo a configuração novamente, mas interpretando as seqüências de escape para substituir as seleções de cores existentes.

Podemos usar isso do URxvt vinculando uma chave a uma longa cadeia de comandos, cada um dos quais altera uma das 16 cores padrão.

Por exemplo, aqui defino alt+ctrl+lpara alterar todas as cores para 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

Eu tenho "trabalhando", mas não realmente, porque parece que há uma diferença fundamental entre os recursos definidos como

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

e qualquer tentativa de fazer o mesmo $term->cmd_parse().

Há algo que possa ser feito em relação a isto? Até agora, eu codifiquei todos os conjuntos de cores claras e escuras usando sequências de escape (muito longas):

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

Isso funciona exatamente como eu esperava que fosse e pode ser alternado no tempo de execução, então estou marcando isso como respondido, mas por que isso não pode ser feito dinamicamente no Perl? Aqui está o que eu tenho até agora, eu não sou um ótimo programador de Perl, então desculpe o estilo indubitavelmente ruim.

Espero que alguém possa comentar sobre qual é o problema. Este será um bom plugin. O upstream está no 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 não retorna a sequência de cores e cmd_parse () é executado sem parâmetros?
Ярослав Рахматуллин

Erro de digitação. Não percebi porque, na infinita sabedoria de perl, o valor de retorno está implicitamente $spresente.
precisa

1
Por favor, diga-nos quando o seu plugin funciona.
Erik

4

Criei uma extensão Perl que recarrega a configuração do urxvt ao receber o SIGUSR1: https://github.com/regnarg/urxvt-config-reload

Atualmente, ele suporta apenas o recarregamento da configuração de cores, mas outras coisas (como fontes) podem ser adicionadas facilmente. Relatar bugs como problemas no github.


Agora também suporta configurações de fonte e geometria! :)
Powerman 25/03

Agradável! Ler toda a configuração novamente não é realmente o que eu quero, mas talvez você tenha descoberto algumas coisas que eu não tenho. Com nossos poderes combinados ...?
John Tyree

3

O script a seguir pode ser usado com o URxvt (ou qualquer outro terminal que suporte sequências de escape do XTerm OSC) para alterar o esquema de cores em tempo real. Ele aceita definições no estilo .Xresources como entrada e gera as seqüências de escape. Basta executar o script no terminal e colar um esquema de cores para alterar a paleta de cores - útil para testar rapidamente esquemas diferentes.

#!/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 redirecionamento pode ser usado como bem: ~/bin/term-recolor < .Xdefaults.solarized.dark.


0

A configuração é lida uma vez na vida útil de um processo urxvtd ou de um urxvt independente. Não é possível recarregar a configuração e os efeitos ocorrem em uma instância do programa em execução. Há exceções a essa regra, quando se trata de algumas configurações de fonte e localidade.

Você pode rolar para a seção apropriada no seu terminal. Aqui estão algumas perguntas frequentes relevantes

P Por que o rxvt-unicode não lê meus recursos?

A (abreviado) Sim, use xrdb. Você deve fazer login novamente após cada alteração (ou executar xrdb -merge $ HOME / .Xresources).

Isso implica recarregar o terminal binário para mim.

P Não gosto das cores da tela. Como eu os troco?

A Você pode alterar as cores da tela em tempo de execução usando os recursos ~ / .Xdefaults (ou como opções longas).

Eu acho que isso significa "quando você inicia o aplicativo".


Você pode fazer com que determinado texto apareça em uma determinada cor, mas as cores são definidas nos arquivos x-resources e precisam ser lidas (reiniciando) sempre que forem alteradas. Posso estar errado, mas não acho que o urxvt suporte a alteração das definições de cores após o início. Talvez exista uma sequência de controle para isso, não tenho certeza.

POR EXEMPLO

$ 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

informações mais relevantes:

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


Certo. E as exceções especiais em relação à fonte e às cores mostradas man 7 urxvtsão as que me interessam. Simplesmente não sei dizer como isso funciona.
John Tyree 13/03

AFAIK, as seqüências de escape de cores são usadas para dizer "depois que aqui chegar vermelho" - texto vermelho - "depois daqui texto normal" - preto em branco - e assim por diante. Mas as definições de vermelho, branco e preto são lidas a partir dos recursos x disponíveis somente quando o binário é iniciado.
Ярослав Рахматуллин

Achei isso bem olhando para o wiki do mintty, mas o SU não permite que novas pessoas respondam suas próprias perguntas dentro de 8 horas. Atualmente, estou escrevendo um plugin urxvt perl para fazer exatamente isso.
precisa

Seria interessante ver seus resultados.
Ярослав Рахматуллин

Eu resolvi o problema de uma maneira insatisfatória. O início de um bom plugin para carregar dinamicamente arquivos de cores está incluído. Ajuda apreciada.
precisa

0

Eu sei que já faz um tempo, mas eu estava olhando o seu código perl com o objetivo de definir as cores urxvt padrão, dependendo de qual host ssh eu estava conectado.

Em seguida, deparei com as definições de sequência de escape do OSC em http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control e criei o seguinte:

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

Onde, neste caso, "amarelo" é o primeiro plano e "azul" é a cor do plano de fundo. As definições de cores podem ser qualquer sequência aceitável para XParseColor, por exemplo, LemonChiffon ou # FF4455.

Isso substitui permanentemente as cores padrão do terminal, de forma que uma redefinição do terminal use novas cores. Portanto, é pegajoso em relação às seqüências de escape ANSI normais, que é exatamente o que eu precisava. Funciona em rxvt e urxvt, provavelmente em outros consoles (o OSC é mencionado ainda no man console_codes).

Também parece haver códigos para substituir cores ANSI individuais, mas eu não tentei, mas se elas funcionarem eu acho que é a melhor maneira de dinamizar seu console dinamicamente, você pode literalmente apenas "gato escuro" ou "luz gato".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.