Tình cờ, tôi tình cờ tìm thấy wiki cấu hình cho mintty
. Nó có rất nhiều gợi ý tuyệt vời, một trong số đó là làm thế nào để thiết lập các tùy chọn khác nhau bằng cách sử dụng các chuỗi thoát có ý nghĩa xterm
. Vì vậy, điều này hoạt động bằng cách không đọc lại cấu hình mà thay vào đó bằng cách diễn giải các chuỗi thoát để ghi đè các lựa chọn màu hiện có.
Chúng ta có thể sử dụng điều này từ URxvt bằng cách liên kết một khóa với một chuỗi lệnh dài, mỗi lệnh thay đổi một trong 16 màu mặc định.
Ví dụ, ở đây tôi đặt alt+ctrl+l
để thay đổi mọi màu thành 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
Plugin Perl
Tôi có nó "hoạt động" nhưng không thực sự, vì dường như có một sự khác biệt cơ bản giữa các tài nguyên được định nghĩa là
URxvt.keysym.M-1: command:\033].......
và bất kỳ nỗ lực để làm tương tự với $term->cmd_parse()
.
Có bất cứ điều gì có thể được thực hiện về điều này? Cho đến nay tôi đã mã hóa toàn bộ các bộ màu sáng và tối bằng cách sử dụng các chuỗi thoát (rất dài):
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
Điều này hoạt động chính xác như tôi đã hy vọng và có thể được bật trong thời gian chạy vì vậy tôi đánh dấu điều này là đã trả lời, nhưng tại sao điều này không thể được thực hiện một cách linh hoạt từ Perl? Đây là những gì tôi có cho đến nay, tôi không phải là một lập trình viên Perl tuyệt vời, vì vậy xin miễn cho phong cách không thể nghi ngờ.
Hy vọng ai đó có thể kêu gọi vấn đề là gì. Đây sẽ là một plugin tốt đẹp. Thượng nguồn là tại 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));
}
()
}