使用选项卡式扩展时,Ctrl-箭头在 urxvt 中不起作用

使用选项卡式扩展时,Ctrl-箭头在 urxvt 中不起作用

当使用 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

事实上,当在终端执行reador时, (正确)会为 Ctrl-Up 打印,但对于 Ctrl-Left 和 Ctrl-Right 则不会打印任何内容,这反而使终端闪烁。这表明组合键在发送到终端之前实际上已被捕获。cat -v^[[1;5A

当使用空.Xresources文件时,Ctrl-左/右将按预期发送到终端。导致此问题的原因可能是什么?

答案1

事实证明,罪魁祸首是tabbed常见的 Perl 扩展。tabbed破坏 Ctrl-Left/Right 分别向左或向右移动当前选项卡。只需从选项卡中删除选项卡即可URxvt.perl-ext-common解决问题,但当然也会删除选项卡功能。

最后,我的解决方案是创建tabbed扩展的本地副本并使用它而不是默认版本。首先,您可能需要找到系统的副本tabbed并将其复制到本地扩展目录。在我的 64 位 Ubuntu 18 系统上,该文件位于cp以下命令中的位置。该命令当然假设~/.urxvt/ext/已经存在。

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

要加载本地副本而不是系统副本,请tabbedURxvt.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-Shift-Left/Right 左右移动选项卡,而不是 Ctrl-Left/Right。但另一种可能性是删除左右移动选项卡的代码,并在没有该功能的情况下继续使用。这可以通过删除行来完成

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

以及该子句末尾的以下行。

相关内容