ustawienia urxvt - przeładuj bez ponownego uruchamiania terminala?

17

mam dwa urxvt motywy kolorów, których używam, jeden dla jasnego tła i jeden dla ciemności, w zależności od tego, jak słoneczne jest otoczenie.

Łatwo jest je zmienić, modyfikując ~/.Xresources i działa xrdb ~/.Xresources ponownie, ale to nie dotyczy terminali, które już działają.

Używam tmux, więc mogę odłączyć, zrestartować terminal i ponownie go podłączyć, ale bardzo szybko denerwuje mnie to, gdy jest już 8 z nich, jak chcę w różnych przestrzeniach roboczych.

Wydaje się, że rozwiązaniem jest, aby urxvt przeładował swoje ustawienia w jakiś sposób, ale nie mogę znaleźć żadnych informacji o tym, jak to zrobić lub czy jest to możliwe. Czy ktoś wie jak?

Uwaga: Nie używam żadnego z głównych DE i nie zamierzam instalować wszystkich bibliotek kde lub gnome tylko dla terminala.

Edytować: man 7 urxvt pokazuje trochę czarodziejskich kodów do zrobienia ... cóż ... coś . Nie widzę, jak ma to zastosowanie do zmiany całych zestawów kolorów. Jakieś wskazówki?

John Tyree
źródło

Odpowiedzi:

12

Przypadkiem znalazłem wiki konfiguracyjne dla mintty. To ma dużo wspaniałych sugestii, z których jedną jest sposób ustawiania różnych opcji za pomocą sekwencji ucieczki przeznaczonych dla xterm. Działa to nie odczytywając ponownie konfiguracji, lecz interpretując sekwencje ucieczki, aby zastąpić istniejące wybory kolorów.

Możemy użyć tego z URxvt, wiążąc klucz z długim łańcuchem poleceń, z których każdy zmienia jeden z 16 domyślnych kolorów.

Na przykład tutaj ustawiam alt+ctrl+l zmienić każdy kolor na 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

Wtyczka Perl

Mam to „działające”, ale nie tak naprawdę, ponieważ wydaje się, że istnieje podstawa różnica między zasobami zdefiniowanymi jako

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

i każda próba zrobienia tego samego $term->cmd_parse().

Czy można coś z tym zrobić? Do tej pory zakodowałem na stałe jasne i ciemne zestawy kolorów przy użyciu (bardzo długich) sekwencji ucieczki:

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

Działa to dokładnie tak, jak się spodziewałem, i może być przełączane w czasie wykonywania, więc zaznaczam to jako odpowiedź, ale dlaczego nie można tego zrobić dynamicznie z Perla? Oto co mam do tej pory, nie jestem świetnym koderem Perla, więc proszę wybaczyć niewątpliwie zły styl.

Miejmy nadzieję, że ktoś będzie mógł powiedzieć, na czym polega problem. Będzie to ładna wtyczka. Upstream jest na 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));
    }
    ()
}
John Tyree
źródło
build_cmd nie zwraca ciągu kolorów i cmd_parse () jest wykonywany bez parametrów?
Ярослав Рахматуллин
Literówka. Nie zauważyłem, ponieważ w nieskończonej mądrości Perla wartość zwrotna jest niejawna $s tam.
John Tyree
1
Poinformuj nas, kiedy wtyczka działa.
erik
4

Stworzyłem rozszerzenie Perl, które ładuje konfigurację urxvt po otrzymaniu SIGUSR1: https://github.com/regnarg/urxvt-config-reload

Obecnie obsługuje tylko przeładowywanie konfiguracji kolorów, ale inne rzeczy (takie jak czcionki) można łatwo dodawać. Zgłoś błędy jako problemy z githubem.

regnarg
źródło
Teraz obsługuje także konfigurację czcionek i geometrii! :)
Powerman
Ładny! Ponowne odczytanie całej konfiguracji nie jest tym, czego chcę, ale może odkryłeś pewne rzeczy, których nie mam. Z naszymi mocami połączonymi ...?
John Tyree
3

Poniższy skrypt może być używany z URxvt (lub dowolnym innym terminalem obsługującym sekwencje specjalne XTerm OSC), aby zmienić schemat kolorów w locie. Akceptuje definicje stylu .Xresources jako dane wejściowe i wysyła sekwencje specjalne. Proste uruchomienie skryptu w terminalu i wklejenie do niego kolorów spowoduje zmianę palety kolorów - przydatne do szybkiego wypróbowania różnych schematów.

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

Można również użyć przekierowania powłoki: ~/bin/term-recolor < .Xdefaults.solarized.dark.

amonakov
źródło
0

Konfiguracja jest odczytywana raz w czasie życia procesu urxvtd lub samodzielnego urxvt. Nie jest możliwe ponowne załadowanie konfiguracji i efekty będą miały miejsce w już uruchomionej instancji programu. Istnieją wyjątki od tej reguły, jeśli chodzi o niektóre ustawienia czcionek i ustawień regionalnych.

Możesz przewinąć do odpowiedniej sekcji w swoim terminalu. Oto kilka istotnych pytań

P Dlaczego rxvt-unicode nie odczytuje moich zasobów?

A (skrócona) Robi, używaj xrdb. Musisz ponownie zalogować się po każdej zmianie (lub uruchomić xrdb -merge $ HOME / .Xresources).

Oznacza to ponowne załadowanie binarnego terminala do mnie.

P Nie podoba mi się kolor ekranu. Jak je zmienić?

A Możesz zmienić kolory ekranu w czasie wykonywania, używając zasobów ~ / .Xdefaults (lub jako opcji długich).

Myślę, że oznacza to „po uruchomieniu aplikacji”.


Możesz sprawić, że określony tekst pojawi się w określonym kolorze, ale kolory są zdefiniowane w plikach x-resources i muszą być ponownie odczytane (przez ponowne uruchomienie) za każdym razem, gdy są zmieniane. Mogę się mylić, ale nie sądzę, aby urxvt wspierał zmianę definicji kolorów po jego uruchomieniu. Być może jest to sekwencja kontrolna, nie jestem pewien.

E. G.

$ 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

bardziej odpowiednie informacje:

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

Ярослав Рахматуллин
źródło
Dobrze. I specjalne wyjątki dotyczące czcionki i kolorów pokazanych w man 7 urxvt to, co mnie interesuje. Po prostu nie mogę powiedzieć, jak to działa.
John Tyree
AFAIK, kolorowe sekwencje ucieczki są używane do mówienia „po tym przychodzi czerwony„ - czerwony tekst - ”po tym jak normalny tekst” - czarny na białym - i tak dalej. Ale definicje czerwonego i białego i czarnego są odczytywane z dostępnych zasobów x tylko wtedy, gdy zaczyna się binarny.
Ярослав Рахматуллин
Znalazłem to równie dobrze, patrząc na wiki na miętę, ale SU nie pozwala nowym ludziom odpowiedzieć na ich pytania w ciągu 8 godzin. Aktualnie piszę wtyczkę urxvt perl, aby to zrobić.
John Tyree
Byłoby interesujące zobaczyć twoje wyniki.
Ярослав Рахматуллин
Rozwiązałem problem w niezadowalający sposób. Dołączone są początki ładnej wtyczki do dynamicznego ładowania plików kolorów. Pomoc mile widziana.
John Tyree
0

Wiem, że minęło trochę czasu, ale patrzyłem na twój kod perla z myślą o ustawieniu domyślnych kolorów urxvt w zależności od tego, z którym hostem ssh byłem połączony.

Potem natknąłem się na definicje sekwencji ucieczki OSC w http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control i wymyślił następujące:

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

Gdzie w tym przypadku „żółty” to pierwszy plan, a „niebieski” to kolor tła. Definicje kolorów mogą być dowolnymi łańcuchami akceptowanymi przez XParseColor, np. LemonChiffon lub # FF4455.

To na stałe zastępuje domyślne kolory terminala, tak że reset terminala będzie używał nowych kolorów. Jest więc lepki w stosunku do normalnych sekwencji ucieczki ANSI, co jest dokładnie tym, czego potrzebowałem. Działa na rxvt i urxvt, prawdopodobnie również na innych konsolach (OSC jest nawet wspomniany w man console_codes).

Wydaje się również, że istnieją kody do nadpisywania poszczególnych kolorów ANSI, nie próbowałem tych, ale jeśli działają, to myślę, że jest to najlepszy sposób na dynamiczne motywowanie konsoli, możesz dosłownie „kot ciemny” lub „kotek”.

rich
źródło
To brzmi naprawdę interesująco dzięki!
John Tyree