337 lines
10 KiB
Markdown
337 lines
10 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to the Vim Input Method Switch Plugin will be documented in this file.
|
|
|
|
Includes update history for both Obsidian plugin and Vim plugin versions.
|
|
|
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
|
[English](./CHANGELOG_en.md) | [中文](./CHANGELOG.md)
|
|
|
|
---
|
|
|
|
## [2.0.3] - 2025-11-09
|
|
|
|
### Fixed
|
|
|
|
#### Obsidian Plugin
|
|
- **Fixed input method switching triggered by ESC in Normal mode**:
|
|
- Issue: Pressing ESC in Normal mode would unexpectedly trigger input method switching (from Chinese to English, then English to English on second press)
|
|
- Cause: `handleKeyDown` function didn't check current Vim mode when handling ESC key
|
|
- Solution: Added mode check to only save IM state and switch to English when ESC is pressed in Insert or Replace mode
|
|
- Result: Behavior now consistent with native Vim plugin - ESC in Normal mode doesn't change input method
|
|
|
|
### Improved
|
|
|
|
- Enhanced accuracy of mode detection
|
|
- Optimized ESC key handling logic
|
|
|
|
---
|
|
|
|
## [2.0.0] - 2025-11-04
|
|
|
|
### Added
|
|
|
|
#### Native Vim Plugin Support
|
|
- **New fcitx-osx.vim plugin**: Provides automatic input method switching for native Vim/NeoVim editors
|
|
- **Smart input method state memory**:
|
|
- Remembers input method (Chinese/English) when exiting Insert mode
|
|
- Automatically restores previous IM state when entering Insert mode again
|
|
- Completely seamless switching with no UI flicker
|
|
- **Using fcitx-remote -s command**:
|
|
- Precise switching by specifying input method ID
|
|
- Replaces old `-c`/`-o` toggle commands
|
|
- Supports custom English and Chinese IM IDs
|
|
- **Asynchronous execution optimization**:
|
|
- Uses Vim 8+ `job_start()` for async command execution
|
|
- Completely eliminates UI flicker and delay during IM switching
|
|
- Backward compatible with older Vim versions (using background process)
|
|
|
|
#### Enhanced Deploy Script
|
|
- **deploy.sh update**: One-click deployment for both Obsidian and Vim plugins
|
|
- Automatically creates `~/.vim/plugin/` directory
|
|
- Copies both plugins to their respective target locations
|
|
|
|
### Improved
|
|
|
|
#### Vim Plugin Performance Optimization
|
|
- Uses `fcitx-remote -n` to get current input method name
|
|
- Saves complete IM ID instead of simple toggle state
|
|
- Avoids unnecessary IM switches (skips when same IM)
|
|
- All output redirected to `/dev/null` for silent execution
|
|
|
|
### Fixed
|
|
- Fixed issue where `fcitx-remote -c` command doesn't work in Vim plugin
|
|
- Fixed title bar flashing "fcitx-remote" issue
|
|
- Fixed string comparison failure (`"2\n" == 2`) issue
|
|
|
|
### Documentation
|
|
- Updated README.md and README_en.md with Vim plugin installation instructions
|
|
- Updated all document titles from "Obsidian" to include both plugins
|
|
- Added Vim plugin configuration and debugging instructions
|
|
|
|
---
|
|
|
|
## [2.0.2] - 2025-11-04
|
|
|
|
### Fixed
|
|
|
|
- Terminal compatibility: Fixed brief terminal/tab title flash when invoking `fcitx-remote` from terminal Vim by launching commands fully detached (nohup/background) and redirecting output
|
|
- Compatibility: Removed unsupported `job_start(..., {'detach': v:true})` usage to work with more Vim builds
|
|
|
|
### Documentation
|
|
|
|
- Minor docs update: note terminal behavior fix in README and RELEASE
|
|
|
|
---
|
|
|
|
## [1.0.8] - 2025-01-04
|
|
|
|
This is a major update that introduces input method state memory and fixes several critical issues.
|
|
|
|
### Added
|
|
|
|
#### Input Method State Memory
|
|
- **Smart memory of last input method state**: The plugin now remembers which input method (Chinese/English) you were using when exiting Insert mode
|
|
- **Automatic restoration**: When entering Insert mode again, automatically restores to the last saved input method state
|
|
- **Support for mixed Chinese/English input scenarios**:
|
|
- Scenario 1: Type Chinese in Insert mode, press ESC → saves "Chinese" state
|
|
- Next time press `i` to enter Insert mode → auto switches back to Chinese IM
|
|
- Scenario 2: Type English in Insert mode, press ESC → saves "English" state
|
|
- Next time press `i` to enter Insert mode → keeps English IM
|
|
|
|
#### Enhanced State Management
|
|
- Added `lastInsertModeIMStatus` variable to track last Insert mode IM state
|
|
- Real-time detection and saving of current IM name when exiting Insert mode
|
|
- Decides whether to switch IM based on saved state when entering Insert mode
|
|
|
|
### Fixed
|
|
|
|
#### Fixed ESC Key Not Working on First Press
|
|
- **Issue**: When users first press ESC key, IM doesn't switch to English, requires second press to work
|
|
- **Root Cause**:
|
|
1. Keyboard event listener registered too late (after `onload()`)
|
|
2. Obsidian's Vim mode processes ESC before our listener receives it
|
|
3. Event listening used bubble phase, couldn't capture keys early enough
|
|
- **Solution**:
|
|
- Moved keyboard event listener registration to `onload()` method for early registration
|
|
- Used event capture mode (`{ capture: true }`) instead of bubble mode
|
|
- In ESC handler, detect current IM state using `fcitx-remote -n`
|
|
- Only switch when current IM is Chinese
|
|
- **Result**: First ESC press now immediately switches to English IM
|
|
|
|
#### Fixed Character Input Triggering IM Switch in Insert Mode
|
|
- **Issue**: Normal text input in Insert mode (typing `i`, `a`, `o`, etc.) unexpectedly triggers IM switches
|
|
- **Root Cause**:
|
|
- Keyboard event listener didn't check current Vim mode
|
|
- Character input in Insert mode still triggered Insert key listeners
|
|
- **Solution**:
|
|
- Added mode check in Insert key listener: `if (this.currentVimMode !== 'normal') return;`
|
|
- Only respond to Insert keys in Normal mode
|
|
- Character input in Insert mode doesn't trigger any IM switch logic
|
|
- **Result**: Normal text input in Insert mode is no longer interrupted
|
|
|
|
### Performance
|
|
|
|
#### Use Event Capture Mode for Better Responsiveness
|
|
- **Improvements**:
|
|
- Use `addEventListener('keydown', handler, { capture: true })` instead of default bubble mode
|
|
- Capture keys at earliest stage of event processing chain
|
|
- Reduced time gap between Obsidian Vim processing and plugin processing
|
|
- **Benefits**:
|
|
- ESC key response is faster with almost no delay
|
|
- IM switching is smoother and more natural
|
|
- Reduced possibility of state inconsistency
|
|
|
|
#### Optimized IM Detection Logic
|
|
- **Improvements**:
|
|
- Check current IM before deciding to switch on ESC key press
|
|
- Avoid unnecessary `fcitx-remote` calls
|
|
- Reduced processing time by 10-20ms
|
|
- **Result**:
|
|
- No redundant switching when already in English IM
|
|
- Lower system resource usage
|
|
|
|
### Cleanup
|
|
|
|
#### Removed Redundant Code
|
|
- **Deleted**:
|
|
- Removed `testVimModeSimulation()` test function (~20 lines)
|
|
- Removed `testCurrentVimMode()` test function (~15 lines)
|
|
- Removed test command registration code
|
|
- Deleted legacy global keyboard monitoring code
|
|
- **Impact**:
|
|
- Reduced ~50 lines of unused code
|
|
- Decreased plugin size by ~2KB
|
|
- Improved code maintainability
|
|
|
|
#### Simplified Logging
|
|
- **Before**: Every event had detailed debug logs including:
|
|
```
|
|
Current IM: xxx
|
|
Entering insert mode...
|
|
Vim mode: xxx
|
|
Saved IM status: xxx
|
|
Detected ESC key press
|
|
Insert key pressed: i
|
|
```
|
|
- **After**: Only key state transition logs remain:
|
|
```
|
|
Loading plugin...
|
|
ESC → English (saved Chinese)
|
|
→ Chinese
|
|
Error: xxx
|
|
```
|
|
- **Benefits**:
|
|
- 70% less console output
|
|
- Clearer logs, easier to see key information
|
|
- Doesn't affect troubleshooting (error logs still detailed)
|
|
|
|
#### Code Structure Optimization
|
|
- **Improvements**:
|
|
- Simplified `onunload()` method, removed redundant try-catch
|
|
- Unified error handling format
|
|
- Improved clarity of code comments
|
|
- Optimized function naming consistency
|
|
- **Result**:
|
|
- More readable and understandable code
|
|
- Lower future maintenance cost
|
|
|
|
### Technical Improvements
|
|
|
|
#### Triple Detection Mechanism
|
|
The plugin now uses three detection mechanisms for reliability:
|
|
|
|
1. **Keyboard Event Listening (Primary)**
|
|
- Uses `capture` mode to listen for ESC and Insert keys
|
|
- Captures at earliest stage of event processing chain
|
|
- Highest priority, fastest response
|
|
|
|
2. **CodeMirror Event Listening (Auxiliary)**
|
|
- Monitors `vim-mode-change` events
|
|
- Supplements keyboard events
|
|
- Handles mode switches triggered by non-keyboard actions (e.g., commands)
|
|
|
|
3. **Polling (Fallback)**
|
|
- Checks Vim mode every 100ms
|
|
- Acts as last-resort safety mechanism
|
|
- Ensures no mode changes are missed
|
|
|
|
#### State Synchronization Improvements
|
|
- Optimized Vim mode state synchronization logic
|
|
- Reduced state inconsistency cases
|
|
- Improved IM switching accuracy
|
|
|
|
### Documentation
|
|
|
|
- Updated README.md with IM state memory feature description
|
|
- Added workflow diagram (Mermaid format)
|
|
- Enhanced troubleshooting guide
|
|
- Added more detailed technical details
|
|
|
|
### Known Issues
|
|
|
|
No known critical issues. If you encounter problems, see [Troubleshooting](./README_en.md#troubleshooting) or submit an Issue.
|
|
|
|
### Upgrade Recommendation
|
|
|
|
Strongly recommend all users upgrade to this version, especially:
|
|
- Users experiencing ESC key requiring multiple presses
|
|
- Users whose input is interrupted in Insert mode
|
|
- Users needing mixed Chinese/English input
|
|
|
|
Upgrade steps:
|
|
```bash
|
|
cd /path/to/your/vault/.obsidian/plugins/vim-im-switch/
|
|
git pull origin main
|
|
npm install
|
|
npm run build
|
|
# Restart Obsidian
|
|
```
|
|
|
|
---
|
|
|
|
## [1.0.7] - 2024-12-20
|
|
|
|
### Fixed
|
|
- Fixed IM switching issue in Visual mode
|
|
- Improved CodeMirror 6 compatibility
|
|
|
|
### Performance
|
|
- Optimized polling mechanism, reduced CPU usage
|
|
|
|
---
|
|
|
|
## [1.0.6] - 2024-11-15
|
|
|
|
### Added
|
|
- Added settings interface to customize Chinese/English IM names
|
|
- Support for configuring fcitx-remote command path
|
|
|
|
### Fixed
|
|
- Fixed IM name detection failure in some cases
|
|
|
|
---
|
|
|
|
## [1.0.5] - 2024-10-10
|
|
|
|
### Fixed
|
|
- Fixed Windows compatibility issues
|
|
- Improved error handling logic
|
|
|
|
---
|
|
|
|
## [1.0.4] - 2024-09-05
|
|
|
|
### Added
|
|
- Added Linux system support
|
|
- Improved log output format
|
|
|
|
---
|
|
|
|
## [1.0.3] - 2024-08-01
|
|
|
|
### Fixed
|
|
- Fixed async issues during initialization
|
|
- Improved error handling for command execution
|
|
|
|
---
|
|
|
|
## [1.0.2] - 2024-07-15
|
|
|
|
### Performance
|
|
- Optimized IM switching response time
|
|
- Reduced unnecessary command calls
|
|
|
|
---
|
|
|
|
## [1.0.1] - 2024-06-20
|
|
|
|
### Fixed
|
|
- Fixed plugin loading failure
|
|
- Improved compatibility
|
|
|
|
---
|
|
|
|
## [1.0.0] - 2024-06-01
|
|
|
|
### Initial Release
|
|
- Basic Vim mode IM auto-switching functionality
|
|
- macOS support
|
|
- Normal/Insert mode switching support
|
|
|
|
---
|
|
|
|
## Legend
|
|
|
|
- **Added** - New features
|
|
- **Fixed** - Bug fixes
|
|
- **Performance** - Performance improvements
|
|
- **Cleanup** - Code cleanup
|
|
- **Technical** - Technical improvements
|
|
- **Documentation** - Documentation updates
|
|
- **Known Issues** - Known issues
|
|
- **Upgrade** - Upgrade recommendations
|
|
- **Milestone** - Important milestones
|