Files
vim-im-switch/README.md
2025-11-11 18:14:34 +08:00

10 KiB
Raw Permalink Blame History

Vim 输入法自动切换插件

Version Platform License

English | 中文

感谢 github 中的 vim-im-switch这个项目 这个项目不能满足需求,在这个项目基础上改进。

作者Gavin Chan

🚀 智能输入法管理工具 - 为 Vim 用户打造的无感知输入法切换体验

这是为 原生 VimObsidian 编辑器 的 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

  1. 安装 fcitx-remote-for-osx:

    brew install fcitx-remote-for-osx
    
  2. 验证安装:

    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 脚本:

  1. 安装 AutoHotkey
  2. 使用项目中的 fcitx-remote.ahk 脚本
  3. 或下载编译好的版本:fcitx-remote.exe
  4. 将 exe 文件放到系统 PATH 路径中

安装插件

Obsidian 插件安装

  1. 下载插件文件到 Obsidian 插件目录:

    cd /path/to/your/vault/.obsidian/plugins/
    git clone https://github.com/yourusername/vim-im-switch.git
    
  2. 在 Obsidian 中启用插件:

    • 打开设置 → 社区插件 → 浏览
    • 找到 "Vim Input Method Switch"
    • 点击启用
  3. 配置输入法(可选):

    • 打开插件设置
    • 设置英文输入法(默认:com.apple.keylayout.ABC
    • 设置中文输入法(默认:自动检测)

Vim 插件安装

  1. 复制插件文件到 Vim 配置目录:

    mkdir -p ~/.vim/plugin
    cp vim-im-switch.vim ~/.vim/plugin/
    
  2. 重启 Vim插件会自动加载

  3. 配置输入法(可选): 在 .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 中的标题闪烁问题,详见 更新日志

使用方法

基本使用场景

  1. 中文输入

    按 i → 进入 Insert 模式 → 输入法切换到中文(如果上次是中文)
    输入中文内容
    按 ESC → 退出到 Normal 模式 → 输入法切换到英文
    
  2. 英文输入

    按 i → 进入 Insert 模式 → 输入法保持英文(如果上次是英文)
    输入英文内容
    按 ESC → 退出到 Normal 模式 → 输入法保持英文
    
  3. 中英混合

    按 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

常见问题

🚫 插件没有效果

  1. 检查依赖:确认 fcitx-remote 是否正确安装

    # macOS
    fcitx-remote -n
    
    # Linux
    which fcitx-remote
    
    # Windows
    fcitx-remote.exe
    
  2. 检查日志

    • Obsidian: 开发者控制台 (Ctrl+Shift+I)
    • Vim: :messages 命令
  3. 验证配置:确认输入法名称与系统设置匹配

⚠️ 输入法切换不正确

  1. 获取正确的输入法名称

    # 切换到中文输入法后执行
    fcitx-remote -n
    
  2. 手动测试

    # 切换到英文
    fcitx-remote -s com.apple.keylayout.ABC
    
    # 切换到中文(替换为你的输入法名称)
    fcitx-remote -s com.tencent.inputmethod.wetype.pinyin
    
  3. 检查冲突:暂时禁用其他 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()

贡献指南

  1. Fork 项目
  2. 创建功能分支:git checkout -b feature/amazing-feature
  3. 提交更改:git commit -m 'Add amazing feature'
  4. 推送分支:git push origin feature/amazing-feature
  5. 提交 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 首次发布

查看 完整更新日志 获取详细的版本更新历史。

🔗 相关链接

🙏 致谢

感谢以下项目和贡献者:


如果这个项目对你有帮助,请给个 Star

Made with ❤️ for Vim users