urxvtで任意のキーでセレクションのペースト

urxvt-unicode (urxvt) でのセレクション(PRIMARY)のペーストはShift-Insertに割り当てられている。このキーバインドホームポジションから遠く押しにくいので、他のキーバインドでペーストできるようにする。

問題点

バージョン9.07のurxvtは、PRIMARYのペーストしかできないうえ、ペーストのキーバインドがShift-Insertから変えられないっぽい(ハードコーディングされてる)

方法

urxvtはperlで機能拡張できる。perlを使ってxsel*1コマンドを呼び出し、セレクションの内容を端末に書き出す。

ここでの設定

  • perlのファイルは/home/willowlet/.urxvt/にあるとする。(もちろんここは各ユーザ名に変更する所)
  • キーバインドは以下の通り
Alt-v
PRIMARYのペースト
Ctrl-Alt-v
CLIPBOARDのペースト

ここではAlt-vと表記しているが、設定ファイル中ではM-vとする。

以下設定ファイル
~/.Xresources

URxvt.perl-lib: /home/willowlet/.urxvt/
URxvt.perl-ext-common: default,x-selection
URxvt.keysym.M-v: perl:x-selection:paste_primary
URxvt.keysym.C-M-v: perl:x-selection:paste_clipboard

~/.urxvt/x-selection

#! perl

sub paste_primary {
    my ($self) = @_;
    my $o = $self->locale_encode($self->selection);
    # 自urxvtに選択箇所があるとxselがフリーズするっぽいので場合分け
    if ($o) {
	$self->tt_write($o);
    } else {
	open my $fh, '-|', qw/xsel/ or die $!;
	while (<$fh>) {
	    $self->tt_write($_);
	}
	close $fh or warn "status: $?";
    }

    ()
}

sub paste_clipboard {
    my ($self) = @_;
    open my $fh, '-|', qw/xsel -b/ or die $!;
    while (<$fh>) {
	$self->tt_write($_);
    }
    close $fh or warn "status: $?";

    ()
}

sub on_user_command {
    my ($self, $cmd) = @_;

    if ($cmd eq "x-selection:paste_primary") {
	#$self->tt_write('[p]');
	$self->paste_primary;
    }

    if ($cmd eq "x-selection:paste_clipboard") {
	#$self->tt_write('[c]');
	$self->paste_clipboard;
    }

    ()
}

独り言

perlで拡張できるurxvtはフリーダム。どういう事ができるかは man urxvtperl とか http://linux.die.net/man/3/urxvtperl に書いてある。

URxvt.keysym.*: command: の使い方がよく分からない。

*1:xsel-conrad