urxvt Einstellungen - neu laden ohne Terminal neu zu starten?

19

Ich verwende zwei urxvtFarbthemen, eines für hellen und eines für dunklen Hintergrund, je nachdem, wie sonnig die Umgebung ist.

Es ist einfach genug, sie durch Ändern ~/.Xresourcesund erneutes Ausführen zu wechseln xrdb ~/.Xresources, dies wirkt sich jedoch nicht auf Terminals aus, die bereits ausgeführt werden.

Ich benutze tmux, um das Terminal abzutrennen, neu zu starten und erneut anzuschließen, aber das wird sehr schnell ärgerlich, wenn 8 davon bereits so angelegt sind, wie ich es auf verschiedenen Arbeitsplätzen haben möchte.

Die Lösung scheint zu sein, dass urxvt seine Einstellungen irgendwie neu lädt, aber ich kann keine Informationen darüber finden, wie das geht oder ob es überhaupt möglich ist. Weiß jemand wie?

Hinweis: Ich verwende keine der wichtigsten DEs und werde nicht alle kde- oder gnome-Bibliotheken nur für ein Terminal installieren.

Bearbeiten: man 7 urxvtZeigt einige zauberhaft aussehende Codes an, die zu erledigen sind ... na ja ... etwas . Ich verstehe nicht, wie sich das auf das Ändern ganzer Farbsätze auswirkt. Irgendwelche Tipps?

John Tyree
quelle

Antworten:

12

Zufällig habe ich das Konfigurations-Wiki für gefunden mintty. Es enthält viele großartige Vorschläge, unter anderem, wie Sie verschiedene Optionen mithilfe von Escape-Sequenzen festlegen, für die es bestimmt ist xterm. Dies funktioniert also, indem Sie die Konfiguration nicht erneut lesen, sondern Escape-Sequenzen interpretieren, um die vorhandene Farbauswahl zu überschreiben.

Wir können dies von URxvt aus verwenden, indem wir einen Schlüssel an eine lange Befehlskette binden, die jeweils eine der 16 Standardfarben ändert.

Zum Beispiel alt+ctrl+ländere ich hier jede Farbe auf 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

Ich habe es "funktioniert" aber nicht wirklich, denn es scheint, dass es einen grundlegenden Unterschied zwischen Ressourcen gibt, die als definiert werden

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

und jeder Versuch, dasselbe mit $term->cmd_parse().

Gibt es etwas, das dagegen unternommen werden kann? Bisher habe ich ganze helle und dunkle Farbsets mit (sehr langen) Escape-Sequenzen fest codiert:

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

Dies funktioniert genau so, wie ich es mir erhofft hatte und kann zur Laufzeit umgeschaltet werden. Ich markiere dies als beantwortet, aber warum kann dies nicht dynamisch von Perl aus durchgeführt werden? Hier ist, was ich bis jetzt habe, ich bin kein großartiger Perl-Programmierer, also entschuldigen Sie bitte den zweifellos schlechten Stil.

Hoffentlich kann sich jemand auf das Problem einlassen. Dies wird ein schönes Plugin sein. Upstream ist bei 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
quelle
build_cmd gibt den colours string nicht zurück und cmd_parse () wird ohne Parameter ausgeführt?
Ярослав Рахматуллин
Tippfehler. Ich habe es nicht bemerkt, weil in Perls unendlicher Weisheit der Rückgabewert implizit $sda ist.
John Tyree
1
Bitte teilen Sie uns mit, wann Ihr Plugin funktioniert.
Erik
4

Ich habe eine Perl-Erweiterung erstellt, die beim Empfang von SIGUSR1 die urxvt-Konfiguration neu lädt: https://github.com/regnarg/urxvt-config-reload

Derzeit wird nur das Neuladen der Farbkonfiguration unterstützt, aber andere Dinge (z. B. Schriftarten) können problemlos hinzugefügt werden. Fehler als Github-Probleme melden.

regnarg
quelle
Es unterstützt jetzt auch die Schriftart- und Geometriekonfiguration! :)
Powerman
Nett! Das Lesen der gesamten Konfiguration ist nicht wirklich das, was ich will, aber vielleicht haben Sie einige Dinge herausgefunden, die ich nicht habe. Mit unseren Kräften kombiniert ...?
John Tyree
3

Das folgende Skript kann mit URxvt (oder einem anderen Terminal, das XTerm OSC-Escape-Sequenzen unterstützt) verwendet werden, um das Farbschema im laufenden Betrieb zu ändern. Es akzeptiert .Xresources-Definitionen als Eingabe und gibt die Escape-Sequenzen aus. Durch einfaches Ausführen des Skripts im Terminal und Einfügen eines Farbschemas wird die Farbpalette geändert. Dies ist hilfreich, um verschiedene Schemata schnell auszuprobieren.

#!/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 - Umleitung kann auch verwendet werden: ~/bin/term-recolor < .Xdefaults.solarized.dark.

amonakov
quelle
0

Die Konfiguration wird einmal in der Lebensdauer eines urxvtd-Prozesses oder eines eigenständigen urxvt gelesen. Es ist nicht möglich, die Konfiguration neu zu laden und die Effekte in einer bereits laufenden Instanz des Programms auszuführen. Es gibt Ausnahmen zu dieser Regel, wenn es um einige Schriftart- und Gebietsschemaeinstellungen geht.

Sie können zum entsprechenden Abschnitt in Ihrem Terminal scrollen. Hier finden Sie einige relevante FAQs

F Warum liest rxvt-unicode meine Ressourcen nicht?

A (verkürzt) Verwenden Sie xrdb. Sie müssen sich nach jeder Änderung erneut anmelden (oder xrdb -merge $ HOME / .Xresources ausführen).

Das bedeutet, dass ich die Terminal-Binärdatei neu lade.

QIch mag die Bildschirmfarben nicht. Wie ändere ich sie?

A Sie können die Bildschirmfarben zur Laufzeit mit den Ressourcen ~ / .Xdefaults (oder als long-Optionen) ändern.

Ich denke, das bedeutet "wenn Sie die Anwendung starten".


Sie können festlegen, dass bestimmter Text in einer bestimmten Farbe angezeigt wird, die Farben werden jedoch in den x-resources-Dateien definiert und müssen bei jeder Änderung neu gelesen (durch Neustart) werden. Ich kann mich irren, aber ich glaube nicht, dass urxvt das Ändern von Farbdefinitionen nach dem Start unterstützt. Vielleicht gibt es dafür eine Kontrollsequenz, da bin ich mir nicht sicher.

Z.B

$ 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

weitere relevante Infos:

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

Ярослав Рахматуллин
quelle
Richtig. Und die besonderen Ausnahmen in Bezug auf Schriftart und Farben, die in gezeigt man 7 urxvtwerden, interessieren mich. Ich kann nur nicht sagen, wie es funktioniert.
John Tyree
AFAIK, die Farb-Escape-Sequenzen werden verwendet, um zu sagen: "Nach hier kommt Rot" - roter Text - "Nach hier normaler Text" - Schwarz auf Weiß - und so weiter. Die Definitionen für Rot, Weiß und Schwarz werden jedoch erst beim Starten der Binärdatei aus den verfügbaren x-Ressourcen gelesen.
Ярослав Рахматуллин
Ich fand das auch, als ich das Wiki für Mintty betrachtete, aber SU lässt nicht zu, dass neue Leute ihre eigenen Fragen innerhalb von 8 Stunden beantworten. Ich schreibe gerade ein urxvt-Perl-Plugin, um genau dies zu tun.
John Tyree
Es wäre interessant, Ihre Ergebnisse zu sehen.
Ярослав Рахматуллин
Ich habe das Problem unbefriedigend gelöst. Die Anfänge eines netten Plugins zum dynamischen Laden von Farbdateien sind enthalten. Hilfe geschätzt.
John Tyree
0

Ich weiß, dass es eine Weile her ist, aber ich habe Ihren Perl-Code untersucht, um die Standard-URL-Farben festzulegen, je nachdem, mit welchem ​​SSH-Host ich verbunden war.

Dann bin ich auf die OSC-Escape-Sequenzdefinitionen unter http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control gestoßen und habe Folgendes gefunden:

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

Wobei in diesem Fall "gelb" der Vordergrund und "blau" die Hintergrundfarbe ist. Die Farbdefinitionen können beliebige Zeichenfolgen sein, die für XParseColor akzeptabel sind, z. B. LemonChiffon oder # FF4455.

Dadurch werden die Standardfarben des Terminals dauerhaft überschrieben, sodass beim Zurücksetzen des Terminals neue Farben verwendet werden. Es ist daher in Bezug auf normale ANSI-Escape-Sequenzen klebrig, was genau das ist, was ich brauchte. Funktioniert mit rxvt und urxvt, wahrscheinlich auch mit anderen Konsolen (OSC wird sogar in man console_codes erwähnt).

Es scheint auch Codes zu geben, mit denen einzelne ANSI-Farben außer Kraft gesetzt werden können. Diese habe ich nicht ausprobiert. Wenn sie jedoch funktionieren, ist dies meiner Meinung nach die beste Möglichkeit, Ihre Konsole dynamisch zu gestalten.

Reich
quelle