Files
vim-im-switch/CHANGELOG.md
2025-11-09 22:04:12 +08:00

10 KiB
Raw Permalink Blame History

更新日志

本文档记录了 Vim 输入法自动切换插件的所有重要变更。

包含 Obsidian 插件和 Vim 插件两个版本的更新历史。

格式基于 Keep a Changelog 版本号遵循 语义化版本

English | 中文


[2.0.3] - 2025-11-09

修复

Obsidian 插件

  • 修复 Normal 模式下按 ESC 触发输入法切换的问题
    • 问题:在 Normal 模式下按 ESC 会意外触发输入法切换(从中文切到英文,再按又从英文切到英文)
    • 原因:handleKeyDown 函数处理 ESC 键时没有检查当前 Vim 模式
    • 解决:增加模式检查,只在 Insert 或 Replace 模式下按 ESC 时才保存输入法状态并切换到英文
    • 效果:与原生 Vim 插件行为保持一致Normal 模式下按 ESC 不会改变输入法

改进

  • 提高了模式检测的准确性
  • 优化了 ESC 键的处理逻辑

[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 格式)
  • 完善了故障排除指南
  • 添加了更详细的技术细节说明

已知问题

无已知的严重问题。如果遇到问题,请查看 故障排除 或提交 Issue。

升级建议

强烈建议所有用户升级到此版本,特别是:

  • 遇到 ESC 键需要按多次的用户
  • 在 Insert 模式下输入被干扰的用户
  • 需要中英文混合输入的用户

升级步骤:

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重要版本