* 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>
35 lines
2.9 KiB
Markdown
35 lines
2.9 KiB
Markdown
# Vim 模式:按应用在 Esc 后切换英文
|
|
|
|
在 Vim 或启用 Vim 插件的编辑器中,中文输入完成后按 Esc,编辑器可以正常回到 normal 模式,但水杉仍停留在中文状态。可按应用启用 Vim 模式,让这次 Esc 同时将水杉切到英文,随后直接输入 `hjkl` 等命令。
|
|
|
|
在数据目录的 `config.toml`(默认 `%LOCALAPPDATA%\metasequoiaime\config.toml`,安装时若选了别的位置就在那里;`METASEQUOIA_IME_DATA_DIR` 环境变量优先)的 `[input]` 段填写要启用的应用:
|
|
|
|
```toml
|
|
[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"`。
|
|
|
|
手工验证:
|
|
|
|
1. 在已配置的编辑器中切到中文,输入并提交中文;按 Esc 后编辑器进入 normal 模式、水杉进入英文状态,再按 `hjkl` 应执行移动。
|
|
2. 输入尚未提交的拼音,按 Esc 应保留原有取消输入行为;释放后再次按 Esc 才切英文。长按第一次 Esc 不应触发切换。
|
|
3. 在未配置的应用、关闭配置后及使用带修饰键的 Esc 时,确认原有行为不变。
|
|
4. 修改配置并等待一秒,确认无需重启即可启停;检查默认数据目录和非 ASCII 的自定义数据目录。
|
|
5. 验证 Server 重启、失焦/回焦、中文/英文标点锁定、`app` / `global` 状态范围,以及不先调用 `OnTestKeyDown` 的宿主路径。
|
|
|
|
自动回归目标 `vim_mode` 验证 `vim_mode_apps` 解析、按应用匹配、无效配置和按键策略。真实宿主的 normal/insert 状态和 TSF 回调顺序仍需按以上步骤验证。
|