xremap使用指南

2022-12-18 20:49

切回Linux后最不适应的是键盘映射们. 之前在Linux下的肌肉记忆早已被若干年的macos使用给磨没了, 我自己在macos下的窗口切换方案让我到了Linux后有寸步难行的感觉, 而且使用macos时习得的那些readline快捷键也是根深蒂固. 为了窗口切换, 我花了一天时间把之前在hammerspoon下配置的快捷键hiper.luamagnet.lua用Linux实现了一遍(比我想象的容易太多了). 但是, 入口仍然不算特别好, 之前的方案是xmodmap加上xbindkeys. 主要缺陷是很多时候会失效, 所以得先用一个特殊的快捷键唤醒xmodmap, xmodmap里面定义了right cmd/right alt键, 然后再用xbindkeys定义的快捷键运行自己写的hiper.sh. 至于readline的那些快捷键, 之前想着这个问题应该有人解决过, 不过始终没搜到结果.

前两天在v2ex上看到有人提到关键字kinto, 找来看了看, 貌似是我想要的东西. 这个周末折腾了一下, 到底来说这个软件用了很多PyGTK的东西来做界面(我不需要), 又用了xkeysnail这个软件来做快捷键定义. 所以我的想法是参考kinto里面的快捷键定义, 然后使用xkeysnail来自己做键映射的定义. 不过这个软件里面比较多坑. 首先编译就需要一群一群的幺蛾子库(pycairo我在说你呢)和头文件包. 编译好之后运行时需要提权, 因为普通用户没有读/dev/uinput设备的权限, 解决办法有两个, 一个是用root运行, 缺点是更不安全, 而且对于X的访问, root用户要多过一次验证; 另外一种方案是创建udev的规则, 让启动时/dev/uinput设备的属组是一个普通用户从属的组. 我选用的是后一种方案, 遇到的一个小坑是uniput模块根本没加载, 所以还得多写一个配置去加载这个模块. 真正坑的事情是调试这个xkeysnail程序, 和大多数python程序一样, 输出是有缓冲区的, 只有当缓冲区满了才会写到硬盘的文件里. 不过我是折腾了半个小时之后才想到这一点. 解决方案也很简单, 在systemd的service定义中添加一个PYTHONUNBUFFERED环境变量就好. 另外一个很不满意的就是这个xkeysnail提供的Python API简直是不能看. 所以还写了一段代码, 把所有的配置定义到一个数据结构里面. 好歹符合自己的审美了. 最后的最后, 这个软件好久没更新了…

昨晚刚折腾完, 今天就在reddit上看到一个更好的替换品, xremap, rust编写, 编译后大小为7MB, 接受一个yml文件作为配置. 配置文件的样子也很合乎逻辑, 所以趁着手还热乎, 直接转过来了. 具体配置分为下面三步:

目前唯一的不满是所有xremap启动的进程的父进程都是xremap, 没有double fork, 所以(尤其是调试时)当我们停止这个服务/进程时, 启动的子进程也被杀掉了, 不过无伤大雅. 提了一个issue, 看看作者是什么想法先.