Ctrl-arrow não funciona no urxvt ao usar a extensão tabulada

1

Ao usar o urxvt com personalizações de várias origens, Ctrl-Left e Ctrl-Right não funcionam mais para mover-se entre palavras, por exemplo, bash e vi. A causa não é a típica falta de linhas de keysym em .Xresources como sugerido em outras respostas, como aquelas existentes no arquivo, e funciona para outras combinações de teclas.

URxvt.keysym.Control-Up:    3[1;5A
URxvt.keysym.Control-Down:  3[1;5B
URxvt.keysym.Control-Left:  3[1;5D
URxvt.keysym.Control-Right: 3[1;5C

Na verdade, ao fazer um read ou cat -v no terminal, ^[[1;5A é (corretamente) impresso para Ctrl-Up, mas nada é impresso para Ctrl-Left e Ctrl-Right, o que torna o terminal piscar. Isso indica que a combinação de teclas é capturada antes de ser enviada ao terminal.

Ao usar arquivos .Xresources vazios, as teclas Ctrl-Esquerda / Direita são enviadas para o terminal como esperado. Qual poderia ser a causa deste problema?

    
por nitro2k01 02.07.2018 / 22:48

1 resposta

2

Acontece que o culpado é a extensão% Perl comum de tabbed . tabbed está sobrescrevendo Ctrl-Esquerda / Direita para mover a aba atual para a esquerda ou para a direita, respectivamente. Simplesmente remover as guias do URxvt.perl-ext-common corrige o problema, mas, claro, também remove a funcionalidade da guia.

No final, minha solução foi criar uma cópia local da extensão tabbed e usá-la em vez da versão padrão. Primeiro você pode querer encontrar a cópia do seu sistema de tabbed e copiá-lo para o diretório de extensão local. No meu sistema Ubuntu 18 de 64 bits, o arquivo estava localizado no local no comando cp abaixo. Este comando, claro, assume que ~/.urxvt/ext/ já existe.

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

Para carregar a cópia local em vez da cópia do sistema, remova tabbed do URxvt.perl-ext-common (que carregaria a versão padrão) e adicione a seguinte linha.

URxvt.perl-ext: tabbed

Em ~/.urxvt/ext/tabbed , localize a função tab_key_press e altere-a, por exemplo, da seguinte forma:

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;
      }
   }

   ()
}

Esta versão da função tornará as abas de movimento Ctrl-Shift-Esquerda / Direita para a esquerda e para a direita, em vez de Ctrl-Esquerda / Direita. Mas outra possibilidade é remover completamente o código para mover abas para a esquerda e para a direita e viver sem essa funcionalidade. Isso seria feito removendo a linha

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

e as seguintes linhas para o final da cláusula.

    
por 02.07.2018 / 22:48

Tags