![将 GNOME 键盘快捷键移植到 URXVT](https://linux22.com/image/1317889/%E5%B0%86%20GNOME%20%E9%94%AE%E7%9B%98%E5%BF%AB%E6%8D%B7%E9%94%AE%E7%A7%BB%E6%A4%8D%E5%88%B0%20URXVT.png)
我最近从 切换gnome terminal
到urxvt
(并安装了选项卡式扩展)。我也是重度emacs
用户,使用很多类似于urxvt
(选项卡相关的东西) 的组合键,如Shift-Left
和Shift-Right
。这些组合键设置为在 中选择文本emacs
。
有没有办法将ALT-1
, ALT-2
,映射ALT-3
到标签上1, 2, 3 ..
?
有没有扩展可以做到这一点?可以通过~/.Xdefaults
文件实现吗?
答案1
您可以通过修改 perl 扩展的 tabs(tabbed)并更改其响应的键来手动执行此操作。我通过修改tab_key_press方法:
您可以从文件夹中的 urxvt 源分发包中获取原始的选项卡式脚本rxvt-unicode-9.15/src/perl/tabbed,找到该函数,并用下面的方法替换它。
完成后,您可以将修改后的文件保存在 /some/folder/tabz 中,然后使用以下命令运行 urxvturxvt --perl-lib /some/folder -pe tabz
我认为应该可以使用 X 资源 (~/.Xdefaults) 来配置它,所以也许我将来会制作一个从那里读取的脚本版本并将其邮寄给 urxvt 维护者,但现在:
sub tab_key_press {
my ($self, $tab, $event, $keysym, $str) = @_;
warn "keysym: ", $keysym;
#if ($event->{state} & urxvt::ShiftMask) {
if ($event->{state} & urxvt::Mod1Mask) {
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 ( $keysym == 0x31 || $keysym == 0x32 || $keysym == 0x33 ||
$keysym == 0x34 || $keysym == 0x35 || $keysym == 0x36 ||
$keysym == 0x37 || $keysym == 0x38 || $keysym == 0x39
) {
my $idx = 0;
$idx = 0 if $keysym == 0x31;
$idx = 1 if $keysym == 0x32;
$idx = 2 if $keysym == 0x33;
$idx = 3 if $keysym == 0x34;
$idx = 4 if $keysym == 0x35;
$idx = 5 if $keysym == 0x36;
$idx = 6 if $keysym == 0x37;
$idx = 7 if $keysym == 0x38;
$idx = 8 if $keysym == 0x39;
warn scalar @{ $self->{tabs} };
$self->make_current ($self->{tabs}[ $idx ]) if ($idx < (scalar @{$self->{tabs}})) ;
return 1;
}
}
elsif ($event->{state} & urxvt::ControlMask) {
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;
}
}
()
}