* feat(windows): add opt-in per-app Vim Escape mode * fix(windows): 改用 config.toml 的 vim_mode_apps 并移除 yaml-cpp TSF DLL 会注入所有宿主进程,约定保持 /Zc:threadSafeInit- 且不加全局构造器; yaml-cpp 带命名空间级 std::string 数组和线程安全局部静态,违背这一约定。 配置改为 [input] vim_mode_apps = [...],由 DLL 内的小型解析器读取, 沿用 config.toml 的时间戳缓存;键写入出厂模板与工作配置,升级合并保留用户值。 --------- Co-authored-by: fanlusky <1730976608@qq.com>
2.9 KiB
2.9 KiB
Vim 模式:按应用在 Esc 后切换英文
在 Vim 或启用 Vim 插件的编辑器中,中文输入完成后按 Esc,编辑器可以正常回到 normal 模式,但水杉仍停留在中文状态。可按应用启用 Vim 模式,让这次 Esc 同时将水杉切到英文,随后直接输入 hjkl 等命令。
在数据目录的 config.toml(默认 %LOCALAPPDATA%\metasequoiaime\config.toml,安装时若选了别的位置就在那里;METASEQUOIA_IME_DATA_DIR 环境变量优先)的 [input] 段填写要启用的应用:
[input]
# 可执行文件名,不填写路径;ASCII 大小写不敏感。
vim_mode_apps = ["Code.exe", "gvim.exe"]
出厂值是空列表,即默认关闭。这个键在出厂配置模板里,升级合并会保留你填写的值。
配置修改通常在下一次 Esc 时生效,文件检查间隔最长一秒,无需重新部署或重启编辑器。从列表中删除应用或改回 [] 即可关闭。列表格式无效(不是字符串数组、缺逗号、未闭合等)时整项视为关闭,保留现有按键行为。
行为约定:
- 保留现有的 Esc 处理及透传判定,只在 Esc 已决定交给应用时切换到水杉的英文状态。不会切换系统输入法。
- 未完成拼音或候选仍按现有逻辑由 Esc 取消;取消后重新按一次 Esc 才会切英文。长按 Esc 的重复事件不触发切换。
- 有待处理的异步按键时不抢先切换,避免改变队列中输入的含义。
- Shift/Ctrl/Alt/Win + Esc 不触发;进入 insert 模式时也不自动恢复中文。
- 只按宿主进程匹配;例如 VS Code 的所有窗口都属于
Code.exe,无法区分其中是否启用了 Vim 插件。终端内的 Vim 需要配置终端宿主,终端中的其他程序也会受影响。 - 切换中英文及标点沿用现有 compartment 通路和标点锁定配置。
input.ime_mode_scope = "global"时,英文状态也会同步到其他应用;需要应用间独立状态时使用"app"。
手工验证:
- 在已配置的编辑器中切到中文,输入并提交中文;按 Esc 后编辑器进入 normal 模式、水杉进入英文状态,再按
hjkl应执行移动。 - 输入尚未提交的拼音,按 Esc 应保留原有取消输入行为;释放后再次按 Esc 才切英文。长按第一次 Esc 不应触发切换。
- 在未配置的应用、关闭配置后及使用带修饰键的 Esc 时,确认原有行为不变。
- 修改配置并等待一秒,确认无需重启即可启停;检查默认数据目录和非 ASCII 的自定义数据目录。
- 验证 Server 重启、失焦/回焦、中文/英文标点锁定、
app/global状态范围,以及不先调用OnTestKeyDown的宿主路径。
自动回归目标 vim_mode 验证 vim_mode_apps 解析、按应用匹配、无效配置和按键策略。真实宿主的 normal/insert 状态和 TSF 回调顺序仍需按以上步骤验证。