การตั้งค่า urxvt - โหลดซ้ำโดยไม่ต้องรีสตาร์ทเครื่อง?


19

ฉันมีurxvtธีมสีสองแบบที่ฉันใช้หนึ่งสำหรับพื้นหลังแสงและอีกหนึ่งสำหรับมืดขึ้นอยู่กับสภาพแวดล้อมที่มีแดด

มันง่ายพอที่จะเปลี่ยนได้โดยการแก้ไข~/.Xresourcesและทำงานxrdb ~/.Xresourcesอีกครั้ง แต่สิ่งนี้จะไม่ส่งผลกระทบต่อเทอร์มินัลที่กำลังทำงานอยู่

ฉันใช้ tmux ดังนั้นฉันจึงสามารถถอดรีสตาร์ทเทอร์มินัลและติดตั้งใหม่ได้ แต่สิ่งนี้น่ารำคาญมากอย่างรวดเร็วเมื่อมี 8 คนที่จัดวางแล้วว่าฉันต้องการพื้นที่ทำงานที่หลากหลายอย่างไร

ดูเหมือนว่าวิธีแก้ปัญหานั้นมีไว้สำหรับ urxvt ที่จะโหลดการตั้งค่าใหม่อีกครั้ง แต่ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับวิธีการทำเช่นนี้หรือหากเป็นไปได้ ไม่มีใครรู้ได้อย่างไร

หมายเหตุ: ฉันไม่ได้เรียกใช้ DE ที่สำคัญและฉันไม่ได้ติดตั้ง kde หรือ gnome libs ทั้งหมดสำหรับเทอร์มินัล

แก้ไข: man 7 urxvtบางรายการ wizardly มองรหัสที่จะทำ ... ดี ... บางสิ่งบางอย่าง ฉันไม่เห็นวิธีที่นำไปใช้กับการเปลี่ยนชุดสีทั้งหมด เคล็ดลับใด ๆ

คำตอบ:


12

minttyโดยโอกาสฉันเกิดขึ้นเพื่อหาสิ่งที่วิกิพีเดียการตั้งค่าสำหรับ แต่ก็มีจำนวนมากของข้อเสนอแนะที่ดีซึ่งเป็นหนึ่งในวิธีการที่จะตั้งค่าตัวเลือกต่าง ๆ xtermโดยใช้ลำดับหนีหมายสำหรับ ดังนั้นสิ่งนี้จะทำงานโดยไม่อ่านการกำหนดค่าอีกครั้ง แต่แทนการตีความลำดับ escape เพื่อแทนที่การเลือกสีที่มีอยู่

เราสามารถใช้สิ่งนี้จาก 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()และพยายามที่จะทำเช่นเดียวกันกับ

มีอะไรที่สามารถทำได้เกี่ยวกับเรื่องนี้หรือไม่? จนถึงตอนนี้ฉันได้ hardcoded ทั้งชุดแสงและสีเข้มโดยใช้ลำดับ escape (ยาวมาก):

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 ได้? นี่คือสิ่งที่ฉันมีจนถึงตอนนี้ฉันไม่ได้เป็น coder 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));
    }
    ()
}

build_cmd ไม่ส่งคืนสตริงสีและ cmd_parse () ถูกเรียกใช้โดยไม่มีพารามิเตอร์ใช่หรือไม่
ЯрославРахматуллин

สะกดผิด ฉันไม่ได้สังเกตเพราะในภูมิปัญญาที่ไม่มีที่สิ้นสุดของ Perl ค่าส่งคืนจะอยู่ที่$sนั่นโดยปริยาย
John Tyree

1
โปรดบอกเราว่าปลั๊กอินของคุณทำงานเมื่อใด
erik

4

ฉันสร้างส่วนขยาย Perl ที่โหลดการกำหนดค่า urxvt ใหม่เมื่อรับ SIGUSR1: https://github.com/regnarg/urxvt-config-reload

ขณะนี้รองรับการกำหนดค่าสีใหม่เท่านั้น แต่สามารถเพิ่มสิ่งอื่น ๆ (เช่นแบบอักษร) ได้อย่างง่ายดาย รายงานข้อบกพร่องเป็นปัญหา GitHub


ตอนนี้รองรับการกำหนดค่าแบบอักษรและเรขาคณิตด้วย! :)
Powerman

ดี! การอ่านการกำหนดค่าทั้งหมดอีกครั้งนั้นไม่ใช่สิ่งที่ฉันต้องการ แต่บางทีคุณอาจจะได้รู้บางสิ่งที่ฉันไม่ได้ทำ ด้วยพลังของเรารวมกัน ... ?
John Tyree

3

สคริปต์ต่อไปนี้สามารถใช้กับ URxvt (หรือเทอร์มินัลอื่นที่สนับสนุนลำดับการหลบหนี XTerm OSC) เพื่อเปลี่ยนชุดรูปแบบสีได้ทันที ยอมรับคำจำกัดความ. Xresources-style เป็นอินพุตและเอาต์พุตเอาต์พุต escape sequences เพียงแค่เรียกใช้สคริปต์ในเทอร์มินัลและวางสีลงในนั้นจะเปลี่ยนจานสี - มีประโยชน์สำหรับการลองใช้ชุดรูปแบบที่แตกต่างกันได้อย่างรวดเร็ว

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

การเปลี่ยนเส้นทางของเชลล์สามารถใช้ได้เช่นกัน: ~/bin/term-recolor < .Xdefaults.solarized.dark.


0

การกำหนดค่าจะถูกอ่านหนึ่งครั้งในช่วงอายุของกระบวนการ urxvtd หรือ urxvt แบบสแตนด์อโลน ไม่สามารถโหลดการกำหนดค่าใหม่และให้เอฟเฟกต์เกิดขึ้นในอินสแตนซ์ที่กำลังทำงานของโปรแกรม มีข้อยกเว้นกฎนี้เมื่อมันมาถึงการตั้งค่าแบบอักษรและสถานที่บางส่วน

คุณสามารถเลื่อนลงไปยังส่วนที่เหมาะสมในเครื่องของคุณ นี่คือคำถามที่พบบ่อยที่เกี่ยวข้องสองสามข้อ

ถามเหตุใด rxvt-unicode จึงไม่อ่านทรัพยากรของฉัน

A (ย่อ) มันใช้ xrdb คุณต้องเข้าสู่ระบบอีกครั้งหลังจากการเปลี่ยนแปลงทุกครั้ง (หรือเรียกใช้ xrdb -merge $ HOME / .Xresources)

นั่นหมายถึงการโหลดไบนารีเทอร์มินัลใหม่สำหรับฉัน

Q ฉันไม่ชอบสีของหน้าจอ ฉันจะเปลี่ยนพวกเขาได้อย่างไร

ตอบคุณสามารถเปลี่ยนสีของหน้าจอในขณะใช้งานโดยใช้ทรัพยากร ~ / .Xdefaults (หรือเป็นตัวเลือกแบบยาว)

ฉันคิดว่านั่นหมายถึง "เมื่อคุณเริ่มต้นแอปพลิเคชัน"


คุณสามารถทำให้ข้อความบางข้อความปรากฏเป็นสีที่แน่นอน แต่สีนั้นถูกกำหนดไว้ในไฟล์ x-resources และต้องอ่านใหม่ (โดยการรีสตาร์ท) ทุกครั้งที่มีการเปลี่ยนแปลง ฉันอาจจะผิด แต่ฉันไม่คิดว่า urxvt รองรับการเปลี่ยนคำจำกัดความของสีหลังจากเริ่มต้น อาจมีลำดับการควบคุมสำหรับสิ่งนั้นฉันไม่แน่ใจ

เช่น

$ 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

ข้อมูลที่เกี่ยวข้องเพิ่มเติม:

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

http://www.xfree86.org/current/xterm.1.html#toc19

http://en.wikipedia.org/wiki/Control_Sequence_Introducer#Sequence_elements

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


ขวา. และข้อยกเว้นพิเศษเกี่ยวกับแบบอักษรและสีที่แสดงman 7 urxvtเป็นสิ่งที่ฉันสนใจฉันไม่สามารถบอกได้ว่ามันทำงานอย่างไร
John Tyree

AFAIK ลำดับการหลีกสีจะใช้เพื่อพูดว่า "หลังจากที่นี่มาเป็นสีแดง" - ข้อความสีแดง - "หลังจากข้อความปกติที่นี่" - ดำบนพื้นขาว - และต่อไป แต่คำจำกัดความของสีแดงและสีขาวและสีดำอ่านได้จากทรัพยากร x ที่มีอยู่เฉพาะเมื่อไบนารีเริ่ม
ЯрославРахматуллин

ฉันพบสิ่งนี้เช่นเดียวกับการมองหาวิกิเพื่อเงิน แต่ SU ไม่ให้ผู้คนใหม่ตอบคำถามของตัวเองภายใน 8 ชั่วโมง ฉันกำลังเขียนปลั๊กอิน urxvt perl เพื่อทำสิ่งนี้
John Tyree

มันจะน่าสนใจที่จะเห็นผลลัพธ์ของคุณ
ЯрославРахматуллин

ฉันแก้ไขปัญหาด้วยวิธีที่ไม่น่าพอใจ จุดเริ่มต้นของปลั๊กอินที่ดีในการโหลดไฟล์สีแบบไดนามิกรวมอยู่ ช่วยชื่นชม
John Tyree

0

ฉันรู้ว่ามันได้รับในขณะที่ แต่ฉันดูรหัส perl ของคุณด้วยตาต่อการตั้งค่าสี urxvt เริ่มต้นขึ้นอยู่กับโฮสต์ ssh ที่ฉันเชื่อมต่อ

จากนั้นฉันก็สะดุดกับคำจำกัดความของ OSC escape ที่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 escape sequences ปกติซึ่งเป็นสิ่งที่ฉันต้องการ ทำงานบน rxvt และ urxvt ซึ่งอาจเป็นคอนโซลอื่นเช่นกัน (OSC ถูกกล่าวถึงใน man console_codes)

ดูเหมือนว่าจะมีรหัสสำหรับแทนที่สี ANSI แต่ละอันฉันไม่ได้ลองมัน แต่ถ้าพวกมันใช้ได้ฉันคิดว่านั่นเป็นวิธีที่ดีที่สุดในการกำหนดธีมคอนโซลของคุณแบบไดนามิกคุณสามารถทำได้แค่ "แมวดำ" หรือ "แมวแสง"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.