urxvt設定-端末を再起動せずにリロードしますか?


19

urxvt使用する色のテーマは2つあります。1つは明るい背景用で、もう1つは環境の明るさに応じて暗いもの用です。

変更~/.Xresourcesしてxrdb ~/.Xresources再度実行することで簡単に切り替えることができますが、これは既に実行中の端末には影響しません。

tmuxを使用するので、デタッチ、ターミナルの再起動、再アタッチができますが、さまざまな作業スペースで8個が既にレイアウトされていると、非常にすぐに迷惑になります。

解決策は、どうやらurxvtがその設定を何らかの方法でリロードすることですが、これを行う方法や可能かどうかについての情報が見つかりません。誰もが方法を知っていますか?

注:主要なDEは実行していません。また、ターミナル用にすべてのkdeまたはgnomeライブラリをインストールするつもりはありません。

編集:man 7 urxvtウィザードのように見えるコードを表示します...まあ... 何か。カラーセット全体の変更にどのように適用されるかわかりません。任意のヒント?

回答:


12

偶然、私はたまたまのconfig wikiを見つけましたmintty。それには多くの素晴らしい提案がありますが、その1つは、を意味するエスケープシーケンスを使用してさまざまなオプションを設定する方法です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

Perlプラグイン

私はそれを「動作」させていますが、実際にはそうではありません。なぜなら、

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()はパラメータなしで実行されますか?
ЯрославРахматуллин

打ち間違え。perlの無限の知恵では、戻り値が暗黙的に$sそこにあるので、私は気づきませんでした。
ジョンタイリー

1
プラグインがいつ機能するかを教えてください。
エリック14

4

SIGUSR1の受信時にurxvt構成を再ロードするPerl拡張機能を作成しました:https : //github.com/regnarg/urxvt-config-reload

現在、カラー設定の再読み込みのみをサポートしていますが、他のもの(フォントなど)を簡単に追加できます。バグをgithubの問題として報告してください。


フォントとジオメトリの構成もサポートするようになりました!:)
パワーマン

いいね!構成全体を再度読み取ることは、私が本当に望んでいることではありませんが、多分あなたは私が持っていないいくつかのことを理解したでしょう。私たちの力を組み合わせて...?
ジョンタイリー

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の存続期間に1回読み取られます。構成を再読み込みして、プログラムの既に実行中のインスタンスで効果を発生させることはできません。フォントとロケールの設定に関しては、このルールには例外があります。

ターミナルの適切なセクションまでスクロールダウンできます。関連するFAQをいくつか紹介します

Q rxvt-unicodeがリソースを読み取らないのはなぜですか?

A(短縮)これは、xrdbを使用します。変更するたびに再ログインする必要があります(またはxrdb -merge $ HOME / .Xresourcesを実行します)。

これは、ターミナルバイナリをリロードすることを意味します。

Q画面の色が好きではありません。それらを変更するにはどうすればよいですか?

A〜/ .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いるフォントと色に関する特別な例外は、私が興味を持っているものです。どのように機能するかわかりません。
ジョンタイリー

知る限りでは、カラーエスケープシーケンスは、「ここから後は赤になります」-赤いテキスト-「ここから後は通常のテキスト」-白地に黒などと言うために使用されます。ただし、赤と白と黒の定義は、バイナリの起動時にのみ利用可能なxリソースから読み取られます。
ЯрославРахматуллин

これはminttyのwikiでも確認できましたが、SUでは8時間以内に新しい人が自分の質問に答えることはできません。現在、これを行うためにurxvt perlプラグインを作成しています。
ジョンタイリー

結果を見るのは面白いでしょう。
ЯрославРахматуллин

私は不満足な方法で問題を解決しました。カラーファイルを動的にロードするための素晴らしいプラグインの始まりが含まれています。感謝します。
ジョンタイリー

0

しばらく経ちましたが、私が接続したsshホストに応じてデフォルトのurxvtの色を設定することに目を向けて、あなたのperlコードを見ていました。

それからhttp://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-ControlでOSCエスケープシーケンスの定義を見つけて、次のことを思いつきました。

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

この場合、「黄色」は前景で、「青」は背景色です。色の定義には、LmonChiffonや#FF4455などのXParseColorで受け入れ可能な任意の文字列を使用できます。

これにより、端末のデフォルトの色が永続的に上書きされ、端末のリセットで新しい色が使用されます。したがって、通常のANSIエスケープシーケンスに対してスティッキーです。これはまさに必要なものです。rxvtおよびurxvt、おそらく他のコンソールでも動作します(OSCはman console_codesでも言及されています)。

個々のANSIカラーをオーバーライドするコードもあるように見えますが、それらを試したことはありませんが、それらが機能する場合、それがコンソールを動的にテーマ設定するための最良の方法だと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.