命令与按键的绑定设计是用了什么样的数据结构

自己在想命令与按键的绑定设计使用的数据结构是什么样的

首先可以想到的有

  • 每个命令唯一,且一定存在
  • 每个命令的按键绑定不一定存在
  • 而命令与按键需要双向查找

我自己根据上面自己想了一下怎么实现

首先我使用数组

我将命令按键绑定全部存入数组 ,

只不过有存放规则,每个命令与其对应按键绑定(没有按键绑定放个null)一组放入 也就成了

|------|
| 命令 |
| 按键 |
| 命令 |
| null |
| 命令 |
| 按键 |
| 命令 |
| 按键 |
| 命令 |
| 按键 |

对所有命令处理时,从中 奇数遍历

对所有按键处理时,从中 偶数遍历

按键命令 本身位置-1

命令按键 本身位置+1

不知道真实情况是什么样的

就是map,不过有很多map,有优先级: GitHub - noctuid/evil-guide: Draft of a guide for using emacs with evil 。你可以直接C-h v一个map的名字来看它的值,比如dired-mode-map,可以看到它是一个key->command的alist,也就是个map。不过我不知道是怎么实现command到key的查找的。

用 C 函数 where-is-internal 对 keymap 搜索遍历得到的。这个函数会用 hashtable 缓存搜索结果。


你没有想到的有,每个命令可以对应多个按键,以及用 tree search 会比 linear search 快多了。

每个命令可以对应多个按键 有想到,

多个按键 写一个按键组

tree search 会比 linear search 快

倒是不知道

是怎么对 map 进行 tree search的?

那我得先问,对于比如 C-x 8 n o 这么个按健组合,你本來想怎么处理呢。

{command:['C-x','8','n','o']}

我没想到这个 多次按键 需要缓存记录每次的按键

确实成了 tree