手动排序 (Super Sequence):调整候选词顺序
super_sequence.lua用于记录并恢复用户主动调整过的候选位置。它不会改变词频本身,而是在候选输出阶段,根据当前输入编码对应的排序记录重新安排候选顺序。
当某个候选的位置长期不符合自己的使用习惯时,可以直接在候选菜单中将它前移、后移、置顶,或者取消已有的手动排序。
当前版本已经改为基于 Rime UserDb 原生记录格式 保存排序状态,并采用稀疏记录方式:只保存真正被用户主动操作过的候选,不再把因其他候选移动而被动让位的普通候选全部写入数据库。
一、核心快捷键
出现候选菜单后,先选中需要调整的候选,再使用以下快捷键:
手动排序快捷键
-
Ctrl + p:置顶
将当前选中的候选移动到第 1 位,并保存这一排序意图。 -
Ctrl + j:向前移动
将当前选中的候选向前移动 1 个位置。 -
Ctrl + k:向后移动
将当前选中的候选向后移动 1 个位置。 -
Ctrl + l:重置排序
取消当前候选已有的手动排序状态,使它重新按照上游候选顺序参与排列。
例如原始候选为:
选中“事件”后按一次 Ctrl + j:
再次按 Ctrl + j:
如果直接按 Ctrl + p,则会将当前选中的候选直接放到首位。
二、按住 Ctrl 查看排序标记
已经手动调整过候选后,可以在输入状态下按住 Ctrl 键查看排序标记。
松开 Ctrl 后,标记自动隐藏。
排序标记的含义
-
负数,例如
-2:当前候选相对于原始位置向前移动了 2 位。 -
正数,例如
+3:当前候选相对于原始位置向后移动了 3 位。 -
●:该候选仍存在有效的手动排序记录,但在当前候选列表中,它的最终位置恰好与原始位置相同。
这里比较的是:
因此标记反映的是当前候选列表中的实际位置变化,而不是累计按过多少次快捷键。
动态功能候选不显示这组位置标记
普通拼音候选可以通过 Ctrl 查看 -1、+2、● 等标记。
日期、时间等动态功能采用序号方式保存排序,不使用候选文字作为排序键,因此当前不会显示这组普通候选位置标记。
三、手动排序不会修改原始词频
Super Sequence 并不是去修改词典频率,也不会把当前候选重新学习成更高词频。
它的处理方式可以理解为:
因此:
- 没有手动调整过的候选仍然遵循原有排序逻辑。
- 用户词频、语法模型、上下文调频仍然可以正常工作。
- Super Sequence 只对已经明确保存过位置的候选进行额外的位置约束。
这也是手动排序与普通“调频”的主要区别:
调频改变候选自身的权重倾向,手动排序保存的是指定输入下的候选位置。
四、新版采用稀疏记录
旧版本在移动一个候选时,可能会把整段受影响候选的位置一起写入排序数据库。
例如:
如果把 D 移到第 1 位:
从视觉上看,A / B / C 都向后移动了。
但新版不会因为这种被动让位,就为 A / B / C 全部创建新的排序记录。
当前规则是:
- 主动操作的候选必须保存。
- 从未被主动排序过的普通候选,只在当前候选列表中自然让位,不落库。
- 如果另一个候选本来就有手动排序记录,并因为本次操作被挤动,则只更新这个已有记录的最终位置。
因此数据库中保存的是:
而不是:
这样可以减少排序数据库中的冗余记录,也能降低多设备同步时不必要的数据变化。
五、排序记录如何保存?
默认数据库配置为:
当前版本使用 UserDb 的标准记录形式保存每一个手动排序状态。
逻辑上,一条记录由:
唯一确定。
普通拼音候选可以理解为:
例如:
属于两条不同的排序记录。
排序状态不再依赖业务时间戳
新版已经取消旧版:
这一套由脚本自行维护的时间戳合并逻辑。
当前排序状态直接编码在 UserDb 标准记录的 c 字段中:
而 UserDb 的:
交给 librime 自身维护,Super Sequence 不再把它作为业务排序时间戳使用。
这意味着新版不再需要脚本额外维护“哪个设备最后一次修改发生在几点几分几秒”的时序关系。
六、Ctrl + l 为什么不是直接删除数据库记录?
从使用效果看:
Ctrl + l
就是取消手动排序,让候选重新回到自然排序。
但数据库层并不是简单地把这条记录物理删除。
当前版本会写入一个更高逻辑版本的重置墓碑。
可以理解为:
如果“取消排序”只是在本地删除记录,那么旧设备同步过来的历史状态可能再次把它恢复成第 1 位。
因此新版会保留一条:
的状态记录。
它的作用是让“取消排序”本身也能够作为一次有效状态参与 UserDb 同步,从而覆盖更早的排序结果。
重置的是排序效果,不是简单删除一行数据
Ctrl + l 后,当前候选不再受到这条手动排序记录的约束。
数据库中保留重置状态,是为了避免多设备同步时旧排序重新出现。
七、动态 Lua 候选也可以保持固定格式顺序
普通候选可以直接使用:
作为稳定排序键。
但是日期、时间等动态内容每天都在变化。
例如今天输入 /rq:
第二天又会变成:
如果直接按照候选文字保存排序,那么第二天文字已经变了,昨天的排序记录就无法继续命中。
动态功能采用“功能编码 + 候选序号”
为解决这个问题,已接入 Super Sequence 的 Lua 功能会主动设置:
例如时间模块会为不同功能指定稳定的排序编码:
进入这类功能模式后,Super Sequence 不再把动态候选文本本身作为排序键,而是使用候选的原始序号。
可以理解为:
因此即使日期每天变化:
只要这个格式仍然位于同一个原始候选序号,保存的排序关系就仍然有效。
示例
假设 /rq 默认输出:
你更常用第二种格式:
选中它后按:
之后再次输入 /rq,第 2 个原始格式会优先排列到首位。
第二天候选内容虽然变成:
但它仍然属于同一个“第 2 个格式”,因此排序习惯仍然能够继续生效。
不是所有 Lua 候选都会自动支持动态排序
动态功能需要主动向上下文写入 sequence_adjustment_code,Super Sequence 才能获得稳定的功能排序标识。
因此更准确的说法是:
万象中已经接入这一排序接口的动态 Lua 功能,可以按候选序号保存排序。
不能简单理解成“任何第三方 Lua Translator 挂进去后都自动支持永久排序”。
八、为什么动态功能按序号,而普通候选按文本?
两种场景的数据稳定性不同。
普通拼音
例如:
“时间”本身是稳定文本,因此可以直接记录:
动态日期
例如:
第二天文字就会变化,如果保存:
那么第二天已经无法命中。
因此动态功能保存的是:
这使 Super Sequence 实际可以同时处理两种需求:
九、多设备同步:改为使用 UserDb 原生机制
当前版本已经取消旧版自建的排序同步流程。
旧版曾经需要:
并由 Lua 自行:
这一套现在已经不再作为 Super Sequence 的日常运行机制。
新版直接把排序信息保存成稳定的 UserDb 记录,使其能够跟随 Rime 原有的用户数据同步流程处理。
因此新用户不需要再:
- 为 Super Sequence 单独创建
sequence_device_list.txt - 手工维护
sequence_windows.txt、sequence_mac.txt等设备文件 - 为排序脚本单独建立“主设备”
- 依赖 Lua 自己比较
updated_at - 把合并后的文本再次注入
sequence.userdb
当前同步思路
可以简化为:
其中:
- 正常排序状态带有自己的逻辑版本。
- 再次调整会递增该候选自己的逻辑版本。
Ctrl + l会写入更高版本的重置墓碑。- 业务层不再依赖设备本地时间来判断新旧。
这也是新版取消旧时序合并逻辑后的主要变化。
十、旧版 sequence_device_list.txt 还有作用吗?
有,但只用于旧数据迁移。
当前代码仍然保留对:
的读取能力,是为了首次升级时把旧版:
这类记录转换成新的 UserDb 排序状态。
迁移完成后,正常使用不再依赖这些旧同步文件。
新安装不需要创建旧版同步文件
如果是全新安装当前版本,不需要创建:
这些文件只属于旧版排序同步方案。
如果从旧版本升级并保留了历史文件,首次迁移时脚本可以读取其中的数据并转换到新格式。
十一、installation_id 不再承担 Super Sequence 设备命名职责
旧版文档曾建议把:
改成人类可读的设备名称,以便生成:
当前版本已经不再依赖这种自定义导出文件,因此 Super Sequence 本身不要求为了排序功能修改 installation_id。
如果你需要使用 Rime 自身的数据同步,仍然按照当前前端和 Rime 的正常同步方式配置即可。
不要再为了生成 sequence_设备名.txt 而专门修改 installation_id。
十二、排序位置冲突如何处理?
多个已经手动排序过的候选,有可能都希望占据相同位置。
例如曾先后把:
当前版本会先根据保存的位置和逻辑版本确定这些固定候选的处理顺序,再为发生冲突的候选寻找可用位置。
其余没有手动记录的候选,再按照原始顺序填充剩余空位。
因此,排序恢复不是简单地:
而是重新构造:
形成最终候选列表。
对普通用户而言,只需要记住:
最后一次主动调整会更新该候选自己的排序状态,普通候选仍尽量维持原有相对顺序。
十三、排序范围
当前 Super Sequence 最多对前:
个去重后的候选参与手动排序重建。
第 501 个及之后的候选不会继续载入排序表,而是保持上游顺序直接输出。
这一限制主要用于避免对极长候选流进行无边界的完整展开。
日常输入中的候选数量通常远低于这一范围,因此一般无需额外关注。
十四、为什么建议不要绑定方向键?
默认快捷键采用:
而不是直接使用:
主要是因为方向键本身经常承担:
- 候选移动
- 输入区光标移动
- 翻页
- 前端系统导航
如果改成方向键,很容易与现有 Rime 或前端操作发生职责重叠。
并非技术上绝对不能改,而是默认组合更容易与常用操作共存。
十五、自定义按键与数据库
当前 Super Sequence 对外主要提供以下配置:
super_sequence:
db_name: "lua/sequence"
up: "Control+j"
down: "Control+k"
reset: "Control+l"
pin: "Control+p"
如果需要修改,可以在 wanxiang.custom.yaml 中 Patch:
patch:
"super_sequence/db_name": "lua/sequence"
"super_sequence/up": "Control+j"
"super_sequence/down": "Control+k"
"super_sequence/reset": "Control+l"
"super_sequence/pin": "Control+p"
各参数含义:
| 参数 | 作用 | 默认值 |
|---|---|---|
db_name |
排序 UserDb 数据库名称 | lua/sequence |
up |
当前候选向前移动一位 | Control+j |
down |
当前候选向后移动一位 | Control+k |
reset |
取消当前候选手动排序 | Control+l |
pin |
当前候选置顶 | Control+p |
当前没有需要用户配置的:
这些都属于旧版同步实现,不应再写入当前配置教程。
十六、当前版本可以怎样理解?
新版 Super Sequence 的核心关系可以概括成:
重置时则是:
相比旧版自建文本同步机制,当前版本最重要的变化不是增加更多功能,而是把排序数据重新收敛到 UserDb 原生记录 + 稀疏状态 + 逻辑版本 这一套结构中。