UnimeType 把三类对象分开:
- 捕获文本: 从宿主或本地键入缓冲读取的文本。
- 请求文本: 应用本地保护后的捕获正文。
- 写回文本: 保留前缀 + 模型输出 + 保留后缀。
每次可转换捕获都满足 捕获文本 = 保留前缀 + 请求正文 + 保留后缀。光标与并发编辑检查使用完整捕获宿主范围,而不是请求正文的相对范围。
捕获顺序
Convert
- 使用非空选区。Convert 从请求正文去掉外侧空白,但写回范围仍是精确选区。外侧空白按字节还原,选中的结构标记仍属于请求正文。
- 在 Terminal、Ghostty、VS Code 或 VS Code Insiders 中,若键入缓冲可用且光标折叠,使用当前本地键入缓冲。
- 否则读取包含光标的完整段落。若本地键入缓冲与光标前宿主文本逐字节匹配,则只转换该缓冲,并把段落作为只读上下文。段中与段末同样适用。
- 若段落不可用,使用当前键入缓冲。
- 若无来源,报告 无可转换输入。
Polish 与 Explain
- 使用精确非空选区(含外侧空白)。
- 否则捕获光标所在句子。句子分隔符为
。!?.!?与换行。 - 若句子不可用,使用当前键入缓冲。
段落与结构边界
硬换行定义段落边界;软换行不算。边界换行从不进入自动写回范围。
自动 Convert 捕获时,UnimeType 保留外侧空白,并从请求正文去掉这些结构前缀:
- Markdown 标题,如
## - 引用,如
> - 有序与无序列表标记
- 任务框,如
[ ]与[x]
自动捕获与显式 Convert 选区的外侧空白不发给模型,但留在完整写回信封中并按字节还原。Convert 不会剥掉选中的结构前缀。Polish 与 Explain 保持显式选区完全一致。
已接受段落与追加文字
段落写回校验成功后,UnimeType 记住结果文本、起始范围与宿主客户端。若同一段落仍以该已接受文本开头且用户追加文字,下一次 Convert 只发送新后缀,并附带最多 100 个前置字符作为只读上下文。
若当前段落不再以已接受文本开头,则再次发送完整段落正文。当本地缓冲只能校验新后缀时,写回只删除并替换该后缀,保留宿主中的已接受前缀。
示例(示意)
- 成功转换整段。
- 在段末继续输入拉丁文本。
- 再次 Convert — 在已接受前缀仍匹配时,只请求新后缀并带有限前文。
键入缓冲失效
客户端切换、动作菜单外的指针输入、换行、导航或焦点键、Command/Control 编辑命令、Option-Backspace、不可跟踪按键、输入法停用,或动作完成/未改变,都会清空本地缓冲。普通 Backspace 删除最后一个缓冲字符。
写回前,UnimeType 检查捕获宿主范围或键入缓冲世代是否仍未变。不匹配则报告 文本已更改 并阻止写回。
macOS 上的宿主捕获偏好见 Mac 应用兼容性。