Release Notes v1.3.0
This release adds in-plugin-manager keybind conflict resolution, a comprehensive keybinding overview, configurable keybindings with a dedicated editor, undo support, an auto-save plugin, test improvements, and numerous UI/UX refinements.
Added
- Added undo support (
u) — undo the last destructive action (trash, delete, rename) with a single keystroke. - Added configurable keybindings — press
Ctrl+Kto open an interactive keybinding editor that lists all registered keybindings (core and plugin), showing what each key does. Changes are saved withCtrl+Sand discarded withCtrl+D. - Added auto-save plugin (
s) — a note-mode plugin that automatically saves notes at a configurable interval. - Added in-plugin-manager keybind conflict resolution — when a plugin shows
[key conflict], pressingENTERopens an interactive flow to assign a new keybind. Press any key to assign,ESCto cancel. If the key is taken, a warning is shown. Thekshortcut works on any plugin to change its keybind. - Added keybind override persistence — custom keybind overrides are saved to
~/.local/share/blob/plugin_keybinds(format:plugin_name=KEY) and survive restarts. - Added
Ctrl+Oexpanded help view showing all registered keybinds in a sectioned layout (Core shortcuts, Ctrl shortcuts, and Plugin keybinds). - Added
Ctrl+Mto expand the compact help view — shows up to 4 plugin keybinds plus core keys by default, then reveals all on demand. - Added test improvements — new unit tests for undo functionality, keybinding resolution, and theme loading.
- Added
get_plugin_keybind_override()andset_plugin_keybind_override()functions following the existingdisabled_pluginspersistence pattern. - Added
render_plugin_keybinds_help()— a helper that scans addons and renders all plugin keybindings for the expanded help view.
Changed
- Plugin manager UI — plugin name alignment is now dynamic: the width adapts to the longest plugin name (capped at 25 chars), preventing long names from breaking the layout.
- Plugin status display — long plugin names no longer misalign the status column; alignment is computed per-render.
- Keybinding help — now shows keybindings line by line with a maximum of 4 plugin lines (plus core keybinds) in the collapsed view.
Ctrl+Mtoggles to the full expanded view. - Plugin keybind conflict detection —
mark_plugin_keybind_conflicts()now accepts theAppConfigpointer and loads per-plugin keybind overrides from disk before checking for conflicts. - Reserved keys updated —
kadded to the reserved core key set (used for "set keybind" in the plugin manager). - Plugin action flow —
ENTERon a conflicted plugin now offers to change the keybind instead of blocking the action. - All three call sites of
mark_plugin_keybind_conflicts()updated to pass the config pointer (including the test harness). render_plugin_uihelp text changed to[k] set keybind [ENTER] compile/run [u] uninstallfor clarity.- Format string bug fixed:
%%%%s>→%%s>in the dynamic plugin name format builder. - Version bumped from
1.2.1to1.3.0.
Removed
- Removed hardcoded
%-15splugin name width in favor of dynamic computation.
Notes
- The in-manager keybind conflict resolution is a core feature; plugin developers no longer need to ship a separate keybind helper plugin, but it is still recommended to assign your plugin to a keybind that has not been used, if possible.
- Plugin keybinding overrides are persisted to
<data_dir>/plugin_keybindswith the formatname=K(one per line). This is managed automatically by the core. - The
get_plugin_keybind_override()andset_plugin_keybind_override()functions are internal tomain.cand follow the same conventions asset_plugin_disabled_on_disk(). - Test writers should pass
NULLfor thecfgparameter when keybind override testing is not needed (handled safely insidemark_plugin_keybind_conflicts()).