2

Я хотел бы связать Alt + <Number> ключ для переключения вкладок в urxvt.

Любые подходы?

3 ответа3

6

Код находится в /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; в основном это копирование + вставка).

0

Urxvt сам по себе не является терминалом с вкладками. Вы можете использовать расширение Perl для получения вкладок. Может быть несколько вариантов изменения привязки клавиш. см. FAQ по этому вопросу.

0

Я не нашел способа использовать модификатор alt, но я изменил расширение tabbedex (/usr/lib/urxvt/perl/tabbedex), чтобы переключать вкладки влево и вправо с помощью Ctrl + J и Ctrl + K и создавать новые вкладки с помощью Ctrl + T. Использование Shift + Arrow по- прежнему работает, как и раньше.

Я изменил функцию tab_key_press следующим образом. Чтобы изменить привязку ключа, вы должны использовать его код ключа (здесь приведен список 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;
      }
   }

   ();
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .