다양한 소스의 사용자 정의를 위해 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
빈 파일을 사용하면 .Xresources
Ctrl-Left/Right가 예상대로 터미널로 전송됩니다. 이 문제의 원인은 무엇입니까?
답변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-Left/Right 대신 Ctrl-Shift-Left/Right 탭을 왼쪽 및 오른쪽으로 이동하게 됩니다. 그러나 또 다른 가능성은 탭을 왼쪽과 오른쪽으로 이동하는 코드를 제거하고 해당 기능 없이 계속하는 것입니다. 행을 삭제하면 이 작업을 수행할 수 있습니다.
if ($keysym == 0xff51 || $keysym == 0xff53) {
그리고 절 끝에 다음 줄이 있습니다.