urxvtで任意のキーでセレクションのペースト
urxvt-unicode (urxvt) でのセレクション(PRIMARY)のペーストはShift-Insertに割り当てられている。このキーバインドはホームポジションから遠く押しにくいので、他のキーバインドでペーストできるようにする。
問題点
バージョン9.07のurxvtは、PRIMARYのペーストしかできないうえ、ペーストのキーバインドがShift-Insertから変えられないっぽい(ハードコーディングされてる)
方法
urxvtはperlで機能拡張できる。perlを使ってxsel*1コマンドを呼び出し、セレクションの内容を端末に書き出す。
ここでの設定
- 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