タブ拡張を使用すると、urxvtでCtrl -矢印が機能しない

タブ拡張を使用すると、urxvtでCtrl -矢印が機能しない

さまざまなソースのカスタマイズに urxvt を使用する場合、Ctrl-Left と Ctrl-Right は bash や vi などの単語の間を移動するのに機能しなくなります。原因は、他の回答で提案されている一般的な欠落キー記号行ではありません.Xresources。これらの行はファイルに存在し、他のキーの組み合わせで動作するためです。

URxvt.keysym.Control-Up:    \033[1;5A
URxvt.keysym.Control-Down:  \033[1;5B
URxvt.keysym.Control-Left:  \033[1;5D
URxvt.keysym.Control-Right: \033[1;5C

実際には、実行中またはread端末からCtrl-Upの場合は(正しく)印刷されますが、Ctrl-LeftおよびCtrl-Rightの場合は何も印刷されず、代わりに端末が点滅します。これは、キーの組み合わせが端末に送信される前に実際にキャプチャされたことを示します。cat -v^[[1;5A

空のファイルを使用すると、.XresourcesCtrl-Left / Rightが期待どおりに端末に送信されます。この問題の原因は何ですか?

答え1

tabbed犯人は一般的なPerl拡張であることがわかりました。tabbedCtrl - 左/右を破ると、現在のタブがそれぞれ左または右に移動します。タブからタブを削除するとURxvt.perl-ext-common問題は解決しますが、もちろんタブ機能も削除されます。

結局のところ、私の解決策はtabbed拡張のローカルコピーを作成し、基本バージョンの代わりに使用することでした。まず、システムのコピーを見つけてtabbedローカル拡張ディレクトリにコピーする必要があります。私の64ビットUbuntu 18システムでは、ファイルはcp次のコマンドの場所にあります。もちろん、このコマンドは~/.urxvt/ext/すでに存在すると仮定します。

cp /usr/lib/x86_64-linux-gnu/urxvt/perl/tabbed ~/.urxvt/ext/

システムコピーの代わりにローカルコピーをロードするには、次の行をtabbed削除して追加しますURxvt.perl-ext-common(これによりデフォルトバージョンがロードされます)。

URxvt.perl-ext: tabbed

~/.urxvt/ext/tabbed関数を見つけてtab_key_press変更します。たとえば、次のようになります。

sub tab_key_press {
   my ($self, $tab, $event, $keysym, $str) = @_;

   if ($event->{state} & urxvt::ShiftMask && !($event->{state} & urxvt::ControlMask) ) {
      if ($keysym == 0xff51 || $keysym == 0xff53) {
         my ($idx) = grep $self->{tabs}[$_] == $tab, 0 .. $#{ $self->{tabs} };

         --$idx if $keysym == 0xff51;
         ++$idx if $keysym == 0xff53;

         $self->make_current ($self->{tabs}[$idx % @{ $self->{tabs}}]);

         return 1;
      } elsif ($keysym == 0xff54) {
         $self->new_tab;

         return 1;
      }
   }elsif ($event->{state} & urxvt::ControlMask && $event->{state} & urxvt::ShiftMask) {
      if ($keysym == 0xff51 || $keysym == 0xff53) {
         my ($idx1) = grep $self->{tabs}[$_] == $tab, 0 .. $#{ $self->{tabs} };
         my  $idx2  = ($idx1 + ($keysym == 0xff51 ? -1 : +1)) % @{ $self->{tabs} };

         ($self->{tabs}[$idx1], $self->{tabs}[$idx2]) =
            ($self->{tabs}[$idx2], $self->{tabs}[$idx1]);

         $self->make_current ($self->{tabs}[$idx2]);

         return 1;
      }
   }

   ()
}

この機能バージョンでは、Ctrl-Left/Right ではなく Ctrl-Shift-Left/Right タブを左右に移動します。ただし、もう1つの可能性は、タブを左右に移動するコードを削除し、その機能なしで続行することです。行を削除すると、これを行うことができます。

if ($keysym == 0xff51 || $keysym == 0xff53) {

そして、節の終わりに次の行があります。

関連情報