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
これによって実現される機能は,