Ctrl-Arrow не работает в URXVT при использовании расширения вкладка

Поскольку вы спросили, как это сделать с помощью awk, Я думал, что докажу, что это не так уж и сложно. Итак, начнем:

echo "John Doe <john.doe@gmail.com> John Doe <johndoe@hotmail.net> Jane Doe <j.doe@outlook.org>" | \
awk \
'
{print repl($0)}

function repl(s, m)
{
  if (match(s,"(<.)([^>]*)(.@.)([^>]*)(.\\.[a-z]*>)", m))
  {
    return substr(s, 1, RSTART-1) m[1] \
           gensub(".","*","g",m[2]) m[3] \
           gensub(".","*","g",m[4]) m[5] \
           repl(substr(s,RSTART+RLENGTH))
  }
  else
    return s
}
'
1
02.07.2018, 23:48
1 ответ

Как выясняется, виновником является tabbedобычное расширение Perl. tabbedзатирает Ctrl -Влево/Вправо для перемещения текущей вкладки влево или вправо соответственно. Простое удаление вкладки из 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 -Shift -Влево/Вправо перемещать вкладки влево и вправо вместо Ctrl -Влево/Вправо. Но другая возможность — полностью удалить код для перемещения вкладок влево и вправо и жить без этой функциональности. Это можно сделать, удалив строку

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

и следующие строки в конец пункта.

4
27.01.2020, 23:32

Теги

Похожие вопросы