BindKey——实现可自定义的快捷键

用过Emacs的人都知道,其快捷键有多么强大,利用组合键C-x C-w,你可以将buffer内容另存为一个新的文件。那么程序是如何响应用户输入的快捷键呢?又如在Linux的Shell环境中,CTRL+R可以查找以前使用过的历史命令,这是由readline库来实现的。下面实现的这个代码,允许将一个函数绑定到一串字符串,如果命中了该字符串,则调用绑定的接口函数。

 

目前的实现,是使用树来管理所有的快捷键路径,每个节点都可以绑定一个函数,但我们应该遵循最长命令的原则,即如果A-B是一个快捷键,A-B-C也是一个快捷键,那么当输入A-B时需要等待用户下一个输入,如果没有输入,或者输入非C,则调用A-B快捷方式;否则调用A-B-C快捷方式。还有以下两个问题没有很好地解决,一个是,在用户输入A-B后,如何判断用户没有后续的输入了?一个是,如果A和A-B都是快捷键,如果用户连续输入两个A,应该怎么调用快捷键A?
例如对于下面五个快捷键, 
AXH, AXE, AXEH, ABXH, ACXH
我们将会生成一棵如下的多分枝树:
/->C->X->H*
|
A->X->H*
|   |
|   /->E*->H*
/->B->X->H*
我们知道,ESC键的ASCII值为0x1b, 而方向键和F1-F12功能键的序列值也是以0x1b开始的,那么如何区别用户键入的是ESC键还是方向键呢?
下面开始粘贴分析代码。
首先是数据结构,如果有不清楚的,请看详细注释。
 
然后是初始化和销毁接口,提供了节点内存的申请和释放接口和整个keymap的初始化和销毁接口。
 
下面的接口函数可用来打印所有的快捷键路径。
 
这个接口用来查找某个字符串是否绑定了快捷键,如果没有绑定, 则返回空指针。
 
下面是实现绑定的接口, 将快捷键分散到树的各个节点上:
 
以下为测试函数:
 
另外,下面使用一个while循环来响应用户的输入,用来测试如何检查用户输入的每个字符是否被绑定到快捷键。
 

其中函数wdm_keymap_get_next()使用当前节点和当前用户输入的键值来获取下一个节点。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值