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

337 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 更新日志
本文档记录了 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.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 格式)
- 完善了故障排除指南
- 添加了更详细的技术细节说明
### 已知问题
无已知的严重问题。如果遇到问题,请查看 [故障排除](./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重要版本