@
kuanat #4
感谢回复, 老哥太专业了, 句句直戳要害
我说一下在做这个工具的时候自己的一点儿思考, 希望老哥能够百忙之中再指导指导
关于 2:
这个真是大坑而且不太好在 remapping 的逻辑里处理完
我目前的做法是针对 ctrl 和 alt 做了特殊处理 (其实如你所说, alt 更加不好处理,我自己疏忽了没有考虑到 alt 在很多场景是不是完全的 modifier)
我对 ctrl 处理的需求是想解决按住 ctrl 打开浏览器链接的时候会强制在新 tab 打开
当前的处理逻辑是(以 ctrl 为例):
- 独立按下的时候透传一个 down 的 event
- 在 down 的状态如果还有其他键比如 C 按下并且匹配到改键逻辑, 则在发送改键 event 之前发送这个 ctrl 的 up event
- 发送修改之后的组合到 uinput
- 丢掉 src dev 后面 ctrl 和 C 的 up event
所有的 remap 的配置我都是使用当前 down 的所有 key 做匹配
关于 3:
我的初版实现是用 yaml 做配置文件的, 好处就是所有用户的逻辑可以提前知道, 性能可以做到比较好
但是只要想表达复杂逻辑 if else or and 之类的, 在 yaml 上做就很反人类
那自然想到脚本语言, 我评估了三种:
1. lua, 最开始就想到它, vim, 以及我个人比较喜欢的一个叫做 Hammerspoon 工具都用它
但是我自己不太会写 lua, 以及看到一些大佬评价 lua 的某些缺点, 就不做最优先考虑了
2. 像 AHK 一样, 有自己的脚本引擎, 这个是我最想要做的, 好处有:
- 可以做到配置特别简洁, 比如 remap 只需要两个 a::b 就行
- 脚本运行之前就能掌控所有的用户配置, 好做优化
- 支持复杂的 if else 等逻辑
缺点: 对我这样的初级开发者来讲, 实现起来太难了. 对用户来讲需要学习一个新的脚本语法
3. js, 算是综合前面所有考虑之后的妥协
另外提到全拦截, 我看到的最优雅的是 kmonad, 最开始我也实现了一个 layer 的方案, 但是后来发现对于我这样只想映射少量键的请, 要配置层多了之后每个层都要把所有键配置一下也挺烦的
最后想开了: 不要想大而全, 不要想让很多人都用, 就只做好一小部分功能就不错了
从这个角度出发, 我甚至都考虑过不开放配置, 就叫做: 让你的 linux 快捷键用起来像 macOS
我自己用的话可能就用 go 写死一个这个 [Engine](
https://github.com/jialeicui/KeySwift/blob/d21ee1e683cab0ee16862d08612ea0ccadb50327/pkg/engine/interfaces.go#L15) 的实现了
关于 4:
是我自己的强需求, 目前只实现了 gnome 相关的, 要做好确实要有好多路要走
老哥其他提到的很多知识点/名词都让我学到很多, 再次感谢!