问题: 在最新的 macOS 系统设置已不支持配置全局使用同一个 InputConnection ("Use one input source in all documents" Deprecated ),故部分用户需要 squirrel 实现前端记录全局的 ascii_mode 以实现在任意应用任意输入框中有可预期的 ascii 模式输入体验。
相关问题:
解决方案: 在了解整体问题上下文后,决定通过以下方式实现
在 squirrel.yaml 配置文件中增加 global_ascii: bool 字段用于控制是否全局记录 ascii_mode ,其默认值为 false 当 global_ascii 为 true 时 squirrel 会使用 UserDefaults.standard 记录以 _user_global_ascii_mode 为 key 记录 ascii_mode 并在每次创建新的(或重新激活旧的) InputConnection 时读取并以此设置的值为 ascii_mode 最高优先级 可遇见的问题: 使用该功能后可能会导致忽略用户配置的 app_options.ascii_mode 字段失效(编者是能接受在明确启用全局 ascii_mode 模式后应该以全局配置项为准的配置优先级的,如果有更好的实现方式或想法欢迎留言一起讨论实现,我愿意为推进此功能持续工作)
注: 作为一个 workaround 方案提交的 PR #1054 并没有被上游接受(叠甲,不是抱怨。我也认同上游共享实例观点可以继续推进)只是当前实现方式在完美方案实现之前的一个替代实现方案以及能够满足我系统 全局记录 中/英 切换模式的需求了。 有同样需求的小伙伴此阶段可以试试我的 fork 版本 https://github.com/PBK-B/squirrel 由于自己有需求所以会持续同步并已经配置 CI 自动构建发布版本,下载地址 https://github.com/PBK-B/squirrel/releases
如果有帮助到你可以评论一下呀(鼓励我继续尝试推进上游提出的共享实例。咕咕咕咕~),完结撒花 🎊
1
kur0d3s 3 天前 via iPhone
Mark ,空了学习下。感谢分享:)
|
3
tywtyw2002 2 天前
Squirrel 不接这个 PR 的,多少年前就有人 PR 过几次了。
workaround 有很多,两种解决模式,要不改 librime 要不改 Squirrel 。 不过 librime 编译起来麻烦,Squirrel 编译起来快。 librime -> https://github.com/rime/librime/compare/master...groverlynn:librime:ascii_mode Squirrel 就是几点 1. hook message -> option ascii_mode 和 !ascii_mode 的通讯,然后决定 global ascii 状态。 2. 处理 event.keyCode 检查下 ascii_mode 和 global ascii 状态。 可以用 session_id 来加快检查速度,如果 sessionid 相同就不需要处理了。 https://github.com/rime/squirrel/compare/master...tywtyw2002:squirrel:z/squirrel-next |
4
kuanat 2 天前
我来解释一下 Rime 作者为什么不接受这个实现方式,以及作者期望的可能的实现方式。
按照作者的术语习惯,librime 核心部分称为后端,也叫算法引擎,weasel/squirrel/ibus-rime 这些官方应用称为前端。这里忽略掉操作系统的输入法框架细节,搞清楚两个事情即可,一个是前端和后端之间是通过 ipc 通信的,另一个是像获取并维护输入焦点信息、输入法状态本身的管理是在前端完成的。 实际上只有 librime 后端才是输入法状态的真实来源,squirrel 这个前端只有逻辑上的 get/set 接口。由于 macOS/Linux 的输入法框架都是基于 ipc 的,所以 librime 后端实现了 Session 机制,用于区分不同的输入焦点目标。 现在 squirrel 前端的实现非常 naive ,对于每个输入目标焦点,都通过 createSession 来创建一个新的 session 。你现在的实现思路是,通过 squirrel 暴露的 set 接口,控制 librime 后端每个 session 的实际状态。 作者认为更好的方法是,在 squirrel 层面实现一个 session 复用机制,而不是每个输入焦点都用 createSession 来创建新的 ipc 连接。 这种实现方式也非常直接,我这里拿 fcitx5-rime 这个基于 fcitx5 框架的 rime 前端做例子。 fcitx5-rime 逻辑上不区分具体的 ascii 还是简繁或者其他什么状态,只关心是不是要在不同的输入焦点目标之间“共享状态”,有全局共享/应用内共享/不共享三个逻辑层次。 具体实现层面上,fcitx5-rime 维护了一个与 librime 后端之间的 ipc 连接池,对接到了 librime session 相关 api 。根据用户设定的共享状态,选择性创建或者复用 session 。 我不用 macOS 很久了,只是大致看了一下 issue 和代码,有可能说错,但我感觉这个大致的思路是没问题的。 |
5
pbk OP @kuanat 是的,我能理解作者的想法,不过在现有的 squirrel 中实现起来改动会比较大。在我之前也有很多大佬实现过类似的包括上面 @tywtyw2002 大佬的实现,逻辑上来说都相同。之前还能通过 macos 配置修改实现全局输入法 ascii 状态记录,现在系统设置中也没有这个选项了,所以我主动关闭 PR 并自己 fork 了一份并加上 CI 自动同步和编译(给自己和有需要的朋友使用)
|
6
pbk OP @tywtyw2002 大佬的实现也很不错 👍
|