update at 2026-07-15 11:10:25

This commit is contained in:
douboer
2026-07-15 11:10:25 +08:00
parent aeade0f813
commit 0adb4b88c5
8 changed files with 402 additions and 523 deletions

View File

@@ -1,118 +1,87 @@
# 项目文件对比
# 项目实现对比
## 新增文件(使用 im-select 版本)
本项目当前包含两套相关但独立的输入法切换实现:
| 文件 | 大小 | 说明 |
|--------|------|------|
| `vim-im-switch-select.vim` | 4.5KB | 主插件文件(使用 im-select |
| `test-im-select.sh` | 2.2KB | 自动化测试脚本 |
| `run-vim-test.sh` | 665B | Vim 交互测试脚本 |
| `test-im-switch.txt` | 316B | 测试文件 |
| `README-im-select.md` | 5.8KB | 详细说明文档 |
| 实现 | 文件 | 当前角色 | 主要切换方式 |
|---|---|---|---|
| 原生 Vim 插件 | `vim-im-switch-select.vim` | 当前 macOS 原生 Vim 稳定方案 | Hammerspoon 优先,`im-select` fallback |
| Obsidian 插件 | `main.ts` | Obsidian Vim keymap 输入法切换 | `fcitx-remote` |
## 核心差异对比
## 原生 Vim 插件
### vim-im-switch.vim (原版 - fcitx-remote)
`vim-im-switch-select.vim` 面向 macOS 原生 Vim。
```vim
" 使用 fcitx-remote
executable("fcitx-remote")
system("fcitx-remote -n")
fcitx-remote -s <IM_ID>
当前稳定策略:
" 变量和函数
g:fcitx_*
Fcitx*()
- 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
```
### vim-im-switch-select.vim (新版 - im-select)
表现为菜单栏显示中文输入法,但实际仍输入英文。
```vim
" 使用 im-select
executable("im-select")
system("im-select")
im-select <IM_ID>
Hammerspoon 的 `setLayout()` / `setMethod()` 能直接设置 layout / method因此是当前主路径。
" 变量和函数
g:imselect_*
IMSelect*()
```
## Obsidian 插件
## 功能完全一致
`main.ts` 是 Obsidian 插件入口。本次 Hammerspoon 方案没有改造 Obsidian 插件。
✅ 自动切换输入法
✅ 智能状态记忆
✅ 异步处理
✅ 中英混合友好
✅ 多光标支持
✅ 防抖机制
当前 Obsidian 插件仍然:
## 测试验证
- 使用 `fcitx-remote` 查询和切换输入法。
- 监听 Obsidian / CodeMirror Vim 模式变化。
- Normal / Visual 模式切英文。
- Insert / Replace 模式恢复上次 Insert 状态。
- 通过插件设置页配置不同平台的 `fcitx-remote` 路径。
### 1. im-select 基础功能测试
```bash
./test-im-select.sh
```
结果:✅ 所有测试通过
- ✓ im-select 可执行
- ✓ 获取当前输入法
- ✓ 切换到英文
- ✓ 恢复原输入法
- ✓ 插件文件完整9个函数
## 行为对比
### 2. Vim 插件集成测试
```bash
./run-vim-test.sh
```
手动测试步骤:
1. 进入 Insert 模式 → 输入法状态保持
2. 切换到中文输入 → 输入中文内容
3. ESC 退出 → 自动切换到英文
4. 再次 i 进入 → 自动恢复中文输入法
| 场景 | 原生 Vim 插件 | Obsidian 插件 |
|---|---|---|
| Normal / Esc | Hammerspoon `setLayout("ABC")`fallback `im-select` | `fcitx-remote -s <English IM>` |
| Insert 中文恢复 | Hammerspoon `setMethod("Pinyin Simplified")`fallback `im-select` | `fcitx-remote -s <Chinese IM>` |
| Insert 状态记忆 | 同一 Vim 进程内有效 | Obsidian 插件运行期间有效 |
| 跨进程/重启持久化 | 不持久化 | 由 Obsidian 插件运行状态决定 |
| 最近 Hammerspoon 调整影响 | 是 | 否 |
## 使用建议
## 主要文件
### 场景 1macOS 用户,已安装 fcitx-remote-for-osx
- 使用 `vim-im-switch.vim`(原版)
### 场景 2macOS 用户,使用 im-select
- 使用 `vim-im-switch-select.vim`(新版)
### 场景 3Linux 用户
- 使用 `vim-im-switch.vim`(原版,配合 fcitx
### 场景 4想要更轻量的方案
- 使用 `vim-im-switch-select.vim`
- 项目已包含 im-select 可执行文件
- 无需额外安装 fcitx-remote
## 安装方法
```bash
# 方法 1复制到 Vim 插件目录
cp vim-im-switch-select.vim ~/.vim/plugin/
# 方法 2在 .vimrc 中 source
echo "source $(pwd)/vim-im-switch-select.vim" >> ~/.vimrc
# 方法 3确保 im-select 在 PATH 中
sudo cp im-select /usr/local/bin/
chmod +x /usr/local/bin/im-select
```
## 配置示例
```vim
" 在 .vimrc 中添加
let g:imselect_english_im = 'com.apple.keylayout.ABC'
let g:imselect_chinese_im = 'com.apple.inputmethod.SCIM.ITABC'
```
| 文件 | 说明 |
|---|---|
| `vim-im-switch-select.vim` | 当前原生 Vim 稳定插件 |
| `main.ts` | Obsidian 插件入口 |
| `README.md` | 中文说明文档 |
| `README_en.md` | English documentation |
| `CHANGELOG.md` / `CHANGELOG_en.md` | 更新日志 |
| `RELEASE.md` | 发布说明 |
## 总结
**vim-im-switch-select.vim 已创建成功**
**逻辑与原版完全相同**
**所有测试通过**
**文档齐全**
当前推荐:
可以立即投入使用!
- 原生 Vim使用 `vim-im-switch-select.vim`Hammerspoon 优先,`im-select` fallback。
- Obsidian继续使用现有 `main.ts` 插件逻辑,保持 `fcitx-remote` 路径。
两者目标相同,但实现路径不同;不要把原生 Vim 的 Hammerspoon 调整误认为 Obsidian 插件也已改造。