update at 2025-12-05 13:34:29

This commit is contained in:
douboer@gmail.com
2025-12-05 13:34:29 +08:00
parent adc2cc6977
commit 8377047a36
6 changed files with 634 additions and 0 deletions

262
README-im-select.md Normal file
View File

@@ -0,0 +1,262 @@
# vim-im-switch-select.vim
> 使用 `im-select` 而不是 `fcitx-remote` 的 Vim 输入法自动切换插件
## 概述
`vim-im-switch-select.vim``vim-im-switch.vim` 的变体版本,使用 `im-select` 工具而不是 `fcitx-remote` 来控制输入法切换。
## 主要区别
| 特性 | vim-im-switch.vim | vim-im-switch-select.vim |
|------|------------------|-------------------------|
| 输入法工具 | fcitx-remote | im-select |
| 适用平台 | macOS, Linux | 主要是 macOS |
| 获取当前输入法 | `fcitx-remote -n` | `im-select` |
| 切换输入法 | `fcitx-remote -s <IM>` | `im-select <IM>` |
| 全局变量前缀 | `g:fcitx_*` | `g:imselect_*` |
| 函数前缀 | `Fcitx*` | `IMSelect*` |
## 功能特性
**自动切换输入法**:在 Normal 模式和 Insert 模式之间切换时自动切换输入法
**智能状态记忆**:记住上次 Insert 模式的输入法状态,下次自动恢复
**异步处理**:使用 `job_start()` 异步执行,避免 UI 阻塞
**中英混合友好**:完美支持中英文混合输入场景
## 安装要求
### 1. 安装 im-select
本项目已经包含了 `im-select` 可执行文件(适用于 macOS ARM64
如果你需要其他版本,可以从这里获取:
- [im-select GitHub](https://github.com/daipeihust/im-select)
或者使用项目中的 `im-select` 文件:
```bash
# 确保 im-select 有执行权限
chmod +x /path/to/vim-im-switch/im-select
# 将 im-select 添加到 PATH可选
sudo cp /path/to/vim-im-switch/im-select /usr/local/bin/
```
### 2. 验证 im-select 安装
```bash
# 如果在项目目录中
./im-select
# 如果在 PATH 中
im-select
```
应该输出当前的输入法名称,例如:
```
com.apple.keylayout.ABC
```
## 安装插件
### 方法 1复制到 Vim 插件目录
```bash
mkdir -p ~/.vim/plugin
cp vim-im-switch-select.vim ~/.vim/plugin/
```
### 方法 2在 .vimrc 中 source
```vim
" 在 .vimrc 中添加
source /Users/gavin/vim-im-switch/vim-im-switch-select.vim
```
### 方法 3使用插件管理器
**vim-plug**:
```vim
Plug 'yourusername/vim-im-switch', { 'rtp': 'vim-im-switch-select.vim' }
```
## 配置
`.vimrc` 中添加配置(可选):
```vim
" 英文输入法 ID默认值
let g:imselect_english_im = 'com.apple.keylayout.ABC'
" 中文输入法 ID可选插件会自动检测
" 例如:搜狗输入法
" let g:imselect_chinese_im = 'com.sogou.inputmethod.sogou'
" 例如:系统自带简体拼音
" let g:imselect_chinese_im = 'com.apple.inputmethod.SCIM.ITABC'
```
### 如何获取输入法 ID
```bash
# 切换到你想要的输入法,然后运行:
./im-select
# 或
im-select
```
常见的输入法 ID
- 美国英文:`com.apple.keylayout.ABC`
- 简体拼音:`com.apple.inputmethod.SCIM.ITABC`
- 搜狗输入法:`com.sogou.inputmethod.sogou`
- 百度输入法:`com.baidu.inputmethod.BaiduIM.pinyin`
- 微信输入法:`com.tencent.inputmethod.wetype.pinyin`
## 使用方法
插件安装后会自动工作,无需手动操作:
1. **进入 Insert 模式** (`i`, `a`, `o` 等)
- 自动恢复上次保存的输入法状态
2. **退出 Insert 模式** (`ESC`)
- 保存当前输入法状态
- 自动切换到英文输入法
3. **中英文混合输入**
- 插件会记住你每次退出 Insert 模式时的输入法
- 下次进入时自动恢复
## 测试
### 运行自动化测试
```bash
# 测试 im-select 功能
./test-im-select.sh
# 在 Vim 中测试插件
./run-vim-test.sh
```
### 手动测试步骤
1. 启动 Vim 并打开测试文件:
```bash
vim test-im-switch.txt
```
2. 按 `i` 进入 Insert 模式
3. 切换到中文输入法,输入一些中文
4. 按 `ESC` 退出到 Normal 模式
- 观察输入法是否切换到英文
5. 再次按 `i` 进入 Insert 模式
- 观察输入法是否自动恢复到中文
6. 在 Insert 模式下,手动切换到英文输入法,输入一些英文
7. 按 `ESC` 退出到 Normal 模式
8. 再次按 `i` 进入 Insert 模式
- 观察输入法是否保持英文
## 调试
### 查看插件是否加载
```vim
:echo exists('g:imselect_loaded')
" 应该输出 1
```
### 查看保存的输入法状态
```vim
:echo g:imselect_last_insert_im_name
" 输出上次 Insert 模式的输入法名称
```
### 手动测试函数
```vim
" 切换到英文
:call IMSelect2en()
" 恢复输入法
:call IMSelect2zh()
```
### 查看 Vim 消息
```vim
:messages
```
## 故障排除
### 插件没有效果
1. **检查 im-select 是否可执行**
```bash
which im-select
# 或
ls -l ./im-select
```
2. **检查 Vim 版本是否支持 job_start()**
```vim
:echo has('job')
" 应该输出 1
```
3. **检查是否有错误消息**
```vim
:messages
```
### 输入法切换延迟
- 这是正常的,因为使用了异步处理
- 通常延迟小于 100ms不影响使用
### 输入法 ID 不正确
```bash
# 切换到你的中文输入法,然后运行:
./im-select
# 将输出的 ID 配置到 .vimrc
let g:imselect_chinese_im = '你的输入法ID'
```
## 与原版的兼容性
`vim-im-switch-select.vim` 和 `vim-im-switch.vim` 可以共存,但不建议同时使用。它们使用不同的:
- 全局变量名(`g:imselect_*` vs `g:fcitx_*`
- 函数名(`IMSelect*` vs `Fcitx*`
- 自动命令组名(`IMSelect` vs `Fcitx`
## 文件清单
- `vim-im-switch-select.vim` - 插件主文件
- `im-select` - im-select 可执行文件macOS ARM64
- `test-im-select.sh` - 自动化测试脚本
- `run-vim-test.sh` - Vim 交互测试脚本
- `test-im-switch.txt` - 测试文件
- `README-im-select.md` - 本说明文件
## 参考链接
- [im-select GitHub](https://github.com/daipeihust/im-select)
- [原版 vim-im-switch 项目](https://github.com/yourusername/vim-im-switch)
## 许可证
MIT License
---
**如有问题或建议,欢迎提交 Issue**