urxvt 설정-터미널을 다시 시작하지 않고 다시로드?


19

urxvt환경이 얼마나 맑은 지에 따라 밝은 배경과 어두운 배경에 대해 두 가지 색상 테마를 사용합니다.

수정 ~/.Xresources하고 xrdb ~/.Xresources다시 실행 하여 전환하기는 쉽지만 이미 실행중인 터미널에는 영향을 미치지 않습니다.

나는 tmux를 사용하여 분리하고 터미널을 다시 시작하고 다시 연결할 수 있지만 8 가지가 이미 다양한 작업 공간에서 원하는 방식으로 배치되어 있으면 매우 빠르게 짜증납니다.

해결책은 urxvt가 어떻게 든 설정을 다시로드하는 것 같지만이 작업을 수행하는 방법이나 가능한 경우에 대한 정보를 찾을 수 없습니다. 아무도 방법을 알고 있습니까?

참고 : 나는 주요 DE를 실행하지 않으며 터미널 용으로 kde 또는 gnome 라이브러리를 모두 설치하려고하지 않습니다.

편집 : man 7 urxvt마법사처럼 보이는 코드를 보여줍니다 ... 음 ... 무언가 . 전체 색상 세트를 변경하는 데 어떻게 적용되는지 알 수 없습니다. 팁이 있습니까?

답변:


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

펄 플러그인

나는 "작동 중"이지만 실제로는 아닙니다. 왜냐하면 자원 사이에 근본적인 차이가있는 것처럼 보입니다.

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

build_cmd가 색상 문자열을 반환하지 않고 cmd_parse ()가 매개 변수없이 실행됩니까?
Ярослав Рахматуллин 2

오식. 나는 펄의 무한한 지혜 속에서 반환 가치가 암묵적으로 $s존재 하기 때문에 눈치 채지 못했습니다 .
John Tyree

1
플러그인이 작동하는시기를 알려주십시오.
erik

4

SIGUSR1을 수신 할 때 urxvt 구성을 다시로드하는 Perl 확장을 작성했습니다. https://github.com/regnarg/urxvt-config-reload

현재는 색상 구성 다시로드 만 지원하지만 다른 글꼴 (예 : 글꼴)을 쉽게 추가 할 수 있습니다. 버그를 github 문제로보고하십시오.


이제 글꼴 및 지오메트리 구성도 지원합니다! :)
Powerman

좋은! 전체 설정을 다시 읽는 것은 실제로 내가 원하는 것이 아니지만 아마도 내가하지 않은 것을 알아 냈습니다. 우리의 힘이 합쳐져서 ...?
John Tyree

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

셸 리디렉션도 사용할 수 있습니다 ~/bin/term-recolor < .Xdefaults.solarized.dark.


0

urxvtd 프로세스 또는 독립형 urxvt 수명 동안 한 번 구성을 읽습니다. 구성을 다시로드 할 수 없으며 이미 실행중인 프로그램 인스턴스에서 효과가 발생합니다. 일부 글꼴 및 로캘 설정과 관련하여이 규칙에는 예외가 있습니다.

터미널에서 해당 섹션으로 스크롤 할 수 있습니다. 다음은 몇 가지 관련 FAQ입니다

Q rxvt-unicode가 내 리소스를 읽지 못하는 이유는 무엇입니까?

A (단축 됨) xrdb를 사용합니다. 모든 변경 후에 다시 로그인해야합니다 (또는 xrdb -merge $ HOME / .Xresources를 실행하십시오).

그것은 터미널 바이너리를 나에게 다시로드한다는 것을 의미합니다.

Q 화면 색상이 마음에 들지 않습니다. 어떻게 바꾸나요?

A ~ / .Xdefaults 리소스 (또는 긴 옵션)를 사용하여 런타임에 화면 색상을 변경할 수 있습니다.

"응용 프로그램을 시작할 때"를 의미한다고 생각합니다.


특정 텍스트를 특정 색상으로 표시 할 수 있지만 색상은 x-resources 파일에 정의되어 있으며 변경 될 때마다 다시 시작 (다시 시작)해야합니다. 틀릴 수도 있지만 urxvt가 시작한 후에 색상 정의 변경을 지원하지 않는다고 생각합니다. 아마도 그에 대한 제어 순서가 있을지 모르겠습니다.

EG

$ 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 리소스에서 빨강 및 흰색 및 검정의 정의를 읽습니다.
Ярослав Рахматуллин 2014 년

나는 이것을 민트에 대한 위키를 보면서 찾았지만 SU는 8 시간 이내에 새로운 사람들이 자신의 질문에 대답하지 못하게합니다. 나는 현재이 작업을 수행하기 위해 urxvt perl 플러그인을 작성 중입니다.
John Tyree

결과를 보는 것이 흥미로울 것입니다.
Ярослав Рахматуллин

불만족스러운 방식으로 문제를 해결했습니다. 컬러 파일을 동적으로로드하는 멋진 플러그인의 시작 부분이 포함되어 있습니다. 감사합니다.
John Tyree

0

나는 그것이 오래되었다는 것을 알고 있지만, 내가 연결된 ssh 호스트에 따라 기본 urxvt 색상을 설정하기 위해 펄 코드를보고있었습니다.

그런 다음 http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control 에서 OSC 이스케이프 시퀀스 정의를 우연히 발견 하고 다음을 생각해 냈습니다.

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

이 경우 "노란색"은 전경이고 "파란색"은 배경색입니다. 색상 정의는 XParseColor에 허용되는 모든 문자열 (예 : LemonChiffon 또는 # FF4455) 일 수 있습니다.

이것은 터미널 재설정시 새로운 색상을 사용하도록 터미널의 기본 색상을 영구적으로 무시합니다. 따라서 정상적인 ANSI 이스케이프 시퀀스와 관련하여 스티커입니다. rxvt 및 urxvt, 아마도 다른 콘솔에서도 작동합니다 (OSC는 man console_codes에서도 언급됩니다).

또한 개별 ANSI 색상을 재정의하는 코드가있는 것으로 보이지만, 시도하지는 않았지만 콘솔이 동적으로 테마를 지정하는 가장 좋은 방법이라고 생각하면 문자 그대로 "고양이"또는 "고양이"입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.