Perl 插件

Perl 插件

我使用两种urxvt颜色主题,一种用于浅色背景,一种用于深色背景,这取决于环境的阳光程度。

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

我使用 tmux,这样我就可以分离、重新启动终端,然后重新连接,但是当其中 8 个已经按照我想要的方式在不同的工作空间上布局时,这很快就会变得非常烦人。

解决方案似乎是让 urxvt 以某种方式重新加载其设置,但我找不到有关如何执行此操作或是否可行的任何信息。有人知道怎么做吗?

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

编辑:man 7 urxvt显示一些看起来像向导的代码来做......好吧......某物。我不明白它如何适用于更改整个颜色集。有什么建议吗?

答案1

偶然间,我偶然发现了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));
    }
    ()
}

答案2

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

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

答案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

答案4

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

然后我偶然发现了 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 颜色,我还没有尝试过,但如果它们有效,我认为这是动态主题化控制台的最佳方式,你实际上可以只使用“猫暗”或“猫亮”。

相关内容