rxvt-unicode の clipboard 連携

Thinkpad like な環境ではあまり気にならなかった center button のコストが,平凡なマウスを使っていると想像以上に大きいことがわかったので,キーボードでコピペできるようにしてみた. Shift + Insert はさすがに論外.
いわゆるクリップボードと, urxvt がコピペに使っているバッファらしきものが別物であることは以前から認識していたが,今回調べてみて明確に別物であることがわかった. command.C の 568 行あたりにハードコーディングされているので,そこを書き換えてもいいのだけれど,もうちょっとデスクトップ環境に歩み寄ってクリップボードを使うことにしてみる.
/foo/bar/urxvt-xsel という名で以下のスクリプトを保存する.どういう訳か $term->selection が non-false の時に system ("xsel | xsel -bi") など外部コマンドを実行しようとすると urxvt ごと凍ってしまう謎仕様を回避するため,ちょっと苦しいことをしている.
raw

#!/usr/bin/env perl
use strict;
use warnings;

sub copy
{
	my ($self) = @_;

	my $elite = $self->locale_encode($self->selection);
	if ($elite) {
		my $EOF = time();
		$EOF .= '0' while ($elite =~ /$EOF/);
		system ("cat<<$EOF | xsel -bi\n$elite\n$EOF\n");
	} else {
		system ("xsel | xsel -bi");
	}

	()
}

sub paste
{
	my ($self) = @_;

	open (XSEL, '-|', qw/xsel -b/) or die $!;
	while (<XSEL>) {
		$self->tt_write ($self->locale_encode ($_));
	}
	close XSEL;

	()
}

sub paste_selected
{
	my ($self) = @_;

	my $elite = $self->locale_encode($self->selection);
	$self->tt_write ($self->locale_encode ($elite)) if ($elite);

	()
}

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

	if ($cmd eq "urxvt-xsel:copy") {
		$self->copy;
	} elsif ($cmd eq "urxvt-xsel:paste") {
		$self->paste;
	} elsif ($cmd eq "urxvt-xsel:paste_selected") {
		$self->paste_selected;
	}

	()
}

実行には xsel が要る. Debian なら

% sudo aptitude install xsel

とかで入る.
続いて ~/.Xdefaults に以下を追記.

URxvt.perl-lib:        /foo/bar/
URxvt.perl-ext-common: urxvt-xsel
URxvt.keysym.C-C:      perl:urxvt-xsel:copy
URxvt.keysym.C-V:      perl:urxvt-xsel:paste
URxvt.keysym.C-M-V:    perl:urxvt-xsel:paste_selected

これによって実現される機能は,

Ctrl + Shift + C
urxvt 上現在選択されている or 過去に選択されていたテキストをクリップボードへコピー
Ctrl + Shift + V
クリップボードから urxvt 上へペースト
Ctrl + Shift + Alt + V
urxvt 上現在選択されている or 過去に選択されていたテキストを urxvt 上へペースト