Skip to content

fix(keymaps): properly clean up keymaps on close (fixes #211)#226

Merged
esmuellert merged 3 commits intomainfrom
dev/main
Feb 5, 2026
Merged

fix(keymaps): properly clean up keymaps on close (fixes #211)#226
esmuellert merged 3 commits intomainfrom
dev/main

Conversation

@esmuellert
Copy link
Owner

Summary

Fixes #211 - Keymaps not restored properly after quitting :CodeDiff with q

Problem

When users configured custom keymaps (e.g., J, K for next_file/prev_file) and navigated files, the keymaps would be set on new buffers but old buffers weren't tracked. On close, only current buffers had keymaps deleted, leaving orphaned buffer-local keymaps that shadowed user's global keymaps.

Solution

  1. Revert complex save/restore logic (commit 9a18715) - This approach was unnecessarily complex and didn't fix the actual issue. Buffer-local keymaps shadow global ones, so we just need to delete our keymaps (not save/restore).

  2. Track all buffers - Store all buffers that ever had keymaps set in sess.keymap_buffers

  3. Clean up all tracked buffers - On close, delete keymaps from ALL tracked buffers, not just current ones

  4. Remove duplicate keymap definitions - next_file/prev_file were defined in both view/keymaps.lua and explorer/keymaps.lua/history/keymaps.lua. Now only defined once via set_tab_keymap.

Changes

  • lua/codediff/ui/lifecycle/accessors.lua: Track buffers in keymap_buffers, clean up all on close
  • lua/codediff/ui/explorer/keymaps.lua: Remove duplicate next_file/prev_file
  • lua/codediff/ui/history/keymaps.lua: Remove duplicate next_file/prev_file
  • tests/keymap_restore_spec.lua: Removed (tested reverted functionality)

Testing

All existing tests pass.

Fixes #211 - Keymaps not restored properly after quitting CodeDiff

The issue was that when navigating files with J/K, new buffers would get
keymaps set but old buffers weren't tracked. On close, only current
buffers had keymaps deleted, leaving orphaned buffer-local keymaps that
shadowed user's global keymaps.

Solution:
- Track all buffers in sess.keymap_buffers when keymaps are set
- On close, delete keymaps from ALL tracked buffers

This also reverts the previous save/restore approach (commit 9a18715)
which was unnecessarily complex and didn't fix the actual issue.
These keymaps are already set via view/keymaps.lua:setup_all_keymaps()
which uses set_tab_keymap to set them on all buffers including explorer
and history panels. No need to set them again in panel-specific keymaps.
@esmuellert esmuellert merged commit 8a1ce04 into main Feb 5, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Keymaps not restored properly after quitting :CodeDiff with q

1 participant