10 KiB
10 KiB
Vim 输入法自动切换插件
English | 中文
感谢 github 中的 vim-im-switch这个项目 这个项目不能满足需求,在这个项目基础上改进。
作者:Gavin Chan
🚀 智能输入法管理工具 - 为 Vim 用户打造的无感知输入法切换体验
这是为 原生 Vim 和 Obsidian 编辑器 的 Vim 模式设计的智能输入法自动切换插件,包含:
- 🎯 Obsidian 插件:适用于 Obsidian 编辑器的 Vim 模式
- ⚡ Vim 插件:适用于原生 Vim/NeoVim 编辑器
- 🌍 跨平台支持:macOS、Linux、Windows 全平台兼容
✨ 功能亮点
- 🔄 自动切换输入法:在 Vim 的 Normal 模式和 Insert 模式之间切换时,自动切换输入法
- 🧠 智能状态记忆:记住上次 Insert 模式退出时的输入法状态,下次进入时自动恢复
- 🎭 无感知体验:完全静默切换,无 UI 闪烁或延迟
- 🌐 中英混合友好:完美支持中英文混合输入场景
- ⚡ 多重保障机制:三层检测确保切换的可靠性
核心特性
1. 模式切换自动化
- 进入 Normal 模式(按 ESC 或其他命令)→ 自动切换到英文输入法
- 进入 Insert 模式(按 i, a, o 等)→ 自动恢复上次的输入法状态
2. 输入法状态记忆
- 退出 Insert 模式时,自动检测并保存当前的输入法(中文/英文)
- 下次进入 Insert 模式时,自动恢复到上次保存的输入法状态
- 支持中英文混合输入场景
3. 智能检测机制
插件采用三重检测机制确保可靠性:
| 检测方式 | 优先级 | 说明 |
|---|---|---|
| 🎯 键盘事件监听 | 最高 | 使用事件捕获模式监听 ESC 和 Insert 按键,响应最快 |
| 🔧 CodeMirror 事件 | 中等 | 监听 vim-mode-change 事件,处理非按键触发的模式切换 |
| 🔄 定时轮询 | 兜底 | 100ms 轮询检测模式变化,作为最后保障机制 |
4. 技术特性
- ⚡ 异步处理:使用
job_start()异步执行,避免 UI 阻塞 - 🛡️ 防抖机制:100ms 防抖避免重复处理
- 🎯 事件捕获优化:使用 capture 模式确保最快响应
- 🔧 自动检测:智能检测和配置中文输入法
安装要求
macOS
-
brew install fcitx-remote-for-osx -
验证安装:
fcitx-remote -n # 应该输出当前输入法的名称,如:com.apple.keylayout.ABC
Linux
通过你的包管理器安装 fcitx:
# Ubuntu/Debian
sudo apt-get install fcitx
# Fedora
sudo dnf install fcitx
# Arch Linux
sudo pacman -S fcitx
Windows
使用项目内置的 AutoHotkey 脚本:
- 安装 AutoHotkey
- 使用项目中的
fcitx-remote.ahk脚本 - 或下载编译好的版本:fcitx-remote.exe
- 将 exe 文件放到系统 PATH 路径中
安装插件
Obsidian 插件安装
-
下载插件文件到 Obsidian 插件目录:
cd /path/to/your/vault/.obsidian/plugins/ git clone https://github.com/yourusername/vim-im-switch.git -
在 Obsidian 中启用插件:
- 打开设置 → 社区插件 → 浏览
- 找到 "Vim Input Method Switch"
- 点击启用
-
配置输入法(可选):
- 打开插件设置
- 设置英文输入法(默认:
com.apple.keylayout.ABC) - 设置中文输入法(默认:自动检测)
Vim 插件安装
-
复制插件文件到 Vim 配置目录:
mkdir -p ~/.vim/plugin cp vim-im-switch.vim ~/.vim/plugin/ -
重启 Vim,插件会自动加载
-
配置输入法(可选): 在
.vimrc中添加:" 英文输入法 ID(默认值) let g:fcitx_english_im = 'com.apple.keylayout.ABC' " 中文输入法 ID(可选,插件会自动检测) " let g:fcitx_chinese_im = 'com.tencent.inputmethod.wetype.pinyin'
使用插件管理器安装
vim-plug:
Plug 'yourusername/vim-im-switch'
Vundle:
Plugin 'yourusername/vim-im-switch'
🚀 一键部署(推荐)
使用部署脚本同时安装 Obsidian 插件和 Vim 插件:
# 克隆项目
git clone https://github.com/yourusername/vim-im-switch.git
cd vim-im-switch
# 构建并部署
npm install
./deploy.sh
💡 提示: v2.0.2 修复了终端 Vim 中的标题闪烁问题,详见 更新日志
使用方法
基本使用场景
-
中文输入:
按 i → 进入 Insert 模式 → 输入法切换到中文(如果上次是中文) 输入中文内容 按 ESC → 退出到 Normal 模式 → 输入法切换到英文 -
英文输入:
按 i → 进入 Insert 模式 → 输入法保持英文(如果上次是英文) 输入英文内容 按 ESC → 退出到 Normal 模式 → 输入法保持英文 -
中英混合:
按 i → 自动恢复上次的输入法 输入中文,然后手动切换到英文继续输入 按 ESC → 保存当前输入法状态(英文) 按 i → 自动恢复英文输入法
支持的 Vim 命令
- 进入 Insert 模式:
i,I,a,A,o,O,s,S,c,C - 退出 Insert 模式:
ESC, 以及其他触发 Normal 模式的命令
工作原理
graph TD
A[Normal 模式<br/>英文输入法] -->|按 i/a/o 等| B[检测模式切换]
B --> C[恢复上次保存的<br/>输入法状态]
C --> D[Insert 模式<br/>自动恢复的输入法:<br/>中文/英文]
D -->|按 ESC| E[保存当前输入法<br/>状态 中/英]
E --> F[切换到英文输入法]
F --> A
style A fill:#e1f5ff,stroke:#01579b,stroke-width:2px
style D fill:#fff9c4,stroke:#f57f17,stroke-width:2px
style E fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
style F fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px
插件维护一个状态机,跟踪 Vim 模式和输入法状态,在模式转换时自动切换输入法,同时保留用户偏好设置。
🔧 故障排除
快速诊断
使用内置诊断脚本:
./diagnose-im.sh
常见问题
🚫 插件没有效果
-
检查依赖:确认 fcitx-remote 是否正确安装
# macOS fcitx-remote -n # Linux which fcitx-remote # Windows fcitx-remote.exe -
检查日志:
- Obsidian: 开发者控制台 (Ctrl+Shift+I)
- Vim:
:messages命令
-
验证配置:确认输入法名称与系统设置匹配
⚠️ 输入法切换不正确
-
获取正确的输入法名称:
# 切换到中文输入法后执行 fcitx-remote -n -
手动测试:
# 切换到英文 fcitx-remote -s com.apple.keylayout.ABC # 切换到中文(替换为你的输入法名称) fcitx-remote -s com.tencent.inputmethod.wetype.pinyin -
检查冲突:暂时禁用其他 Vim 插件测试
🐛 其他问题
- 权限问题:确保 fcitx-remote 有执行权限
- 路径问题:检查 fcitx-remote 是否在 PATH 中
- 版本兼容:确认 Vim 版本支持
job_start()(Vim 8+)
🛠️ 开发指南
环境要求
- Node.js 14+
- TypeScript 4.2+
- Rollup (构建工具)
构建项目
# 安装依赖
npm install
# 开发模式(监听文件变化)
npm run dev
# 生产构建
npm run build
项目结构
vim-im-switch/
├── main.ts # Obsidian 插件主文件
├── vim-im-switch.vim # Vim 插件文件
├── fcitx-remote.ahk # Windows 支持脚本
├── fcitx-remote-for-osx/ # macOS 支持工具
├── deploy.sh # 一键部署脚本
├── diagnose-im.sh # 诊断脚本
└── vim-im-switch-plugin/ # 构建输出目录
调试方法
Obsidian 插件调试
插件会在控制台输出关键日志:
🚀 [VimIMSwitch] Loading plugin...
🔤 [VimIMSwitch] ESC → English (saved Chinese)
🈳 [VimIMSwitch] → Chinese
❌ [VimIMSwitch] Error: ...
Vim 插件调试
" 查看插件消息
:messages
" 检查插件是否加载
:echo exists('g:fcitx_remote')
" 手动测试函数
:call Fcitx2en()
:call Fcitx2zh()
贡献指南
- Fork 项目
- 创建功能分支:
git checkout -b feature/amazing-feature - 提交更改:
git commit -m 'Add amazing feature' - 推送分支:
git push origin feature/amazing-feature - 提交 Pull Request
📋 版本历史
| 版本 | 日期 | 主要更新 |
|---|---|---|
| v2.0.3 | 2025-11-09 | 修复 Normal 模式 ESC 键问题 |
| v2.0.2 | 2025-11-04 | 修复终端兼容性问题 |
| v2.0.0 | 2025-11-04 | 新增 Vim 原生插件支持 |
| v1.0.8 | 2025-01-04 | 智能状态记忆功能 |
| v1.0.0 | 2024-06-01 | 首次发布 |
查看 完整更新日志 获取详细的版本更新历史。
🔗 相关链接
- 📖 English Documentation
- 📝 更新日志
- 🛠️ fcitx-remote-for-osx
- 🐛 [问题反馈](https://github.com/yourusername/vim-im-switch
🙏 致谢
感谢以下项目和贡献者:
- fcitx-remote-for-osx - macOS 输入法控制工具
- Obsidian - 强大的知识管理工具
- Vim / NeoVim - 经典的文本编辑器
如果这个项目对你有帮助,请给个 ⭐ Star!
Made with ❤️ for Vim users