# 更新日志 本文档记录了 Vim 输入法自动切换插件的所有重要变更。 包含 Obsidian 插件和 Vim 插件两个版本的更新历史。 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/), 版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 [English](./CHANGELOG_en.md) | 中文 --- ## [2.0.0] - 2025-11-04 ### 新增功能 #### Vim 原生插件支持 - **新增 fcitx-osx.vim 插件**:为原生 Vim/NeoVim 编辑器提供输入法自动切换功能 - **智能输入法状态记忆**: - 记住退出 Insert 模式时的输入法(中文/英文) - 下次进入 Insert 模式时自动恢复上次的输入法状态 - 完全无感知切换,无任何 UI 闪烁 - **使用 fcitx-remote -s 命令**: - 通过指定输入法 ID 进行精确切换 - 替代原有的 `-c`/`-o` 开关命令 - 支持自定义英文和中文输入法 ID - **异步执行优化**: - 使用 Vim 8+ 的 `job_start()` 异步执行命令 - 完全消除输入法切换时的 UI 闪烁和延迟 - 向后兼容旧版本 Vim(使用后台进程) #### 部署脚本增强 - **deploy.sh 更新**:一键部署 Obsidian 插件和 Vim 插件 - 自动创建 `~/.vim/plugin/` 目录 - 同时复制两个插件到各自的目标位置 ### 改进 #### Vim 插件性能优化 - 使用 `fcitx-remote -n` 获取当前输入法名称 - 保存完整的输入法 ID 而不是简单的开关状态 - 避免不必要的输入法切换(相同输入法时跳过) - 所有输出重定向到 `/dev/null`,确保静默执行 ### Bug 修复 - 修复 Vim 插件中 `fcitx-remote -c` 命令不生效的问题 - 修复标题栏显示 "fcitx-remote" 的闪烁问题 - 修复字符串比较失败(`"2\n" == 2`)的问题 ### 文档更新 - 更新 README.md 和 README_en.md,添加 Vim 插件安装说明 - 更新所有文档标题,从 "Obsidian" 改为包含两个插件的描述 - 添加 Vim 插件配置说明和调试方法 --- ## [2.0.2] - 2025-11-04 ### 修复 - 终端兼容性:修复在 macOS 终端(vi/vim)中按 ESC 时,子进程输出导致标题栏短暂闪烁的问题(使用 nohup/background 方式彻底静默化命令执行) - 兼容性:移除 `job_start(..., {'detach': v:true})` 不兼容选项,改以更通用的后台执行方式 ### 文档 - 补充 RELEASE/README 中关于终端下行为的说明 --- ## [1.0.8] - 2025-01-04 这是一个重大更新版本,引入了输入法状态记忆功能,并修复了多个关键问题。 ### 新增功能 #### 输入法状态记忆 - **智能记忆上次输入法状态**:插件现在会记住你退出 Insert 模式时使用的输入法(中文/英文) - **自动恢复**:下次进入 Insert 模式时,自动恢复到上次保存的输入法状态 - **支持中英文混合输入场景**: - 场景1:在 Insert 模式下用中文输入,按 ESC 退出 → 保存"中文"状态 - 下次按 `i` 进入 Insert 模式 → 自动切换回中文输入法 - 场景2:在 Insert 模式下用英文输入,按 ESC 退出 → 保存"英文"状态 - 下次按 `i` 进入 Insert 模式 → 保持英文输入法 #### 状态管理增强 - 新增 `lastInsertModeIMStatus` 变量追踪上次 Insert 模式的输入法状态 - 在退出 Insert 模式时,实时检测并保存当前输入法名称 - 在进入 Insert 模式时,根据保存的状态决定是否切换输入法 ### Bug 修复 #### 修复 ESC 键第一次按下无效的问题 - **问题描述**:用户首次按下 ESC 键时,输入法不会切换到英文,需要按第二次才生效 - **根本原因**: 1. 键盘事件监听器注册太晚(在 `onload()` 之后) 2. Obsidian 的 Vim 模式在 ESC 事件到达我们的监听器之前就已经处理完毕 3. 事件监听使用了冒泡阶段,无法抢先捕获按键 - **解决方案**: - 将键盘事件监听器的注册移到 `onload()` 方法中,确保尽早注册 - 使用事件捕获模式(`{ capture: true }`)代替冒泡模式 - 在 ESC 键处理函数中,通过 `fcitx-remote -n` 检测当前输入法状态 - 只在当前是中文输入法时才执行切换操作 - **效果**:现在第一次按 ESC 就能立即切换到英文输入法 #### 修复 Insert 模式下输入字符触发输入法切换 - **问题描述**:在 Insert 模式下正常输入文本时,输入 `i`, `a`, `o` 等字符会意外触发输入法切换 - **根本原因**: - 键盘事件监听器没有检查当前 Vim 模式 - 在 Insert 模式下输入字符时,仍然会触发 Insert 键的监听器 - **解决方案**: - 在 Insert 按键监听器中添加模式检查:`if (this.currentVimMode !== 'normal') return;` - 只在 Normal 模式下才响应 Insert 按键 - 在 Insert 模式下,字符输入不会触发任何输入法切换逻辑 - **效果**:在 Insert 模式下正常输入文本不会被干扰 ### 性能优化 #### 使用事件捕获模式提高响应速度 - **改进点**: - 使用 `addEventListener('keydown', handler, { capture: true })` 代替默认的冒泡模式 - 在事件处理链的最早阶段捕获按键 - 减少了 Obsidian Vim 模式处理与插件处理之间的时间差 - **优势**: - ESC 键响应更快,几乎没有延迟 - 输入法切换更加流畅自然 - 减少了状态不一致的可能性 #### 优化输入法检测逻辑 - **改进点**: - 在 ESC 键处理时,先检测当前输入法再决定是否切换 - 避免不必要的 `fcitx-remote` 调用 - 减少了 10-20ms 的处理时间 - **效果**: - 当前已经是英文输入法时,不会重复切换 - 降低了系统资源占用 ### 代码清理 #### 移除冗余代码 - **删除内容**: - 移除了 `testVimModeSimulation()` 测试函数(约20行) - 移除了 `testCurrentVimMode()` 测试函数(约15行) - 移除了测试命令的注册代码 - 删除了全局键盘监听的遗留代码 - **影响**: - 减少了约 50 行未使用的代码 - 降低了插件体积约 2KB - 提高了代码可维护性 #### 简化日志输出 - **改进前**:每个事件都有详细的调试日志,包括: ``` Current IM: xxx Entering insert mode... Vim mode: xxx Saved IM status: xxx Detected ESC key press Insert key pressed: i ``` - **改进后**:只保留关键的状态转换日志: ``` Loading plugin... ESC → English (saved Chinese) → Chinese Error: xxx ``` - **优势**: - 减少了 70% 的控制台输出 - 日志更加清晰,易于查看关键信息 - 不影响问题排查(错误日志仍然详细) #### 代码结构优化 - **改进内容**: - 简化了 `onunload()` 方法,移除冗余的 try-catch - 统一了错误处理格式 - 改进了代码注释的清晰度 - 优化了函数命名的一致性 - **效果**: - 代码更易读易懂 - 降低了未来维护成本 ### 技术改进 #### 多重检测机制 插件现在使用三重检测机制确保可靠性: 1. **键盘事件监听(主要)** - 使用 `capture` 模式监听 ESC 和 Insert 按键 - 在事件处理链的最早阶段捕获 - 优先级最高,响应最快 2. **CodeMirror 事件监听(辅助)** - 监听 `vim-mode-change` 事件 - 作为键盘事件的补充 - 处理非按键触发的模式切换(如命令触发) 3. **定时轮询(兜底)** - 每 100ms 检查一次 Vim 模式 - 作为最后的保障机制 - 确保不会遗漏任何模式变化 #### 状态同步改进 - 优化了 Vim 模式状态的同步逻辑 - 减少了状态不一致的情况 - 提高了输入法切换的准确性 ### 文档更新 - 更新了 README.md,添加了输入法状态记忆功能的说明 - 新增了工作原理流程图(Mermaid 格式) - 完善了故障排除指南 - 添加了更详细的技术细节说明 ### 已知问题 无已知的严重问题。如果遇到问题,请查看 [故障排除](./README.md#故障排除) 或提交 Issue。 ### 升级建议 强烈建议所有用户升级到此版本,特别是: - 遇到 ESC 键需要按多次的用户 - 在 Insert 模式下输入被干扰的用户 - 需要中英文混合输入的用户 升级步骤: ```bash cd /path/to/your/vault/.obsidian/plugins/vim-im-switch/ git pull origin main npm install npm run build # 重启 Obsidian ``` --- ## [1.0.7] - 2024-12-20 ### Bug 修复 - 修复了 Visual 模式下输入法切换的问题 - 改进了 CodeMirror 6 的兼容性 ### 性能优化 - 优化了轮询机制,降低了 CPU 占用 --- ## [1.0.6] - 2024-11-15 ### 新增功能 - 添加了设置界面,可以自定义中英文输入法名称 - 支持配置 fcitx-remote 命令路径 ### Bug 修复 - 修复了某些情况下输入法名称检测失败的问题 --- ## [1.0.5] - 2024-10-10 ### Bug 修复 - 修复了 Windows 系统下的兼容性问题 - 改进了错误处理逻辑 --- ## [1.0.4] - 2024-09-05 ### 新增功能 - 添加了对 Linux 系统的支持 - 改进了日志输出格式 --- ## [1.0.3] - 2024-08-01 ### Bug 修复 - 修复了初始化时的异步问题 - 改进了命令执行的错误处理 --- ## [1.0.2] - 2024-07-15 ### 性能优化 - 优化了输入法切换的响应时间 - 减少了不必要的命令调用 --- ## [1.0.1] - 2024-06-20 ### Bug 修复 - 修复了插件加载失败的问题 - 改进了兼容性 --- ## [1.0.0] - 2024-06-01 ### 首次发布 - 基本的 Vim 模式输入法自动切换功能 - 支持 macOS 系统 - 支持 Normal/Insert 模式切换 --- ## 图例说明 - **新增功能** - Added:新功能 - **Bug 修复** - Fixed:问题修复 - **性能优化** - Performance:性能改进 - **代码清理** - Cleanup:代码整理 - **技术改进** - Technical:技术升级 - **文档更新** - Documentation:文档完善 - **已知问题** - Known Issues:已知问题 - **升级建议** - Upgrade:升级指南 - **重要里程碑** - Milestone:重要版本