# 项目实现对比 本项目当前包含两套相关但独立的输入法切换实现: | 实现 | 文件 | 当前角色 | 主要切换方式 | |---|---|---|---| | 原生 Vim 插件 | `vim-im-switch-select.vim` | 当前 macOS 原生 Vim 稳定方案 | Hammerspoon 优先,`im-select` fallback | | Obsidian 插件 | `main.ts` | Obsidian Vim keymap 输入法切换 | `fcitx-remote` | ## 原生 Vim 插件 `vim-im-switch-select.vim` 面向 macOS 原生 Vim。 当前稳定策略: - Normal / Esc:切到英文 `ABC`。 - Insert:恢复同一 Vim 进程内上次 Insert 使用的中/英状态。 - 首次进入 Insert 默认中文。 - 优先使用 Hammerspoon: ```lua hs.keycodes.setLayout("ABC") hs.keycodes.setMethod("Pinyin – Simplified") ``` - 当 `hs` 不可用时,fallback 到 `im-select`: ```bash im-select com.apple.keylayout.ABC im-select com.apple.inputmethod.SCIM.ITABC ``` ### 为什么不再只依赖 im-select `im-select` 只能切换 macOS input source ID。Apple 拼音可能出现以下不一致状态: ```text sourceID = com.apple.inputmethod.SCIM.ITABC layout = ABC method = Pinyin – Simplified ``` 表现为菜单栏显示中文输入法,但实际仍输入英文。 Hammerspoon 的 `setLayout()` / `setMethod()` 能直接设置 layout / method,因此是当前主路径。 ## Obsidian 插件 `main.ts` 是 Obsidian 插件入口。本次 Hammerspoon 方案没有改造 Obsidian 插件。 当前 Obsidian 插件仍然: - 使用 `fcitx-remote` 查询和切换输入法。 - 监听 Obsidian / CodeMirror Vim 模式变化。 - Normal / Visual 模式切英文。 - Insert / Replace 模式恢复上次 Insert 状态。 - 通过插件设置页配置不同平台的 `fcitx-remote` 路径。 ## 行为对比 | 场景 | 原生 Vim 插件 | Obsidian 插件 | |---|---|---| | Normal / Esc | Hammerspoon `setLayout("ABC")`,fallback `im-select` | `fcitx-remote -s ` | | Insert 中文恢复 | Hammerspoon `setMethod("Pinyin – Simplified")`,fallback `im-select` | `fcitx-remote -s ` | | Insert 状态记忆 | 同一 Vim 进程内有效 | Obsidian 插件运行期间有效 | | 跨进程/重启持久化 | 不持久化 | 由 Obsidian 插件运行状态决定 | | 最近 Hammerspoon 调整影响 | 是 | 否 | ## 主要文件 | 文件 | 说明 | |---|---| | `vim-im-switch-select.vim` | 当前原生 Vim 稳定插件 | | `main.ts` | Obsidian 插件入口 | | `README.md` | 中文说明文档 | | `README_en.md` | English documentation | | `CHANGELOG.md` / `CHANGELOG_en.md` | 更新日志 | | `RELEASE.md` | 发布说明 | ## 总结 当前推荐: - 原生 Vim:使用 `vim-im-switch-select.vim`,Hammerspoon 优先,`im-select` fallback。 - Obsidian:继续使用现有 `main.ts` 插件逻辑,保持 `fcitx-remote` 路径。 两者目标相同,但实现路径不同;不要把原生 Vim 的 Hammerspoon 调整误认为 Obsidian 插件也已改造。