17

У меня есть две цветовые темы urxvt которые я использую, одна для светлого фона и одна для темного, в зависимости от того, насколько солнечная среда.

Достаточно просто переключить их, изменив ~/.Xresources и запустить снова xrdb ~/.Xresources, но это не повлияет на уже работающие терминалы.

Я использую tmux, поэтому могу отсоединять, перезагружать терминал и подключать его, но это очень быстро раздражает, когда 8 из них уже выложены так, как я хочу в различных рабочих пространствах.

Похоже, решение состоит в том, чтобы urxvt каким-то образом перезагрузил свои настройки, но я не могу найти никакой информации о том, как это сделать или, если это вообще возможно. Кто-нибудь знает как?

Примечание: я не запускаю ни одну из основных DE и не собираюсь устанавливать все библиотеки KDE или GNOME только для терминала.

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

5 ответов5

12

Случайно мне довелось найти конфиг вики для mintty. В нем много замечательных предложений, один из которых - как установить различные опции, используя escape-последовательности, предназначенные для xterm . Так что это работает, не читая конфигурацию снова, а вместо этого интерпретируя escape-последовательности, чтобы переопределить существующие цветовые выборы.

Мы можем использовать это из 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 Plugin

У меня это "работает", но не совсем, потому что кажется, что есть фундаментальная разница между ресурсами, определенными как

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

и любая попытка сделать то же самое с $term->cmd_parse() .

Есть ли что-нибудь, что можно с этим сделать? До сих пор я жестко закодировал все наборы светлых и темных цветов, используя (очень длинные) escape-последовательности:

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));
    }
    ()
}
4

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

В настоящее время он поддерживает только перезагрузку цветовой конфигурации, но другие вещи (например, шрифты) могут быть легко добавлены. Сообщайте об ошибках как о проблемах github.

3

Следующий скрипт может использоваться с URxvt (или любым другим терминалом, поддерживающим escape-последовательности XTerm OSC) для изменения цветовой схемы на лету. Он принимает.Определения в стиле Xresources в качестве входных данных и вывод escape-последовательностей. Просто запустив скрипт в терминале и вставив в него цветовую схему, вы измените цветовую палитру - это полезно для быстрого опробования различных схем.

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

Также можно использовать перенаправление оболочки: ~/bin/term-recolor < .Xdefaults.solarized.dark .

0

Я знаю, что это было давно, но я смотрел на ваш Perl-код, ориентируясь на установку цветов urxvt по умолчанию в зависимости от того, к какому SSH-хосту я был подключен.

Затем я наткнулся на определения escape-последовательности 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.

Это навсегда отменяет цвета терминала по умолчанию, так что при сбросе терминала будут использоваться новые цвета. Таким образом, он не соответствует нормальным escape-последовательностям ANSI, а это именно то, что мне было нужно. Работает на rxvt и urxvt, возможно, на других консолях (OSC упоминается даже в man console_codes).

Также, похоже, есть коды для переопределения отдельных цветов ANSI, я не пробовал их, но если бы они работали, я думаю, что это лучший способ динамически создавать темы для вашей консоли, вы могли бы буквально просто "cat dark" или "cat light".

0

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

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

В Почему rxvt-unicode не читает мои ресурсы?

A (сокращенно). Использует xrdb. Вы должны повторно входить в систему после каждого изменения (или запустить xrdb -merge $ HOME/.Xresources).

Это подразумевает перезагрузку двоичного файла терминала для меня.

Q Мне не нравятся цвета экрана. Как я могу изменить их?

О Вы можете изменить цвета экрана во время выполнения, используя ~/.Ресурсы Xdefaults (или как long-options).

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


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

НАПРИМЕР

$ 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .