urxvt:如何像其他模拟器一样在标签之间切换?

urxvt:如何像其他模拟器一样在标签之间切换?

我想绑定Alt+<Number>键来在 urxvt 中切换标签。

有什么方法吗?

答案1

代码已经在里面了/usr/lib/urxvt/perl/tabbed(至少在我的系统上)。

在第 312 行,控制按键的子程序开始 ( sub tab_key_press)。它检查$event->{state}和按键掩码;默认情况下,要么与urxvt::ShiftMask或组合urxvt::ControlMask

/usr/lib/urxvt/urxvt.pm显示其他可能性,例如Mod1Mask最有可能是Alt修饰语。

默认情况下,仅定义在标签之间向左或向右移动的快捷键。它读取当前位置 ( $idx),然后将其增加/减少一 ( $idx++/ $idx--),然后将此值设置为新标签索引。

有了这些信息,很容易修改为

  1. 使用 Mod1Mask。
  2. 读取所按下的按键号。
  3. 将标签索引设置为读取的数字。

(只需最少的编码经验,甚至不一定是 Perl;大部分都是复制+粘贴)。

答案2

Urxvt 本身并不是选项卡式终端。您可以使用 perl 扩展来获取选项卡。它可能有一些选项可以更改键绑定。请参阅常问问题就此而言。

答案3

我没有找到使用 alt 修饰符的方法,但我确实修改了扩展tabbedex( ),以便使用+和+/usr/lib/urxvt/perl/tabbedex左右切换选项卡,并使用+创建新选项卡。使用+仍然像以前一样有效。CtrlJCtrlKCtrlTShiftArrow

我修改了该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;
      }
   }

   ();
}

相关内容