Repository navigation
[讨论稿] 把按键、触发、动作拆成三根正交轴 —— 接着 #2220 补上「动作命名另议」 #2224
x4w2nyhvk8
started this conversation in
Ideas | 想法
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
1. 为什么接着 #2220 说
#2220 把「颜色」收进了
color.<domain>[.<sub>].<part>[.<class>][.<state>]这一条路径,键定义里不再出现颜色。但按键本身仍留着三处老问题,和当时颜色侧「同一对象多种写法」是同一种病:Return/Return1/Return2、space/space1、Shift_L3、BackSpace2,同一颗键因为所在键盘、行宽、大小写不同就复制一份定义;bh1~bh4更是把行号写进了名字。preset_keys的一项里,click/long_click/swipe_up是触发槽位,command/option/select/toggle/commit是动作字段,label/hint是显示,send又是发给引擎的按键——全是平级字段,没有层次。CommonKeyboardActionListener用when (action.command)对 snake_case 字符串字面量分派,全仓没有动作枚举。多一个功能就多一个字符串,写错了不报错、只是不生效。本稿只做一件事:把「这颗键是谁 / 什么时候触发 / 做什么」拆成三根互不越界的轴,各配一份受控词表,并对齐源码消费点。 颜色仍按 #2220,本稿不重复。
2. 一个前提:别拿配置样本当词表,也别拿别家实现当依据
现有主题里出现过哪些键名、哪些动作,是散在
KeyAction.kt、KeyBehavior.kt、CommonKeyboardActionListener.kt、内置trime.yaml和doc/trime-schema.json里的。以某份流行主题为样本来定规范,样本没写的就会漏——#2220 提过我最初这么做漏了 12 个源码字段,动作侧同理。引擎侧动作其实是三种形态并存,这也决定了「统一」不是改拼写、而是换编址方式:
KeyActioncommand/option/select/toggle/commit/send…,加功能就加字段CommonKeyboardActionListener的when (action.command)liquid_keyboard/select_all/share_text等字面量,无枚举约束KeyBehavior,由Key逐一bind所以规范里的「动词」是主题侧新抽象,不是整理已有枚举。这一点我在稿里如实标出来,不假装引擎已经支持。
3. 三根正交轴
keykey_domain ⊆ action_domain,由校验强制子集关系)preset_keys表名 + 数组位置eventKeyBehavior的 13 个枚举小写化,Key里逐一bindactionevent13 项里,后 4 项composing/has_menu/paging/ascii是同文特有的状态条件型触发(按 Rime 运行时状态挑KeyAction),不是手势也不是时序。这一层源码本来就是封闭的,规范直接沿用,不新造。沿用 #2220 §8 的
keys/layouts结构,补齐动作侧后是这样(纯示意,当前引擎不认):三个要点:
when:是一张映射,不是一堆后缀字段。加一种触发时机 = 词表加一行 +when加一键,不需要给每颗键新增一列。class与动作产出的state正是 [讨论稿] 把「位置 + 功能命名」落成可校验的路径式色表 —— 接着 #1434 提一份具体方案 #2220 色表路径的末两段,两稿在这里接缝:event.swipe_left → action.edit.moveCursor → state: pressed → color.key.background.space.pressed。因此词表必须统一放一份并双向校验,拼错一个词两侧同时失效。key.*只标识身份。同一颗空格键在 26 键、数字键盘、fixed_key_bar里都是key.edit.space,差异交给label/geometry/class/when,替身键随之消失。4. 大小写:不是规则不齐,是五层投影
讨论中常被问到「为什么一会大写一会小写」。把同一个概念在各层的合法拼写摊开,会发现那是序列化器转换的结果,跨层不可比、层内必须齐:
SWIPE_UP/KEY_SYMBOL_COLORswipeUp/isLabelUppercaseswipe_up/label_transformYamlNamingStrategy.SnakeCase自动转KEY_SYMBOL_COLOR→key_symbol_colorname.lowercase()ColorKeyevent.swipe_left/action.edit.moveCursor本稿取 B1:token 字符串值的段内用 lowerCamel,YAML 结构字段名与
event名保留 snake_case。理由是ThemeYaml用YamlNamingStrategy.SnakeCase且strictMode = false——在 YAML 里把字段名写成驼峰会被静默丢弃,配置看着写了却不生效。event是唯一一处有意的不齐:它既是词表成员、又是 YAML 字段名。彻底驼峰需要把when从 map 改成数组并改KeyBehavior绑定代码,超出纯文档范围。留这一处,换零解析器改动,是否可接受见 §9。另有一条书写纪律:写规范、台账、示例一律用带命名空间的全路径(
action.modifier.toggleCapsLock),不用uppercasedStateAction这类悬空概念名——悬空名没有词表约束,会滑回替身键的老路。5. 横向参照:借鉴什么,不借鉴什么
这一节只比较结构取舍。其他输入法与 Rime 系前端的按键/动作写法,确实给了两处有用的启发;但它们的字段、取值、命名空间一个都不进本稿词表。
xxxButton后缀;事件是action/swipeUpAction/uppercasedStateAction/repeatAction等后缀式字段;动作值结构化{character}/{shortcut}/{sendKeys}action: {name, params});后缀式事件字段 → 不采纳,加一种手势就多一列,是笛卡尔积的另一种形态foxy.*一类自定义命名空间)ref:三段分区:rime.*(引擎键名)/qwerty.*(布局)/foxy.*(自定义);swipe/longPress用嵌套对象key_table)Return/BackSpace/Shift_L/KP_1,大小写敏感,三种历史风格混用BackSpace是发给引擎的按键,不是「删除」这个动词还有两点反面约束值得记下来:事件槽位嵌套虽比后缀式好,但仍把「触发时机」写成结构层级而非词表;引擎键名混进动作值时若不带命名空间,就会出现「一会大写一会小写」的观感——分区比统一拼写更重要。
6. 同文自己的特色(本稿落脚点)
借鉴归借鉴,下面几条是别的输入法不会替同文做、也不可能给出的——它们全都来自同文自己的源码结构和历史包袱:
KeyAction已是 16 个平行字段,再堆下去不可维护;拆成key/event/action/color/metric后每轴只管一件事KeyAction、GeneralStyleref引用,不存在这个问题Return1、bh1~bh4、主题里自造的bkg/tkg/benter标签是同文特有历史包袱,只有引入稳定 ID +when就地覆盖才能收掉preset_keys、PresetKeyevent直接等于 13 个KeyBehavior枚举;再配受控词表、一值一路径、回退链无环、源码文件哈希漂移报警,避免规范与实现悄悄脱节KeyBehavior、Key,呼应 #1294 / #1968wired接线分档,不写「写了不生效」的名字wired: falserime.a≠rime.A)。用params.key原样承载,不铺成 39 项别名KeyCode.parse、RimeKeyMapping、GenKeyMappingevent唯一例外YamlNamingStrategy.SnakeCase+strictMode = false会静默丢弃驼峰字段,大小写必须逐层分别定,不能统一成一种拼写ThemeYamlmenu_keyboard这类旧命令单独登记为「action 域 / 打开 window.switch」,不并入封闭动词表,避免历史 snake_case 污染新词表CommonKeyboardActionListener的窗口装配gap,V3 兼容税单列geometry.gap(留白 = 空单元格 +span),但降级产物里的{gap: n}必须保留并注明是 V3 兼容税Keyboard的布局计算、Key.gap声明未被读取一句话概括取舍:别家给的是「配置长什么样」,同文这套多做了「规范与实现的绑定关系」——源码锚定、接线分档、静态校验、兼容税标注,都是为了让「文档写了」和「引擎真的认」不脱节。这也是我认为最值得请官方判断的部分。
7. 落地的诚实分档
39 动词按「有没有源码消费点」分三档,词频只作线索、消费点优先:
commit、backspace(经 librimeBackSpace)、moveCursor、toggleCapsLock、showClipboard、deployinsertText、repeatCommit(现为布尔isRepeatable)、selectAll、cut/copy/pasteparams的动词,须改KeyAction解析wired: falseglideType、expandPopup、hideKeyboard、webSearch、selectText有两处容易误判,一并写明:
backspace在源码里词频为零,是因为它走 librime 键名BackSpace;run/date/none的高词频是通用词。按消费点判定,不按词频。三道硬门也在文档里标了:引擎目前只认
config_version: "3.0"(ThemeDiagnostics的版本门);动词化依赖尚未存在的 V5 解析器;行为 ID 全面取代替身键依赖二维布局。所以这份词表现阶段是编址契约,不是可运行配置。8. 与 #1434 / #2220 各条的对应
preset_key_style/fallback_style,preset_keys移除颜色参数、增加classid/class/attributes/action/when,颜色全在color:节点(#2220 已落),本稿补齐动作侧class+state取色,配列只放geometry,二者不共享字段class优先使用预设名class是 6 词受控词表,且与色表路径修饰段共用同一份词表when产出state,正是这条的输入attributes: [sticky]表达「这键可锁定」,是性质而非事件;produces_state: locked与颜色侧第三持续态对应longPress/key.hint等 proposed 槽位怎么收wired分档给出统一判据:有消费点进 A、等价能力进 B、零消费点留 C 标proposed9. 想听的意见
key/event/action)与官方设想的preset_key_style/fallback_style是冲突,还是可以作为它们内部的编址规则? 若第 1 条就与路线不符,后面几条都不必谈,我按维护者方向重写。wired该不该跨轴推广(目前只标在尺寸轴的硬编码项上)?C 档动词是保留为status: proposed,还是直接从词表删掉,避免「已封闭、可组合」的虚假承诺?params.key,还是新建独立的native_key_refs段只登记坐标?两种都不动 39 项封闭词表。event保留 snake_case 这一处不齐能否接受(换零解析器改动)?还是宁可改KeyBehavior绑定也要全驼峰?本稿基于对
develop分支源码的阅读整理,未在官方仓库提交代码或 PR;文中命名空间、词表、when:与接线分档均为待讨论提案,不代表同文已实现或已采纳。§5 所列其他输入法仅作结构参照,不是本稿任何字段或取值的来源。All reactions