+
+
+
+**lazy.nvim** is a modern plugin manager for Neovim.
+
+
## ✨ Features
-- [x] Partial clones instead of shallow clones
-- [x] waits till missing deps are installed (bootstrap Neovim and start using it right away)
-- [x] Async
-- [x] No need for compile
-- [x] Fast
-- [x] Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?)
-- [ ] Import specs from Packer
-- [x] Config in multiple files
-- [x] Patterns for local packages
-- [x] Profiling
-- [x] lockfile
-- [x] upvalues in `config` & `init`
-- [x] check for updates
-- [ ] package.lua
-- [ ] package-lock.lua
-- [x] tag/version support `git tag --sort version:refname`
-- [x] auto-loading on completion for lazy-loaded commands
-- [x] bootstrap code
-- [x] semver https://devhints.io/semver
- https://semver.npmjs.com/
+- 📦 Manage all your Neovim plugins with a powerful UI
+- 🚀 Fast startup times thanks to automatic caching and bytecode compilation of Lua modules
+- 💾 Partial clones instead of shallow clones
+- 🔌 Automatic lazy-loading of Lua modules and lazy-loading on events, commands, filetypes, and key mappings
+- ⏳ Automatically install missing plugins before starting up Neovim, allowing you to start using it right away
+- 💪 Async execution for improved performance
+- 🛠️ No need to manually compile plugins
+- 🧪 Correct sequencing of dependencies
+- 📁 Configurable in multiple files
+- 📚 Generates helptags of the headings in `README.md` files for plugins that don't have vimdocs
+- 💻 Dev options and patterns for using local plugins
+- 📊 Profiling tools to optimize performance
+- 🔒 Lockfile `lazy-lock.json` to keep track of installed plugins
+- 🔎 Automatically check for updates
+- 📋 Commit, branch, tag, version, and full [Semver](https://devhints.io/semver) support
+- 📈 Statusline component to see the number of pending updates
+- 🎨 Automatically lazy-loads colorschemes
-## ✅ TODO
+## ⚡️ Requirements
-- [ ] health checks: check merge conflicts async
-- [ ] allow setting up plugins through config
-- [x] support for Plugin.lock
-- [x] defaults for git log
-- [x] view keybindings for update/clean/...
-- [x] add profiler to view
-- [x] add buttons for actions
-- [x] show time taken for op in view
-- [ ] package meta index (package.lua cache for all packages)
-- [ ] auto lazy-loading of lua modules
-- [ ] use uv file watcher to check for config changes
-- [x] clear errors
-- [x] add support for versions `git tag --sort v:refname`
-- [x] rename requires to dependencies
-- [x] move tasks etc to Plugin.state
-- [x] handlers imply opt
-- [x] dependencies imply opt for deps
-- [x] fix local plugin spec
-- [ ] investigate all opt=true. Simplifies logic (easily switch between opt/start afterwards)
-- [ ] add support to specify `engines`, `os` and `cpu` like in `package.json`
+- Neovim >= **0.8.0** (needs to be built with **LuaJIT**)
+- Git >= **2.19.0** (for partial clones support)
+- a [Nerd Font](https://www.nerdfonts.com/) **_(optional)_**
+- [luarocks](https://luarocks.org/) to install rockspecs.
+ You can remove `rockspec` from `opts.pkg.sources` to disable this feature.
-## 📦 Differences with Packer
+## 🚀 Getting Started
-- **Plugin Spec**:
-
- - `setup` => `init`
- - `requires` => `dependencies`
- - `as` => `name`
+Check the [documentation website](https://lazy.folke.io/) for more information.
\ No newline at end of file
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..3d4da4e
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,79 @@
+# ✅ TODO
+
+- [x] progress bar?
+- [x] options when opening file
+- [x] lazy notify? not ideal when installing missing stuff
+- [x] topmods?
+
+- [ ] better merging options?
+- [ ] especially what to do with merging of handlers?
+- [ ] overwriting keymaps probably doesn't work
+- [ ] disabled deps?
+
+- [x] fancy UI to manage all your Neovim plugins
+- [x] auto lazy-loading of lua modules
+- [x] lazy-loading on events, commands, filetypes and key mappings
+- [x] Partial clones instead of shallow clones
+- [x] waits till missing deps are installed (bootstrap Neovim and start using it right away)
+- [x] Async
+- [x] No need to manually compile
+- [x] Fast. Automatically caches and compiles byte code of all lua modules needed during startup
+- [x] Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?)
+- [x] Config in multiple files
+- [x] dev option and patterns for local packages
+- [x] Profiling
+- [x] lockfile `lazy-lock.json`
+- [x] upvalues in `config` & `init`
+- [x] automatically check for updates
+- [x] commit, branch, tag, version and full semver support
+- [x] statusline component to see number of pending updates
+
+- [x] semver https://devhints.io/semver
+- [x] auto-loading on completion for lazy-loaded commands
+- [x] bootstrap code
+- [x] Background update checker
+- [x] health checks: check merge conflicts async
+ - [x] unsupported props or props from other managers
+ - [x] other packages still in site?
+ - [x] other package manager artifacts still present? compiled etc
+- [x] status page showing running handlers and cache stats
+- [x] temp colorscheme used during startup when installing missing plugins
+- [x] automatically reloads when config changes are detected
+- [x] handlers imply opt
+- [x] dependencies imply opt for deps
+- [x] show spec errors in health
+- [x] fix plugin details
+- [ ] show disabled plugins (strikethrough?)
+- [ ] log file
+- [x] git tests
+- [x] Import specs from other plugin managers
+- [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification)
+
+ - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json`
+ - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range
+ - default semver merging strategy: if no version matches all, then use the highest version?
+ - [ ] package meta index (package.lua cache for all packages)
+
+- [x] document highlight groups
+- [x] document user events
+- [x] document API, like lazy.plugins()
+- [x] icons
+
+- [x] check in cache if rtp files match
+- [x] I think the installation section, specifically the loading part, could use an
+ extra sentence or two. I was confused on what `config.plugins` was initially.
+ Maybe a quick, "for example, if you have a lua file
+ `~/.config/nvim/lua/config/plugins.lua` that returns a table" or something it'd
+ remove most question marks I think.
+- [x] When auto-installing the plugins the cursor isn't focused on the floating
+ window, but on the non-floating window in the background.
+- [x] Doing `:Lazy clean` doesn't show which plugins were removed.
+- [x] Shouldn't the "Versioning" section be in the "Lockfile" chapter?
+- [x] Why are personal dotfiles used as examples? Dotfiles change all the time,
+ there's no guarantee this will be relevant or even exist in two years.
+- [x] What's the difference between lazy-loading and verylazy-loading?
+- [x] Most emojis in "Configuration" aren't shown for me.
+- [x] add section on how to uninstall
+- [x] add `:Packadd` command or something similar
+- [x] headless install
+- [x] better keys handling
diff --git a/bootstrap.lua b/bootstrap.lua
new file mode 100644
index 0000000..c934c48
--- /dev/null
+++ b/bootstrap.lua
@@ -0,0 +1,51 @@
+-- Lazy Bootstrapper
+-- Usage:
+-- ```lua
+-- load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))()
+-- ```
+local M = {}
+
+function M.setup()
+ local uv = vim.uv or vim.loop
+ if vim.env.LAZY_STDPATH then
+ local root = vim.fn.fnamemodify(vim.env.LAZY_STDPATH, ":p"):gsub("[\\/]$", "")
+ for _, name in ipairs({ "config", "data", "state", "cache" }) do
+ vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
+ end
+ end
+
+ if vim.env.LAZY_PATH and not uv.fs_stat(vim.env.LAZY_PATH) then
+ vim.env.LAZY_PATH = nil
+ end
+
+ local lazypath = vim.env.LAZY_PATH or vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
+ if not vim.env.LAZY_PATH and not uv.fs_stat(lazypath) then
+ vim.api.nvim_echo({
+ {
+ "Cloning lazy.nvim\n\n",
+ "DiagnosticInfo",
+ },
+ }, true, {})
+ local lazyrepo = "https://github.com/folke/lazy.nvim.git"
+ local ok, out = pcall(vim.fn.system, {
+ "git",
+ "clone",
+ "--filter=blob:none",
+ lazyrepo,
+ lazypath,
+ })
+ if not ok or vim.v.shell_error ~= 0 then
+ vim.api.nvim_echo({
+ { "Failed to clone lazy.nvim\n", "ErrorMsg" },
+ { vim.trim(out or ""), "WarningMsg" },
+ { "\nPress any key to exit...", "MoreMsg" },
+ }, true, {})
+ vim.fn.getchar()
+ os.exit(1)
+ end
+ end
+ vim.opt.rtp:prepend(lazypath)
+end
+M.setup()
+
+return M
diff --git a/doc/.keep b/doc/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt
index b34708d..2ae3b36 100644
--- a/doc/lazy.nvim.txt
+++ b/doc/lazy.nvim.txt
@@ -1,74 +1,1429 @@
-*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 November 29
+*lazy.nvim.txt* A modern plugin manager for Neovim
==============================================================================
Table of Contents *lazy.nvim-table-of-contents*
-1. lazy.nvim |lazy.nvim-lazy.nvim|
- - Features |lazy.nvim-features|
- - TODO |lazy.nvim-todo|
- - Differences with Packer |lazy.nvim-differences-with-packer|
+1. 📰 What’s new? |lazy.nvim-📰-what’s-new?|
+ - 11.x |lazy.nvim-📰-what’s-new?-11.x|
+2. 🚀 Getting Started |lazy.nvim-🚀-getting-started|
+ - ✨ Features |lazy.nvim-🚀-getting-started-✨-features|
+ - ⚡️ Requirements |lazy.nvim-🚀-getting-started-⚡️-requirements|
+3. 🛠️ Installation |lazy.nvim-🛠️-installation|
+ - Structured Setup |lazy.nvim-🛠️-installation-structured-setup|
+ - Single File Setup |lazy.nvim-🛠️-installation-single-file-setup|
+4. 🔌 Plugin Spec |lazy.nvim-🔌-plugin-spec|
+ - Spec Source |lazy.nvim-🔌-plugin-spec-spec-source|
+ - Spec Loading |lazy.nvim-🔌-plugin-spec-spec-loading|
+ - Spec Setup |lazy.nvim-🔌-plugin-spec-spec-setup|
+ - Spec Lazy Loading |lazy.nvim-🔌-plugin-spec-spec-lazy-loading|
+ - Spec Versioning |lazy.nvim-🔌-plugin-spec-spec-versioning|
+ - Spec Advanced |lazy.nvim-🔌-plugin-spec-spec-advanced|
+ - Examples |lazy.nvim-🔌-plugin-spec-examples|
+ - Lazy Loading |lazy.nvim-🔌-plugin-spec-lazy-loading|
+ - Versioning |lazy.nvim-🔌-plugin-spec-versioning|
+5. 📦 Packages |lazy.nvim-📦-packages|
+ - Lazy |lazy.nvim-📦-packages-lazy|
+ - Rockspec |lazy.nvim-📦-packages-rockspec|
+ - Packspec |lazy.nvim-📦-packages-packspec|
+6. ⚙️ Configuration |lazy.nvim-⚙️-configuration|
+ - 🌈 Highlight Groups|lazy.nvim-⚙️-configuration-🌈-highlight-groups|
+7. 🚀 Usage |lazy.nvim-🚀-usage|
+ - ▶️ Startup Sequence |lazy.nvim-🚀-usage-▶️-startup-sequence|
+ - 🚀 Commands |lazy.nvim-🚀-usage-🚀-commands|
+ - 📆 User Events |lazy.nvim-🚀-usage-📆-user-events|
+ - ❌ Uninstalling |lazy.nvim-🚀-usage-❌-uninstalling|
+ - 🔒 Lockfile |lazy.nvim-🚀-usage-🔒-lockfile|
+ - 📦 Migration Guide |lazy.nvim-🚀-usage-📦-migration-guide|
+ - ⚡ Profiling & Debug |lazy.nvim-🚀-usage-⚡-profiling-&-debug|
+ - 📂 Structuring Your Plugins|lazy.nvim-🚀-usage-📂-structuring-your-plugins|
+8. 🔥 Developers |lazy.nvim-🔥-developers|
+ - Best Practices |lazy.nvim-🔥-developers-best-practices|
+ - Building |lazy.nvim-🔥-developers-building|
+ - Minit (Minimal Init) |lazy.nvim-🔥-developers-minit-(minimal-init)|
+9. Links |lazy.nvim-links|
==============================================================================
-1. lazy.nvim *lazy.nvim-lazy.nvim*
-
-FEATURES *lazy.nvim-features*
+1. 📰 What’s new? *lazy.nvim-📰-what’s-new?*
-- Partial clones instead of shallow clones
-- waits till missing deps are installed (bootstrap Neovim and start using it right away)
-- Async
-- No need for compile
-- Fast
-- Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?)
-- Import specs from Packer
-- Config in multiple files
-- Patterns for local packages
-- Profiling
-- lockfile
-- upvalues in `config` & `init`
-- check for updates
-- package.lua
-- package-lock.lua
-- tag/version support `git tag --sort version:refname`
-- auto-loading on completion for lazy-loaded commands
-- bootstrap code
-- semver https://devhints.io/semver
- https://semver.npmjs.com/
+11.X *lazy.nvim-📰-what’s-new?-11.x*
+
+- **New Website**: There’s a whole new website with a fresh look and improved
+ documentation. Check it out at