urxvt налаштування - перезавантажити без перезавантаження терміналу?


19

У мене є дві urxvtкольорові теми, які я використовую, одна для світлого фону та одна для темних, залежно від того, наскільки сонячне середовище.

Досить просто переключити їх, змінивши ~/.Xresourcesта запустивши xrdb ~/.Xresourcesзнову, але це не впливає на термінали, які вже запущені.

Я використовую tmux, щоб я міг від'єднатись, перезапустити термінал і повторно вкласти, але це дуже дратує дуже швидко, коли вже 8 з них розміщено, як я хочу на різних робочих просторах.

Здається, рішення полягає в тому, щоб urxvt якось перезавантажив свої налаштування, але я не можу знайти будь-якої інформації про те, як це зробити, або якщо це навіть можливо. Хтось знає як?

Примітка: я не запускаю жодного з основних DE, і я не збираюся встановлювати всі lide kde або gnome лише для терміналу.

Редагувати: man 7 urxvtпоказує якісь майстерно шукаючі коди, щоб зробити ... ну ... щось . Я не бачу, як це стосується зміни цілих наборів кольорів. Якісь поради?

Відповіді:


12

Випадково я знайшов wiki для config mintty. У ньому є багато чудових пропозицій, одна з яких - як встановити різні параметри, використовуючи послідовності втечі, призначені для xterm. Отже, це працює не повторним зчитуванням конфігурації, а замість того, що інтерпретується послідовність евакуації, щоб замінити існуючий вибір кольорів.

Ми можемо використовувати це з URxvt, прив’язавши ключ до довгого ланцюга команд, кожна з яких змінює один з 16 кольорів за замовчуванням.

Наприклад, тут я налаштував alt+ctrl+lзмінити кожен колір на 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

У мене це "працює", але не дуже, тому що, здається, існує принципова різниця між ресурсами, визначеними як

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

і будь-яка спроба зробити те саме $term->cmd_parse().

Чи є щось, що можна зробити з цього приводу? Поки що я мав усі цілі кольори світлого та темного кольорів із жорстким кодом, використовуючи (дуже довгі) послідовності втечі:

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

Це працює саме так, як я сподівався, що це може бути і може бути змінено під час виконання, тому я відзначаю це як відповідь, але чому це не можна зробити Perl динамічно? Ось що я маю досі, я не чудовий кодер Perl, тому, будь ласка, вибачте, безсумнівно, поганий стиль.

Сподіваємось, хтось може прислухатися до того, в чому проблема. Це буде гарний плагін. Вгору за течією знаходиться в 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 не повертає рядок кольорів, а cmd_parse () виконується без параметрів?
Ярослав Рахматуллін

Друкарська помилка. Я не помічав, оскільки в нескінченній мудрості Перла повернене значення явно $sє.
Джон Тайрі

1
Скажіть, будь ласка, коли ваш плагін працює.
erik

4

Я створив розширення Perl, яке завантажує конфігурацію urxvt після отримання SIGUSR1: https://github.com/regnarg/urxvt-config-reload

В даний час він підтримує лише перезавантаження конфігурації кольорів, але інші речі (наприклад, шрифти) можна легко додавати. Повідомте про помилки як про проблеми з github.


Тепер він підтримує конфігурацію шрифту та геометрії! :)
Powerman

Приємно! Читання всього конфігурації - це насправді не те, що я хочу, але, можливо, ви з'ясували деякі речі, яких у мене немає. З нашими повноваженнями в поєднанні ...?
Джон Тайрі

3

Наступний скрипт можна використовувати з URxvt (або будь-яким іншим терміналом, що підтримує послідовності виходу XTerm OSC) для зміни кольорової гами на льоту. Він приймає визначення в стилі .resres в якості вхідних даних і виводить послідовності виходу. Просто запуск сценарію в терміналі та вставлення кольорової схеми в нього змінить палітру кольорів - корисно для швидкого випробування різних схем.

#!/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 можна також використовувати: ~/bin/term-recolor < .Xdefaults.solarized.dark.


0

Конфігурація зчитується один раз протягом життя процесу urxvtd або окремого urxvt. Неможливо перезавантажити конфігурацію та мати наслідки у вже запущеному екземплярі програми. Існують винятки з цього правила, коли мова йде про деякі параметри шрифту та мови.

Ви можете прокрутити вниз до відповідного розділу свого терміналу. Ось пара релевантних поширених запитань

Q Чому rxvt-unicode не читає мої ресурси?

A (скорочено) Це, використовуйте xrdb. Вам потрібно повторно увійти після кожної зміни (або запустити xrdb -merge $ HOME / .Xresources).

Це означає, що для мене перезавантажується кінцевий бінарний.

Я не люблю кольори екрану. Як їх змінити?

A Ви можете змінювати кольори екрану під час виконання, використовуючи ~ / .Xdefaults ресурси (або як довгі параметри).

Я думаю, що це означає "коли ви запускаєте програму".


Ви можете зробити так, щоб певний текст відображався у певному кольорі, але кольори визначаються у файлах x-ресурсів і їх потрібно перечитувати (перезавантаживши) щоразу, коли вони змінюються. Можливо, я помиляюся, але я не думаю, що urxvt підтримує зміни кольорових визначень після його запуску. Можливо, для цього є контрольна послідовність, я не впевнений.

EG

$ 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

більш відповідна інформація:

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


Правильно. І особливі винятки щодо шрифту та кольорів, показаних у, - man 7 urxvtце те, що мене цікавить. Я просто не можу сказати, як це працює.
Джон Тайрі

AFAIK, послідовності кольорових кольорів використовуються для того, щоб говорити "після того, як з'являється червоний" - червоний текст - "після тут нормальний текст" - чорний на білому - і так далі. Але визначення червоного та білого та чорного кольорів читаються з доступних ресурсів x лише тоді, коли починається двійкове.
Ярослав Рахматуллін

Я виявив це, як добре дивлячись на wiki для м'ятного, але SU не дозволяє новим людям відповідати на власні запитання протягом 8 годин. Я зараз пишу плагін urxvt perl, щоб зробити це саме.
Джон Тайрі

Цікаво було б побачити ваші результати.
Ярослав Рахматуллін

Я вирішив проблему незадовільно. Включено початок приємного плагіна для динамічного завантаження кольорових файлів. Допомога оцінена.
Джон Тайрі

0

Я знаю, що минуло деякий час, але я дивився на ваш код Perl з огляду на встановлення кольорів urxvt за замовчуванням залежно від того, до якого ssh хоста я був підключений.

Тоді я натрапив на визначення послідовностей втечі OSC на http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control і придумав таке:

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

У цьому випадку "жовтий" - перший план, а "синій" - колір тла. Визначення кольору може бути будь-яким рядком, прийнятним для XParseColor, наприклад LemonChiffon або # FF4455.

Це назавжди переосмислює кольори за замовчуванням терміналу, таким чином, що для скидання терміналу будуть використані нові кольори. Тому воно липке відносно нормальних послідовностей втечі ANSI, саме це мені і було потрібно. Працює на rxvt та urxvt, ймовірно, і на інших консолях (OSC навіть згадується в man console_codes).

Також, здається, є коди, які переосмислюють окремі кольори ANSI, я їх не пробував, але якщо вони працюють, я вважаю, що це найкращий спосіб динамічно тематизувати консоль, ви можете буквально просто «котяче темно» або «котяче світло».

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.