Joh*_*ree 21 terminal urxvt command-line colors
我使用了两种urxvt颜色主题,一种用于浅色背景,一种用于深色,具体取决于环境的阳光程度。
通过修改~/.Xresources和xrdb ~/.Xresources再次运行来切换它们很容易,但这不会影响已经运行的终端。
我使用 tmux,因此我可以分离、重新启动终端并重新连接,但是当其中有 8 个已经按照我想要的方式布置在各种工作空间中时,这很快就会变得非常烦人。
解决方案似乎是让 urxvt 以某种方式重新加载其设置,但我找不到有关如何执行此操作或是否可能的任何信息。有谁知道怎么做?
注意:我没有运行任何主要的 DE 并且我不打算为终端安装所有的 kde 或 gnome 库。
编辑:man 7 urxvt显示一些看起来很神奇的代码来做......好吧......一些东西。我看不出它如何适用于更改整个颜色集。有小费吗?
Joh*_*ree 12
一个偶然的机会,我偶然发现了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
Run Code Online (Sandbox Code Playgroud)
我让它“工作”但不是真的,因为资源之间似乎存在根本区别,定义为
URxvt.keysym.M-1: command:\033].......
Run Code Online (Sandbox Code Playgroud)
以及任何对$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
Run Code Online (Sandbox Code Playgroud)
这完全符合我的希望,并且可以在运行时切换,所以我将其标记为已回答,但为什么不能从 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));
}
()
}
Run Code Online (Sandbox Code Playgroud)
小智 5
以下脚本可与 URxvt(或任何其他支持 XTerm OSC 转义序列的终端)一起使用来动态更改颜色方案。它接受 .Xresources 样式定义作为输入,并输出转义序列。只需在终端中运行脚本并将颜色方案粘贴到其中即可更改调色板 \xe2\x80\x94,这对于快速尝试不同的方案很有用。
\n\n#!/bin/sh\ntr -d ' \\t' | sed -n '\ns/.*background:/\\x1b]11;/p\ns/.*foreground:/\\x1b]10;/p\ns/.*color\\([0-9][^:]*\\):/\\x1b]4;\\1;/p\n' | tr \\\\n \\\\a\nRun Code Online (Sandbox Code Playgroud)\n\n也可以使用 shell 重定向:~/bin/term-recolor < .Xdefaults.solarized.dark.
小智 5
我创建了一个 Perl 扩展,它在收到 SIGUSR1 时重新加载 urxvt 配置:https : //github.com/regnarg/urxvt-config-reload
目前它仅支持重新加载颜色配置,但可以轻松添加其他内容(如字体)。将错误报告为 github 问题。
| 归档时间: |
|
| 查看次数: |
32448 次 |
| 最近记录: |