我的目标是:
我读到 emacs-meta 被分配给 Esc 键,.
我的(失败的)尝试是用 Perl 语言,但欢迎使用任何语言的工作代码。
use v5.30;
use Term::ReadLine;
BEGIN {
import Term::ReadLine::Gnu qw(:keymap_type);
}
my (%seq, %seq_meta, %func, %func_meta);
my $term = Term::ReadLine->new('keymap and custom dispatch test');
# add my own dispatch routine
my $func_name = 'hotkey_dispatch';
my $coderef = sub {};
$term->add_defun($func_name, $coderef);
my $emacs = $term->get_keymap;
say "initial state:";
dump_keyseq("\e"); # Esc
dump_keyseq("\e[A"); # Up arrow
$term->bind_keyseq("\e", $func_name);
$term->bind_keyseq("\e[A", $func_name);
my $emacs_meta = $term->get_keymap_by_name('emacs-meta');
my $nama = $term->copy_keymap($emacs);
my $nama_meta = $term->copy_keymap($emacs_meta);
$term->set_keymap_name('nama-meta', $nama_meta);
$term->set_keymap_name('nama',$nama);
$term->set_keymap($nama);
$term->generic_bind(ISKMAP,"\e",$nama_meta, $nama);
$term->bind_keyseq("\e", $func_name);
$term->bind_keyseq("\e[A", $func_name);
say "after copying, activating and binding:";
dump_keyseq("\e");
say "this should be 'nama-meta'";
dump_keyseq("\e[A");
say "this should be 'hotkey_dispatch'";
$term->set_keymap($emacs_meta);
$term->set_keymap($emacs);
$term->generic_bind(ISKMAP,"\e",$emacs_meta, $emacs);
say "after attempting restore:";
dump_keyseq("\e");
say "this should be emacs-meta, but only after nama-meta";
dump_keyseq("\e[A");
say "this should be previous-history";
sub dump_keyseq {
my $seq = shift;
my ($data, $type) = $term->function_of_keyseq($seq);
if ($type == ISFUNC) {
say "function: ", $term->get_function_name($data);
} elsif ($type == ISKMAP) {
say "keymap: ", $term->get_keymap_name($data);
} elsif ($type == ISMACR) {
say "macro: $data";
} else {
say "unknown type: $type";
}
}
initial state:
keymap: emacs-meta
function: previous-history
after copying, activating and binding:
keymap: emacs-meta
this should be 'nama-meta'
function: hotkey_dispatch
this should be 'hotkey_dispatch'
after attempting restore:
keymap: emacs-meta
this should be emacs-meta, but only after nama-meta
function: hotkey_dispatch
this should be previous-history
如您所见,我尝试复制、激活、修改和恢复默认键盘映射,但是无法正确激活或恢复键盘映射。我将不胜感激任何建议。
复制、激活、绑定后:
键盘映射:emacs-meta
这应该是“nama-meta”
看起来这两行中的第二行取消了第一行:
$term->generic_bind(ISKMAP,"\e",$nama_meta, $nama);
$term->bind_keyseq("\e", $func_name);
因为两者都发生在键盘映射中
$nama
。也许这就是为什么输出不是“nama-meta”?