pengaturan urxvt - memuat ulang tanpa me-restart terminal?

19

Saya memiliki dua urxvttema warna yang saya gunakan, satu untuk latar belakang terang dan satu untuk gelap, tergantung pada seberapa cerah lingkungannya.

Cukup mudah untuk mengubahnya dengan memodifikasi ~/.Xresourcesdan menjalankan xrdb ~/.Xresourceslagi, tetapi ini tidak mempengaruhi terminal yang sudah berjalan.

Saya menggunakan tmux sehingga saya bisa melepaskan, me-restart terminal, dan memasang kembali, tetapi ini menjadi sangat menjengkelkan dengan sangat cepat ketika ada 8 dari mereka yang telah meletakkan apa yang saya inginkan di berbagai ruang kerja.

Solusinya, tampaknya, adalah untuk urxvt untuk memuat ulang pengaturannya entah bagaimana, tetapi saya tidak dapat menemukan informasi tentang cara melakukan ini atau jika itu bahkan mungkin. Adakah yang tahu bagaimana caranya?

Catatan: Saya tidak menjalankan DE utama dan saya tidak akan menginstal semua kde atau gnome libs hanya untuk terminal.

Sunting: man 7 urxvtmenunjukkan beberapa kode yang kelihatannya bagus untuk melakukan ... yah ... sesuatu . Saya tidak melihat bagaimana ini berlaku untuk mengubah seluruh rangkaian warna. Ada tips?

John Tyree
sumber

Jawaban:

12

Secara kebetulan, kebetulan saya menemukan wiki konfigurasi untuk mintty. Ini memiliki banyak saran bagus, salah satunya adalah bagaimana mengatur berbagai opsi menggunakan urutan melarikan diri yang dimaksudkan untuk xterm. Jadi ini berfungsi dengan tidak membaca konfigurasi lagi tetapi dengan menafsirkan urutan melarikan diri untuk menimpa pemilihan warna yang ada.

Kita dapat menggunakan ini dari URxvt dengan mengikat kunci ke rantai panjang perintah, yang masing-masing mengubah salah satu dari 16 warna default.

Misalnya, di sini saya mengatur alt+ctrl+luntuk mengubah setiap warna menjadi 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

Saya memilikinya "bekerja" tetapi tidak benar-benar, karena tampaknya ada perbedaan mendasar antara sumber daya yang didefinisikan

URxvt.keysym.M-1: command:\033].......

dan setiap upaya untuk melakukan hal yang sama dengannya $term->cmd_parse().

Adakah yang bisa dilakukan tentang ini? Sejauh ini saya telah menetapkan seluruh set warna gelap dan terang dengan hardcod menggunakan urutan pelarian yang sangat panjang:

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

Ini berfungsi persis seperti yang saya harapkan akan dan dapat diaktifkan saat runtime jadi saya menandai ini sebagai dijawab, tetapi mengapa ini tidak dapat dilakukan secara dinamis dari Perl? Inilah yang saya miliki sejauh ini, saya bukan seorang programmer Perl yang hebat, jadi mohon maafkan gaya buruknya.

Mudah-mudahan seseorang dapat berpadu tentang apa masalahnya. Ini akan menjadi plugin yang bagus. Hulu ada di 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));
    }
    ()
}
John Tyree
sumber
build_cmd tidak mengembalikan string warna dan cmd_parse () dijalankan tanpa parameter?
Ярослав Рахматуллин
Salah ketik. Saya tidak memperhatikan karena dalam kebijaksanaan perl yang tak terbatas, nilai baliknya $sada di sana.
John Tyree
1
Beri tahu kami saat plugin Anda berfungsi.
erik
4

Saya membuat ekstensi Perl yang memuat ulang konfigurasi urxvt setelah menerima SIGUSR1: https://github.com/regnarg/urxvt-config-reload

Saat ini hanya mendukung reload konfigurasi warna tetapi hal-hal lain (seperti font) dapat ditambahkan dengan mudah. Laporkan bug sebagai masalah github.

regnarg
sumber
Sekarang juga mendukung konfigurasi font dan geometri! :)
Powerman
Bagus! Membaca seluruh konfigurasi lagi bukan yang saya inginkan, tetapi mungkin Anda sudah menemukan beberapa hal yang belum. Dengan kekuatan kita digabungkan ...?
John Tyree
3

Skrip berikut dapat digunakan dengan URxvt (atau terminal lain yang mendukung urutan pelarian XTerm OSC) untuk mengubah skema warna dengan cepat. Ia menerima definisi .Xresources-style sebagai input, dan menampilkan urutan escape. Cukup menjalankan skrip di terminal dan menempelkan colorcheme ke dalamnya akan mengubah palet warna - berguna untuk dengan cepat mencoba skema yang berbeda.

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

Shell redirection dapat digunakan juga: ~/bin/term-recolor < .Xdefaults.solarized.dark.

amonakov
sumber
0

Konfigurasi dibaca sekali dalam seumur hidup dari proses urxvtd atau urxvt mandiri. Tidak mungkin memuat ulang konfigurasi dan efeknya terjadi di instance program yang sudah berjalan. Ada pengecualian untuk aturan ini, ketika datang ke beberapa pengaturan font dan lokal.

Anda dapat menggulir ke bawah ke bagian yang sesuai di terminal Anda. Berikut adalah beberapa FAQ yang relevan

T Mengapa rxvt-unicode tidak membaca sumber daya saya?

A (disingkat) Ya, gunakan xrdb. Anda harus login kembali setelah setiap perubahan (atau jalankan xrdb -merge $ HOME / .Xresources).

Itu menyiratkan memuat ulang terminal biner kepada saya.

QA saya tidak suka warna layar. Bagaimana cara mengubahnya?

A Anda dapat mengubah warna layar saat run-time menggunakan ~ / .Xdefaults resources (atau sebagai opsi panjang).

Saya pikir itu berarti "ketika Anda memulai aplikasi".


Anda dapat membuat teks tertentu muncul dalam warna tertentu, tetapi warna-warna tersebut ditentukan dalam file x-resources dan harus dibaca kembali (dengan memulai ulang) setiap kali mereka diubah. Saya mungkin salah, tetapi saya tidak berpikir urxvt mendukung perubahan definisi warna setelah dimulai. Mungkin ada urutan kontrol untuk itu, saya tidak yakin.

MISALNYA

$ 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

info lebih relevan:

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

Ярослав Рахматуллин
sumber
Baik. Dan pengecualian khusus sehubungan dengan font dan warna yang ditampilkan man 7 urxvtadalah hal yang saya minati. Saya tidak tahu bagaimana cara kerjanya.
John Tyree
AFAIK, urutan pelarian warna digunakan untuk mengatakan "setelah di sini menjadi merah" --red text - "after here normal text" - black on white - dan seterusnya. Tetapi definisi merah dan putih dan hitam dibaca dari sumber x yang tersedia hanya ketika biner dimulai.
Ярослав Рахматуллин
Saya menemukan ini juga mencari wiki untuk mintty tetapi SU tidak membiarkan orang baru menjawab pertanyaan mereka sendiri dalam 8 jam. Saat ini saya sedang menulis plugin perl urxvt untuk melakukan hal ini.
John Tyree
Akan menarik melihat hasil Anda.
Ярослав Рахматуллин
Saya memecahkan masalah dengan cara yang tidak memuaskan. Dimulainya plugin yang bagus untuk memuat file warna secara dinamis. Bantuan dihargai.
John Tyree
0

Saya tahu ini sudah lama, tapi saya melihat kode perl Anda dengan mata untuk menetapkan warna urxvt default tergantung pada host ssh mana saya terhubung.

Kemudian saya menemukan definisi urutan escape OSC di http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Control , dan muncul dengan yang berikut:

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

Di mana dalam hal ini "kuning" adalah latar depan dan "biru" adalah warna latar belakang. Definisi warna dapat berupa string apa pun yang dapat diterima oleh XParseColor, misalnya LemonChiffon atau # FF4455.

Ini secara permanen menimpa warna default terminal, sehingga reset terminal akan menggunakan warna baru. Oleh karena itu lengket sehubungan dengan urutan pelarian ANSI normal, yang persis apa yang saya butuhkan. Bekerja pada rxvt dan urxvt, mungkin juga konsol lain (OSC bahkan disebutkan dalam man console_codes).

Tampaknya juga ada kode untuk mengganti warna ANSI individual, saya belum mencobanya, tetapi jika mereka bekerja saya akan berpikir itu adalah cara terbaik untuk secara dinamis tema konsol Anda, Anda benar-benar bisa hanya "cat dark" atau "cat light".

kaya
sumber