web-dev-qa-db-ja.com

urxvt:他のエミュレーターのようにタブを切り替える方法は?

バインドしたい Alt<Number> urxvtのタブを切り替えるためのキー。

何かアプローチはありますか?

2
Determinant

コードは/usr/lib/urxvt/Perl/tabbedにあります(少なくとも私のシステムでは)。

312行目で、Ctrlキーを押すサブが開始します(sub tab_key_press)。 $event->{state}とキーマスクをチェックします。デフォルトでは、urxvt::ShiftMaskまたはurxvt::ControlMaskとの組み合わせのいずれかです。

/usr/lib/urxvt/urxvt.pmは、他の可能性を示しています。 Mod1MaskこれはおそらくAlt修飾子です。

デフォルトでは、タブ間を左または右に歩くためのショートカットのみが定義されています。現在位置($idx)を読み取り、1ずつ増減($idx++/$idx--)し、この値を新しいタブインデックスとして設定します。

この情報を使用すると、次のように簡単に変更できます。

  1. Mod1Maskを使用します。
  2. 押されたキー番号を読み取ります。
  3. タブインデックスを読み取り番号に設定します。

(コーディングの経験は最小限で、必ずしもPerlである必要はありません。ほとんどの場合、コピーと貼り付けです)。

6

Urxvtは、それ自体ではタブ付き端末ではありません。 Perl拡張機能を使用してタブを取得できます。キーバインディングを変更するためのいくつかのオプションがある場合があります。 [〜#〜] faq [〜#〜] を参照してください。

0
Keith

Alt修飾子を使用する方法が見つかりませんでしたが、tabbedex拡張子(/usr/lib/urxvt/Perl/tabbedex)を変更して、タブを左右に切り替えました。 CtrlJ そして CtrlK で新しいタブを作成します CtrlT。使用する ShiftArrow まだ以前のように動作します。

tab_key_press関数を次のように変更しました。キーバインディングを変更するには、そのkeysymコードを使用します(ここにリストがあります https://www.cl.cam.ac.uk/~mgk25/ucs/keysymdef.h )。

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

   if ($tab->{is_inputting_name}) {
      if ($keysym == 0xff0d || $keysym == 0xff8d) { # enter
         $tab->{name} = $tab->{new_name};
         $tab->{is_inputting_name} = 0;
         $self->update_autohide (1);
      } elsif ($keysym == 0xff1b) { # escape
         $tab->{name} = $tab->{old_name};
         $tab->{is_inputting_name} = 0;
         $self->update_autohide (1);
      } elsif ($keysym == 0xff08) { # backspace
         substr $tab->{new_name}, -1, 1, "";
         $tab->{name} = "$tab->{new_name}█";
      } elsif ($str !~ /[\x00-\x1f\x80-\xaf]/) {
         $tab->{new_name} .= $str;
         $tab->{name} = "$tab->{new_name}█";
      }
      $self->refresh;
      return 1;
   }

    if ($event->{state} & urxvt::ShiftMask) {
      if ($keysym == 0xff51 || $keysym == 0xff53) {
         if (@{ $self->{tabs} } > 1) {
            $self->change_tab($tab, $keysym - 0xff52);
         }
         return 1;

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

      } elsif ($keysym == 0xff52) {
         $tab->{is_inputting_name} = 1;
         $tab->{old_name} = $tab->{name} ? $tab->{name} : "";
         $tab->{new_name} = "";
         $tab->{name} = "█";
         $self->update_autohide (1);
         $self->refresh;
         return 1;
      }
   } elsif ($event->{state} & urxvt::ControlMask) {

    if ($keysym == 0x006a){
         if (@{ $self->{tabs} } > 1) {
            $self->change_tab($tab, -1);
         }
         return 1;
    } elsif ($keysym == 0x006b){
         if (@{ $self->{tabs} } > 1) {
            $self->change_tab($tab, 1);
         }
         return 1;
    } elsif ($keysym == 0x0074){
         $self->new_tab;
         return 1;
    } elsif ($keysym == 0xff51 || $keysym == 0xff53) {
         if (@{ $self->{tabs} } > 1) {
            my $idx1 = 0;
            ++$idx1 while $self->{tabs}[$idx1] != $tab;
            my $idx2 = ($idx1 + $keysym - 0xff52) % @{ $self->{tabs} };

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

   ();
}
0
sealj553