diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8b176d5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +root = true + +[*] +insert_final_newline = true +indent_style = space +indent_size = 2 +charset = utf-8 diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index a2f63d1..dd77c5c 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.10.4" + ".": "11.17.1" } diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 4a77601..5c225eb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -6,7 +6,10 @@ body: - type: markdown attributes: value: | - **Before** reporting an issue, make sure to read the [documentation](https://github.com/folke/lazy.nvim) and search [existing issues](https://github.com/folke/lazy.nvim/issues). Usage questions such as ***"How do I...?"*** belong in [Discussions](https://github.com/folke/lazy.nvim/discussions) and will be closed. + **Before** reporting an issue, make sure to read the [documentation](https://github.com/folke/lazy.nvim) + and search [existing issues](https://github.com/folke/lazy.nvim/issues). + + Usage questions such as ***"How do I...?"*** belong in [Discussions](https://github.com/folke/lazy.nvim/discussions) and will be closed. - type: checkboxes attributes: label: Did you check docs and existing issues? @@ -14,6 +17,8 @@ body: options: - label: I have read all the lazy.nvim docs required: true + - label: I have updated the plugin to the latest version before submitting this issue + required: true - label: I have searched the existing issues of lazy.nvim required: true - label: I have searched the existing issues of plugins related to this issue @@ -57,32 +62,14 @@ body: label: Repro description: Minimal `init.lua` to reproduce this issue. Save as `repro.lua` and run with `nvim -u repro.lua` value: | - -- DO NOT change the paths and don't remove the colorscheme - local root = vim.fn.fnamemodify("./.repro", ":p") + vim.env.LAZY_STDPATH = ".repro" + load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() - -- set stdpaths to use .repro - for _, name in ipairs({ "config", "data", "state", "cache" }) do - vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name - end - - -- bootstrap lazy - local lazypath = root .. "/plugins/lazy.nvim" - if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath, }) - end - vim.opt.runtimepath:prepend(lazypath) - - -- install plugins - local plugins = { - "folke/tokyonight.nvim", - -- add any other plugins here - } - require("lazy").setup(plugins, { - root = root .. "/plugins", + require("lazy.minit").repro({ + spec = { + -- add any other plugins here + }, }) - - vim.cmd.colorscheme("tokyonight") - -- add anything else here - render: Lua + render: lua validations: required: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 60f92cf..95c1e6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,3 +12,4 @@ jobs: with: plugin: lazy.nvim repo: folke/lazy.nvim + docs: false diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index a0c704b..4e0273b 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -5,6 +5,7 @@ on: - cron: "30 1 * * *" jobs: - ci: + stale: + if: contains(fromJSON('["folke", "LazyVim"]'), github.repository_owner) uses: folke/github/.github/workflows/stale.yml@main secrets: inherit diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index 2177a50..6784ef9 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -7,6 +7,7 @@ on: - cron: "0 * * * *" jobs: - ci: + update: + if: contains(fromJSON('["folke", "LazyVim"]'), github.repository_owner) uses: folke/github/.github/workflows/update.yml@main secrets: inherit diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ed551f..521777a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,165 @@ # Changelog +## [11.17.1](https://github.com/folke/lazy.nvim/compare/v11.17.0...v11.17.1) (2025-02-25) + + +### Bug Fixes + +* **bootstrap:** support for older Neovim versions ([1c9ba37](https://github.com/folke/lazy.nvim/commit/1c9ba3704564a2e34a22191bb89678680ffeb245)) +* **meta:** rebuild dirty right after disable. See [#1889](https://github.com/folke/lazy.nvim/issues/1889) ([d51cf69](https://github.com/folke/lazy.nvim/commit/d51cf6978321d659e68a8bc38ee806bd2517a196)) + +## [11.17.0](https://github.com/folke/lazy.nvim/compare/v11.16.2...v11.17.0) (2025-02-24) + + +### Features + +* **config,render:** allow customizing the debug icon ([#1863](https://github.com/folke/lazy.nvim/issues/1863)) ([a9c660d](https://github.com/folke/lazy.nvim/commit/a9c660d6ef1b396869d3d951760aa7a3dbfe575f)) +* **util:** pass lang to `vim.notify` so that snacks notifier can render the ft. Closes [#1919](https://github.com/folke/lazy.nvim/issues/1919) ([c6a57a3](https://github.com/folke/lazy.nvim/commit/c6a57a3534d3494bcc5ff9b0586e141bdb0280eb)) + + +### Bug Fixes + +* **config:** add missing space on the default debug icon ([#1879](https://github.com/folke/lazy.nvim/issues/1879)) ([4df5c4d](https://github.com/folke/lazy.nvim/commit/4df5c4d65a3bbf801edd9ec55fb1ae55cfa72dd0)) +* **meta:** disable top-level specs before the rest. Closes [#1889](https://github.com/folke/lazy.nvim/issues/1889) ([f81a3fb](https://github.com/folke/lazy.nvim/commit/f81a3fb7feaf460ec7c8c983682b4a693b18fdd4)) +* **ui:** do not show virt_lines for messages ([#1904](https://github.com/folke/lazy.nvim/issues/1904)) ([f15a939](https://github.com/folke/lazy.nvim/commit/f15a93907ddad3d9139aea465ae18336d87f5ce6)) + +## [11.16.2](https://github.com/folke/lazy.nvim/compare/v11.16.1...v11.16.2) (2024-12-13) + + +### Bug Fixes + +* **meta:** when a plugin is both optional and disabled, then just delete it from the list ([805b85c](https://github.com/folke/lazy.nvim/commit/805b85c2ea3bd6f9506ef22cbd6e3a39172b5b08)) + +## [11.16.1](https://github.com/folke/lazy.nvim/compare/v11.16.0...v11.16.1) (2024-12-09) + + +### Bug Fixes + +* **types:** ensure all fields for `LazyPluginSpec` are optional ([#1843](https://github.com/folke/lazy.nvim/issues/1843)) ([703be1d](https://github.com/folke/lazy.nvim/commit/703be1dda35e142e76e94e7503cf67d6b98a1d35)), closes [#1842](https://github.com/folke/lazy.nvim/issues/1842) + +## [11.16.0](https://github.com/folke/lazy.nvim/compare/v11.15.0...v11.16.0) (2024-12-07) + + +### Features + +* **plugin:** added support for virtual plugins. Closes [#1836](https://github.com/folke/lazy.nvim/issues/1836) ([ee64abc](https://github.com/folke/lazy.nvim/commit/ee64abc76be2b237b95d241a924b0323005b868a)) + + +### Bug Fixes + +* **plugin:** don't check if dir exists for virtual plugins ([656cf43](https://github.com/folke/lazy.nvim/commit/656cf4309396b7b8b62984e923bf8d8a0013f7d7)) +* **render:** show correct key for home. Fixes [#1796](https://github.com/folke/lazy.nvim/issues/1796) ([b08dba8](https://github.com/folke/lazy.nvim/commit/b08dba8107b5bdaaa007f18cf6c0cc0e0fd576aa)) + +## [11.15.0](https://github.com/folke/lazy.nvim/compare/v11.14.2...v11.15.0) (2024-12-05) + + +### Features + +* **plugin:** show error for local plugins that don't exist. Fixes [#1773](https://github.com/folke/lazy.nvim/issues/1773) ([9570a5a](https://github.com/folke/lazy.nvim/commit/9570a5ae7b17dcde4718c7458fd986c10f015a99)) + +## [11.14.2](https://github.com/folke/lazy.nvim/compare/v11.14.1...v11.14.2) (2024-11-10) + + +### Bug Fixes + +* **bootstrap:** single forward slash. Fixes [#1747](https://github.com/folke/lazy.nvim/issues/1747) ([aca30f6](https://github.com/folke/lazy.nvim/commit/aca30f63619a7492ecdea8833a065cf83c80f764)) +* **completion:** check if command string is a prefix of Lazy ([#1760](https://github.com/folke/lazy.nvim/issues/1760)) ([e9fd76e](https://github.com/folke/lazy.nvim/commit/e9fd76e239cc18da289f9a3f80f35fa16b003175)), closes [#1758](https://github.com/folke/lazy.nvim/issues/1758) +* **docs:** always update helptags for local plugins ([60cf258](https://github.com/folke/lazy.nvim/commit/60cf258a9ae7fffe04bb31141141a91845158dcc)) +* **luarocks:** try to install from root manifest ([#1687](https://github.com/folke/lazy.nvim/issues/1687)) ([591ef40](https://github.com/folke/lazy.nvim/commit/591ef40f2da3a26fbcc0466988cd6fe45ca68cae)) +* **rocks:** add lib64 plugin directory to package.cpath ([#1717](https://github.com/folke/lazy.nvim/issues/1717)) ([80da254](https://github.com/folke/lazy.nvim/commit/80da254e645f579c28394ee0f08f75a9c9481744)) +* **rockspec:** allow binary lua files. Fixes [#1800](https://github.com/folke/lazy.nvim/issues/1800) ([408449a](https://github.com/folke/lazy.nvim/commit/408449a59adb8c2a31c32fff606676b32ce4552a)) + +## [11.14.1](https://github.com/folke/lazy.nvim/compare/v11.14.0...v11.14.1) (2024-07-25) + + +### Bug Fixes + +* **plugins:** "Vim:E150: Not a directory" on plugin update ([#1679](https://github.com/folke/lazy.nvim/issues/1679)) ([7108809](https://github.com/folke/lazy.nvim/commit/7108809ab18dc1b1e6f402b29e2e1d35a5d311d5)) + +## [11.14.0](https://github.com/folke/lazy.nvim/compare/v11.13.5...v11.14.0) (2024-07-24) + + +### Features + +* added `opts.git.cooldown` to allow updating plugins on slow connections. Fixes [#1656](https://github.com/folke/lazy.nvim/issues/1656) ([d5686ef](https://github.com/folke/lazy.nvim/commit/d5686efbd00942b3e38de7c08b8df69d961b02f0)) +* **plugin:** improve error handling and show better error message ([c02268a](https://github.com/folke/lazy.nvim/commit/c02268ac6e6aab92249d020d75efc588bd9d24fa)) + + +### Bug Fixes + +* **plugin:** make .lazy.lua work again ([b4a5a12](https://github.com/folke/lazy.nvim/commit/b4a5a1209e4c64fa67aedf721a383541a64056d1)) + +## [11.13.5](https://github.com/folke/lazy.nvim/compare/v11.13.4...v11.13.5) (2024-07-22) + + +### Bug Fixes + +* **health:** dont use vim.fn.system to get cmd versions ([7d29719](https://github.com/folke/lazy.nvim/commit/7d29719ade6f5a269e3b7d08b246641b5b079aaa)) + +## [11.13.4](https://github.com/folke/lazy.nvim/compare/v11.13.3...v11.13.4) (2024-07-22) + + +### Bug Fixes + +* **loader:** add plugins whose rtp got loaded early to start plugins ([34b0126](https://github.com/folke/lazy.nvim/commit/34b0126e5b3966f1dbe148d6f8450213115e76b2)) +* **loader:** explicitely set package.loaded.modname to nil to prevent recursive loading errors ([12f2c74](https://github.com/folke/lazy.nvim/commit/12f2c74244cc768d97c83972aa63722389b5d96d)) + +## [11.13.3](https://github.com/folke/lazy.nvim/compare/v11.13.2...v11.13.3) (2024-07-21) + + +### Reverts + +* fix(loader): add auto loaded module to package.loaded early to prevent require loops ([a692bf8](https://github.com/folke/lazy.nvim/commit/a692bf86883457f45fe3f773bfc8bc4d9e4b070c)) + +## [11.13.2](https://github.com/folke/lazy.nvim/compare/v11.13.1...v11.13.2) (2024-07-21) + + +### Bug Fixes + +* **loader:** add auto loaded module to package.loaded early to prevent require loops ([18d1c1b](https://github.com/folke/lazy.nvim/commit/18d1c1b47e175cd58dc12bf4792ef4e9a50505fa)) + +## [11.13.1](https://github.com/folke/lazy.nvim/compare/v11.13.0...v11.13.1) (2024-07-19) + + +### Bug Fixes + +* **build:** only load the plugin before build for `:` build commands ([5bdb12a](https://github.com/folke/lazy.nvim/commit/5bdb12a038e5a72cc793f38893f1a9c9fb741759)) + +## [11.13.0](https://github.com/folke/lazy.nvim/compare/v11.12.0...v11.13.0) (2024-07-17) + + +### Features + +* **ui:** added mapping descriptions ([6ca90a2](https://github.com/folke/lazy.nvim/commit/6ca90a21202808796418e46d3cebfbb5a44e54a2)) + +## [11.12.0](https://github.com/folke/lazy.nvim/compare/v11.11.1...v11.12.0) (2024-07-16) + + +### Features + +* **git:** added git network throttle to limit network related git ops per interval. Closes [#1635](https://github.com/folke/lazy.nvim/issues/1635) ([d731a6b](https://github.com/folke/lazy.nvim/commit/d731a6b005fd239e85e555bd57362382f6c1e461)) + +## [11.11.1](https://github.com/folke/lazy.nvim/compare/v11.11.0...v11.11.1) (2024-07-13) + + +### Bug Fixes + +* **config:** check for lib64. Fixes [#1343](https://github.com/folke/lazy.nvim/issues/1343) ([93499c5](https://github.com/folke/lazy.nvim/commit/93499c5deb37641c6cf71528a93f101d186b409f)) +* **lockfile:** ensure newline at EOF for lockfile ([#1639](https://github.com/folke/lazy.nvim/issues/1639)) ([7ed9f71](https://github.com/folke/lazy.nvim/commit/7ed9f7173cdec71a057053d7e6efc20c2c230b95)) + +## [11.11.0](https://github.com/folke/lazy.nvim/compare/v11.10.4...v11.11.0) (2024-07-11) + + +### Features + +* add plugin name to handlers.managed ([17473db](https://github.com/folke/lazy.nvim/commit/17473db1d79ea30e06126834be7fd95ca511557b)) + + +### Bug Fixes + +* **minit:** add tests to package.path when running busted (helpers.lua etc) ([fadebdc](https://github.com/folke/lazy.nvim/commit/fadebdc76b71a1d3658a88a025c6c8fb4749e0f8)) +* **util:** strip `-lua` in normname ([54b003c](https://github.com/folke/lazy.nvim/commit/54b003c650f07b771e61566f7be2629beb2b781f)) + ## [11.10.4](https://github.com/folke/lazy.nvim/compare/v11.10.3...v11.10.4) (2024-07-08) diff --git a/bootstrap.lua b/bootstrap.lua index 16d9f1d..c934c48 100644 --- a/bootstrap.lua +++ b/bootstrap.lua @@ -1,4 +1,4 @@ --- Lay Bootstrapper +-- Lazy Bootstrapper -- Usage: -- ```lua -- load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() @@ -6,19 +6,20 @@ 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") + 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 vim.uv.fs_stat(vim.env.LAZY_PATH) then + 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 (vim.uv or vim.loop).fs_stat(lazypath) then + if not vim.env.LAZY_PATH and not uv.fs_stat(lazypath) then vim.api.nvim_echo({ { "Cloning lazy.nvim\n\n", diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 476bdf7..2ae3b36 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 08 +*lazy.nvim.txt* A modern plugin manager for Neovim ============================================================================== Table of Contents *lazy.nvim-table-of-contents* - - Features |lazy.nvim-features| - - Requirements |lazy.nvim-requirements| - - Getting Started |lazy.nvim-getting-started| -1. Links |lazy.nvim-links| -Install -Β· -Configure -Β· -Docs - - - - - - - - - - - - - - +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. πŸ“° What’s new? *lazy.nvim-πŸ“°-what’s-new?* +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 . The GitHub `README.md` + has been updated to point to the new website. The `vimdoc` contains all the + information that is available on the website. +- **Spec Resolution & Merging**: the code that resolves a final spec from a + plugin’s fragments has been rewritten. This should be a tiny bit faster, but + more importantly, fixes some issues and is easier to maintain. +- Packages can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks `*-scm-1.rockspec` file + - **Packspec**: `pkg.json` (experimental, since the format is not quite there yet) + Related _lazy.nvim_ options: + >lua + { + pkg = { + enabled = true, + cache = vim.fn.stdpath("state") .. "/lazy/pkg-cache.lua", + -- the first package source that is found for a plugin will be used. + sources = { + "lazy", + "rockspec", -- will only be used when rocks.enabled is true + "packspec", + }, + }, + rocks = { + enabled = true, + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + } + < +- Installing neorg is now as simple as: + >lua + { "nvim-neorg/neorg", opts = {} } + < +- Packages are not limited to just Neovim plugins. You can install any + **luarocks** package, like: + >lua + { "https://github.com/lubyk/yaml" } + < + Luarocks packages without a `/lua` directory are never lazy-loaded, since + it’s just a library. +- `build` functions or `*.lua` build files (like `build.lua`) now run + asynchronously. You can use `coroutine.yield(status_msg)` to show progress. + Yielding will also schedule the next `resume` to run in the next tick, so you + can do long-running tasks without blocking Neovim. +============================================================================== +2. πŸš€ Getting Started *lazy.nvim-πŸš€-getting-started* **lazy.nvim** is a modern plugin manager for Neovim. -FEATURES *lazy.nvim-features* +✨ FEATURES *lazy.nvim-πŸš€-getting-started-✨-features* -- 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 support -- Statusline component to see the number of pending updates -- Automatically lazy-loads colorschemes +- πŸ“¦ 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 support +- πŸ“ˆ Statusline component to see the number of pending updates +- 🎨 Automatically lazy-loads colorschemes -REQUIREMENTS *lazy.nvim-requirements* +⚑️ REQUIREMENTS *lazy.nvim-πŸš€-getting-started-⚑️-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -64,14 +133,1297 @@ REQUIREMENTS *lazy.nvim-requirements* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -GETTING STARTED *lazy.nvim-getting-started* +============================================================================== +3. πŸ› οΈ Installation *lazy.nvim-πŸ› οΈ-installation* + +There are multiple ways to install **lazy.nvim**. The **Structured Setup** is +the recommended way, but you can also use the **Single File Setup** if you +prefer to keep everything in your `init.lua`. + +Please refer to the Configuration section for an overview of +all available options. + + + + +STRUCTURED SETUP *lazy.nvim-πŸ› οΈ-installation-structured-setup* + +>lua + require("config.lazy") +< + +>lua + -- Bootstrap lazy.nvim + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" + if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end + end + vim.opt.rtp:prepend(lazypath) + + -- Make sure to setup `mapleader` and `maplocalleader` before + -- loading lazy.nvim so that mappings are correct. + -- This is also a good place to setup other settings (vim.opt) + vim.g.mapleader = " " + vim.g.maplocalleader = "\\" + + -- Setup lazy.nvim + require("lazy").setup({ + -- highlight-start + spec = { + -- import your plugins + { import = "plugins" }, + }, + -- highlight-end + -- Configure any other settings here. See the documentation for more details. + -- colorscheme that will be used when installing plugins. + install = { colorscheme = { "habamax" } }, + -- automatically check for plugin updates + checker = { enabled = true }, + }) +< + +You can then create your plugin specs in `~/.config/nvim/lua/plugins/`. Each +file should return a table with the plugins you want to install. + +For more info see Structuring Your Plugins + + +SINGLE FILE SETUP *lazy.nvim-πŸ› οΈ-installation-single-file-setup* + +>lua + -- Bootstrap lazy.nvim + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" + if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end + end + vim.opt.rtp:prepend(lazypath) + + -- Make sure to setup `mapleader` and `maplocalleader` before + -- loading lazy.nvim so that mappings are correct. + -- This is also a good place to setup other settings (vim.opt) + vim.g.mapleader = " " + vim.g.maplocalleader = "\\" + + -- Setup lazy.nvim + require("lazy").setup({ + -- highlight-start + spec = { + -- add your plugins here + }, + -- highlight-end + -- Configure any other settings here. See the documentation for more details. + -- colorscheme that will be used when installing plugins. + install = { colorscheme = { "habamax" } }, + -- automatically check for plugin updates + checker = { enabled = true }, + }) +< -Check the documentation website for more information. ============================================================================== -1. Links *lazy.nvim-links* +4. πŸ”Œ Plugin Spec *lazy.nvim-πŸ”Œ-plugin-spec* + + +SPEC SOURCE *lazy.nvim-πŸ”Œ-plugin-spec-spec-source* + + ----------------------------------------------------------------------------------- + Property Type Description + ---------- ---------- ------------------------------------------------------------- + [1] string? Short plugin url. Will be expanded using + config.git.url_format. Can also be a url or dir. + + dir string? A directory pointing to a local plugin + + url string? A custom git url where the plugin is hosted + + name string? A custom name for the plugin used for the local plugin + directory and as the display name + + dev boolean? When true, a local plugin directory will be used instead. See + config.dev + ----------------------------------------------------------------------------------- +A valid spec should define one of `[1]`, `dir` or `url`. + + +SPEC LOADING *lazy.nvim-πŸ”Œ-plugin-spec-spec-loading* + + -------------------------------------------------------------------------------------------------- + Property Type Description + -------------- ------------------------- --------------------------------------------------------- + dependencies LazySpec[] A list of plugin names or plugin specs that should be + loaded when the plugin loads. Dependencies are always + lazy-loaded unless specified otherwise. When specifying a + name, make sure the plugin spec has been defined + somewhere else. + + enabled boolean? or fun():boolean When false, or if the function returns false, then this + plugin will not be included in the spec + + cond boolean? or Behaves the same as enabled, but won’t uninstall the + fun(LazyPlugin):boolean plugin when the condition is false. Useful to disable + some plugins in vscode, or firenvim for example. + + priority number? Only useful for start plugins (lazy=false) to force + loading certain plugins first. Default priority is 50. + It’s recommended to set this to a high number for + colorschemes. + -------------------------------------------------------------------------------------------------- + +SPEC SETUP *lazy.nvim-πŸ”Œ-plugin-spec-spec-setup* + + -------------------------------------------------------------------------------------------------- + Property Type Description + ---------- ----------------------------- --------------------------------------------------------- + init fun(LazyPlugin) init functions are always executed during startup. Mostly + useful for setting vim.g.* configuration used by Vim + plugins startup + + opts table or opts should be a table (will be merged with parent + fun(LazyPlugin, opts:table) specs), return a table (replaces parent specs) or should + change a table. The table will be passed to the + Plugin.config() function. Setting this value will imply + Plugin.config() + + config fun(LazyPlugin, opts:table) config is executed when the plugin loads. The default + or true implementation will automatically run + require(MAIN).setup(opts) if opts or config = true is + set. Lazy uses several heuristics to determine the + plugin’s MAIN module automatically based on the plugin’s + name. (opts is the recommended way to configure plugins). + + main string? You can specify the main module to use for config() and + opts(), in case it can not be determined automatically. + See config() + + build fun(LazyPlugin) or string or build is executed when a plugin is installed or updated. + false or a list of build See Building for more information. + commands + -------------------------------------------------------------------------------------------------- +Always use `opts` instead of `config` when possible. `config` is almost never +needed. + + + + +SPEC LAZY LOADING *lazy.nvim-πŸ”Œ-plugin-spec-spec-lazy-loading* + + -------------------------------------------------------------------------------------------------------------------- + Property Type Description + ---------- ---------------------------------------------------------------- ---------------------------------------- + lazy boolean? When true, the plugin will only be + loaded when needed. Lazy-loaded plugins + are automatically loaded when their Lua + modules are required, or when one of the + lazy-loading handlers triggers + + event string? or string[] or Lazy-load on event. Events can be + fun(self:LazyPlugin, event:string[]):string[] or specified as BufEnter or with a pattern + {event:string[]\|string, pattern?:string[]\|string} like BufEnter *.lua + + cmd string? or string[] or Lazy-load on command + fun(self:LazyPlugin, cmd:string[]):string[] + + ft string? or string[] or Lazy-load on filetype + fun(self:LazyPlugin, ft:string[]):string[] + + keys string? or string[] or LazyKeysSpec[] or Lazy-load on key mapping + fun(self:LazyPlugin, keys:string[]):(string \| LazyKeysSpec)[] + -------------------------------------------------------------------------------------------------------------------- +Refer to the Lazy Loading <./lazy_loading.md> section for more information. + + +SPEC VERSIONING *lazy.nvim-πŸ”Œ-plugin-spec-spec-versioning* + + ------------------------------------------------------------------------------ + Property Type Description + ------------ -------------------- -------------------------------------------- + branch string? Branch of the repository + + tag string? Tag of the repository + + commit string? Commit of the repository + + version string? or false to Version to use from the repository. Full + override the default Semver ranges are supported + + pin boolean? When true, this plugin will not be included + in updates + + submodules boolean? When false, git submodules will not be + fetched. Defaults to true + ------------------------------------------------------------------------------ +Refer to the Versioning <./versioning.md> section for more information. + + +SPEC ADVANCED *lazy.nvim-πŸ”Œ-plugin-spec-spec-advanced* + + ---------------------------------------------------------------------------------------- + Property Type Description + ---------- ---------- ------------------------------------------------------------------ + optional boolean? When a spec is tagged optional, it will only be included in the + final spec, when the same plugin has been specified at least once + somewhere else without optional. This is mainly useful for Neovim + distros, to allow setting options on plugins that may/may not be + part of the user’s plugins. + + specs LazySpec A list of plugin specs defined in the scope of the plugin. This is + mainly useful for Neovim distros, to allow setting options on + plugins that may/may not be part of the user’s plugins. When the + plugin is disabled, none of the scoped specs will be included in + the final spec. Similar to dependencies without the automatic + loading of the specs. + + module false? Do not automatically load this Lua module when it’s required + somewhere + + import string? Import the given spec module. + ---------------------------------------------------------------------------------------- + +EXAMPLES *lazy.nvim-πŸ”Œ-plugin-spec-examples* + +>lua + return { + -- the colorscheme should be available when starting Neovim + { + "folke/tokyonight.nvim", + lazy = false, -- make sure we load this during startup if it is your main colorscheme + priority = 1000, -- make sure to load this before all the other start plugins + config = function() + -- load the colorscheme here + vim.cmd([[colorscheme tokyonight]]) + end, + }, + + -- I have a separate config.mappings file where I require which-key. + -- With lazy the plugin will be automatically loaded when it is required somewhere + { "folke/which-key.nvim", lazy = true }, + + { + "nvim-neorg/neorg", + -- lazy-load on filetype + ft = "norg", + -- options for neorg. This will automatically call `require("neorg").setup(opts)` + opts = { + load = { + ["core.defaults"] = {}, + }, + }, + }, + + { + "dstein64/vim-startuptime", + -- lazy-load on a command + cmd = "StartupTime", + -- init is called during startup. Configuration for vim plugins typically should be set in an init function + init = function() + vim.g.startuptime_tries = 10 + end, + }, + + { + "hrsh7th/nvim-cmp", + -- load cmp on InsertEnter + event = "InsertEnter", + -- these dependencies will only be loaded when cmp loads + -- dependencies are always lazy-loaded unless specified otherwise + dependencies = { + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-buffer", + }, + config = function() + -- ... + end, + }, + + -- if some code requires a module from an unloaded plugin, it will be automatically loaded. + -- So for api plugins like devicons, we can always set lazy=true + { "nvim-tree/nvim-web-devicons", lazy = true }, + + -- you can use the VeryLazy event for things that can + -- load later and are not important for the initial UI + { "stevearc/dressing.nvim", event = "VeryLazy" }, + + { + "Wansmer/treesj", + keys = { + { "J", "TSJToggle", desc = "Join Toggle" }, + }, + opts = { use_default_keymaps = false, max_join_length = 150 }, + }, + + { + "monaqa/dial.nvim", + -- lazy-load on keys + -- mode is `n` by default. For more advanced options, check the section on key mappings + keys = { "", { "", mode = "n" } }, + }, + + -- local plugins need to be explicitly configured with dir + { dir = "~/projects/secret.nvim" }, + + -- you can use a custom url to fetch a plugin + { url = "git@github.com:folke/noice.nvim.git" }, + + -- local plugins can also be configured with the dev option. + -- This will use {config.dev.path}/noice.nvim/ instead of fetching it from GitHub + -- With the dev option, you can easily switch between the local and installed version of a plugin + { "folke/noice.nvim", dev = true }, + } +< + + +LAZY LOADING *lazy.nvim-πŸ”Œ-plugin-spec-lazy-loading* + +**lazy.nvim** automagically lazy-loads Lua modules. This means that if you have +a plugin `A` that is lazy-loaded and a plugin `B` that requires a module of +plugin `A`, then plugin `A` will be loaded on demand as expected. + + +Additionally, you can also lazy-load on **events**, **commands**, **file +types** and **key mappings**. + +Plugins will be lazy-loaded when one of the following is `true`: + +- The plugin only exists as a dependency in your spec +- It has an `event`, `cmd`, `ft` or `keys` key +- `config.defaults.lazy == true` + + +🌈 COLORSCHEMES ~ + +Colorscheme plugins can be configured with `lazy=true`. The plugin will +automagically load when doing `colorscheme foobar`. + + + +⌨️ LAZY KEY MAPPINGS ~ + +The `keys` property can be a `string` or `string[]` for simple normal-mode +mappings, or it can be a `LazyKeysSpec` table with the following key-value +pairs: + +- **[1]**: (`string`) lhs **(required)** +- **[2]**: (`string|fun()`) rhs **(optional)** +- **mode**: (`string|string[]`) mode **(optional, defaults to "n")** +- **ft**: (`string|string[]`) `filetype` for buffer-local keymaps **(optional)** +- any other option valid for `vim.keymap.set` + +Key mappings will load the plugin the first time they get executed. + +When `[2]` is `nil`, then the real mapping has to be created by the `config()` +function. + +>lua + -- Example for neo-tree.nvim + { + "nvim-neo-tree/neo-tree.nvim", + keys = { + { "ft", "Neotree toggle", desc = "NeoTree" }, + }, + opts = {}, + } +< + + +VERSIONING *lazy.nvim-πŸ”Œ-plugin-spec-versioning* + +If you want to install a specific revision of a plugin, you can use `commit`, +`tag`, `branch`, `version`. + +The `version` property supports Semver ranges. + + + +EXAMPLES ~ + +- `*`: latest stable version (this excludes pre-release versions) +- `1.2.x`: any version that starts with `1.2`, such as `1.2.0`, `1.2.3`, etc. +- `^1.2.3`: any version that is compatible with `1.2.3`, such as `1.3.0`, `1.4.5`, etc., but not `2.0.0`. +- `~1.2.3`: any version that is compatible with `1.2.3`, such as `1.2.4`, `1.2.5`, but not `1.3.0`. +- `>1.2.3`: any version that is greater than `1.2.3`, such as `1.3.0`, `1.4.5`, etc. +- `>=1.2.3`: any version that is greater than or equal to `1.2.3`, such as `1.2.3`, `1.3.0`, `1.4.5`, etc. +- `<1.2.3`: any version that is less than `1.2.3`, such as `1.1.0`, `1.0.5`, etc. +- `<=1.2.3`: any version that is less than or equal to `1.2.3`, such as `1.2.3`, `1.1.0`, `1.0.5`, etc + + +============================================================================== +5. πŸ“¦ Packages *lazy.nvim-πŸ“¦-packages* + +**lazy.nvim** supports three ways for plugins to define their dependencies and +configuration. + +- **Lazy**: `lazy.lua` file +- **Rockspec**: luarocks `*-scm-1.rockspec` file +- **Packspec**: `pkg.json` (experimental, since the format is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +. The order of sources is important, as the first source that +finds a package will be used. + + + +LAZY *lazy.nvim-πŸ“¦-packages-lazy* + +Using a `lazy.lua` file is the recommended way to define your plugin +dependencies and configuration. Syntax is the same as any plugin spec. + + +ROCKSPEC *lazy.nvim-πŸ“¦-packages-rockspec* + +When a plugin contains a `*-1.rockspec` file, **lazy.nvim** will automatically +build the rock and its dependencies. + +A **rockspec** will only be used if one of the following is true: + +- the package does not have a `/lua` directory +- the package has a complex build step +- the package has dependencies (excluding `lua`) + + +PACKSPEC *lazy.nvim-πŸ“¦-packages-packspec* + +Supports the pkg.json + format, with +a lazy extension in `lazy`. `lazy` can contain any valid lazy spec fields. They +will be added to the plugin’s spec. + + +============================================================================== +6. βš™οΈ Configuration *lazy.nvim-βš™οΈ-configuration* + +**lazy.nvim** comes with the following defaults: + +>lua + { + root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed + defaults = { + -- Set this to `true` to have all your plugins lazy-loaded by default. + -- Only do this if you know what you are doing, as it can lead to unexpected behavior. + lazy = false, -- should plugins be lazy-loaded? + -- It's recommended to leave version=false for now, since a lot the plugin that support versioning, + -- have outdated releases, which may break your Neovim install. + version = nil, -- always use the latest git commit + -- version = "*", -- try installing the latest stable version for plugins that support semver + -- default `cond` you can use to globally disable a lot of plugins + -- when running inside vscode for example + cond = nil, ---@type boolean|fun(self:LazyPlugin):boolean|nil + }, + -- leave nil when passing the spec as the first argument to setup() + spec = nil, ---@type LazySpec + local_spec = true, -- load project specific .lazy.lua spec files. They will be added at the end of the spec. + lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. + ---@type number? limit the maximum amount of concurrent tasks + concurrency = jit.os:find("Windows") and (vim.uv.available_parallelism() * 2) or nil, + git = { + -- defaults for the `Lazy log` command + -- log = { "--since=3 days ago" }, -- show commits from the last 3 days + log = { "-8" }, -- show the last 8 commits + timeout = 120, -- kill processes that take more than 2 minutes + url_format = "https://github.com/%s.git", + -- lazy.nvim requires git >=2.19.0. If you really want to use lazy with an older version, + -- then set the below to false. This should work, but is NOT supported and will + -- increase downloads a lot. + filter = true, + -- rate of network related git operations (clone, fetch, checkout) + throttle = { + enabled = false, -- not enabled by default + -- max 2 ops every 5 seconds + rate = 2, + duration = 5 * 1000, -- in ms + }, + -- Time in seconds to wait before running fetch again for a plugin. + -- Repeated update/check operations will not run again until this + -- cooldown period has passed. + cooldown = 0, + }, + pkg = { + enabled = true, + cache = vim.fn.stdpath("state") .. "/lazy/pkg-cache.lua", + -- the first package source that is found for a plugin will be used. + sources = { + "lazy", + "rockspec", -- will only be used when rocks.enabled is true + "packspec", + }, + }, + rocks = { + enabled = true, + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + -- use hererocks to install luarocks? + -- set to `nil` to use hererocks when luarocks is not found + -- set to `true` to always use hererocks + -- set to `false` to always use luarocks + hererocks = nil, + }, + dev = { + -- Directory where you store your local plugin projects. If a function is used, + -- the plugin directory (e.g. `~/projects/plugin-name`) must be returned. + ---@type string | fun(plugin: LazyPlugin): string + path = "~/projects", + ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub + patterns = {}, -- For example {"folke"} + fallback = false, -- Fallback to git when local plugin doesn't exist + }, + install = { + -- install missing plugins on startup. This doesn't increase startup time. + missing = true, + -- try to load one of these colorschemes when starting an installation during startup + colorscheme = { "habamax" }, + }, + ui = { + -- a number <1 is a percentage., >1 is a fixed size + size = { width = 0.8, height = 0.8 }, + wrap = true, -- wrap the lines in the ui + -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. + border = "none", + -- The backdrop opacity. 0 is fully opaque, 100 is fully transparent. + backdrop = 60, + title = nil, ---@type string only works when border is not "none" + title_pos = "center", ---@type "center" | "left" | "right" + -- Show pills on top of the Lazy window + pills = true, ---@type boolean + icons = { + cmd = "ξ―‡ ", + config = "", + debug = "● ", + event = "ξͺ† ", + favorite = "ο€… ", + ft = "ο€– ", + init = " ", + import = " ", + keys = "ο„œ ", + lazy = "σ°’² ", + loaded = "●", + not_loaded = "β—‹", + plugin = "ο’‡ ", + runtime = "ξŸ… ", + require = "σ°’± ", + source = "ο„‘ ", + start = "ξ«“ ", + task = "βœ” ", + list = { + "●", + "➜", + "β˜…", + "β€’", + }, + }, + -- leave nil, to automatically select a browser depending on your OS. + -- If you want to use a specific browser, you can define it here + browser = nil, ---@type string? + throttle = 1000 / 30, -- how frequently should the ui process render events + custom_keys = { + -- You can define custom key maps here. If present, the description will + -- be shown in the help menu. + -- To disable one of the defaults, set it to false. + + ["l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["i"] = { + function(plugin) + Util.notify(vim.inspect(plugin), { + title = "Inspect " .. plugin.name, + lang = "lua", + }) + end, + desc = "Inspect Plugin", + }, + + ["t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + -- Output options for headless mode + headless = { + -- show the output from process commands like git + process = true, + -- show log messages + log = true, + -- show task start/end + task = true, + -- use ansi colors + colors = true, + }, + diff = { + -- diff command can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to as well, + -- so you can have a different command for diff + -- * git: will run git diff and open a buffer with filetype git + -- * terminal_git: will open a pseudo terminal with git diff + -- * diffview.nvim: will open Diffview to show the diff + cmd = "git", + }, + checker = { + -- automatically check for plugin updates + enabled = false, + concurrency = nil, ---@type number? set to 1 to check for updates very slowly + notify = true, -- get a notification when new updates are found + frequency = 3600, -- check for updates every hour + check_pinned = false, -- check for pinned packages that can't be updated + }, + change_detection = { + -- automatically check for config file changes and reload the ui + enabled = true, + notify = true, -- get a notification when changes are found + }, + performance = { + cache = { + enabled = true, + }, + reset_packpath = true, -- reset the package path to improve startup time + rtp = { + reset = true, -- reset the runtime path to $VIMRUNTIME and your config directory + ---@type string[] + paths = {}, -- add any custom paths here that you want to includes in the rtp + ---@type string[] list any plugins you want to disable here + disabled_plugins = { + -- "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + -- "tarPlugin", + -- "tohtml", + -- "tutor", + -- "zipPlugin", + }, + }, + }, + -- lazy can generate helptags from the headings in markdown readme files, + -- so :help works even for plugins that don't have vim docs. + -- when the readme opens with :help it will be correctly displayed as markdown + readme = { + enabled = true, + root = vim.fn.stdpath("state") .. "/lazy/readme", + files = { "README.md", "lua/**/README.md" }, + -- only generate markdown helptags for plugins that don't have docs + skip_if_doc_exists = true, + }, + state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things + -- Enable profiling of lazy.nvim. This will add some overhead, + -- so only enable this when you are debugging lazy.nvim + profiling = { + -- Enables extra stats on the debug tab related to the loader cache. + -- Additionally gathers stats about all package.loaders + loader = false, + -- Track each new require in the Lazy profiling tab + require = false, + }, + } +< + +If you don’t want to use a Nerd Font, you can replace the icons with Unicode symbols. ~ + +>lua + { + ui = { + icons = { + cmd = "⌘", + config = "πŸ› ", + event = "πŸ“…", + ft = "πŸ“‚", + init = "βš™", + keys = "πŸ—", + plugin = "πŸ”Œ", + runtime = "πŸ’»", + require = "πŸŒ™", + source = "πŸ“„", + start = "πŸš€", + task = "πŸ“Œ", + lazy = "πŸ’€ ", + }, + }, + } +< + + +🌈 HIGHLIGHT GROUPS *lazy.nvim-βš™οΈ-configuration-🌈-highlight-groups* + + ----------------------------------------------------------------------- + Highlight Group Default Group Description + ----------------------- ----------------------- ----------------------- + LazyBold { bold = true } + + LazyButton CursorLine + + LazyButtonActive Visual + + LazyComment Comment + + LazyCommit @variable.builtin commit ref + + LazyCommitIssue Number + + LazyCommitScope Italic conventional commit + scope + + LazyCommitType Title conventional commit + type + + LazyDimmed Conceal property + + LazyDir @markup.link directory + + LazyError DiagnosticError task errors + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + LazyInfo DiagnosticInfo task errors + + LazyItalic { italic = true } + + LazyLocal Constant + + LazyNoCond DiagnosticWarn unloaded icon for a + plugin where cond() was + false + + LazyNormal NormalFloat + + LazyProgressDone Constant progress bar done + + LazyProgressTodo LineNr progress bar todo + + LazyProp Conceal property + + LazyReasonCmd Operator + + LazyReasonEvent Constant + + LazyReasonFt Character + + LazyReasonImport Identifier + + LazyReasonKeys Statement + + LazyReasonPlugin Special + + LazyReasonRequire @variable.parameter + + LazyReasonRuntime @macro + + LazyReasonSource Character + + LazyReasonStart @variable.member + + LazySpecial @punctuation.special + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + + LazyWarning DiagnosticWarn task errors + ----------------------------------------------------------------------- + +============================================================================== +7. πŸš€ Usage *lazy.nvim-πŸš€-usage* + + +▢️ STARTUP SEQUENCE *lazy.nvim-πŸš€-usage-▢️-startup-sequence* + +**lazy.nvim** does **NOT** use Neovim packages and even disables plugin loading +completely (`vim.go.loadplugins = false`). It takes over the complete startup +sequence for more flexibility and better performance. + +In practice this means that step 10 of |Neovim Initialization| is done by Lazy: + +1. All the plugins’ `init()` functions are executed +2. All plugins with `lazy=false` are loaded. This includes sourcing `/plugin` and `/ftdetect` files. (`/after` will not be sourced yet) +3. All files from `/plugin` and `/ftdetect` directories in your rtp are sourced (excluding `/after`) +4. All `/after/plugin` files are sourced (this includes `/after` from plugins) + +Files from runtime directories are always sourced in alphabetical order. + + +πŸš€ COMMANDS *lazy.nvim-πŸš€-usage-πŸš€-commands* + +Plugins are managed with the `:Lazy` command. Open the help with `` to see +all the key mappings. + +You can press `` on a plugin to show its details. Most properties can be +hovered with `` to open links, help files, readmes, git commits and git +issues. + +Lazy can automatically check for updates in the background. This feature can be +enabled with `config.checker.enabled = true`. + +Any operation can be started from the UI, with a sub command or an API +function: + + ---------------------------------------------------------------------------------- + Command Lua Description + ------------------------- -------------------------------- ----------------------- + :Lazy build {plugins} require("lazy").build(opts) Rebuild a plugin + + :Lazy check [plugins] require("lazy").check(opts?) Check for updates and + show the log (git + fetch) + + :Lazy clean [plugins] require("lazy").clean(opts?) Clean plugins that are + no longer needed + + :Lazy clear require("lazy").clear() Clear finished tasks + + :Lazy debug require("lazy").debug() Show debug information + + :Lazy health require("lazy").health() Run :checkhealth lazy + + :Lazy help require("lazy").help() Toggle this help page + + :Lazy home require("lazy").home() Go back to plugin list + + :Lazy install [plugins] require("lazy").install(opts?) Install missing plugins + + :Lazy load {plugins} require("lazy").load(opts) Load a plugin that has + not been loaded yet. + Similar to :packadd. + Like + :Lazy load foo.nvim. + Use :Lazy! load to skip + cond checks. + + :Lazy log [plugins] require("lazy").log(opts?) Show recent updates + + :Lazy profile require("lazy").profile() Show detailed profiling + + :Lazy reload {plugins} require("lazy").reload(opts) Reload a plugin + (experimental!!) + + :Lazy restore [plugins] require("lazy").restore(opts?) Updates all plugins to + the state in the + lockfile. For a single + plugin: restore it to + the state in the + lockfile or to a given + commit under the cursor + + :Lazy sync [plugins] require("lazy").sync(opts?) Run install, clean and + update + + :Lazy update [plugins] require("lazy").update(opts?) Update plugins. This + will also update the + lockfile + ---------------------------------------------------------------------------------- +Any command can have a **bang** to make the command wait till it finished. For +example, if you want to sync lazy from the cmdline, you can use: + +>shell + nvim --headless "+Lazy! sync" +qa +< + +`opts` is a table with the following key-values: + +- **wait**: when true, then the call will wait till the operation completed +- **show**: when false, the UI will not be shown +- **plugins**: a list of plugin names to run the operation on +- **concurrency**: limit the `number` of concurrently running tasks + +Stats API (`require("lazy").stats()`): + +>lua + { + -- startuptime in milliseconds till UIEnter + startuptime = 0, + -- when true, startuptime is the accurate cputime for the Neovim process. (Linux & macOS) + -- this is more accurate than `nvim --startuptime`, and as such will be slightly higher + -- when false, startuptime is calculated based on a delta with a timestamp when lazy started. + real_cputime = false, + count = 0, -- total number of plugins + loaded = 0, -- number of loaded plugins + ---@type table + times = {}, + } +< + +**lazy.nvim** provides a statusline component that you can use to show the +number of pending updates. Make sure to enable `config.checker.enabled = true` +to make this work. + +Example of configuring lualine.nvim ~ + +>lua + require("lualine").setup({ + sections = { + lualine_x = { + { + require("lazy.status").updates, + cond = require("lazy.status").has_updates, + color = { fg = "#ff9e64" }, + }, + }, + }, + }) +< + + +πŸ“† USER EVENTS *lazy.nvim-πŸš€-usage-πŸ“†-user-events* + +The following user events will be triggered: + +- **LazyDone**: when lazy has finished starting up and loaded your config +- **LazySync**: after running sync +- **LazyInstall**: after an install +- **LazyUpdate**: after an update +- **LazyClean**: after a clean +- **LazyCheck**: after checking for updates +- **LazyLog**: after running log +- **LazyLoad**: after loading a plugin. The `data` attribute will contain the plugin name. +- **LazySyncPre**: before running sync +- **LazyInstallPre**: before an install +- **LazyUpdatePre**: before an update +- **LazyCleanPre**: before a clean +- **LazyCheckPre**: before checking for updates +- **LazyLogPre**: before running log +- **LazyReload**: triggered by change detection after reloading plugin specs +- **VeryLazy**: triggered after `LazyDone` and processing `VimEnter` auto commands +- **LazyVimStarted**: triggered after `UIEnter` when `require("lazy").stats().startuptime` has been calculated. + Useful to update the startuptime on your dashboard. + + +❌ UNINSTALLING *lazy.nvim-πŸš€-usage-❌-uninstalling* + +To uninstall **lazy.nvim**, you need to remove the following files and +directories: + +- **data**: `~/.local/share/nvim/lazy` +- **state**: `~/.local/state/nvim/lazy` +- **lockfile**: `~/.config/nvim/lazy-lock.json` + + + Paths can differ if you changed `XDG` environment variables. + +πŸ”’ LOCKFILE *lazy.nvim-πŸš€-usage-πŸ”’-lockfile* + +After every **update**, the local lockfile (`lazy-lock.json`) is updated with +the installed revisions. It is recommended to have this file under version +control. + +If you use your Neovim config on multiple machines, using the lockfile, you can +ensure that the same version of every plugin is installed. + +If you are on another machine, you can do `:Lazy restore`, to update all your +plugins to the version from the lockfile. + + +πŸ“¦ MIGRATION GUIDE *lazy.nvim-πŸš€-usage-πŸ“¦-migration-guide* + + +PACKER.NVIM ~ + +- `setup` ➑️ `init` +- `requires` ➑️ `dependencies` +- `as` ➑️ `name` +- `opt` ➑️ `lazy` +- `run` ➑️ `build` +- `lock` ➑️ `pin` +- `disable=true` ➑️ `enabled = false` +- `tag='*'` ➑️ `version="*"` +- `after` is **not needed** for most use-cases. Use `dependencies` otherwise. +- `wants` is **not needed** for most use-cases. Use `dependencies` otherwise. +- `config` don’t support string type, use `fun(LazyPlugin)` instead. +- `module` is auto-loaded. No need to specify +- `keys` spec is |lazy.nvim-different| +- `rtp` can be accomplished with: + +>lua + config = function(plugin) + vim.opt.rtp:append(plugin.dir .. "/custom-rtp") + end +< + +With packer `wants`, `requires` and `after` can be used to manage dependencies. +With lazy, this isn’t needed for most of the Lua dependencies. They can be +installed just like normal plugins (even with `lazy=true`) and will be loaded +when other plugins need them. The `dependencies` key can be used to group those +required plugins with the one that requires them. The plugins which are added +as `dependencies` will always be lazy-loaded and loaded when the plugin is +loaded. + + +PAQ-NVIM ~ + +- `as` ➑️ `name` +- `opt` ➑️ `lazy` +- `run` ➑️ `build` + + +⚑ PROFILING & DEBUG *lazy.nvim-πŸš€-usage-⚑-profiling-&-debug* + +Great care has been taken to make the startup code (`lazy.core`) as efficient +as possible. During startup, all Lua files used before `VimEnter` or +`BufReadPre` are byte-compiled and cached, similar to what impatient.nvim + does. + +My config for example loads in about `11ms` with `93` plugins. I do a lot of +lazy-loading though :) + +**lazy.nvim** comes with an advanced profiler `:Lazy profile` to help you +improve performance. The profiling view shows you why and how long it took to +load your plugins. + + +πŸ› DEBUG ~ + +See an overview of active lazy-loading handlers and what’s in the module +cache. + + +πŸ“‚ STRUCTURING YOUR PLUGINS*lazy.nvim-πŸš€-usage-πŸ“‚-structuring-your-plugins* + +Some users may want to split their plugin specs in multiple files. Instead of +passing a spec table to `setup()`, you can use a Lua module. The specs from the +**module** and any top-level **sub-modules** will be merged together in the +final spec, so it is not needed to add `require` calls in your main plugin file +to the other files. + +The benefits of using this approach: + +- Simple to **add** new plugin specs. Just create a new file in your plugins module. +- Allows for **caching** of all your plugin specs. This becomes important if you have a lot of smaller plugin specs. +- Spec changes will automatically be **reloaded** when they’re updated, so the `:Lazy` UI is always up to date. + +Example: + +- `~/.config/nvim/init.lua` + +>lua + require("lazy").setup("plugins") +< + +- `~/.config/nvim/lua/plugins.lua` or `~/.config/nvim/lua/plugins/init.lua` **(this file is optional)** + +>lua + return { + "folke/neodev.nvim", + "folke/which-key.nvim", + { "folke/neoconf.nvim", cmd = "Neoconf" }, + } +< + +- Any lua file in `~/.config/nvim/lua/plugins/*.lua` will be automatically merged in the main plugin spec + +For a real-life example, you can check LazyVim + and more specifically: + +- lazyvim.plugins contains all the plugin specs that will be loaded + + +↩️ IMPORTING SPECS, CONFIG & OPTS + +As part of a spec, you can add `import` statements to import additional plugin +modules. Both of the `setup()` calls are equivalent: + +>lua + require("lazy").setup("plugins") + + -- Same as: + require("lazy").setup({{import = "plugins"}}) +< + +To import multiple modules from a plugin, add additional specs for each import. +For example, to import LazyVim core plugins and an optional plugin: + +>lua + require("lazy").setup({ + spec = { + { "LazyVim/LazyVim", import = "lazyvim.plugins" }, + { import = "lazyvim.plugins.extras.coding.copilot" }, + } + }) +< + +When you import specs, you can override them by simply adding a spec for the +same plugin to your local specs, adding any keys you want to override / merge. + +`opts`, `dependencies`, `cmd`, `event`, `ft` and `keys` are always merged with +the parent spec. Any other property will override the property from the parent +spec. + + +============================================================================== +8. πŸ”₯ Developers *lazy.nvim-πŸ”₯-developers* + +To make it easier for users to install your plugin, you can include a package +spec in your repo. + + +BEST PRACTICES *lazy.nvim-πŸ”₯-developers-best-practices* + +- If your plugin needs `setup()`, then create a simple `lazy.lua` file like this: + >lua + return { "me/my-plugin", opts = {} } + < +- Plugins that are pure lua libraries should be lazy-loaded with `lazy = true`. + >lua + { "nvim-lua/plenary.nvim", lazy = true } + < +- Always use `opts` instead of `config` when possible. `config` is almost never + needed. +- Only use `dependencies` if a plugin needs the dep to be installed **AND** + loaded. Lua plugins/libraries are automatically loaded when they are + `require()`d, so they don’t need to be in `dependencies`. +- Inside a `build` function or `*.lua` build file, use + `coroutine.yield(msg:string|LazyMsg)` to show progress. +- Don’t change the `cwd` in your build function, since builds run in parallel + and changing the `cwd` will affect other builds. + + +BUILDING *lazy.nvim-πŸ”₯-developers-building* + +The spec **build** property can be one of the following: + +- `fun(plugin: LazyPlugin)`: a function that builds the plugin. +- `*.lua`: a Lua file that builds the plugin (like `build.lua`) +- `":Command"`: a Neovim command +- `"rockspec"`: this will run `luarocks make` in the plugin’s directory + This is automatically set by the `rockspec` package source. +- any other **string** will be run as a shell command +- a `list` of any of the above to run multiple build steps +- if no `build` is specified, but a `build.lua` file exists, that will be used instead. + +Build functions and `*.lua` files run asynchronously in a coroutine. Use +`coroutine.yield(msg:string|LazyMsg)` to show progress. + +Yielding will also schedule the next `coroutine.resume()` to run in the next +tick, so you can do long-running tasks without blocking Neovim. + +>lua + ---@class LazyMsg + ---@field msg string + ---@field level? number vim.log.levels.XXX +< + +Use `vim.log.levels.TRACE` to only show the message as a **status** message for +the task. + + + +MINIT (MINIMAL INIT) *lazy.nvim-πŸ”₯-developers-minit-(minimal-init)* + +**lazy.nvim** comes with some built-in functionality to help you create a +minimal init for your plugin. + +I mainly use this for testing and for users to create a `repro.lua`. + +When running in **headless** mode, **lazy.nvim** will log any messages to the +terminal. See `opts.headless` for more info. + +**minit** will install/load all your specs and will always run an update as +well. + + +BOOTSTRAP ~ + +>lua + -- setting this env will override all XDG paths + vim.env.LAZY_STDPATH = ".tests" + -- this will install lazy in your stdpath + load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() +< + + +TESTING WITH BUSTED ~ + +This will add `"lunarmodules/busted"`, configure `hererocks` and run `busted`. + +Below is an example of how I use **minit** to run tests with busted + in **LazyVim**. + +>lua + #!/usr/bin/env -S nvim -l + + vim.env.LAZY_STDPATH = ".tests" + load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() + + -- Setup lazy.nvim + require("lazy.minit").busted({ + spec = { + "LazyVim/starter", + "williamboman/mason-lspconfig.nvim", + "williamboman/mason.nvim", + "nvim-treesitter/nvim-treesitter", + }, + }) +< + +To use this, you can run: + +>sh + nvim -l ./tests/busted.lua tests +< + +If you want to inspect the test environment, run: + +>sh + nvim -u ./tests/busted.lua +< + + +REPRO.LUA ~ + +>lua + vim.env.LAZY_STDPATH = ".repro" + load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() + + require("lazy.minit").repro({ + spec = { + "stevearc/conform.nvim", + "nvim-neotest/nvim-nio", + }, + }) + + -- do anything else you need to do to reproduce the issue +< + +Then run it with: + +>sh + nvim -u repro.lua +< + +============================================================================== +9. Links *lazy.nvim-links* 1. *image*: https://user-images.githubusercontent.com/292349/208301737-68fb279c-ba70-43ef-a369-8c3e8367d6b1.png +2. *image*: https://user-images.githubusercontent.com/292349/208301766-5c400561-83c3-4811-9667-1ec4bb3c43b8.png +3. *image*: https://user-images.githubusercontent.com/292349/208301790-7eedbfa5-d202-4e70-852e-de68aa47233b.png Generated by panvimdoc diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 87b46dd..7e41487 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -10,43 +10,87 @@ return }, { name = "adopure.nvim", url = "Willem-J-an/adopure.nvim", - version = "1.1.0-1" + version = "2.1.0-1" }, { name = "aerial.nvim", url = "stevearc/aerial.nvim", - version = "1.7.0-1" + version = "2.4.0-1" + }, { + name = "age.nvim", + url = "KingMichaelPark/age.nvim", + version = "0.1.0-1" }, { name = "ai.nvim", url = "S1M0N38/ai.nvim", - version = "0.1.0-1" + version = "1.5.0-1" + }, { + name = "astral.nvim", + url = "rootiest/astral.nvim", + version = "1.0.9-1" }, { name = "auto-hlsearch.nvim", url = "asiryk/auto-hlsearch.nvim", version = "1.1.0-1" + }, { + name = "autosave.nvim", + url = "brianhuster/autosave.nvim", + version = "0.4.2-1" + }, { + name = "avante.nvim", + url = "yetone/avante.nvim", + version = "0.0.18-1" + }, { + name = "banana.nvim", + url = "CWood-sdf/banana.nvim", + version = "0.2.0-1" + }, { + name = "bars-n-lines.nvim", + url = "OXY2DEV/bars-N-lines.nvim", + version = "1.0.0-1" + }, { + name = "base.nvim", + url = "S1M0N38/base.nvim", + version = "1.0.2-1" }, { name = "better-escape.nvim", url = "max397574/better-escape.nvim", - version = "1.0.0-1" + version = "2.3.3-1" }, { name = "bufferline.nvim", url = "akinsho/bufferline.nvim", - version = "4.6.1-1" + version = "4.9.1-1" + }, { + name = "care.nvim", + url = "max397574/care.nvim", + version = "0.1.0-1" }, { name = "ccc.nvim", url = "uga-rosa/ccc.nvim", - version = "1.6.0-1" + version = "2.0.3-1" + }, { + name = "chatml.nvim", + url = "S1M0N38/chatml.nvim", + version = "1.0.0-1" }, { name = "ci-template.nvim", url = "linrongbin16/ci-template.nvim", version = "8.1.0-1" + }, { + name = "cinnamon.nvim", + url = "declancm/cinnamon.nvim", + version = "1.2.5-1" }, { name = "cmp-rg", url = "lukas-reineke/cmp-rg", - version = "1.3.9-1" + version = "1.3.11-1" + }, { + name = "code-stats.nvim", + url = "Freed-Wu/code-stats.nvim", + version = "0.0.2-1" }, { name = "colorbox.nvim", url = "linrongbin16/colorbox.nvim", - version = "3.1.0-1" + version = "3.1.1-1" }, { name = "colorbuddy.nvim", url = "tjdevries/colorbuddy.nvim", @@ -54,7 +98,11 @@ return }, { name = "colortils.nvim", url = "nvim-colortils/colortils.nvim", - version = "1.1.0-1" + version = "1.2.0-1" + }, { + name = "command.nvim", + url = "cultab/command.nvim", + version = "0.1.1-1" }, { name = "commander.nvim", url = "FeiyouG/commander.nvim", @@ -70,15 +118,35 @@ return }, { name = "commons.nvim", url = "linrongbin16/commons.nvim", - version = "18.0.0-1" + version = "27.0.0-1" }, { name = "conform.nvim", url = "stevearc/conform.nvim", - version = "6.0.0-1" + version = "8.4.0-1" + }, { + name = "coop.nvim", + url = "gregorias/coop.nvim", + version = "1.0.1-0" + }, { + name = "copy-diagnostics.nvim", + url = "NickStafford2/copy-diagnostics.nvim", + version = "main-1" + }, { + name = "cord.nvim", + url = "vyfor/cord.nvim", + version = "2.0.3-1" + }, { + name = "cursor-text-objects.nvim", + url = "ColinKennedy/cursor-text-objects.nvim", + version = "1.3.0-1" }, { name = "cybu.nvim", url = "ghillb/cybu.nvim", version = "1.0-1" + }, { + name = "dante.nvim", + url = "S1M0N38/dante.nvim", + version = "1.3.1-1" }, { name = "daylight.nvim", url = "NTBBloodbath/daylight.nvim", @@ -86,11 +154,19 @@ return }, { name = "deadcolumn.nvim", url = "Bekaboo/deadcolumn.nvim", - version = "1.0.0-1" + version = "1.0.1-1" + }, { + name = "decasify.nvim", + url = "alerque/decasify", + version = "0.8.0-1" }, { name = "decipher.nvim", url = "MisanthropicBit/decipher.nvim", - version = "1.0.1-1" + version = "1.0.3-1" + }, { + name = "delog.nvim", + url = "ej-shafran/delog.nvim", + version = "0.0.2-1" }, { name = "detour.nvim", url = "carbon-steel/detour.nvim", @@ -106,15 +182,27 @@ return }, { name = "donut.nvim", url = "NStefan002/donut.nvim", - version = "2.1.0-1" + version = "2.2.1-1" + }, { + name = "donutlify.nvim", + url = "NStefan002/donutlify.nvim", + version = "1.0.0-1" + }, { + name = "doris.nvim", + url = "jackokring/doris.nvim", + version = "0.3.2-1" + }, { + name = "down.nvim", + url = "clpi/down.nvim", + version = "master-1" }, { name = "dressing.nvim", url = "stevearc/dressing.nvim", - version = "2.2.2-1" + version = "3.1.1-1" }, { name = "dropbar.nvim", url = "Bekaboo/dropbar.nvim", - version = "8.4.0-1" + version = "12.0.0-1" }, { name = "duck.nvim", url = "tamton-aquib/duck.nvim", @@ -126,23 +214,35 @@ return }, { name = "edgy.nvim", url = "folke/edgy.nvim", - version = "1.9.1-1" + version = "1.10.2-1" + }, { + name = "efmls-configs-nvim", + url = "creativenull/efmls-configs-nvim", + version = "1.9.0-1" }, { name = "elixir-tools.nvim", url = "elixir-tools/elixir-tools.nvim", - version = "0.14.3-1" + version = "0.17.0-1" + }, { + name = "fake.nvim", + url = "Kibadda/fake.nvim", + version = "4.0.1-1" + }, { + name = "feed.nvim", + url = "neo451/feed.nvim", + version = "1.16.4-1" }, { name = "feline.nvim", url = "freddiehaddad/feline.nvim", - version = "1.6.2-1" + version = "1.7.1-1" }, { name = "fidget.nvim", url = "j-hui/fidget.nvim", - version = "1.4.1-1" + version = "1.6.0-1" }, { name = "flash.nvim", url = "folke/flash.nvim", - version = "1.18.3-1" + version = "2.1.0-1" }, { name = "flatten.nvim", url = "willothy/flatten.nvim", @@ -150,11 +250,15 @@ return }, { name = "flutter-tools.nvim", url = "akinsho/flutter-tools.nvim", - version = "1.10.0-1" + version = "1.14.0-1" }, { name = "focus.nvim", url = "nvim-focus/focus.nvim", version = "1.0.2-1" + }, { + name = "foldtext.nvim", + url = "OXY2DEV/foldtext.nvim", + version = "1.0.0-1" }, { name = "freeze-code.nvim", url = "AlejandroSuero/freeze-code.nvim", @@ -162,7 +266,7 @@ return }, { name = "fugit2.nvim", url = "SuperBo/fugit2.nvim", - version = "0.2.0-1" + version = "0.2.1-1" }, { name = "funnyfiles.nvim", url = "aikooo7/funnyfiles.nvim", @@ -170,7 +274,7 @@ return }, { name = "fzfx.nvim", url = "linrongbin16/fzfx.nvim", - version = "6.4.0-1" + version = "8.1.1-1" }, { name = "galileo.nvim", url = "S1M0N38/galileo.nvim", @@ -182,19 +286,23 @@ return }, { name = "git-worktree.nvim", url = "polarmutex/git-worktree.nvim", - version = "1.0.0-1" + version = "2.0.1-1" + }, { + name = "git.nvim", + url = "Kibadda/git.nvim", + version = "5.1.0-1" }, { name = "github-nvim-theme", url = "projekt0n/github-nvim-theme", - version = "1.0.2-1" + version = "1.1.2-1" }, { name = "gitlinker.nvim", url = "linrongbin16/gitlinker.nvim", - version = "4.13.1-1" + version = "5.0.1-1" }, { name = "gitsigns.nvim", url = "lewis6991/gitsigns.nvim", - version = "scm-1" + version = "1.0.0-1" }, { name = "glow.nvim", url = "ellisonleao/glow.nvim", @@ -202,7 +310,7 @@ return }, { name = "go.nvim", url = "ray-x/go.nvim", - version = "0.2.1-1" + version = "0.9.0-1" }, { name = "godo.nvim", url = "arthuradolfo/godo.nvim", @@ -215,6 +323,14 @@ return name = "gruvbox.nvim", url = "ellisonleao/gruvbox.nvim", version = "2.0.0-1" + }, { + name = "guard.nvim", + url = "nvimdev/guard.nvim", + version = "2.1.2-1" + }, { + name = "hardhat.nvim", + url = "TheSnakeWitcher/hardhat.nvim", + version = "0.1.0-1" }, { name = "haskell-snippets.nvim", url = "mrcjkb/haskell-snippets.nvim", @@ -222,23 +338,35 @@ return }, { name = "haskell-tools.nvim", url = "mrcjkb/haskell-tools.nvim", - version = "3.1.10-1" + version = "4.4.2-1" }, { name = "headlines.nvim", url = "lukas-reineke/headlines.nvim", - version = "4.0.1-1" + version = "5.0.0-1" }, { name = "heirline.nvim", url = "rebelot/heirline.nvim", - version = "1.0.6-1" + version = "1.0.7-1" + }, { + name = "helpview.nvim", + url = "OXY2DEV/helpview.nvim", + version = "2.0.1-1" + }, { + name = "hibiscus.nvim", + url = "udayvir-singh/hibiscus.nvim", + version = "1.7-1" }, { name = "hlchunk.nvim", url = "shellRaining/hlchunk.nvim", - version = "1.1.0-1" + version = "1.3.0-1" }, { name = "hotpot.nvim", url = "rktjmp/hotpot.nvim", - version = "0.12.1-1" + version = "0.14.7-1" + }, { + name = "hurl.nvim", + url = "jellydn/hurl.nvim", + version = "2.1.0-1" }, { name = "hydra.nvim", url = "nvimtools/hydra.nvim", @@ -247,34 +375,58 @@ return name = "image.nvim", url = "3rd/image.nvim", version = "1.3.0-1" + }, { + name = "ime.nvim", + url = "Freed-Wu/ime.nvim", + version = "0.0.1-1" }, { name = "incline.nvim", url = "b0o/incline.nvim", - version = "0.0.1-1" + version = "0.0.3-1" }, { name = "indent-blankline.nvim", url = "lukas-reineke/indent-blankline.nvim", - version = "3.6.3-1" + version = "3.8.7-1" }, { name = "kai.nvim", url = "Kamilcuk/kai.nvim", version = "0.0.6-1" + }, { + name = "kanban.nvim", + url = "Kibadda/kanban.nvim", + version = "1.3.0-1" + }, { + name = "kube.nvim", + url = "mimparat132/kube.nvim", + version = "1.2.0-1" }, { name = "lazy.nvim", url = "folke/lazy.nvim", - version = "11.2.1-1" + version = "11.16.2-1" + }, { + name = "lazydev.nvim", + url = "folke/lazydev.nvim", + version = "1.9.0-1" + }, { + name = "lean.nvim", + url = "Julian/lean.nvim", + version = "2024.12.2-1" }, { name = "leetcode.nvim", url = "kawre/leetcode.nvim", - version = "0.2.0-1" + version = "0.3.0-1" }, { name = "legendary.nvim", url = "mrjones2014/legendary.nvim", - version = "2.13.11-1" + version = "2.13.13-1" }, { name = "live-command.nvim", url = "smjonas/live-command.nvim", - version = "1.2.1-1" + version = "2.2.0-1" + }, { + name = "live-preview.nvim", + url = "brianhuster/live-preview.nvim", + version = "0.9.4-1" }, { name = "logging.nvim", url = "NTBBloodbath/logging.nvim", @@ -283,10 +435,14 @@ return name = "love2d.nvim", url = "S1M0N38/love2d.nvim", version = "0.2-1" + }, { + name = "lsp-format.nvim", + url = "lukas-reineke/lsp-format.nvim", + version = "2.7.1-1" }, { name = "lsp-progress.nvim", url = "linrongbin16/lsp-progress.nvim", - version = "1.0.12-1" + version = "1.0.13-1" }, { name = "lsp_signature.nvim", url = "ray-x/lsp_signature.nvim", @@ -295,6 +451,14 @@ return name = "ltreesitter", url = "euclidianAce/ltreesitter", version = "0.0.7-1" + }, { + name = "ltreesitter-ts", + url = "FourierTransformer/ltreesitter-ts", + version = "0.0.1-1" + }, { + name = "lua-console.nvim", + url = "YaroSpace/lua-console.nvim", + version = "1.2.4-1" }, { name = "lua-obfuscator.nvim", url = "git+ssh://git@github.com/kdssoftware/lua-obfuscator.nvim.git", @@ -307,34 +471,66 @@ return name = "lua-utils.nvim", url = "nvim-neorg/lua-utils.nvim", version = "1.0.2-1" + }, { + name = "luarocks-build-tree-sitter-cli", + url = "FourierTransformer/luarocks-build-tree-sitter-cli", + version = "0.0.2-1" }, { name = "luarocks-build-treesitter-parser", url = "nvim-neorocks/luarocks-build-treesitter-parser", - version = "4.1.0-1" + version = "6.0.0-1" + }, { + name = "luarocks-build-treesitter-parser-cpp", + url = "nvim-neorocks/luarocks-build-treesitter-parser-cpp", + version = "2.0.4-1" + }, { + name = "mag-nvim-lsp", + url = "iguanacucumber/mag-nvim-lsp", + version = "0.2-1" + }, { + name = "mag-nvim-lua", + url = "iguanacucumber/mag-nvim-lua", + version = "0.1-1" + }, { + name = "magazine.nvim", + url = "iguanacucumber/magazine.nvim", + version = "0.4.4-1" }, { name = "mapx.nvim", url = "b0o/mapx.nvim", version = "0.2.1-1" + }, { + name = "markview.nvim", + url = "OXY2DEV/markview.nvim", + version = "25.3.1-1" }, { name = "mason-lspconfig.nvim", url = "williamboman/mason-lspconfig.nvim", - version = "1.29.0-1" + version = "1.31.0-1" }, { name = "mason-nvim-dap.nvim", url = "jay-babu/mason-nvim-dap.nvim", - version = "2.3.0-1" + version = "2.4.0-1" }, { name = "mason.nvim", url = "williamboman/mason.nvim", version = "1.10.0-1" + }, { + name = "melange-nvim", + url = "savq/melange-nvim", + version = "0.9.0-1" }, { name = "mini.nvim", url = "echasnovski/mini.nvim", - version = "0.9.0-1" + version = "0.15.0-1" + }, { + name = "minuet-ai.nvim", + url = "milanglacier/minuet-ai.nvim", + version = "0.3.2-1" }, { name = "mkdnflow.nvim", url = "jakewvincent/mkdnflow.nvim", - version = "1.2.0-1" + version = "1.2.4-1" }, { name = "move.nvim", url = "fedepujol/move.nvim", @@ -342,7 +538,7 @@ return }, { name = "multicursors.nvim", url = "smoka7/multicursors.nvim", - version = "1.0.0-1" + version = "2.0.0-1" }, { name = "my-awesome-plugin.nvim", url = "S1M0N38/my-awesome-plugin.nvim", @@ -354,11 +550,11 @@ return }, { name = "neo-tree.nvim", url = "nvim-neo-tree/neo-tree.nvim", - version = "3.26-1" + version = "3.29-1" }, { name = "neoconf.nvim", url = "folke/neoconf.nvim", - version = "1.2.2-1" + version = "1.4.0-1" }, { name = "neodev.nvim", url = "folke/neodev.nvim", @@ -366,19 +562,43 @@ return }, { name = "neogen", url = "danymat/neogen", - version = "2.17.1-1" + version = "2.20.0-1" }, { name = "neogit", url = "NeogitOrg/neogit", - version = "1.0.0-1" + version = "2.0.0-1" }, { name = "neorg", url = "nvim-neorg/neorg", - version = "8.7.1-1" + version = "9.2.0-1" + }, { + name = "neorg-archive", + url = "bottd/neorg-archive", + version = "1.0.0-1" + }, { + name = "neorg-conceal-wrap", + url = "benlubas/neorg-conceal-wrap", + version = "1.0.1-1" + }, { + name = "neorg-interim-ls", + url = "benlubas/neorg-interim-ls", + version = "2.1.0-1" + }, { + name = "neorg-query", + url = "benlubas/neorg-query", + version = "1.3.1-1" + }, { + name = "neorg-se", + url = "benlubas/neorg-se", + version = "1.1.10-1" }, { name = "neorg-telescope", url = "nvim-neorg/neorg-telescope", - version = "1.1.0-1" + version = "1.2.2-1" + }, { + name = "neorg-worklog", + url = "bottd/neorg-worklog", + version = "1.3.4-1" }, { name = "neoscroll.nvim", url = "karb94/neoscroll.nvim", @@ -386,27 +606,55 @@ return }, { name = "neotest", url = "nvim-neotest/neotest", - version = "5.3.3-1" + version = "5.8.0-1" + }, { + name = "neotest-busted", + url = "MisanthropicBit/neotest-busted", + version = "0.5.0-1" + }, { + name = "neotest-dotnet", + url = "Issafalcon/neotest-dotnet", + version = "stable-1" + }, { + name = "neotest-golang", + url = "fredrikaverpil/neotest-golang", + version = "1.10.1-1" }, { name = "neotest-haskell", url = "mrcjkb/neotest-haskell", - version = "2.0.0-1" + version = "2.1.1-1" + }, { + name = "neotest-java", + url = "rcasia/neotest-java", + version = "0.17.6-1" + }, { + name = "neotest-zig", + url = "lawrence-laz/neotest-zig", + version = "1.3.1-1" + }, { + name = "nerdy.nvim", + url = "2KAbhishek/nerdy.nvim", + version = "1.4-1" + }, { + name = "netman.nvim", + url = "miversen33/netman.nvim", + version = "1.15-1" }, { name = "nightfox.nvim", url = "EdenEast/nightfox.nvim", - version = "3.9.3-1" + version = "3.10.0-1" }, { name = "no-neck-pain.nvim", url = "shortcuts/no-neck-pain.nvim", - version = "1.14.0-1" + version = "2.1.5-1" }, { name = "noice.nvim", url = "folke/noice.nvim", - version = "4.3.0-1" + version = "4.10.0-1" }, { name = "npackages.nvim", url = "diegofigs/npackages.nvim", - version = "0.1.0-1" + version = "0.3.0-1" }, { name = "nui-components.nvim", url = "grapp-dev/nui-components.nvim", @@ -415,6 +663,18 @@ return name = "nui.nvim", url = "MunifTanjim/nui.nvim", version = "0.3.0-1" + }, { + name = "nvim-a2-pack", + url = "dfgordon/nvim-a2-pack", + version = "0.3.1-1" + }, { + name = "nvim-best-practices-plugin-template", + url = "ColinKennedy/nvim-best-practices-plugin-template", + version = "1.7.0-1" + }, { + name = "nvim-bqf", + url = "kevinhwang91/nvim-bqf", + version = "1.1.1-1" }, { name = "nvim-client", url = "neovim/lua-client", @@ -423,10 +683,6 @@ return name = "nvim-client-proxy", url = "hjdivad/nvim-client-proxy", version = "0.1.0-1" - }, { - name = "nvim-cmp", - url = "hrsh7th/nvim-cmp", - version = "0.0.1-2" }, { name = "nvim-cokeline", url = "willothy/nvim-cokeline", @@ -434,7 +690,7 @@ return }, { name = "nvim-dap", url = "mfussenegger/nvim-dap", - version = "0.8.0-1" + version = "0.9.0-1" }, { name = "nvim-dap-ui", url = "rcarriga/nvim-dap-ui", @@ -442,11 +698,15 @@ return }, { name = "nvim-dbee", url = "kndndrj/nvim-dbee", - version = "0.1.6-1" + version = "0.1.9-1" }, { name = "nvim-dev-container", url = "esensar/nvim-dev-container", version = "0.2.0-1" + }, { + name = "nvim-faker", + url = "git+ssh://git@github.com/tehdb/nvim-faker.git", + version = "1.0.0-1" }, { name = "nvim-java", url = "nvim-java/nvim-java", @@ -478,7 +738,7 @@ return }, { name = "nvim-lspconfig", url = "neovim/nvim-lspconfig", - version = "0.1.8-1" + version = "1.6.0-1" }, { name = "nvim-metals", url = "scalameta/nvim-metals", @@ -486,11 +746,11 @@ return }, { name = "nvim-nio", url = "nvim-neotest/nvim-nio", - version = "1.9.4-1" + version = "1.10.1-1" }, { name = "nvim-notify", url = "rcarriga/nvim-notify", - version = "3.13.5-1" + version = "3.15.0-1" }, { name = "nvim-parinfer", url = "gpanders/nvim-parinfer", @@ -502,15 +762,19 @@ return }, { name = "nvim-possession", url = "gennaro-tedesco/nvim-possession", - version = "0.0.13-1" + version = "0.1.0-1" }, { name = "nvim-scrollview", url = "dstein64/nvim-scrollview", - version = "5.1.0-1" + version = "6.0.0-1" }, { name = "nvim-smuggler", url = "Klafyvel/nvim-smuggler", - version = "main-1" + version = "0.5.0-1" + }, { + name = "nvim-snippets", + url = "garymjr/nvim-snippets", + version = "1.0.0-1" }, { name = "nvim-snippy", url = "dcampos/nvim-snippy", @@ -519,10 +783,14 @@ return name = "nvim-surround", url = "kylechui/nvim-surround", version = "2.1.5-1" + }, { + name = "nvim-telescope-cycler", + url = "heindsight/nvim-telescope-cycler", + version = "0.1.0-1" }, { name = "nvim-tree.lua", url = "nvim-tree/nvim-tree.lua", - version = "1.4.0-1" + version = "1.6.0-1" }, { name = "nvim-treesitter-legacy-api", url = "nvim-treesitter/nvim-treesitter", @@ -535,18 +803,26 @@ return name = "nvim-web-devicons", url = "nvim-tree/nvim-web-devicons", version = "0.100-1" + }, { + name = "nvim-window-picker", + url = "s1n7ax/nvim-window-picker", + version = "2.3.1-1" + }, { + name = "obazel.nvim", + url = "glindstedt/obazel.nvim", + version = "0.1.1-1" }, { name = "obsidian.nvim", url = "epwalsh/obsidian.nvim", - version = "3.8.0-1" + version = "3.9.0-1" }, { name = "oil.nvim", url = "stevearc/oil.nvim", - version = "2.10.0-1" + version = "2.14.0-1" }, { name = "onedarkpro.nvim", url = "olimorris/onedarkpro.nvim", - version = "0.8.0-1" + version = "2.9.0-1" }, { name = "onenord.nvim", url = "rmehri01/onenord.nvim", @@ -554,15 +830,15 @@ return }, { name = "otter.nvim", url = "jmbuhr/otter.nvim", - version = "1.15.1-1" + version = "2.6.1-1" }, { name = "overseer.nvim", url = "stevearc/overseer.nvim", - version = "1.4.0-1" + version = "1.5.0-1" }, { name = "oz.nvim", url = "luxluth/oz.nvim", - version = "0.0.3-1" + version = "0.0.4-1" }, { name = "package-info.nvim", url = "vuki656/package-info.nvim", @@ -574,7 +850,7 @@ return }, { name = "papis.nvim", url = "jghauser/papis.nvim", - version = "0.5.1-1" + version = "0.7.0-1" }, { name = "paq-nvim", url = "savq/paq-nvim", @@ -582,11 +858,15 @@ return }, { name = "pathlib.nvim", url = "pysan3/pathlib.nvim", - version = "2.2.2-1" + version = "2.2.3-1" + }, { + name = "persisted.nvim", + url = "olimorris/persisted.nvim", + version = "2.0.2-1" }, { name = "persistence.nvim", url = "folke/persistence.nvim", - version = "2.0.0-1" + version = "3.1.0-1" }, { name = "plenary.nvim", url = "nvim-lua/plenary.nvim", @@ -595,42 +875,78 @@ return name = "pretty-fold.nvim", url = "anuvyklack/pretty-fold.nvim", version = "3.0-1" + }, { + name = "processing.nvim", + url = "sophieforrest/processing.nvim", + version = "1.1.0-1" + }, { + name = "quarry.nvim", + url = "rudionrails/quarry.nvim", + version = "4.0.0-1" + }, { + name = "quicker.nvim", + url = "stevearc/quicker.nvim", + version = "1.3.0-1" }, { name = "rainbow-delimiters.nvim", url = "HiPhish/rainbow-delimiters.nvim", - version = "0.4.0-1" + version = "0.8.0-1" + }, { + name = "remember.nvim", + url = "vladdoster/remember.nvim", + version = "1.4.1-1" }, { name = "renamer.nvim", url = "filipdutescu/renamer.nvim", version = "5.1.0-1" + }, { + name = "render-markdown.nvim", + url = "MeanderingProgrammer/render-markdown.nvim", + version = "8.0.0-1" }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", - version = "2.0.1-1" + version = "3.11.1-1" + }, { + name = "rime.nvim", + url = "Freed-Wu/rime.nvim", + version = "0.0.1-1" }, { name = "rocks-config.nvim", url = "nvim-neorocks/rocks-config.nvim", - version = "2.1.0-1" + version = "3.1.0-1" }, { name = "rocks-dev.nvim", url = "nvim-neorocks/rocks-dev.nvim", - version = "1.2.3-1" + version = "1.7.0-1" }, { name = "rocks-git.nvim", url = "nvim-neorocks/rocks-git.nvim", - version = "1.5.1-1" + version = "2.5.2-1" + }, { + name = "rocks-lazy.nvim", + url = "nvim-neorocks/rocks-lazy.nvim", + version = "1.2.0-1" + }, { + name = "rocks-treesitter.nvim", + url = "nvim-neorocks/rocks-treesitter.nvim", + version = "1.3.0-1" }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.32.0-1" + version = "2.43.1-1" }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", - version = "1.0.0-1" + version = "1.2.0-1" + }, { + name = "runt.nvim", + url = "Julian/runt.nvim", + version = "2024.10.2-1" }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "4.25.1-1" + version = "5.24.4-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -638,7 +954,7 @@ return }, { name = "screenkey.nvim", url = "NStefan002/screenkey.nvim", - version = "2.1.0-1" + version = "2.4.2-1" }, { name = "scrollbar.nvim", url = "Xuyuanp/scrollbar.nvim", @@ -646,7 +962,11 @@ return }, { name = "session.nvim", url = "Kibadda/session.nvim", - version = "2.0.0-1" + version = "3.0.0-1" + }, { + name = "sf.nvim", + url = "xixiaofinland/sf.nvim", + version = "1.9.0-1" }, { name = "sg.nvim", url = "sourcegraph/sg.nvim", @@ -654,11 +974,23 @@ return }, { name = "smart-splits.nvim", url = "mrjones2014/smart-splits.nvim", - version = "1.5.0-1" + version = "1.8.1-1" + }, { + name = "snacks.nvim", + url = "folke/snacks.nvim", + version = "2.20.0-1" + }, { + name = "sos.nvim", + url = "tmillr/sos.nvim", + version = "1.0.0-1" }, { name = "squirrel.nvim", url = "xiaoshihou514/squirrel.nvim", version = "1.0.0-1" + }, { + name = "starter.nvim", + url = "Kibadda/starter.nvim", + version = "1.2.0-1" }, { name = "storm-mode.nvim", url = "HoppenR/storm-mode.nvim", @@ -671,14 +1003,34 @@ return name = "substitute.nvim", url = "gbprod/substitute.nvim", version = "2.0.0-1" + }, { + name = "sus.nvim", + url = "TarunDaCoder/sus.nvim", + version = "1.0.0-1" }, { name = "sweetie.nvim", url = "NTBBloodbath/sweetie.nvim", - version = "3.1.1-1" + version = "3.2.0-1" }, { name = "tabby.nvim", url = "nanozuki/tabby.nvim", - version = "2.5.1-1" + version = "2.7.4-1" + }, { + name = "tangerine.nvim", + url = "udayvir-singh/tangerine.nvim", + version = "2.9-1" + }, { + name = "teacup.neovim", + url = "Clivern/teacup.neovim", + version = "0.0.1-1" + }, { + name = "telescope-cmdline.nvim", + url = "jonarrien/telescope-cmdline.nvim", + version = "0.2.1-1" + }, { + name = "telescope-frecency.nvim", + url = "nvim-telescope/telescope-frecency.nvim", + version = "1.2.0-1" }, { name = "telescope-zf-native.nvim", url = "natecraddock/telescope-zf-native.nvim", @@ -690,69 +1042,1369 @@ return }, { name = "todo-comments.nvim", url = "folke/todo-comments.nvim", - version = "1.2.0-1" + version = "1.4.0-1" }, { name = "toggleterm.nvim", url = "akinsho/toggleterm.nvim", - version = "2.11.0-1" + version = "2.13.1-1" }, { name = "tokyonight.nvim", url = "folke/tokyonight.nvim", - version = "3.0.1-1" + version = "4.11.0-1" + }, { + name = "tree-sitter-ada", + url = "briot/tree-sitter-ada", + version = "0.0.29-1" + }, { + name = "tree-sitter-agda", + url = "tree-sitter/tree-sitter-agda", + version = "0.0.31-1" + }, { + name = "tree-sitter-angular", + url = "dlvandenberg/tree-sitter-angular", + version = "0.0.30-1" + }, { + name = "tree-sitter-apex", + url = "aheber/tree-sitter-sfapex", + version = "0.0.47-1" + }, { + name = "tree-sitter-arduino", + url = "tree-sitter-grammars/tree-sitter-arduino", + version = "0.0.31-1" + }, { + name = "tree-sitter-asm", + url = "RubixDev/tree-sitter-asm", + version = "0.0.30-1" + }, { + name = "tree-sitter-astro", + url = "virchau13/tree-sitter-astro", + version = "0.0.33-1" + }, { + name = "tree-sitter-authzed", + url = "mleonidas/tree-sitter-authzed", + version = "0.0.29-1" + }, { + name = "tree-sitter-awk", + url = "Beaglefoot/tree-sitter-awk", + version = "0.0.32-1" + }, { + name = "tree-sitter-bash", + url = "tree-sitter/tree-sitter-bash", + version = "0.0.40-1" + }, { + name = "tree-sitter-bass", + url = "vito/tree-sitter-bass", + version = "0.0.29-1" + }, { + name = "tree-sitter-beancount", + url = "polarmutex/tree-sitter-beancount", + version = "0.0.30-1" + }, { + name = "tree-sitter-bibtex", + url = "latex-lsp/tree-sitter-bibtex", + version = "0.0.29-1" + }, { + name = "tree-sitter-bicep", + url = "tree-sitter-grammars/tree-sitter-bicep", + version = "0.0.30-1" + }, { + name = "tree-sitter-bitbake", + url = "tree-sitter-grammars/tree-sitter-bitbake", + version = "0.0.30-1" + }, { + name = "tree-sitter-blueprint", + url = "https://gitlab.com/gabmus/tree-sitter-blueprint/-/archive/60ba73739c6083c693d86a1a7cf039c07eb4ed59.zip", + version = "0.0.29-1" + }, { + name = "tree-sitter-bp", + url = "ambroisie/tree-sitter-bp", + version = "0.0.30-1" + }, { + name = "tree-sitter-c", + url = "tree-sitter/tree-sitter-c", + version = "0.0.41-1" + }, { + name = "tree-sitter-c_sharp", + url = "tree-sitter/tree-sitter-c-sharp", + version = "0.0.40-1" + }, { + name = "tree-sitter-cairo", + url = "tree-sitter-grammars/tree-sitter-cairo", + version = "0.0.29-1" + }, { + name = "tree-sitter-capnp", + url = "tree-sitter-grammars/tree-sitter-capnp", + version = "0.0.29-1" + }, { + name = "tree-sitter-chatito", + url = "tree-sitter-grammars/tree-sitter-chatito", + version = "0.0.30-1" + }, { + name = "tree-sitter-circom", + url = "Decurity/tree-sitter-circom", + version = "0.0.1-1" + }, { + name = "tree-sitter-cli", + url = "FourierTransformer/tree-sitter-cli", + version = "0.25.1-2" + }, { + name = "tree-sitter-clojure", + url = "sogaiu/tree-sitter-clojure", + version = "0.0.29-1" + }, { + name = "tree-sitter-cmake", + url = "uyha/tree-sitter-cmake", + version = "0.0.31-1" + }, { + name = "tree-sitter-comment", + url = "stsewd/tree-sitter-comment", + version = "0.0.29-1" + }, { + name = "tree-sitter-commonlisp", + url = "tree-sitter-grammars/tree-sitter-commonlisp", + version = "0.0.29-1" + }, { + name = "tree-sitter-cooklang", + url = "addcninblue/tree-sitter-cooklang", + version = "0.0.29-1" + }, { + name = "tree-sitter-corn", + url = "jakestanger/tree-sitter-corn", + version = "0.0.29-1" + }, { + name = "tree-sitter-cpon", + url = "tree-sitter-grammars/tree-sitter-cpon", + version = "0.0.29-1" + }, { + name = "tree-sitter-cpp", + url = "tree-sitter/tree-sitter-cpp", + version = "0.0.41-1" + }, { + name = "tree-sitter-css", + url = "tree-sitter/tree-sitter-css", + version = "0.0.36-1" + }, { + name = "tree-sitter-csv", + url = "tree-sitter-grammars/tree-sitter-csv", + version = "0.0.29-1" + }, { + name = "tree-sitter-cuda", + url = "tree-sitter-grammars/tree-sitter-cuda", + version = "0.0.30-1" + }, { + name = "tree-sitter-cue", + url = "eonpatapon/tree-sitter-cue", + version = "0.0.30-1" + }, { + name = "tree-sitter-cylc", + url = "elliotfontaine/tree-sitter-cylc", + version = "0.0.1-1" + }, { + name = "tree-sitter-d", + url = "gdamore/tree-sitter-d", + version = "0.0.33-1" + }, { + name = "tree-sitter-dart", + url = "UserNobody14/tree-sitter-dart", + version = "0.0.34-1" + }, { + name = "tree-sitter-desktop", + url = "ValdezFOmar/tree-sitter-desktop", + version = "0.0.8-1" + }, { + name = "tree-sitter-devicetree", + url = "joelspadin/tree-sitter-devicetree", + version = "0.0.32-1" + }, { + name = "tree-sitter-dhall", + url = "jbellerb/tree-sitter-dhall", + version = "0.0.31-1" + }, { + name = "tree-sitter-diff", + url = "the-mikedavis/tree-sitter-diff", + version = "0.0.32-1" + }, { + name = "tree-sitter-disassembly", + url = "ColinKennedy/tree-sitter-disassembly", + version = "0.0.29-1" + }, { + name = "tree-sitter-djot", + url = "treeman/tree-sitter-djot", + version = "0.0.34-1" + }, { + name = "tree-sitter-dockerfile", + url = "camdencheek/tree-sitter-dockerfile", + version = "0.0.30-1" + }, { + name = "tree-sitter-dot", + url = "rydesun/tree-sitter-dot", + version = "0.0.29-1" + }, { + name = "tree-sitter-doxygen", + url = "tree-sitter-grammars/tree-sitter-doxygen", + version = "0.0.29-1" + }, { + name = "tree-sitter-dtd", + url = "tree-sitter-grammars/tree-sitter-xml", + version = "0.0.34-1" + }, { + name = "tree-sitter-earthfile", + url = "glehmann/tree-sitter-earthfile", + version = "0.0.35-1" + }, { + name = "tree-sitter-ebnf", + url = "RubixDev/ebnf", + version = "0.0.29-1" + }, { + name = "tree-sitter-ecma", + url = "nvim-neorocks/luarocks-stub", + version = "0.0.30-1" + }, { + name = "tree-sitter-editorconfig", + url = "ValdezFOmar/tree-sitter-editorconfig", + version = "0.0.47-1" + }, { + name = "tree-sitter-eds", + url = "uyha/tree-sitter-eds", + version = "0.0.30-1" + }, { + name = "tree-sitter-eex", + url = "connorlay/tree-sitter-eex", + version = "0.0.29-1" + }, { + name = "tree-sitter-elixir", + url = "elixir-lang/tree-sitter-elixir", + version = "0.0.39-1" + }, { + name = "tree-sitter-elm", + url = "elm-tooling/tree-sitter-elm", + version = "0.0.31-1" + }, { + name = "tree-sitter-elsa", + url = "glapa-grossklag/tree-sitter-elsa", + version = "0.0.29-1" + }, { + name = "tree-sitter-elvish", + url = "elves/tree-sitter-elvish", + version = "0.0.29-1" + }, { + name = "tree-sitter-embedded_template", + url = "tree-sitter/tree-sitter-embedded-template", + version = "0.0.34-1" + }, { + name = "tree-sitter-enforce", + url = "simonvic/tree-sitter-enforce", + version = "0.0.2-1" + }, { + name = "tree-sitter-erlang", + url = "WhatsApp/tree-sitter-erlang", + version = "0.0.40-1" + }, { + name = "tree-sitter-facility", + url = "FacilityApi/tree-sitter-facility", + version = "0.0.30-1" + }, { + name = "tree-sitter-faust", + url = "khiner/tree-sitter-faust", + version = "0.0.29-1" + }, { + name = "tree-sitter-fennel", + url = "alexmozaidze/tree-sitter-fennel", + version = "0.0.29-1" + }, { + name = "tree-sitter-fidl", + url = "google/tree-sitter-fidl", + version = "0.0.29-1" + }, { + name = "tree-sitter-firrtl", + url = "tree-sitter-grammars/tree-sitter-firrtl", + version = "0.0.29-1" + }, { + name = "tree-sitter-fish", + url = "ram02z/tree-sitter-fish", + version = "0.0.30-1" + }, { + name = "tree-sitter-foam", + url = "FoamScience/tree-sitter-foam", + version = "0.0.30-1" + }, { + name = "tree-sitter-forth", + url = "AlexanderBrevig/tree-sitter-forth", + version = "0.0.29-1" + }, { + name = "tree-sitter-fortran", + url = "stadelmanma/tree-sitter-fortran", + version = "0.0.41-1" + }, { + name = "tree-sitter-fsh", + url = "mgramigna/tree-sitter-fsh", + version = "0.0.29-1" + }, { + name = "tree-sitter-fsharp", + url = "ionide/tree-sitter-fsharp", + version = "0.0.11-1" + }, { + name = "tree-sitter-func", + url = "tree-sitter-grammars/tree-sitter-func", + version = "0.0.29-1" + }, { + name = "tree-sitter-fusion", + url = "https://gitlab.com/jirgn/tree-sitter-fusion/-/archive/19db2f47ba4c3a0f6238d4ae0e2abfca16e61dd6.zip", + version = "0.0.29-1" + }, { + name = "tree-sitter-gap", + url = "gap-system/tree-sitter-gap", + version = "0.0.31-1" + }, { + name = "tree-sitter-gaptst", + url = "gap-system/tree-sitter-gaptst", + version = "0.0.30-1" + }, { + name = "tree-sitter-gdscript", + url = "PrestonKnopp/tree-sitter-gdscript", + version = "0.0.34-1" + }, { + name = "tree-sitter-gdshader", + url = "GodOfAvacyn/tree-sitter-gdshader", + version = "0.0.29-1" + }, { + name = "tree-sitter-git_config", + url = "the-mikedavis/tree-sitter-git-config", + version = "0.0.29-1" + }, { + name = "tree-sitter-git_rebase", + url = "the-mikedavis/tree-sitter-git-rebase", + version = "0.0.29-1" + }, { + name = "tree-sitter-gitattributes", + url = "tree-sitter-grammars/tree-sitter-gitattributes", + version = "0.0.30-1" + }, { + name = "tree-sitter-gitcommit", + url = "gbprod/tree-sitter-gitcommit", + version = "0.0.33-1" + }, { + name = "tree-sitter-gitignore", + url = "shunsambongi/tree-sitter-gitignore", + version = "0.0.29-1" + }, { + name = "tree-sitter-gleam", + url = "gleam-lang/tree-sitter-gleam", + version = "0.0.35-1" + }, { + name = "tree-sitter-glimmer", + url = "ember-tooling/tree-sitter-glimmer", + version = "0.0.29-1" + }, { + name = "tree-sitter-glimmer_javascript", + url = "NullVoxPopuli/tree-sitter-glimmer-javascript", + version = "0.0.30-1" + }, { + name = "tree-sitter-glimmer_typescript", + url = "NullVoxPopuli/tree-sitter-glimmer-typescript", + version = "0.0.30-1" + }, { + name = "tree-sitter-glsl", + url = "tree-sitter-grammars/tree-sitter-glsl", + version = "0.0.30-1" + }, { + name = "tree-sitter-gn", + url = "tree-sitter-grammars/tree-sitter-gn", + version = "0.0.29-1" + }, { + name = "tree-sitter-gnuplot", + url = "dpezto/tree-sitter-gnuplot", + version = "0.0.30-1" + }, { + name = "tree-sitter-go", + url = "tree-sitter/tree-sitter-go", + version = "0.0.39-1" + }, { + name = "tree-sitter-goctl", + url = "chaozwn/tree-sitter-goctl", + version = "0.0.29-1" + }, { + name = "tree-sitter-godot_resource", + url = "PrestonKnopp/tree-sitter-godot-resource", + version = "0.0.32-1" + }, { + name = "tree-sitter-gomod", + url = "camdencheek/tree-sitter-go-mod", + version = "0.0.33-1" + }, { + name = "tree-sitter-gosum", + url = "tree-sitter-grammars/tree-sitter-go-sum", + version = "0.0.29-1" + }, { + name = "tree-sitter-gotmpl", + url = "ngalaiko/tree-sitter-go-template", + version = "0.0.35-1" + }, { + name = "tree-sitter-gowork", + url = "omertuc/tree-sitter-go-work", + version = "0.0.29-1" + }, { + name = "tree-sitter-gpg", + url = "tree-sitter-grammars/tree-sitter-gpg-config", + version = "0.0.30-1" + }, { + name = "tree-sitter-graphql", + url = "bkegley/tree-sitter-graphql", + version = "0.0.29-1" + }, { + name = "tree-sitter-gren", + url = "MaeBrooks/tree-sitter-gren", + version = "0.0.6-1" + }, { + name = "tree-sitter-groovy", + url = "murtaza64/tree-sitter-groovy", + version = "0.0.33-1" + }, { + name = "tree-sitter-gstlaunch", + url = "tree-sitter-grammars/tree-sitter-gstlaunch", + version = "0.0.29-1" + }, { + name = "tree-sitter-hack", + url = "slackhq/tree-sitter-hack", + version = "0.0.30-1" + }, { + name = "tree-sitter-hare", + url = "tree-sitter-grammars/tree-sitter-hare", + version = "0.0.29-1" + }, { + name = "tree-sitter-haskell", + url = "tree-sitter/tree-sitter-haskell", + version = "0.0.32-1" + }, { + name = "tree-sitter-haskell_persistent", + url = "MercuryTechnologies/tree-sitter-haskell-persistent", + version = "0.0.29-1" + }, { + name = "tree-sitter-hcl", + url = "tree-sitter-grammars/tree-sitter-hcl", + version = "0.0.29-1" + }, { + name = "tree-sitter-heex", + url = "connorlay/tree-sitter-heex", + version = "0.0.34-1" + }, { + name = "tree-sitter-helm", + url = "ngalaiko/tree-sitter-go-template", + version = "0.0.35-1" + }, { + name = "tree-sitter-hjson", + url = "winston0410/tree-sitter-hjson", + version = "0.0.29-1" + }, { + name = "tree-sitter-hlsl", + url = "tree-sitter-grammars/tree-sitter-hlsl", + version = "0.0.31-1" + }, { + name = "tree-sitter-hlsplaylist", + url = "Freed-Wu/tree-sitter-hlsplaylist", + version = "0.0.29-1" + }, { + name = "tree-sitter-hocon", + url = "antosha417/tree-sitter-hocon", + version = "0.0.29-1" + }, { + name = "tree-sitter-hoon", + url = "urbit-pilled/tree-sitter-hoon", + version = "0.0.32-1" + }, { + name = "tree-sitter-html", + url = "tree-sitter/tree-sitter-html", + version = "0.0.36-1" + }, { + name = "tree-sitter-html_tags", + url = "nvim-neorocks/luarocks-stub", + version = "0.0.29-1" + }, { + name = "tree-sitter-htmldjango", + url = "interdependence/tree-sitter-htmldjango", + version = "0.0.29-1" + }, { + name = "tree-sitter-http", + url = "rest-nvim/tree-sitter-http", + version = "0.0.35-1" + }, { + name = "tree-sitter-hurl", + url = "pfeiferj/tree-sitter-hurl", + version = "0.0.30-1" + }, { + name = "tree-sitter-hyprlang", + url = "tree-sitter-grammars/tree-sitter-hyprlang", + version = "0.0.34-1" + }, { + name = "tree-sitter-idl", + url = "cathaysia/tree-sitter-idl", + version = "0.0.32-1" + }, { + name = "tree-sitter-idris", + url = "kayhide/tree-sitter-idris", + version = "0.0.1-1" + }, { + name = "tree-sitter-ini", + url = "justinmk/tree-sitter-ini", + version = "0.0.29-1" + }, { + name = "tree-sitter-inko", + url = "inko-lang/tree-sitter-inko", + version = "0.0.38-1" + }, { + name = "tree-sitter-ipkg", + url = "srghma/tree-sitter-ipkg", + version = "0.0.1-1" + }, { + name = "tree-sitter-ispc", + url = "tree-sitter-grammars/tree-sitter-ispc", + version = "0.0.30-1" + }, { + name = "tree-sitter-janet_simple", + url = "sogaiu/tree-sitter-janet-simple", + version = "0.0.33-1" + }, { + name = "tree-sitter-java", + url = "tree-sitter/tree-sitter-java", + version = "0.0.40-1" + }, { + name = "tree-sitter-javascript", + url = "tree-sitter/tree-sitter-javascript", + version = "0.0.36-1" + }, { + name = "tree-sitter-jinja", + url = "cathaysia/tree-sitter-jinja", + version = "0.0.2-1" + }, { + name = "tree-sitter-jinja_inline", + url = "cathaysia/tree-sitter-jinja", + version = "0.0.2-1" + }, { + name = "tree-sitter-jq", + url = "flurie/tree-sitter-jq", + version = "0.0.29-1" + }, { + name = "tree-sitter-jsdoc", + url = "tree-sitter/tree-sitter-jsdoc", + version = "0.0.35-1" + }, { + name = "tree-sitter-json", + url = "tree-sitter/tree-sitter-json", + version = "0.0.36-1" + }, { + name = "tree-sitter-json5", + url = "Joakker/tree-sitter-json5", + version = "0.0.29-1" + }, { + name = "tree-sitter-jsonc", + url = "https://gitlab.com/WhyNotHugo/tree-sitter-jsonc/-/archive/02b01653c8a1c198ae7287d566efa86a135b30d5.zip", + version = "0.0.29-1" + }, { + name = "tree-sitter-jsonnet", + url = "sourcegraph/tree-sitter-jsonnet", + version = "0.0.29-1" + }, { + name = "tree-sitter-jsx", + url = "nvim-neorocks/luarocks-stub", + version = "0.0.29-1" + }, { + name = "tree-sitter-julia", + url = "tree-sitter/tree-sitter-julia", + version = "0.0.42-1" + }, { + name = "tree-sitter-just", + url = "IndianBoy42/tree-sitter-just", + version = "0.0.36-1" + }, { + name = "tree-sitter-kconfig", + url = "tree-sitter-grammars/tree-sitter-kconfig", + version = "0.0.32-1" + }, { + name = "tree-sitter-kdl", + url = "tree-sitter-grammars/tree-sitter-kdl", + version = "0.0.29-1" + }, { + name = "tree-sitter-kotlin", + url = "fwcd/tree-sitter-kotlin", + version = "0.0.32-1" + }, { + name = "tree-sitter-koto", + url = "koto-lang/tree-sitter-koto", + version = "0.0.37-1" + }, { + name = "tree-sitter-kusto", + url = "Willem-J-an/tree-sitter-kusto", + version = "0.0.29-1" + }, { + name = "tree-sitter-lalrpop", + url = "traxys/tree-sitter-lalrpop", + version = "0.0.31-1" + }, { + name = "tree-sitter-latex", + url = "latex-lsp/tree-sitter-latex", + version = "0.0.33-1" + }, { + name = "tree-sitter-ledger", + url = "cbarrete/tree-sitter-ledger", + version = "0.0.33-1" + }, { + name = "tree-sitter-leo", + url = "r001/tree-sitter-leo", + version = "0.0.33-1" + }, { + name = "tree-sitter-linkerscript", + url = "tree-sitter-grammars/tree-sitter-linkerscript", + version = "0.0.29-1" + }, { + name = "tree-sitter-liquid", + url = "hankthetank27/tree-sitter-liquid", + version = "0.0.29-1" + }, { + name = "tree-sitter-liquidsoap", + url = "savonet/tree-sitter-liquidsoap", + version = "0.0.30-1" + }, { + name = "tree-sitter-llvm", + url = "benwilliamgraham/tree-sitter-llvm", + version = "0.0.30-1" + }, { + name = "tree-sitter-lua", + url = "tree-sitter-grammars/tree-sitter-lua", + version = "0.0.33-1" + }, { + name = "tree-sitter-luadoc", + url = "tree-sitter-grammars/tree-sitter-luadoc", + version = "0.0.29-1" + }, { + name = "tree-sitter-luap", + url = "tree-sitter-grammars/tree-sitter-luap", + version = "0.0.29-1" + }, { + name = "tree-sitter-luau", + url = "tree-sitter-grammars/tree-sitter-luau", + version = "0.0.30-1" + }, { + name = "tree-sitter-m68k", + url = "grahambates/tree-sitter-m68k", + version = "0.0.29-1" + }, { + name = "tree-sitter-make", + url = "alemuller/tree-sitter-make", + version = "0.0.29-1" + }, { + name = "tree-sitter-markdown", + url = "tree-sitter-grammars/tree-sitter-markdown", + version = "0.0.37-1" + }, { + name = "tree-sitter-markdown_inline", + url = "tree-sitter-grammars/tree-sitter-markdown", + version = "0.0.37-1" + }, { + name = "tree-sitter-matlab", + url = "acristoffers/tree-sitter-matlab", + version = "0.0.32-1" + }, { + name = "tree-sitter-menhir", + url = "Kerl13/tree-sitter-menhir", + version = "0.0.29-1" + }, { + name = "tree-sitter-mermaid", + url = "monaqa/tree-sitter-mermaid", + version = "0.0.29-1" + }, { + name = "tree-sitter-meson", + url = "tree-sitter-grammars/tree-sitter-meson", + version = "0.0.30-1" + }, { + name = "tree-sitter-mlir", + url = "artagnon/tree-sitter-mlir", + version = "0.0.44-1" + }, { + name = "tree-sitter-muttrc", + url = "neomutt/tree-sitter-muttrc", + version = "0.0.29-1" + }, { + name = "tree-sitter-nasm", + url = "naclsn/tree-sitter-nasm", + version = "0.0.30-1" + }, { + name = "tree-sitter-nginx", + url = "opa-oz/tree-sitter-nginx", + version = "0.0.30-1" + }, { + name = "tree-sitter-nickel", + url = "nickel-lang/tree-sitter-nickel", + version = "0.0.31-1" + }, { + name = "tree-sitter-nim", + url = "alaviss/tree-sitter-nim", + version = "0.0.29-1" + }, { + name = "tree-sitter-nim_format_string", + url = "aMOPel/tree-sitter-nim-format-string", + version = "0.0.29-1" + }, { + name = "tree-sitter-ninja", + url = "alemuller/tree-sitter-ninja", + version = "0.0.29-1" + }, { + name = "tree-sitter-nix", + url = "cstrahan/tree-sitter-nix", + version = "0.0.56-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", - version = "0.2.4-1" + version = "0.2.6-1" }, { name = "tree-sitter-norg-meta", url = "nvim-neorg/tree-sitter-norg-meta", version = "0.1.0-1" + }, { + name = "tree-sitter-nqc", + url = "tree-sitter-grammars/tree-sitter-nqc", + version = "0.0.30-1" + }, { + name = "tree-sitter-nu", + url = "nushell/tree-sitter-nu", + version = "0.0.32-1" + }, { + name = "tree-sitter-objc", + url = "tree-sitter-grammars/tree-sitter-objc", + version = "0.0.31-1" + }, { + name = "tree-sitter-objdump", + url = "ColinKennedy/tree-sitter-objdump", + version = "0.0.29-1" + }, { + name = "tree-sitter-ocaml", + url = "tree-sitter/tree-sitter-ocaml", + version = "0.0.39-1" + }, { + name = "tree-sitter-ocaml_interface", + url = "tree-sitter/tree-sitter-ocaml", + version = "0.0.40-1" + }, { + name = "tree-sitter-ocamllex", + url = "atom-ocaml/tree-sitter-ocamllex", + version = "0.0.30-1" + }, { + name = "tree-sitter-odin", + url = "tree-sitter-grammars/tree-sitter-odin", + version = "0.0.32-1" + }, { + name = "tree-sitter-org", + url = "milisims/tree-sitter-org", + version = "0.0.1-1" }, { name = "tree-sitter-orgmode", url = "nvim-orgmode/tree-sitter-org", version = "1.3.2-1" + }, { + name = "tree-sitter-pascal", + url = "Isopod/tree-sitter-pascal", + version = "0.0.29-1" + }, { + name = "tree-sitter-passwd", + url = "ath3/tree-sitter-passwd", + version = "0.0.29-1" + }, { + name = "tree-sitter-pem", + url = "tree-sitter-grammars/tree-sitter-pem", + version = "0.0.30-1" + }, { + name = "tree-sitter-perl", + url = "tree-sitter-perl/tree-sitter-perl", + version = "0.0.41-1" + }, { + name = "tree-sitter-php", + url = "tree-sitter/tree-sitter-php", + version = "0.0.38-1" + }, { + name = "tree-sitter-php_only", + url = "tree-sitter/tree-sitter-php", + version = "0.0.39-1" + }, { + name = "tree-sitter-phpdoc", + url = "claytonrcarter/tree-sitter-phpdoc", + version = "0.0.30-1" + }, { + name = "tree-sitter-pioasm", + url = "leo60228/tree-sitter-pioasm", + version = "0.0.30-1" + }, { + name = "tree-sitter-po", + url = "tree-sitter-grammars/tree-sitter-po", + version = "0.0.29-1" + }, { + name = "tree-sitter-pod", + url = "tree-sitter-perl/tree-sitter-pod", + version = "0.0.29-1" + }, { + name = "tree-sitter-poe_filter", + url = "tree-sitter-grammars/tree-sitter-poe-filter", + version = "0.0.31-1" + }, { + name = "tree-sitter-pony", + url = "tree-sitter-grammars/tree-sitter-pony", + version = "0.0.29-1" + }, { + name = "tree-sitter-powershell", + url = "airbus-cert/tree-sitter-powershell", + version = "0.0.36-1" + }, { + name = "tree-sitter-printf", + url = "tree-sitter-grammars/tree-sitter-printf", + version = "0.0.32-1" + }, { + name = "tree-sitter-prisma", + url = "victorhqc/tree-sitter-prisma", + version = "0.0.30-1" + }, { + name = "tree-sitter-problog", + url = "foxyseta/tree-sitter-prolog", + version = "0.0.29-1" + }, { + name = "tree-sitter-prolog", + url = "foxyseta/tree-sitter-prolog", + version = "0.0.29-1" + }, { + name = "tree-sitter-promql", + url = "MichaHoffmann/tree-sitter-promql", + version = "0.0.29-1" + }, { + name = "tree-sitter-properties", + url = "tree-sitter-grammars/tree-sitter-properties", + version = "0.0.31-1" + }, { + name = "tree-sitter-proto", + url = "treywood/tree-sitter-proto", + version = "0.0.29-1" + }, { + name = "tree-sitter-prql", + url = "PRQL/tree-sitter-prql", + version = "0.0.30-1" + }, { + name = "tree-sitter-psv", + url = "tree-sitter-grammars/tree-sitter-csv", + version = "0.0.29-1" + }, { + name = "tree-sitter-pug", + url = "zealot128/tree-sitter-pug", + version = "0.0.30-1" + }, { + name = "tree-sitter-puppet", + url = "tree-sitter-grammars/tree-sitter-puppet", + version = "0.0.30-1" + }, { + name = "tree-sitter-purescript", + url = "postsolar/tree-sitter-purescript", + version = "0.0.29-1" + }, { + name = "tree-sitter-pymanifest", + url = "tree-sitter-grammars/tree-sitter-pymanifest", + version = "0.0.29-1" + }, { + name = "tree-sitter-python", + url = "tree-sitter/tree-sitter-python", + version = "0.0.40-1" + }, { + name = "tree-sitter-ql", + url = "tree-sitter/tree-sitter-ql", + version = "0.0.31-1" + }, { + name = "tree-sitter-qmldir", + url = "tree-sitter-grammars/tree-sitter-qmldir", + version = "0.0.29-1" + }, { + name = "tree-sitter-qmljs", + url = "yuja/tree-sitter-qmljs", + version = "0.0.31-1" + }, { + name = "tree-sitter-query", + url = "tree-sitter-grammars/tree-sitter-query", + version = "0.0.34-1" + }, { + name = "tree-sitter-r", + url = "r-lib/tree-sitter-r", + version = "0.0.34-1" + }, { + name = "tree-sitter-racket", + url = "6cdh/tree-sitter-racket", + version = "0.0.31-1" + }, { + name = "tree-sitter-ralph", + url = "alephium/tree-sitter-ralph", + version = "0.0.29-1" + }, { + name = "tree-sitter-rasi", + url = "Fymyte/tree-sitter-rasi", + version = "0.0.29-1" + }, { + name = "tree-sitter-razor", + url = "tris203/tree-sitter-razor", + version = "0.0.1-1" + }, { + name = "tree-sitter-rbs", + url = "joker1007/tree-sitter-rbs", + version = "0.0.31-1" + }, { + name = "tree-sitter-re2c", + url = "tree-sitter-grammars/tree-sitter-re2c", + version = "0.0.31-1" + }, { + name = "tree-sitter-readline", + url = "tree-sitter-grammars/tree-sitter-readline", + version = "0.0.30-1" + }, { + name = "tree-sitter-regex", + url = "tree-sitter/tree-sitter-regex", + version = "0.0.40-1" + }, { + name = "tree-sitter-rego", + url = "FallenAngel97/tree-sitter-rego", + version = "0.0.29-1" + }, { + name = "tree-sitter-requirements", + url = "tree-sitter-grammars/tree-sitter-requirements", + version = "0.0.29-1" + }, { + name = "tree-sitter-rescript", + url = "rescript-lang/tree-sitter-rescript", + version = "0.0.29-1" + }, { + name = "tree-sitter-rnoweb", + url = "bamonroe/tree-sitter-rnoweb", + version = "0.0.29-1" + }, { + name = "tree-sitter-robot", + url = "Hubro/tree-sitter-robot", + version = "0.0.32-1" + }, { + name = "tree-sitter-robots", + url = "opa-oz/tree-sitter-robots-txt", + version = "0.0.29-1" + }, { + name = "tree-sitter-roc", + url = "faldor20/tree-sitter-roc", + version = "0.0.31-1" + }, { + name = "tree-sitter-ron", + url = "tree-sitter-grammars/tree-sitter-ron", + version = "0.0.29-1" + }, { + name = "tree-sitter-rst", + url = "stsewd/tree-sitter-rst", + version = "0.0.32-1" + }, { + name = "tree-sitter-ruby", + url = "tree-sitter/tree-sitter-ruby", + version = "0.0.35-1" + }, { + name = "tree-sitter-runescript", + url = "2004Scape/tree-sitter-runescript", + version = "0.0.1-1" + }, { + name = "tree-sitter-rust", + url = "tree-sitter/tree-sitter-rust", + version = "0.0.41-1" + }, { + name = "tree-sitter-scala", + url = "tree-sitter/tree-sitter-scala", + version = "0.0.46-1" + }, { + name = "tree-sitter-scfg", + url = "rockorager/tree-sitter-scfg", + version = "0.0.30-1" + }, { + name = "tree-sitter-scheme", + url = "6cdh/tree-sitter-scheme", + version = "0.0.31-1" + }, { + name = "tree-sitter-scss", + url = "serenadeai/tree-sitter-scss", + version = "0.0.29-1" + }, { + name = "tree-sitter-sflog", + url = "aheber/tree-sitter-sfapex", + version = "0.0.44-1" + }, { + name = "tree-sitter-slang", + url = "tree-sitter-grammars/tree-sitter-slang", + version = "0.0.32-1" + }, { + name = "tree-sitter-slim", + url = "theoo/tree-sitter-slim", + version = "0.0.3-1" + }, { + name = "tree-sitter-slint", + url = "slint-ui/tree-sitter-slint", + version = "0.0.33-1" + }, { + name = "tree-sitter-smali", + url = "tree-sitter-grammars/tree-sitter-smali", + version = "0.0.29-1" + }, { + name = "tree-sitter-smithy", + url = "indoorvivants/tree-sitter-smithy", + version = "0.0.29-1" + }, { + name = "tree-sitter-snakemake", + url = "osthomas/tree-sitter-snakemake", + version = "0.0.31-1" + }, { + name = "tree-sitter-solidity", + url = "JoranHonig/tree-sitter-solidity", + version = "0.0.34-1" + }, { + name = "tree-sitter-soql", + url = "aheber/tree-sitter-sfapex", + version = "0.0.46-1" + }, { + name = "tree-sitter-sosl", + url = "aheber/tree-sitter-sfapex", + version = "0.0.44-1" + }, { + name = "tree-sitter-sourcepawn", + url = "nilshelmig/tree-sitter-sourcepawn", + version = "0.0.30-1" + }, { + name = "tree-sitter-sparql", + url = "GordianDziwis/tree-sitter-sparql", + version = "0.0.30-1" + }, { + name = "tree-sitter-sql", + url = "derekstride/tree-sitter-sql", + version = "0.0.39-1" + }, { + name = "tree-sitter-squirrel", + url = "tree-sitter-grammars/tree-sitter-squirrel", + version = "0.0.29-1" + }, { + name = "tree-sitter-ssh_config", + url = "tree-sitter-grammars/tree-sitter-ssh-config", + version = "0.0.32-1" + }, { + name = "tree-sitter-starlark", + url = "tree-sitter-grammars/tree-sitter-starlark", + version = "0.0.31-1" + }, { + name = "tree-sitter-strace", + url = "sigmaSd/tree-sitter-strace", + version = "0.0.29-1" + }, { + name = "tree-sitter-styled", + url = "mskelton/tree-sitter-styled", + version = "0.0.32-1" + }, { + name = "tree-sitter-supercollider", + url = "madskjeldgaard/tree-sitter-supercollider", + version = "0.0.30-1" + }, { + name = "tree-sitter-superhtml", + url = "kristoff-it/superhtml", + version = "0.0.13-1" + }, { + name = "tree-sitter-surface", + url = "connorlay/tree-sitter-surface", + version = "0.0.29-1" + }, { + name = "tree-sitter-svelte", + url = "tree-sitter-grammars/tree-sitter-svelte", + version = "0.0.32-1" + }, { + name = "tree-sitter-sway", + url = "FuelLabs/tree-sitter-sway", + version = "0.0.3-1" + }, { + name = "tree-sitter-swift", + url = "alex-pinkus/tree-sitter-swift", + version = "0.0.45-1" + }, { + name = "tree-sitter-sxhkdrc", + url = "RaafatTurki/tree-sitter-sxhkdrc", + version = "0.0.30-1" + }, { + name = "tree-sitter-systemtap", + url = "ok-ryoko/tree-sitter-systemtap", + version = "0.0.29-1" + }, { + name = "tree-sitter-systemverilog", + url = "zhangwwpeng/tree-sitter-systemverilog", + version = "0.0.29-1" + }, { + name = "tree-sitter-t32", + url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/e5a12f798f056049642aa03fbb83786e3a5b95d4.zip", + version = "0.0.41-1" + }, { + name = "tree-sitter-tablegen", + url = "tree-sitter-grammars/tree-sitter-tablegen", + version = "0.0.29-1" + }, { + name = "tree-sitter-tact", + url = "tact-lang/tree-sitter-tact", + version = "0.0.33-1" + }, { + name = "tree-sitter-tcl", + url = "tree-sitter-grammars/tree-sitter-tcl", + version = "0.0.30-1" + }, { + name = "tree-sitter-teal", + url = "euclidianAce/tree-sitter-teal", + version = "0.0.33-1" + }, { + name = "tree-sitter-templ", + url = "vrischmann/tree-sitter-templ", + version = "0.0.45-1" + }, { + name = "tree-sitter-terraform", + url = "MichaHoffmann/tree-sitter-hcl", + version = "0.0.29-1" + }, { + name = "tree-sitter-textproto", + url = "PorterAtGoogle/tree-sitter-textproto", + version = "0.0.31-1" + }, { + name = "tree-sitter-thrift", + url = "tree-sitter-grammars/tree-sitter-thrift", + version = "0.0.30-1" + }, { + name = "tree-sitter-tiger", + url = "ambroisie/tree-sitter-tiger", + version = "0.0.29-1" + }, { + name = "tree-sitter-tlaplus", + url = "tlaplus-community/tree-sitter-tlaplus", + version = "0.0.36-1" + }, { + name = "tree-sitter-tmux", + url = "Freed-Wu/tree-sitter-tmux", + version = "0.0.29-1" + }, { + name = "tree-sitter-todotxt", + url = "arnarg/tree-sitter-todotxt", + version = "0.0.29-1" + }, { + name = "tree-sitter-toml", + url = "tree-sitter-grammars/tree-sitter-toml", + version = "0.0.31-1" + }, { + name = "tree-sitter-tsv", + url = "tree-sitter-grammars/tree-sitter-csv", + version = "0.0.29-1" + }, { + name = "tree-sitter-tsx", + url = "tree-sitter/tree-sitter-typescript", + version = "0.0.35-1" + }, { + name = "tree-sitter-turtle", + url = "GordianDziwis/tree-sitter-turtle", + version = "0.0.29-1" + }, { + name = "tree-sitter-twig", + url = "gbprod/tree-sitter-twig", + version = "0.0.29-1" + }, { + name = "tree-sitter-typescript", + url = "tree-sitter/tree-sitter-typescript", + version = "0.0.36-1" + }, { + name = "tree-sitter-typespec", + url = "happenslol/tree-sitter-typespec", + version = "0.0.33-1" + }, { + name = "tree-sitter-typoscript", + url = "Teddytrombone/tree-sitter-typoscript", + version = "0.0.29-1" + }, { + name = "tree-sitter-typst", + url = "uben0/tree-sitter-typst", + version = "0.0.35-1" + }, { + name = "tree-sitter-udev", + url = "tree-sitter-grammars/tree-sitter-udev", + version = "0.0.30-1" + }, { + name = "tree-sitter-ungrammar", + url = "tree-sitter-grammars/tree-sitter-ungrammar", + version = "0.0.29-1" + }, { + name = "tree-sitter-unison", + url = "kylegoetz/tree-sitter-unison", + version = "0.0.33-1" + }, { + name = "tree-sitter-usd", + url = "ColinKennedy/tree-sitter-usd", + version = "0.0.29-1" + }, { + name = "tree-sitter-uxntal", + url = "tree-sitter-grammars/tree-sitter-uxntal", + version = "0.0.29-1" + }, { + name = "tree-sitter-v", + url = "vlang/v-analyzer", + version = "0.0.43-1" + }, { + name = "tree-sitter-vala", + url = "vala-lang/tree-sitter-vala", + version = "0.0.30-1" + }, { + name = "tree-sitter-vento", + url = "ventojs/tree-sitter-vento", + version = "0.0.30-1" + }, { + name = "tree-sitter-verilog", + url = "gmlarumbe/tree-sitter-systemverilog", + version = "0.0.38-1" + }, { + name = "tree-sitter-vhdl", + url = "jpt13653903/tree-sitter-vhdl", + version = "0.0.38-1" + }, { + name = "tree-sitter-vhs", + url = "charmbracelet/tree-sitter-vhs", + version = "0.0.32-1" + }, { + name = "tree-sitter-vim", + url = "tree-sitter-grammars/tree-sitter-vim", + version = "0.0.30-1" + }, { + name = "tree-sitter-vimdoc", + url = "neovim/tree-sitter-vimdoc", + version = "0.0.31-1" + }, { + name = "tree-sitter-vrl", + url = "belltoy/tree-sitter-vrl", + version = "0.0.29-1" + }, { + name = "tree-sitter-vue", + url = "tree-sitter-grammars/tree-sitter-vue", + version = "0.0.29-1" + }, { + name = "tree-sitter-wgsl", + url = "szebniok/tree-sitter-wgsl", + version = "0.0.31-1" + }, { + name = "tree-sitter-wgsl_bevy", + url = "tree-sitter-grammars/tree-sitter-wgsl-bevy", + version = "0.0.30-1" + }, { + name = "tree-sitter-wing", + url = "winglang/tree-sitter-wing", + version = "0.0.29-1" + }, { + name = "tree-sitter-wit", + url = "liamwh/tree-sitter-wit", + version = "0.0.30-1" + }, { + name = "tree-sitter-xcompose", + url = "tree-sitter-grammars/tree-sitter-xcompose", + version = "0.0.29-1" + }, { + name = "tree-sitter-xml", + url = "tree-sitter-grammars/tree-sitter-xml", + version = "0.0.36-1" + }, { + name = "tree-sitter-xresources", + url = "ValdezFOmar/tree-sitter-xresources", + version = "0.0.19-1" + }, { + name = "tree-sitter-yaml", + url = "tree-sitter-grammars/tree-sitter-yaml", + version = "0.0.31-1" + }, { + name = "tree-sitter-yang", + url = "Hubro/tree-sitter-yang", + version = "0.0.29-1" + }, { + name = "tree-sitter-yuck", + url = "tree-sitter-grammars/tree-sitter-yuck", + version = "0.0.29-1" + }, { + name = "tree-sitter-zathurarc", + url = "Freed-Wu/tree-sitter-zathurarc", + version = "0.0.29-1" + }, { + name = "tree-sitter-zig", + url = "tree-sitter-grammars/tree-sitter-zig", + version = "0.0.34-1" + }, { + name = "tree-sitter-ziggy", + url = "kristoff-it/ziggy", + version = "0.0.9-1" + }, { + name = "tree-sitter-ziggy_schema", + url = "kristoff-it/ziggy", + version = "0.0.9-1" + }, { + name = "treedoc.nvim", + url = "neo451/treedoc.nvim", + version = "1.0.3-1" }, { name = "trouble.nvim", url = "folke/trouble.nvim", - version = "3.4.3-1" + version = "3.7.1-1" + }, { + name = "ts-comments.nvim", + url = "folke/ts-comments.nvim", + version = "1.5.0-1" }, { name = "tsc.nvim", url = "dmmulroy/tsc.nvim", - version = "2.3.0-1" + version = "2.5.0-1" }, { name = "twilight.nvim", url = "folke/twilight.nvim", version = "1.0.0-1" + }, { + name = "u.nvim", + url = "jrop/u.nvim", + version = "0.2.0-1" }, { name = "unimpaired.nvim", url = "tummetott/unimpaired.nvim", - version = "0.2.0-1" + version = "0.3.0-1" }, { name = "vgit.nvim", url = "tanvirtin/vgit.nvim", - version = "0.2.2-1" + version = "1.0.6-1" }, { name = "which-key.nvim", url = "folke/which-key.nvim", - version = "2.1.0-1" + version = "3.16.0-1" }, { name = "windline.nvim", url = "windwp/windline.nvim", version = "1.1.0-1" + }, { + name = "winmove.nvim", + url = "MisanthropicBit/winmove.nvim", + version = "0.1.2-1" + }, { + name = "wormhole.nvim", + url = "NStefan002/wormhole.nvim", + version = "1.1.1-1" + }, { + name = "wrapping-paper.nvim", + url = "benlubas/wrapping-paper.nvim", + version = "1.0.0-1" }, { name = "yanky.nvim", url = "gbprod/yanky.nvim", version = "2.0.0-1" + }, { + name = "yarepl.nvim", + url = "milanglacier/yarepl.nvim", + version = "0.10.1-1" }, { name = "yazi.nvim", url = "mikavilpas/yazi.nvim", - version = "master-1" + version = "7.5.4-1" }, { name = "zen-mode.nvim", url = "folke/zen-mode.nvim", - version = "1.3.0-1" + version = "1.4.0-1" }, { name = "zk-nvim", url = "zk-org/zk-nvim", - version = "0.1.0-1" + version = "0.2.0-1" } } \ No newline at end of file diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c50b9c5..603dd1a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -34,6 +34,17 @@ M.defaults = { -- then set the below to false. This should work, but is NOT supported and will -- increase downloads a lot. filter = true, + -- rate of network related git operations (clone, fetch, checkout) + throttle = { + enabled = false, -- not enabled by default + -- max 2 ops every 5 seconds + rate = 2, + duration = 5 * 1000, -- in ms + }, + -- Time in seconds to wait before running fetch again for a plugin. + -- Repeated update/check operations will not run again until this + -- cooldown period has passed. + cooldown = 0, }, pkg = { enabled = true, @@ -56,7 +67,9 @@ M.defaults = { hererocks = nil, }, dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + -- Directory where you store your local plugin projects. If a function is used, + -- the plugin directory (e.g. `~/projects/plugin-name`) must be returned. + ---@type string | fun(plugin: LazyPlugin): string path = "~/projects", ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} @@ -83,6 +96,7 @@ M.defaults = { icons = { cmd = "ξ―‡ ", config = "", + debug = "● ", event = "ξͺ† ", favorite = "ο€… ", ft = "ο€– ", @@ -205,7 +219,7 @@ M.defaults = { enabled = true, root = vim.fn.stdpath("state") .. "/lazy/readme", files = { "README.md", "lua/**/README.md" }, - -- only generate markdown helptags for plugins that dont have docs + -- only generate markdown helptags for plugins that don't have docs skip_if_doc_exists = true, }, state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things @@ -228,7 +242,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.10.4" -- x-release-please-version +M.version = "11.17.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") @@ -284,6 +298,9 @@ function M.setup(opts) M.me = debug.getinfo(1, "S").source:sub(2) M.me = Util.norm(vim.fn.fnamemodify(M.me, ":p:h:h:h:h")) + local lib = vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib" + lib = vim.uv.fs_stat(lib .. "64") and (lib .. "64") or lib + lib = lib .. "/nvim" if M.options.performance.rtp.reset then ---@type vim.Option vim.opt.rtp = { @@ -291,7 +308,7 @@ function M.setup(opts) vim.fn.stdpath("data") .. "/site", M.me, vim.env.VIMRUNTIME, - vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib/nvim", + lib, vim.fn.stdpath("config") .. "/after", } end diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index b7ce3e5..22d3252 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -5,7 +5,7 @@ local Util = require("lazy.core.util") ---@field type LazyHandlerTypes ---@field extends? LazyHandler ---@field active table> ----@field managed table +---@field managed table mapping handler keys to plugin names ---@field super LazyHandler local M = {} @@ -114,7 +114,7 @@ function M:add(plugin) if not self.active[key] then self.active[key] = {} self:_add(value) - self.managed[key] = key + self.managed[key] = plugin.name end self.active[key][plugin.name] = plugin.name end diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 57fbc18..5b5f173 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -11,7 +11,7 @@ local Util = require("lazy.core.util") ---@class LazyKeysSpec: LazyKeysBase ---@field [1] string lhs ----@field [2]? string|fun()|false rhs +---@field [2]? string|fun():string?|false rhs ---@field mode? string|string[] ---@class LazyKeys: LazyKeysBase diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c5cdca2..1501efd 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -161,7 +161,7 @@ function M.get_start_plugins() ---@type LazyPlugin[] local start = {} for _, plugin in pairs(Config.plugins) do - if plugin.lazy == false and not plugin._.loaded then + if not plugin._.loaded and (plugin._.rtp_loaded or plugin.lazy == false) then start[#start + 1] = plugin end end @@ -341,7 +341,9 @@ function M._load(plugin, reason, opts) Util.track({ plugin = plugin.name, start = reason.start }) Handler.disable(plugin) - M.add_to_rtp(plugin) + if not plugin.virtual then + M.add_to_rtp(plugin) + end if plugin._.pkg and plugin._.pkg.source == "rockspec" then M.add_to_luapath(plugin) @@ -353,7 +355,9 @@ function M._load(plugin, reason, opts) end, "Failed to load deps for " .. plugin.name) end - M.packadd(plugin.dir) + if not plugin.virtual then + M.packadd(plugin.dir) + end if plugin.config or plugin.opts then M.config(plugin) end @@ -493,8 +497,11 @@ function M.add_to_luapath(plugin) local root = Config.options.rocks.root .. "/" .. plugin.name local path = root .. "/share/lua/5.1" local cpath = root .. "/lib/lua/5.1" + local cpath2 = root .. "/lib64/lua/5.1" + package.path = package.path .. ";" .. path .. "/?.lua;" .. path .. "/?/init.lua;" package.cpath = package.cpath .. ";" .. cpath .. "/?." .. (jit.os:find("Windows") and "dll" or "so") .. ";" + package.cpath = package.cpath .. ";" .. cpath2 .. "/?." .. (jit.os:find("Windows") and "dll" or "so") .. ";" end function M.source(path) @@ -552,6 +559,8 @@ function M.loader(modname) end if ret then + -- explicitly set to nil to prevent loading errors + package.loaded[modname] = nil M.auto_load(modname, ret.modpath) local mod = package.loaded[modname] if type(mod) == "table" then diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 6e781a0..6fbdfc4 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -179,6 +179,7 @@ function M:_rebuild(name) local super = nil plugin.url = nil plugin._.dep = true + plugin._.top = true plugin.optional = true assert(#plugin._.frags > 0, "no fragments found for plugin " .. name) @@ -195,6 +196,7 @@ function M:_rebuild(name) plugin._.dep = plugin._.dep and fragment.dep plugin.optional = plugin.optional and (rawget(fragment.spec, "optional") == true) plugin.url = fragment.url or plugin.url + plugin._.top = plugin._.top and fragment.pid == nil -- dependencies for _, dep in ipairs(fragment.deps or {}) do @@ -213,6 +215,8 @@ function M:_rebuild(name) plugin.dir = super.dir if plugin.dir then plugin.dir = Util.norm(plugin.dir) + elseif super.virtual then + plugin.dir = Util.norm("/dev/null/" .. plugin.name) else if plugin.dev == nil and plugin.url then for _, pattern in ipairs(Config.options.dev.patterns) do @@ -300,13 +304,26 @@ end --- Removes plugins that are disabled. function M:fix_disabled() local changes = 0 - for _, plugin in pairs(self.plugins) do - if plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled()) then - changes = changes + 1 - self:disable(plugin) + local function check(top) + for _, plugin in pairs(self.plugins) do + if (plugin._.top or false) == top then + if plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled()) then + changes = changes + 1 + if plugin.optional then + self:del(plugin.name) + else + self:disable(plugin) + end + self:rebuild() + end + end end end - self:rebuild() + -- disable top-level plugins first, since they may have non-top-level frags + -- that disable other plugins + check(true) + -- then disable non-top-level plugins + check(false) return changes end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index d121fdf..37d1a8f 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -146,33 +146,43 @@ function Spec:import(spec) local imported = 0 - ---@type (string|(fun():LazyPluginSpec))[] + ---@type {modname: string, load: fun():(LazyPluginSpec?, string?)}[] local modspecs = {} if type(import) == "string" then Util.lsmod(import, function(modname, modpath) - modspecs[#modspecs + 1] = modname - package.preload[modname] = function() - return loadfile(modpath)() - end + modspecs[#modspecs + 1] = { + modname = modname, + load = function() + local mod, err = loadfile(modpath) + if mod then + return mod() + else + return nil, err + end + end, + } + end) + table.sort(modspecs, function(a, b) + return a.modname < b.modname end) - table.sort(modspecs) else - modspecs = { spec.import } + modspecs = { { modname = import_name, load = spec.import } } end for _, modspec in ipairs(modspecs) do imported = imported + 1 - local modname = type(modspec) == "string" and modspec or import_name + local modname = modspec.modname Util.track({ import = modname }) self.importing = modname -- unload the module so we get a clean slate ---@diagnostic disable-next-line: no-unknown package.loaded[modname] = nil Util.try(function() - local mod = type(modspec) == "function" and modspec() or require(modspec) - if type(mod) ~= "table" then - self.importing = nil + local mod, err = modspec.load() + if err then + self:error("Failed to load `" .. modname .. "`:\n" .. err) + elseif type(mod) ~= "table" then return self:error( "Invalid spec module: `" .. modname @@ -180,21 +190,20 @@ function Spec:import(spec) .. type(mod) .. "` was returned instead" ) + else + self:normalize(mod) end - self:normalize(mod) - self.importing = nil - Util.track() end, { msg = "Failed to load `" .. modname .. "`", on_error = function(msg) self:error(msg) - self.importing = nil - Util.track() end, }) + self.importing = nil + Util.track() end if imported == 0 then - self:error("No specs found for module " .. spec.import) + self:error("No specs found for module " .. vim.inspect(spec.import)) end end @@ -228,12 +237,15 @@ function M.update_state() or plugin.cmd plugin.lazy = lazy and true or false end - if plugin.dir:find(Config.options.root, 1, true) == 1 then + if plugin.virtual then + plugin._.is_local = true + plugin._.installed = true -- local plugins are managed by the user + elseif plugin.dir:find(Config.options.root, 1, true) == 1 then plugin._.installed = installed[plugin.name] ~= nil installed[plugin.name] = nil else plugin._.is_local = true - plugin._.installed = true -- local plugins are managed by the user + plugin._.installed = vim.fn.isdirectory(plugin.dir) == 1 end end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 6d7c3b8..83e8a92 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -66,7 +66,7 @@ end ---@param name string ---@return string function M.normname(name) - local ret = name:lower():gsub("^n?vim%-", ""):gsub("%.n?vim$", ""):gsub("%.lua", ""):gsub("[^a-z]+", "") + local ret = name:lower():gsub("^n?vim%-", ""):gsub("%.n?vim$", ""):gsub("[%.%-]lua", ""):gsub("[^a-z]+", "") return ret end @@ -270,7 +270,7 @@ function M.get_unloaded_rtp(modname, opts) local Config = require("lazy.core.config") if Config.spec then for _, plugin in pairs(Config.spec.plugins) do - if not (plugin._.loaded or plugin.module == false) then + if not (plugin._.loaded or plugin.module == false or plugin.virtual) then if norm == M.normname(plugin.name) then table.insert(rtp, 1, plugin.dir) else @@ -374,6 +374,7 @@ function M.notify(msg, opts) local lang = opts.lang or "markdown" local n = opts.once and vim.notify_once or vim.notify n(msg, opts.level or vim.log.levels.INFO, { + ft = lang, on_open = function(win) local ok = pcall(function() vim.treesitter.language.add("markdown") diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 36880a1..afee2d4 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -131,7 +131,8 @@ function M.colors(opts) { "---", "---", "---" }, } Util.foreach(require(opts.modname).colors, function(group, link) - lines[#lines + 1] = { "**" .. opts.name .. group .. "**", "***" .. link .. "***", comments[group] or "" } + link = type(link) == "table" and "`" .. vim.inspect(link):gsub("%s+", " ") .. "`" or "***" .. link .. "***" + lines[#lines + 1] = { "**" .. opts.name .. group .. "**", link, comments[group] or "" } end) return { content = M.table(lines) } end diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 9e2a869..6a6d60d 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -1,4 +1,5 @@ local Config = require("lazy.core.config") +local Process = require("lazy.manage.process") local uv = vim.uv or vim.loop local M = {} @@ -36,11 +37,11 @@ function M.have(cmd, opts) local found for _, c in ipairs(cmd) do if vim.fn.executable(c) == 1 then - local version = vim.fn.system(c .. " " .. opts.version) or "" - if vim.v.shell_error ~= 0 then - opts.error(("failed to get version of {%s}\n%s"):format(c, version)) + local out, exit_code = Process.exec({ c, opts.version }) + if exit_code ~= 0 then + opts.error(("failed to get version of {%s}\n%s"):format(c, table.concat(out, "\n"))) else - version = vim.trim(vim.split(version, "\n")[1]) + local version = vim.trim(out[1] or "") version = version:gsub("^%s*" .. vim.pesc(c) .. "%s*", "") if opts.version_pattern and not version:find(opts.version_pattern, 1, true) then opts.warn(("`%s` version `%s` needed, but found `%s`"):format(c, opts.version_pattern, version)) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index ac9ba14..e28d9dd 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -80,6 +80,7 @@ function M.install(opts) opts = M.opts(opts, { mode = "install" }) return M.run({ pipeline = { + "plugin.exists", "git.clone", { "git.checkout", lockfile = opts.lockfile }, "plugin.docs", @@ -108,6 +109,7 @@ function M.update(opts) opts = M.opts(opts, { mode = "update" }) return M.run({ pipeline = { + "plugin.exists", "git.origin", "git.branch", "git.fetch", @@ -147,6 +149,7 @@ function M.check(opts) opts = opts or {} return M.run({ pipeline = { + "plugin.exists", { "git.origin", check = true }, "git.fetch", "git.status", diff --git a/lua/lazy/manage/lock.lua b/lua/lazy/manage/lock.lua index a1b4c74..b3c4444 100644 --- a/lua/lazy/manage/lock.lua +++ b/lua/lazy/manage/lock.lua @@ -42,7 +42,7 @@ function M.update() f:write(",\n") end end - f:write("\n}") + f:write("\n}\n") f:close() end diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 9425fec..ef848f9 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -1,8 +1,54 @@ +local Async = require("lazy.async") local Config = require("lazy.core.config") local Git = require("lazy.manage.git") local Lock = require("lazy.manage.lock") local Util = require("lazy.util") +local throttle = {} +throttle.running = 0 +throttle.waiting = {} ---@type Async[] +throttle.timer = vim.uv.new_timer() + +function throttle.next() + throttle.running = 0 + while #throttle.waiting > 0 and throttle.running < Config.options.git.throttle.rate do + ---@type Async + local task = table.remove(throttle.waiting, 1) + task:resume() + throttle.running = throttle.running + 1 + end + if throttle.running == 0 then + throttle.timer:stop() + end +end + +function throttle.wait() + if not Config.options.git.throttle.enabled then + return + end + if not throttle.timer:is_active() then + throttle.timer:start(0, Config.options.git.throttle.duration, vim.schedule_wrap(throttle.next)) + end + local running = Async.running() + if throttle.running < Config.options.git.throttle.rate then + throttle.running = throttle.running + 1 + else + table.insert(throttle.waiting, running) + coroutine.yield("waiting") + running:suspend() + coroutine.yield("") + end +end + +---@param plugin LazyPlugin +local function cooldown(plugin) + if not plugin._.last_check then + return false + end + local delta = (vim.uv.now() - plugin._.last_check) / 1000 + return delta < Config.options.git.cooldown +end + ---@type table local M = {} @@ -84,6 +130,7 @@ M.clone = { end, ---@async run = function(self) + throttle.wait() local args = { "clone", self.plugin.url, @@ -228,11 +275,12 @@ M.status = { -- fetches all needed origin branches M.fetch = { skip = function(plugin) - return not plugin._.installed or plugin._.is_local + return not plugin._.installed or plugin._.is_local or cooldown(plugin) end, ---@async run = function(self) + throttle.wait() local args = { "fetch", "--recurse-submodules", @@ -248,6 +296,11 @@ M.fetch = { self:spawn("git", { args = args, cwd = self.plugin.dir, + on_exit = function(ok) + if ok then + self.plugin._.last_check = vim.uv.now() + end + end, }) end, } @@ -262,6 +315,7 @@ M.checkout = { ---@async ---@param opts {lockfile?:boolean} run = function(self, opts) + throttle.wait() local info = assert(Git.info(self.plugin.dir)) local target = assert(Git.get_target(self.plugin)) @@ -281,7 +335,7 @@ M.checkout = { end end - -- dont run checkout if target is already reached. + -- don't run checkout if target is already reached. -- unless we just cloned, since then we won't have any data yet if Git.eq(info, target) and info.branch == target.branch then self.plugin._.updated = { diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index fd6c12b..cec9762 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -19,6 +19,9 @@ local B = {} ---@param task LazyTask ---@param build string function B.cmd(task, build) + if task.plugin.build ~= "rockspec" then + Loader.load(task.plugin, { task = "build" }) + end local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) --[[@as vim.api.keyset.cmd]] task:log(vim.api.nvim_cmd(cmd, { output = true })) end @@ -48,10 +51,6 @@ M.build = { run = function(self) vim.cmd([[silent! runtime plugin/rplugin.vim]]) - if self.plugin.build ~= "rockspec" then - Loader.load(self.plugin, { task = "build" }) - end - local builders = self.plugin.build -- Skip if `build` is set to `false` @@ -88,14 +87,25 @@ M.build = { M.docs = { skip = function(plugin) - return not plugin._.dirty + return not plugin._.is_local and not plugin._.dirty end, run = function(self) - local docs = self.plugin.dir .. "/doc/" + local docs = self.plugin.dir .. "/doc" if Util.file_exists(docs) then self:log(vim.api.nvim_cmd({ cmd = "helptags", args = { docs } }, { output = true })) end end, } +M.exists = { + skip = function(plugin) + return not plugin._.is_local or plugin.virtual + end, + run = function(self) + if not Util.file_exists(self.plugin.dir) then + self:error("Local plugin does not exist at `" .. self.plugin.dir .. "`") + end + end, +} + return M diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index 838ac36..0b8f3ca 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -25,13 +25,19 @@ function M.setup(opts) opts = M.extend({ local_spec = false, change_detection = { enabled = false }, + dev = { + patterns = vim.env.LAZY_DEV and vim.split(vim.env.LAZY_DEV, ",") or nil, + }, }, opts) local args = {} local is_busted = false + local is_minitest = false for _, a in ipairs(_G.arg) do if a == "--busted" then is_busted = true + elseif a == "--minitest" then + is_minitest = true else table.insert(args, a) end @@ -40,6 +46,8 @@ function M.setup(opts) if is_busted then opts = M.busted.setup(opts) + elseif is_minitest then + opts = M.minitest.setup(opts) end -- set stdpaths to use .tests @@ -49,7 +57,6 @@ function M.setup(opts) vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name end end - vim.o.loadplugins = true require("lazy").setup(opts) if vim.g.colors_name == nil then @@ -68,6 +75,8 @@ function M.setup(opts) if is_busted then M.busted.run() + elseif is_minitest then + M.minitest.run() end end @@ -89,6 +98,70 @@ function M.repro(opts) M.setup(opts) end +M.minitest = {} + +function M.minitest.run() + local Config = require("lazy.core.config") + -- disable termnial output for the tests + Config.options.headless = {} + + if not require("lazy.core.config").headless() then + return vim.notify("busted can only run in headless mode. Please run with `nvim -l`", vim.log.levels.WARN) + end + package.path = package.path .. ";" .. vim.uv.cwd() .. "/tests/?.lua" + local Test = require("mini.test") + local expect = Test.expect + local _assert = assert + local Assert = { + __call = function(_, ...) + return _assert(...) + end, + same = expect.equality, + equal = expect.equality, + are = { + equal = expect.equality, + }, + is_not = { + same = expect.no_equality, + }, + is_not_nil = function(a) + return expect.no_equality(nil, a) + end, + is_true = function(a) + return expect.equality(true, a) + end, + is_false = function(a) + return expect.equality(false, a) + end, + } + Assert.__index = Assert + assert = setmetatable({}, Assert) + assert = require("luassert") + require("mini.test").run() +end + +---@param opts LazyConfig +function M.minitest.setup(opts) + return M.extend({ + spec = { + "lunarmodules/luassert", + { + "echasnovski/mini.test", + opts = { + collect = { + find_files = function() + return vim.fn.globpath("tests", "**/*_spec.lua", true, true) + end, + }, + -- script_path = "tests/minit.lua", + }, + }, + { dir = vim.uv.cwd() }, + }, + rocks = { hererocks = true }, + }, opts) +end + M.busted = {} function M.busted.run() @@ -99,6 +172,7 @@ function M.busted.run() if not require("lazy.core.config").headless() then return vim.notify("busted can only run in headless mode. Please run with `nvim -l`", vim.log.levels.WARN) end + package.path = package.path .. ";" .. vim.uv.cwd() .. "/tests/?.lua" -- run busted return pcall(require("busted.runner"), { standalone = false, diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 19d580d..e8ece1b 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -172,7 +172,6 @@ function M.build(task) root, "--server", Config.options.rocks.server, - "--dev", "--lua-version", "5.1", "install", -- use install so that we can make use of pre-built rocks @@ -225,9 +224,10 @@ end ---@return table? function M.parse(file) local ret = {} - return pcall(function() - loadfile(file, "t", ret)() + local ok = pcall(function() + loadfile(file, nil, ret)() end) and ret or nil + return ok and ret or nil end ---@param plugin LazyPlugin diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 0a10467..7700229 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -10,6 +10,7 @@ ---@field dirty? boolean ---@field build? boolean ---@field frags? number[] +---@field top? boolean ---@field handlers? LazyPluginHandlers ---@field installed? boolean ---@field is_local? boolean @@ -20,6 +21,7 @@ ---@field tasks? LazyTask[] ---@field updated? {from:string, to:string} ---@field updates? {from:GitInfo, to:GitInfo} +---@field last_check? number ---@field working? boolean ---@field pkg? LazyPkg @@ -59,6 +61,7 @@ ---@field priority? number Only useful for lazy=false plugins to force loading certain plugins first. Default priority is 50 ---@field dev? boolean If set, then link to the respective folder under your ~/projects ---@field rocks? string[] +---@field virtual? boolean virtual plugins won't be installed or added to the rtp. ---@class LazyPlugin: LazyPluginBase,LazyPluginHandlers,LazyPluginHooks,LazyPluginRef ---@field dependencies? string[] @@ -73,6 +76,8 @@ ---@field module? false ---@class LazyPluginSpec: LazyPluginBase,LazyPluginSpecHandlers,LazyPluginHooks,LazyPluginRef +---@field name? string display name and name used for plugin config files +---@field dir? string ---@field dependencies? string|string[]|LazyPluginSpec[] ---@field specs? string|string[]|LazyPluginSpec[] diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 9791924..fd4af3d 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -146,7 +146,7 @@ end ---@return string, string[] function M.parse(args) local parts = vim.split(vim.trim(args), "%s+") - if parts[1]:find("Lazy") then + if vim.startswith("Lazy", parts[1]) then table.remove(parts, 1) end if args:sub(-1) == " " then diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 3a59069..4131d72 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -166,7 +166,7 @@ function M:mount() self:augroup(true) end, { win = true }) self:focus() - self:on_key(ViewConfig.keys.close, self.close) + self:on_key(ViewConfig.keys.close, self.close, "Close") self:on({ "BufDelete", "BufHidden" }, self.close) if vim.bo[self.buf].buftype == "" then diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 313d3ad..e8444eb 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -85,7 +85,7 @@ function M.create() require("lazy.manage.process").abort() require("lazy.async").abort() return ViewConfig.keys.abort - end, { silent = true, buffer = self.buf, expr = true }) + end, { silent = true, buffer = self.buf, expr = true, desc = "Abort" }) vim.keymap.set("n", "gx", "K", { buffer = self.buf, remap = true }) @@ -110,7 +110,7 @@ function M.create() self.state.plugin = open and selected or nil self:update() end - end) + end, "Details") self:on_key(ViewConfig.keys.next, function() local cursor = vim.api.nvim_win_get_cursor(self.view.win) @@ -121,7 +121,7 @@ function M.create() return end end - end) + end, "Next Plugin") self:on_key(ViewConfig.keys.prev, function() local cursor = vim.api.nvim_win_get_cursor(self.view.win) @@ -132,14 +132,14 @@ function M.create() return end end - end) + end, "Prev Plugin") self:on_key(ViewConfig.keys.profile_sort, function() if self.state.mode == "profile" then self.state.profile.sort_time_taken = not self.state.profile.sort_time_taken self:update() end - end) + end, "Sort Profile") self:on_key(ViewConfig.keys.profile_filter, function() if self.state.mode == "profile" then @@ -159,17 +159,18 @@ function M.create() end end) end - end) + end, "Filter Profile") for lhs, rhs in pairs(Config.options.ui.custom_keys) do if rhs then local handler = type(rhs) == "table" and rhs[1] or rhs + local desc = type(rhs) == "table" and rhs.desc or nil self:on_key(lhs, function() local plugin = self.render:get_plugin() if plugin then handler(plugin) end - end) + end, desc) end end @@ -219,17 +220,17 @@ function M:setup_patterns() ["(https?://%S+)"] = function(url) Util.open(url) end, - }, self.hover) + }, self.hover, "Hover") self:on_pattern(ViewConfig.keys.diff, { [commit_pattern] = function(hash) self:diff({ commit = hash }) end, - }, self.diff) + }, self.diff, "Diff") self:on_pattern(ViewConfig.commands.restore.key_plugin, { [commit_pattern] = function(hash) self:restore({ commit = hash }) end, - }, self.restore) + }, self.restore, "Restore") end ---@param opts? {commit:string} @@ -294,7 +295,8 @@ end ---@param key string ---@param patterns table ---@param fallback? fun(self) -function M:on_pattern(key, patterns, fallback) +---@param desc? string +function M:on_pattern(key, patterns, fallback, desc) self:on_key(key, function() local line = vim.api.nvim_get_current_line() local pos = vim.api.nvim_win_get_cursor(0) @@ -316,7 +318,7 @@ function M:on_pattern(key, patterns, fallback) if fallback then fallback(self) end - end) + end, desc) end function M:setup_modes() diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index e1eec6c..b545af0 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -94,7 +94,7 @@ function M:update() diag.lnum = diag.row - 1 return diag end, self._diagnostics), - { signs = false, virtual_text = true, underline = false } + { signs = false, virtual_text = true, underline = false, virtual_lines = false } ) end @@ -144,8 +144,6 @@ function M:title() if mode.name == "home" then if self.view.state.mode == "home" then title = " lazy.nvim " .. Config.options.ui.icons.lazy - else - title = " lazy.nvim (H) " end end @@ -761,7 +759,7 @@ function M:debug() ---@type string[] plugins = vim.tbl_values(plugins) table.sort(plugins) - self:append("● ", "LazySpecial", { indent = 2 }) + self:append(Config.options.ui.icons.debug, "LazySpecial", { indent = 2 }) if handler_type == "keys" then for k, v in pairs(Config.plugins[plugins[1]]._.handlers.keys) do if k == value then diff --git a/scripts/test b/scripts/test index 4baf621..ffbb540 100755 --- a/scripts/test +++ b/scripts/test @@ -1,3 +1,3 @@ #!/bin/env bash -nvim -l tests/minit.lua --busted tests -o utfTerminal "$@" +nvim -l tests/minit.lua --minitest diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 166dc2a..7982649 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -25,6 +25,7 @@ local function clean(plugins) if plugin._.dep == false then plugin._.dep = nil end + plugin._.top = nil return plugin end, plugins) end