HyprVim v2.0.0
Now Supporting Lua
HyprVim has been completely rewritten from the ground up in Lua for Hyprland's new Lua config format (0.55+). This is a major release: a modular plugin architecture, a built-in auto-updater, user-defined commands, and a faster in-process engine that no longer shells out on every keystroke.
HyprVim.Demo.mp4
Warning
This is a breaking release. Your config must be migrated to Lua.
If you are not ready to migrate, stay on the legacy-conf branch.
📋 Requirements
- Hyprland 0.55+ with Lua plugin/config support
eww,jq,socat(optional): required for the which-key HUDgit,curl,jq(optional): required by the built-in updater for manual git-checkout installs
🚀 Upgrading from v1.x
This release changes the config format and install/config locations. To migrate:
- Move your config to Lua. The old Hyprland
.confkeymap is replaced by a Lua setup call. See Configuration. - Reinstall to the new path. HyprVim now lives under
$XDG_DATA_HOME(~/.local/share/...) with a shim in your Hyprland Lua plugins dir, see Installation. - Relocate custom themes/overrides to
$XDG_CONFIG_HOME.
Not ready to migrate? The legacy-conf branch keeps the old .conf flow (no new features or fixes).
Full guides: docs/guide.
⚠️ Breaking Changes
- Lua rewrite for Hyprland 0.55+: HyprVim is now a modular Lua plugin for Hyprland's new Lua config format. Requires your config to be migrated to Lua.
- Install path moved to XDG data dir: HyprVim now installs to
$XDG_DATA_HOMEinstead of the hypr config dir. - User theme/config moved to
$XDG_CONFIG_HOME: Custom themes and overrides now live under the XDG config directory.
✨ New Features
- Auto-updater: New update checker with
stable,nightly, andpinnedchannels, plus handling for package-managed and detached nightly installs. - User-defined commands: Define your own
:commands via config. Adds 10+ built-in commands (opacity/dim viaset_prop, resize, size, gaps, tab, move-pixel, and more) with string workspace selectors. In NORMAL mode, type:helpto see them all. - Command completion cycling: Repeated
Tabcycles through completions in the command/prompt bar. - User keybind overrides: New
keymapsconfig lets you override submap binds. - Public API from
setup():setup()now exposes a public API for programmatic use. *register and live previews: Adds the*selection register, live register-content previews in the which-key HUD, fallback register labels, numbered-register cycling on yank, and count multipliers for paste.- Clipboard persistence: The system clipboard is now preserved across vim-mode sessions.
- Configurable replace input: Non-blocking replace prompts with a configurable input method.
- Editor returns to submap:
vim-open-editorreturns to the originating submap on exit. - Per-submap which-key timing: Per-submap
delay_msand a globalvim_delay_ms, with instant HUD display and a slide animation for the which-key layer. - New extras: Tridactyl config and docs; Thunderbird
tbkeysgains count and visual-mode support. Thewl-kbptrextra has been removed.
🔧 Improvements
- Bash scripts replaced by Lua modules throughout (window rules, terminal-class detection, theme apply, editor I/O, updater).
- Terminal-based prompt bar replaces the external menu tool; prompts and clipboard I/O migrated to async APIs supporting concurrent prompts.
- Declarative
Submap.defineAPI with a submap registry and aliases; submap transitions routed through a central Submap API. - Custom terminal flags and user tables are deep-merged.
- Documentation moved from the GitHub wiki into the repo under
docs/guide(allowing guides to be version controlled).
⚡ Performance
- In-process dispatch: Logic runs natively in Hyprland's Lua runtime instead of spawning a shell (and often
jq/hyprctl) per keystroke, cutting latency across motions, operators, and submap transitions. - Leaner which-key HUD: Register items are built without
jq, monitor geometry is passed straight to the renderer, redundant shell cleanup calls are removed, and hidden-HUD closes are skipped. - Fewer shell round-trips: Find batches state-file access and the visual-line setup shell call is dropped.
Full changelog: v1.2.3...v2.0.0