urxvt设置-重新加载而不重新启动终端?


19

我有两个urxvt颜色主题,一个用于浅色背景,一个用于深色背景,这取决于环境的晴天。

通过修改~/.Xresourcesxrdb ~/.Xresources再次运行来切换它们很容易,但这不会影响已经在运行的终端。

我使用tmux,以便我可以分离,重新启动终端并重新连接,但是当其中有8个已经在各种工作空间上布局时,这会非常烦人。

看来,解决方案是让urxvt以某种方式重新加载其设置,但我找不到有关如何执行此操作的信息,甚至找不到任何信息。有人知道吗?

注意:我没有运行任何主要的DE,也不会为终端安装所有的kde或gnome库。

编辑:man 7 urxvt显示一些看起来井井有条的代码来做...好... 某事。我看不到它如何适用于更改整个颜色集。有小费吗?

Answers:


12

偶然地,我偶然发现了的配置Wiki 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()在没有参数的情况下执行?
ЯрославРахматуллин

错别字。我没有注意到,因为在perl的无穷智慧中,返回值隐含$s存在。
约翰·泰瑞

1
请告诉我们您的插件何时可用。
erik

4

我创建了一个Perl扩展,可在收到SIGUSR1后重新加载urxvt配置:https : //github.com/regnarg/urxvt-config-reload

当前,它仅支持重新加载颜色配置,但可以轻松添加其他内容(如字体)。将错误报告为github问题。


现在它也支持字体和几何图形配置!:)
Powerman

真好!再次阅读整个配置并不是我真正想要的,但是也许您已经发现了一些我不需要的东西。结合我们的力量...?
约翰·泰瑞

3

以下脚本可与URxvt(或支持XTerm OSC转义序列的任何其他终端)一起使用,以即时更改颜色方案。它接受.Xresources样式的定义作为输入,并输出转义序列。只需在终端中运行脚本并将颜色方案粘贴到其中即可更改调色板,这对于快速尝试不同的方案很有用。

#!/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的生命周期中,仅读取一次配置。无法重新加载配置并使效果在已经运行的程序实例中发生。对于某些字体和区域设置,此规则也有例外。

您可以向下滚动到终端中的相应部分。以下是一些相关的常见问题解答

问:为什么rxvt-unicode无法读取我的资源?

A(缩短)可以,请使用xrdb。每次更改后,您都必须重新登录(或运行xrdb -merge $ HOME / .Xresources)。

这意味着将终端二进制文件重新加载给我。

QI不喜欢屏幕颜色。如何更改它们?

A您可以在运行时使用〜/ .Xdefaults资源(或作为长选项)更改屏幕颜色。

我认为这意味着“当您启动应用程序时”。


您可以使某些文本以某种颜色显示,但是这些颜色在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


对。man 7 urxvt我感兴趣的是关于字体和颜色的特殊例外。我只是不知道它是如何工作的。
约翰·泰瑞

AFAIK,颜色转义序列用于表示“此后为红色” –红色文本–“此后为正常文本” –白底黑字,依此类推。但是仅当二进制文件启动时,才会从可用的x资源中读取红色,白色和黑色的定义。
ЯрославРахматуллин

我在Wiki上查看薄荷味时也发现了这一点,但SU不允许新用户在8小时内回答自己的问题。我目前正在编写urxvt perl插件来完成此操作。
约翰·泰瑞

看到您的结果会很有趣。
ЯрославРахматуллин

我以不满意的方式解决了这个问题。包括一个用于动态加载颜色文件的漂亮插件的开头。帮助表示赞赏。
约翰·泰瑞

0

我知道已经有一段时间了,但是我一直在查看您的perl代码,以根据我所连接的ssh主机设置默认的urxvt颜色。

然后,我在http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control中偶然发现了OSC转义序列定义,并提出了以下内容:

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

在这种情况下,“黄色”是前景,“蓝色”是背景色。颜色定义可以是XParseColor可接受的任何字符串,例如LemonChiffon或#FF4455。

这将永久覆盖终端的默认颜色,以便终端重置将使用新的颜色。因此,对于正常的ANSI转义序列而言,这是很棘手的,这正是我所需要的。可以在rxvt和urxvt上运行,可能还可以在其他控制台上运行(在man console_codes中甚至提到了OSC)。

似乎也有一些代码可以覆盖各个ANSI颜色,但我还没有尝试过,但是如果它们起作用,我认为这是动态设置控制台主题的最佳方法,您可以直接选择“暗猫”或“浅猫”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.