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));
}
()
}
$s
tam.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.
źródło
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.
Można również użyć przekierowania powłoki:
~/bin/term-recolor < .Xdefaults.solarized.dark
.źródło
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ń
Oznacza to ponowne załadowanie binarnego terminala do mnie.
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.
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
man 7 urxvt
to, co mnie interesuje. Po prostu nie mogę powiedzieć, jak to działa.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:
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”.
źródło