readline:激活 emacs-standard 和 emacs-meta 键盘映射的副本

问题描述 投票:0回答:1

我的目标是:

  1. 复制 emacs-standard 和 emacs-meta 键盘映射,
  2. 激活副本
  3. 对副本进行更改
  4. 恢复 emacs-standard 和 emacs-meta 键盘映射

我读到 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


如您所见,我尝试复制、激活、修改和恢复默认键盘映射,但是无法正确激活或恢复键盘映射。我将不胜感激任何建议。

perl emacs gnu readline
1个回答
0
投票

复制、激活、绑定后:
键盘映射:emacs-meta
这应该是“nama-meta”

看起来这两行中的第二行取消了第一行:

$term->generic_bind(ISKMAP,"\e",$nama_meta, $nama);
$term->bind_keyseq("\e", $func_name);

因为两者都发生在键盘映射中

$nama
。也许这就是为什么输出不是“nama-meta”?

© www.soinside.com 2019 - 2024. All rights reserved.