cài đặt urxvt - tải lại mà không cần khởi động lại thiết bị đầu cuối?


19

Tôi có hai urxvtchủ đề màu mà tôi sử dụng, một cho nền sáng và một cho tối, tùy thuộc vào môi trường nắng như thế nào.

Thật dễ dàng để chuyển đổi chúng bằng cách sửa đổi ~/.Xresourcesvà chạy xrdb ~/.Xresourceslại, nhưng điều này không ảnh hưởng đến các thiết bị đầu cuối đang chạy.

Tôi sử dụng tmux để tôi có thể tách ra, khởi động lại thiết bị đầu cuối và reattach, nhưng điều này sẽ rất khó chịu khi có 8 trong số chúng được bố trí theo cách tôi muốn trên nhiều không gian làm việc khác nhau.

Dường như, giải pháp là để urxvt tải lại các cài đặt của nó bằng cách nào đó nhưng tôi không thể tìm thấy bất kỳ thông tin nào về cách thực hiện việc này hoặc nếu nó thậm chí có thể. Có ai biết làm thế nào không?

Lưu ý: Tôi không chạy bất kỳ DE chính nào và tôi sẽ không cài đặt tất cả các lib kde hoặc gnome chỉ cho một thiết bị đầu cuối.

Chỉnh sửa: man 7 urxvthiển thị một số mã tìm kiếm phù hợp để làm ... tốt ... một cái gì đó . Tôi không thấy nó áp dụng như thế nào để thay đổi toàn bộ bộ màu. Bất cứ lời khuyên?

Câu trả lời:


12

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));
    }
    ()
}

build_cmd không trả về chuỗi màu và cmd_parse () được thực thi mà không có tham số?
Ярослав Рахматуллин

Typo. Tôi đã không chú ý bởi vì trong trí tuệ vô hạn của perl, giá trị trả lại hoàn toàn $sở đó.
John Tyree

1
Vui lòng cho chúng tôi biết khi plugin của bạn hoạt động.
erik

4

Tôi đã tạo tiện ích mở rộng Perl tải lại cấu hình urxvt khi nhận SIGUSR1: https://github.com/regnarg/urxvt-config-reload

Hiện tại nó chỉ hỗ trợ tải lại cấu hình màu nhưng những thứ khác (như phông chữ) có thể được thêm dễ dàng. Báo cáo lỗi như các vấn đề github.


Bây giờ nó cũng hỗ trợ cấu hình phông chữ và hình học! :)
Powerman

Đẹp! Đọc lại toàn bộ cấu hình không thực sự là điều tôi muốn nhưng có lẽ bạn đã tìm ra một số điều mà tôi chưa có. Với sức mạnh của chúng ta kết hợp ...?
John Tyree

3

Kịch bản sau đây có thể được sử dụng với URxvt (hoặc bất kỳ thiết bị đầu cuối nào khác hỗ trợ các chuỗi thoát của XTerm OSC) để thay đổi bảng màu khi đang di chuyển. Nó chấp nhận các định nghĩa kiểu .Xresource làm đầu vào và xuất các chuỗi thoát. Chỉ cần chạy tập lệnh trong thiết bị đầu cuối và dán một bảng màu vào nó sẽ thay đổi bảng màu - hữu ích để nhanh chóng thử các sơ đồ khác nhau.

#!/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

Chuyển hướng Shell cũng có thể được sử dụng : ~/bin/term-recolor < .Xdefaults.solarized.dark.


0

Cấu hình được đọc một lần trong suốt quá trình urxvtd hoặc urxvt độc lập. Không thể tải lại cấu hình và các hiệu ứng diễn ra trong một phiên bản đã chạy của chương trình. Có các ngoại lệ cho quy tắc này, khi nói đến một số cài đặt phông chữ và ngôn ngữ.

Bạn có thể cuộn xuống phần thích hợp trong thiết bị đầu cuối của bạn. Dưới đây là một vài câu hỏi thường gặp có liên quan

H Tại sao rxvt-unicode không đọc tài nguyên của tôi?

A (rút ngắn) Nó, sử dụng xrdb. Bạn phải đăng nhập lại sau mỗi thay đổi (hoặc chạy xrdb -merge $ HOME / .Xresource).

Điều đó ngụ ý tải lại nhị phân đầu cuối cho tôi.

QI không thích màu màn hình. Làm thế nào để tôi thay đổi chúng?

A Bạn có thể thay đổi màu màn hình trong thời gian chạy bằng cách sử dụng tài nguyên ~ / .Xdefaults (hoặc dưới dạng tùy chọn dài).

Tôi nghĩ điều đó có nghĩa là "khi bạn bắt đầu ứng dụng".


Bạn có thể làm cho văn bản nhất định xuất hiện trong một màu nhất định, nhưng màu được xác định trong tệp tài nguyên x và phải được đọc lại (bằng cách khởi động lại) mỗi khi chúng được thay đổi. Tôi có thể sai, nhưng tôi không nghĩ urxvt hỗ trợ thay đổi định nghĩa màu sau khi bắt đầu. Có lẽ có một chuỗi kiểm soát cho điều đó, tôi không chắc chắn.

VÍ DỤ

$ 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

thông tin liên quan hơn:

http://pod.tst.eu/http://cvs.schmorp.de/rxvt-unicode/doc/rxvt.7.pod#XTerm_Operating_System_Commands

http://www.xfree86.org/c Hiện / xterm.1.html # toc19

http://en.wikipedia.org/wiki/Control_Sequence_Int sinher # Sequence_elements

http://invisible-island.net/xterm/ctlseqs/ctlseqs.html


Đúng. Và các trường hợp ngoại lệ đặc biệt liên quan đến phông chữ và màu sắc được hiển thị man 7 urxvtlà những gì tôi quan tâm. Tôi chỉ không thể nói nó hoạt động như thế nào.
John Tyree

AFAIK, các chuỗi thoát màu được sử dụng để nói "sau đây xuất hiện màu đỏ" - văn bản được hiển thị-- "sau đây là văn bản bình thường" - màu đen trên nền trắng - vân vân. Nhưng các định nghĩa về đỏ và trắng và đen chỉ được đọc từ các tài nguyên x có sẵn khi nhị phân bắt đầu.
Ярос mặc dù chúng tôi làm việc vào

Tôi thấy điều này cũng như tìm kiếm wiki cho mintty nhưng SU không cho phép những người mới trả lời câu hỏi của chính họ trong vòng 8 giờ. Tôi hiện đang viết một plugin perx urxvt để làm việc này.
John Tyree

Sẽ rất thú vị khi xem kết quả của bạn.
Ярослав Рахматуллин

Tôi đã giải quyết vấn đề một cách không thỏa mãn. Sự khởi đầu của một plugin đẹp để tải động các tệp màu được bao gồm. Giúp đánh giá cao.
John Tyree

0

Tôi biết đã được một lúc, nhưng tôi đã nhìn vào mã perl của bạn bằng một mắt hướng tới việc thiết lập màu urxvt mặc định tùy thuộc vào máy chủ ssh mà tôi đã kết nối.

Sau đó, tôi tình cờ tìm thấy các định nghĩa trình tự thoát OSC tại http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control và đưa ra các cách sau:

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

Trong trường hợp này, "màu vàng" là màu nền trước và "màu xanh" là màu nền. Các định nghĩa màu có thể là bất kỳ chuỗi nào được XPzzyColor chấp nhận, ví dụ LemonChiền hoặc # FF4455.

Điều này sẽ ghi đè vĩnh viễn các màu mặc định của thiết bị đầu cuối, như vậy thiết lập lại thiết bị đầu cuối sẽ sử dụng màu mới. Do đó, nó liên quan đến các chuỗi thoát ANSI bình thường, đó chính xác là những gì tôi cần. Hoạt động trên rxvt và urxvt, có thể là các bảng điều khiển khác nữa (OSC thậm chí còn được đề cập trong man console_codes).

Ngoài ra còn có các mã để ghi đè các màu ANSI riêng lẻ, tôi đã không thử các màu đó nhưng nếu chúng hoạt động tôi sẽ nghĩ đó là cách tốt nhất để tự động tạo chủ đề cho bảng điều khiển của bạn, bạn có thể chỉ là "bóng tối mèo" hoặc "ánh sáng mèo".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.