当使用 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
or时, (正确)会为 Ctrl-Up 打印,但对于 Ctrl-Left 和 Ctrl-Right 则不会打印任何内容,这反而使终端闪烁。这表明组合键在发送到终端之前实际上已被捕获。cat -v
^[[1;5A
当使用空.Xresources
文件时,Ctrl-左/右将按预期发送到终端。导致此问题的原因可能是什么?
答案1
事实证明,罪魁祸首是tabbed
常见的 Perl 扩展。tabbed
破坏 Ctrl-Left/Right 分别向左或向右移动当前选项卡。只需从选项卡中删除选项卡即可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-Left/Right 左右移动选项卡,而不是 Ctrl-Left/Right。但另一种可能性是删除左右移动选项卡的代码,并在没有该功能的情况下继续使用。这可以通过删除行来完成
if ($keysym == 0xff51 || $keysym == 0xff53) {
以及该子句末尾的以下行。