Skip to content

Releases: zuqini/zpack.nvim

v2.0.0

03 Jun 22:46
1a5a7f2

Choose a tag to compare

⚠ BREAKING CHANGES

2.0.0 removes every previously deprecated setup() option, the zpack.add()
function, and the legacy :Z* commands. Update your config before upgrading:

Removed in 2.0 Replacement
setup({ confirm = … }) setup({ defaults = { confirm = … } })
setup({ disable_vim_loader = true }) setup({ performance = { vim_loader = false } })
setup({ plugins_dir = 'dir' }) a { import = 'dir' } entry in your spec list
setup({ cmd_prefix = 'Z' }) setup({ cmd_name = 'Z' })
legacy :ZUpdate / :ZClean / :ZDelete / :ZRestore / :ZLoad / :ZBuild :ZPack update / clean / delete / restore / load / build (or :Z … with cmd_name = 'Z')
setup({ auto_import = … }) removed — was already a no-op in 1.x
require('zpack').add(…) removed — was already a no-op in 1.x

See Upgrading from 1.x to 2.0 for the full migration guide.

Features

  • adopt Neovim plugin best practices (#23) (2f45de6)
  • close lazy.nvim parity gaps across lazy triggers (#27) (9ed473a)
  • lazy-parity: add defaults.lazy and defaults.version (#29) (d52f0dd)
  • lazy.nvim spec parity (pin/optional/dev/specs/build/reload/sync) (#28) (b6f82cd)
  • remove deprecated features for 2.0.0 (#25) (4681a74)
  • support bang on :ZPack update/restore; document 0.13 native commands (4f9b312)
  • sync state with vim.pack via PackChanged on plugin removal (0b65048)

Bug Fixes

  • address PR #21/#22 review follow-ups (c9c6c61)
  • command-specific legacy command deprecation notice (8970a43)
  • correct bang placement in usage hints; always warn on legacy commands (2f4bf35)
  • guard non-number priority and non-string import field (af3f109)
  • guard non-string src/url/dir in normalize_source (b127f63)
  • harden lazy-load path against operator-pending loss + throw-leaks (#26) (c6079d5)
  • preserve typeahead order on multi-key sequences (6b99fcb)

Code Refactoring

  • :ZPack with subcommands (d197fc6)

v1.2.1

12 May 05:21
8d02f50

Choose a tag to compare

What's Changed

  • docs: add migration notes for install feedback and passive libraries on by @zuqini in #14
  • docs: split general tips from lazy.nvim migration notes by @zuqini in #15
  • docs: rename tips subsection to gotchas by @zuqini in #16
  • feat: forward expr/silent/noremap/replace_keycodes on KeySpec by @zuqini in #19

Full Changelog: v1.2.0...v1.2.1

v1.2.0 — public introspection API + opts merging refactor

13 Apr 20:28
d3cc74d

Choose a tag to compare

What's Changed

  • feat: add public introspection API for third-party tooling by @zuqini in #12
  • refactor: collapse opts merging to single authoritative path by @zuqini in #13

Full Changelog: v1.1.2...v1.1.3

v1.1.2 — lazy-loading event re-firing bug fixes + polish

09 Apr 06:54
7ea1529

Choose a tag to compare

What's Changed

  • fix: forward ev.data, validate buffer, chain dependencies, and dedupl… by @zuqini in #10

Full Changelog: v1.1.1...v1.1.2

v1.1.1 - bug-fix/stability

09 Apr 00:07
a782b9d

Choose a tag to compare

What's Changed

  • fix: lazy-loaded plugins not fully activating by @zuqini in #8

Full Changelog: v1.1.0...v1.1.1

v1.1.0 — ZRestore

08 Apr 09:33

Choose a tag to compare

New

  • :ZRestore [plugin] — restore plugins to the state recorded in the native lockfile. Wraps vim.pack.update() with target='lockfile'. Useful for syncing plugins across machines or reverting after an update.

Commits

  • feat: add ZRestore command to restore plugins from lockfile by @zuqini in #4
  • docs: split README into separate docs for examples, tips, and migration by @zuqini in #5

Full Changelog: v1.0.0...v1.1.0

v1.0.0 — Stable Release for Neovim 0.12

06 Apr 03:43

Choose a tag to compare

🎉 zpack.nvim v1.0.0

The first stable release of zpack.nvim, timed with the official release of Neovim 0.12 and vim.pack.

zpack is a thin layer on top of Neovim's native vim.pack, adding lazy-loading capabilities and support for the widely adopted lazy.nvim-like declarative spec — so you can keep using the plugin specs you already know, powered entirely by what's built in.

zpack.nvim

Highlights

  • 100% native — installs and manages plugins (including zpack itself) through vim.pack
  • Near drop-in from lazy.nvim — use the same declarative specs plugin authors already provide
  • Lazy-loading triggersevent, cmd, keys, ft, priority, and cond/enabled controls
  • Build hooks — run shell commands or Lua functions on install/update
  • Plugin lifecycle commands:ZUpdate, :ZClean, :ZBuild, :ZLoad, :ZDelete with tab completion
  • Spec imports — organize plugins across files under lua/plugins/ just like lazy.nvim
  • Dependency resolution — dependencies load automatically before their parent
  • Version pinning — branches, tags, commits, and semver ranges via vim.version.range()
  • lazy.nvim compatibility fieldssem_version, branch, tag, commit, dir, url all map to native equivalents
  • Configurable command prefix — rename :Z* commands to whatever you prefer
  • Tested — CI test suite via GitHub Actions

What's New Since the Initial Announcement

Since the original Reddit post (~4 months ago), zpack has matured significantly:

  • FileType lazy-loading (ft) — with automatic re-triggering of BufReadPre, BufReadPost, and FileType events for proper LSP/Treesitter attachment
  • Event patterns — inline patterns ("BufReadPre *.rs") and structured EventSpec with multiple patterns
  • Plugin lifecycle commands:ZBuild, :ZLoad, :ZDelete (with ! for batch operations) joined the original :ZUpdate and :ZClean
  • Global defaultsdefaults.confirm and defaults.cond for all plugins
  • vim_loader integrationperformance.vim_loader for faster startup (enabled by default)
  • Configurable command prefix — via cmd_prefix option
  • init hook — runs before plugin load for plugins that need early setup
  • module field — disable module-based lazy loading per-plugin
  • enabled vs cond distinctionenabled skips vim.pack.add entirely; cond skips loading after install
  • main field — explicit main module override when auto-detection fails
  • opts as functionopts = function(plugin, opts) return {} end
  • Plugin data in hooks — all lifecycle hooks receive a zpack.Plugin object with path and spec
  • Snacks.nvim compatibility guide — documented workaround for dashboard startup section
  • Community extensionzshow.nvim by @sairyy provides a floating window UI for viewing installed plugins
  • Comprehensive test suite — automated testing via GitHub Actions

Getting Started

-- Bootstrap with vim.pack
vim.pack.add({ 'https://github.com/zuqini/zpack.nvim' })
 
vim.g.mapleader = " "
require('zpack').setup()

Create plugin specs in lua/plugins/ — see the README for examples and the migration guide for lazy.nvim users.

Requirements

  • Neovim 0.12.0+

Thank You

Thanks to everyone who tried zpack and gave feedback since the initial announcement. Special thanks to the early adopters and to @sairyy for building the first community extension.


Full Changelog: https://github.com/zuqini/zpack.nvim/commits/v1.0.0

New Contributors

  • @Yuhf7 made their first contribution in #1

Full Changelog: https://github.com/zuqini/zpack.nvim/commits/v1.0.0