탭 확장을 사용할 때 urxvt에서 Ctrl-화살표가 작동하지 않습니다

탭 확장을 사용할 때 urxvt에서 Ctrl-화살표가 작동하지 않습니다

다양한 소스의 사용자 정의를 위해 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

실제로 실행 시 read또는 터미널에서 Ctrl-Up에 대해서는 (올바르게) 인쇄되지만 Ctrl-Left 및 Ctrl-Right에 대해서는 아무것도 인쇄되지 않아 대신 터미널이 깜박입니다. 이는 키 조합이 터미널로 전송되기 전에 실제로 캡처되었음을 나타냅니다.cat -v^[[1;5A

빈 파일을 사용하면 .XresourcesCtrl-Left/Right가 예상대로 터미널로 전송됩니다. 이 문제의 원인은 무엇입니까?

답변1

tabbed범인은 일반적인 Perl 확장 인 것으로 밝혀졌습니다 . tabbedCtrl-왼쪽/오른쪽을 깨면 현재 탭이 각각 왼쪽이나 오른쪽으로 이동합니다. 탭에서 탭을 제거하면 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-Left/Right 대신 Ctrl-Shift-Left/Right 탭을 왼쪽 및 오른쪽으로 이동하게 됩니다. 그러나 또 다른 가능성은 탭을 왼쪽과 오른쪽으로 이동하는 코드를 제거하고 해당 기능 없이 계속하는 것입니다. 행을 삭제하면 이 작업을 수행할 수 있습니다.

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

그리고 절 끝에 다음 줄이 있습니다.

관련 정보