SQUIRREL
Intro(RIME | SQUIRREL) #
Caution
因为需要输入法配置灵活度高,所以找到开源的鼠须管,基于中州韵输入法引擎的一个 macosx 端实现。 详细介绍(自序、历史、概念、项目构成、开发计划)
重新部署: 参考/Library/Input\ Methods/Squirrel.app/Contents/MacOS/Squirrel --reload
control + option + .
下载安装 #
下载页面, macOS 鼠须管 1.0.2 pkg 安装包(属于将引擎中州韵代码作为 git 子模块,编译成动态链接库供鼠须管使用)
macOS 编译指南
鼠鬚管 Wiki配置 #
配置文件位置 #
Warning
应运程序的安装位置:
/Library/Input\ Methods/Squirrel.app/Contents
程序附带的共享配置:/Library/Input\ Methods/Squirrel.app/Contents/SharedSupport/
用户自定义覆写目录:~/Library/Rime/
配置文件目录及文件分布参考 (RimeWithSchemata / Rime 中的數據文件分佈及作用)
配置文件的 YAML 升级语法参考 (Configuration / Rime 配置文件)
对于定制选项可参考 (CustomizationGuide / 定製指南)外观-Squirrel(鼠须管) #
图片引用自 官方的示例图,小狼毫和鼠须管外观配置基本一致。如需设置,则可以参考 主題設計助手 或者 润笔 - Rime 设置小助手
引擎-Librime(中州韵) #
文档和样例
1).
: 配置文档: 01-RimeWithSchemata 02-雪齋的文檔 03-CustomizationGuide2).
: 参考样例: 01-rime-luna-pinyin 02-rime-prelude 03-綜合演練 / hello根据配置文档自己画的配置关系图如下:
Caution
因为官方不建议修改的 Shared 文件的原因,所以有些属性就得通过 custom 文件进行覆盖或者补丁。
自定义及解释 #
外观相关参数 #
可以将输入法展示区块分为三部分:inline(目标区),preedit(编辑区)[可消失],candidate(候选区)[不消失]
inline_preedit__
:编辑区与目标区行内显示(简单理解为编辑区
覆盖目标区)inline_candidate
:候选区与目标区行内显示(简单理解为候选区
覆盖目标区)
同时覆盖的话,编辑区消失,候选区上位,分隔符修改 #
修改拼写分隔符:
luna_pinyin.custom.yaml
。由原来的delimiter: " '"
到delimiter: "'"
speller/delimiter
:引用(RimeWithSchemata / 【三】最高武藝)中的注释:隔音符號用「’」;第一位的空白用來自動插入到音節邊界處。
翻译过来就是可以手动通过第二位对拼音进行分割,比如西安
这个的拼音xi'an
,就可以手动打'
,其余自动分割的用第一个符号。
改完后delimiter: "'"
的一二位因为一样,所以使用一个就可以了。翻页配置 #
修改翻页为-|=
: 在位置default.custom.yaml
。
key_binder: 增加两个 bindings (结果没生效){ when: paging, accept: minus, send: Page_Up}
{ when: has_menu, accept: equal, send: Page_Down}
大意了,原来预置的key_bindings.yaml
里买就有相关快捷键的定义,但是自己手贱,又重新在default.custom.yaml
里面重新定义了,并且没有绑定相关键位,发现不生效,以为原来的预置的键位没有绑定上去。其实应该是在 custom 文件里面进行追加或者修改的,不是直接定义(会覆盖)。
例如:右边default.custom.yaml
代码中追加和修改示例。修改插入记号(CARET) #
修改 caret(插入记号):符号
‸
,此处的符号引用自 UI Improvements / 10。查看 librime 引擎中相关代码,发现在 此处 使用了😝|
模拟了插入记号,所以感觉应该是在每个客户端(squirrel|weasel)中去自自己实现的。然后转到 squirrel,在 此处 SquirrelInputController.swift 发现相关代码,其中 caretPos 就是指定了位置,但是并没有看出来是怎么使用的,比如是直接将插入符号追加到编辑区 还是 在后续调用中根据位置直接设置的。swift 代码不太好看,无从下手了,所以没有解决。在此处仅做个记录。
更新上述错误表述:后面查看代码的时候发现在 librime 引擎处有 kCaretSymbol 定义,而且在下面一行处有用户可配置的选项soft_cursor
,大概熟悉代码后发现这只是一个开关(false|true),用来控制是否显示插入符号的开关,通过 debug 验证后发现可行。于是添加如下图括起来的类似配置,在本地进行测试,发现在 Squirrel 端并不生效。于是查看 squirrel 端代码,发现有 这样的判断,进而对soft_cursor
进行了覆写,所以没生效。但是根据它的判断条件也可以进行验证,一般对于浏览器,都是进行强制内联(inline)的。所以在浏览器地址栏输入就不会出现插入符号了。
接着,为了实现修改插入记号的初始想法,就必须修改引擎代码然后重新编译出动态链接库,替换 squirrel 自己编译出来的。步骤如下:1).
: 修改 kCaretSymbol 定义 中 38 行代码为:static const string kCaretSymbol("\xe2\x86\x9e");
,\xe2\x86\x9e
就是你想替换的任何 UTF-8 符号的十六进制编码。比如我此处的就是↞
。2).
: 此处使用 clion + camke 的方式编译出动态链接库/path/librime/cmake-build-release/lib/librime.1.11.2.dylib
3).
: 进入 squirrel 输入法目录:cd /Library/Input Methods/Squirrel.app/Contents/Frameworks
4).
: 备份 squirrel 自带(或它附带编译出来)的:sudo mv librime.1.dylib librime.1.dylib.bak
5).
: 使用刚才编译出的进行替换:sudo cp /path/librime/cmake-build-release/lib/librime.1.11.2.dylib librime.1.dylib
6).
: 重启输入法进行验证:/Library/Input\ Methods/Squirrel.app/Contents/MacOS/Squirrel --quit
,过一会自己就启动了。
如果需要此次编译出来 macOS 端的动态链接库librime.1.11.2.dylib
, 点击下载。
需要注意的是:a).
: 这次编译出来的 Release 版本大小为3.4M
,原来的为7.0M
,不知道什么区别,仅供测试。(后来发现跟插件有关系,比如 lua)b).
: 浏览器中编辑框中最后的那个竖线|
是闪动的光标,正好闪动的时候截的图。
添加LUA脚本 #
lua
脚本使用,直接输入日期之类的
使用方法:a).
: 在用户配置目录~/Library/Rime/
新建文件rime.lua
,里面的内容 参考 hchunhui/librime-lua/wikib).
: 在luna_pinyin.custom.yaml
中添加engine/translators/@before 0/: lua_translator@date_translator
, 启用 lua 日期翻译器。效果如下左 gif。
但是这样的话,自己编译的librime.1.11.2.dylib
里面没有启用插件,需要将插件编译进去,编译过程如下:1).
: 目前 rime 生态体系支持的插件有 这些 plugins2).
: 如果想要安装某个插件,比如hchunhui/librime-lua
,进入到源码目录 librime ,在终端执行./install-plugins.sh hchunhui/librime-lua
。会将插件仓库下载到当前目录的plugins
中。
其他插件类似,但是hchunhui/librime-lua
,这个插件的 CMakeLists.txt 第五行有点问题,我本地是有 lua-5.4.6 的,但是它没检测到,将lua54
改成lua5.4
即可通过重建 cmake 工程。3).
: 将 clion 切换到 Release profile, 重新 build 即可重新生成cmake-build-release/lib/librime.1.11.2.dylib
。4).
: 如上 修改插入记号CARET 的操作,复制替换重启一气呵成。效果如下右 gif。
如果需要此次编译出来 macOS 端的动态链接库2ed-librime.1.11.2.dylib
, 点击下载。
添加词库 #
添加搜狗 网络, 计算机 等相关词库。并使用在线工具 词库转换器,将 scel 文件转换成 txt,比如:网络流行新词【官方推荐】.txt 、计算机词汇大全【官方推荐】.txt
秉承不修改 Shared 目录文件的原则,通过给luna_pinyin.schema.yaml
打补丁,修改translator/dictionary 的值。
具体操作如下:1).
: 将 Shared 目录 /Library/Input\ Methods/Squirrel.app/Contents/SharedSupport/ 中的luna_pinyin.dict.yaml
复制一份到用户目录 ~/Library/Rime/ ,并改名为luna_pinyin_compact.dict.yaml
。2).
: 编辑luna_pinyin_compact.dict.yaml
,在 use_preset_vocabulary 一行后面添加import_tables: [ sougou_pinyin_network, sougou_pinyin_computer ]
3).
: 新建文件sougou_pinyin_network.dict.yaml
,先写入如下模板头,剩下的通过命令将 txt 内容追加到后面即可。计算机同样的方式。4).
: 导入命令:cat /path/网络流行新词【官方推荐】.txt >> sougou_pinyin_network.dict.yaml
5).
: 将原来luna_pinyin.schema.yaml
中定义的translator/dictionary: luna_pinyin
通过打补丁的方式替换,这样明月拼音相关方案中的词典都会替换。
补丁方法:在luna_pinyin.custom.yaml
添加内容补丁:translator/dictionary: luna_pinyin_compact
卸载词库也很简单,只需要将补丁行translator/dictionary: luna_pinyin_compact
注释即可,这样原来的就会起作用。
词库去重部分暂时没处理。另外还有 这样: issues/214 的问题
中英混输 #
要想在中文模式下输入英文单词,有一种办法就是将输入的编码 通过自定义的 table 类型的英文翻译器进行转换,只需要进行相关的配置就行。
具体操作如下:1).
: 先生成字典配置en_dict.dict.yaml
如右所示,网上下载这两个码表en.dict.yaml
(主表)、en_ext.dict.yaml
(扩展表)。
重命名en.dict.yaml
==>en_primary.dict.yaml
2).
: 配置自定义文件luna_pinyin.custom.yaml
,新增英文翻译器(table_translator@english),主要配置如右。
还有一个默认的主翻译器,稍后要进行调频,所以一起配置了。3).
: 进行调频,其实就是给两个翻译器配置中的initial_quality
进行赋值,参数可以 参考:优化 Rime 英文输入体验/权重设定4).
: 重新部署,如果没问题,日志没报错,那就是没问题了,直接输入体验就行。
但是我的日志报错:Error loading table for dictionary 'en_dict'.
5).
: 解决方式就是暂时将我们的en_dict
配置给主翻译器,让生成 *.bin 词典数据后,再换回来。5.1).
互换右边第 4 和 17 行。5.2).
重新部署一次,让生成 bin 文件,如果成功的话会在用户目录下 build 文件夹生成 **en_dict.***等文件。5.3).
互换右边第 17 和 4 行。5.4).
再次重新部署就没问题了。微信表情快捷输入 #
翻找表情比较麻烦,还不知道什么意思,所以利用输入法配置一下。
采用自定义符号的形式, 参考:Rime 自定義短語文件樣例
需要注意:这个是微信功能支持,输入表情格式的文字会转换为对应的表情,和输入法没关系。此处的输入法只是为了将输入liu
转化为[666]
,touxiao
转化为[偷笑]
等。
具体操作如下:1).
: 因为默认配置里面已经写好相关引用了,所以只需要在用户目录下新建custom_phrase.txt
文件,将微信表情相关的符号写入到里面就可以了。符号定义如下:
如果是百度输入法,则可以 参考:baidu输入法个性短语导入微信表情自定义符号
配置符号直接上屏(GRAVE) #
因为写 markdown 较多的缘故,所以经常用到
`
反引号,用来注释重要的内容,中英切换比较费事,所以想不管中英模式,敲`
直接上屏。
如果直接通过补丁的方式覆盖的话, 对于加了commit
的值会报错copy on write failed; incompatible node type: commit
参考/issues/504, 所以得直接复制一份共享目录下面的 symbols.yaml 文件到用户目录,并改名为 symbols_updated.yaml。 采用迂回的方式对luna_pinyin.schema.yaml
中的 punctuator 直接覆盖。这样既绕过了 commit 的问题,也不用修改原来的 symbols.yaml 文件。
具体操作如下:1).
: 修改 symbols_updated.yaml 中的 half_shape 如下图第一个片段。
正常来说应该已经生效了,但是配置文件中还有其他影响的部分,比如 反查前缀等。所以还需要进行 2,3两步。2).
: 补丁覆写:reverse_lookup/prefix: ")"
,目前不知道这个反查是什么东西,影响不大。3).
: 补丁覆写:recognizer/patterns/reverse_lookup: "R:[a-z]*'?$"
。4).
: 重新部署查看效果。(gif中第一次输入后出现两个`
,是 clion 的自动补全效果,后面就正常了)
配置回车直接上屏 #
默认的回车操作是上屏
编辑区域
的内容,源码可以 参考: editor.cc#L189-L218,相关配置解释可以 参考 Rime_description.md#八其它/第5个
使回车和空格一样的操作按照如下配置就行。
具体操作如下:1).
: 在luna_pinyin.custom.yaml
中加入补丁:editor/bindings/Return: confirm
。取消CTRL触发中西文切换 #
平常使用 vim 的时候进行模式切换、退出会用到
ctrl + [
。因为刚开始的错误配置,很容易触发 中西文切换,所以用下方补丁调整一下。
Rime引擎 #
版本:[2024/09/29]:https://github.com/rime/librime/tree/aaaaaec344c22c1b3b8059190a00e4c532a2ab54
源码处理参考 #
Comment
engine
中的所有模块组合 gears_module.ccengine
中对于按键的处理流程 ConcreteEngine::ProcessKeyengine
中处理器processor
中 fluid_editor/fluency_editor 和 express_editor 的处理 异同编译与调试 #
Note
由于需要查看 yaml 文件生成后到底是什么样的,以及配置了为什么没有生效等问题。所以将源代码拉取下来,进行分析,结合日志打印出的信息以及 AIGC 等问答,最后修改 librime 输入法引擎部分代码,实现测试,验证等效果。
修改的commit为: aaaaaec3
编译参考文档: Rime with Mac
文件变更: feat: add yaml dump to temp dir for test and verify.
其他 #
Caution
1).
: 在计算机科学和编程中,grave
通常指的是“重音符”或“倒尖号”,在键盘上通常位于数字 1 键的左边,形状像一个倾斜的撇号,有时也被称为反引号`
。 — 来自阿里通义2).
:space
理解为空格,这个算是基本常识了、但是backspace
一度懵逼,后来一查,发现是退格键
。😝
Reference #