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