Compare commits

..

No commits in common. "main" and "v11.10.2" have entirely different histories.

35 changed files with 273 additions and 2381 deletions

View file

@ -1,7 +0,0 @@
root = true
[*]
insert_final_newline = true
indent_style = space
indent_size = 2
charset = utf-8

View file

@ -1,3 +1,3 @@
{ {
".": "11.17.1" ".": "11.10.2"
} }

View file

@ -6,10 +6,7 @@ body:
- type: markdown - type: markdown
attributes: attributes:
value: | value: |
**Before** reporting an issue, make sure to read the [documentation](https://github.com/folke/lazy.nvim) **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.
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 - type: checkboxes
attributes: attributes:
label: Did you check docs and existing issues? label: Did you check docs and existing issues?
@ -17,8 +14,6 @@ body:
options: options:
- label: I have read all the lazy.nvim docs - label: I have read all the lazy.nvim docs
required: true 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 - label: I have searched the existing issues of lazy.nvim
required: true required: true
- label: I have searched the existing issues of plugins related to this issue - label: I have searched the existing issues of plugins related to this issue
@ -62,14 +57,32 @@ body:
label: Repro label: Repro
description: Minimal `init.lua` to reproduce this issue. Save as `repro.lua` and run with `nvim -u repro.lua` description: Minimal `init.lua` to reproduce this issue. Save as `repro.lua` and run with `nvim -u repro.lua`
value: | value: |
vim.env.LAZY_STDPATH = ".repro" -- DO NOT change the paths and don't remove the colorscheme
load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() local root = vim.fn.fnamemodify("./.repro", ":p")
require("lazy.minit").repro({ -- set stdpaths to use .repro
spec = { 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 -- add any other plugins here
}, }
require("lazy").setup(plugins, {
root = root .. "/plugins",
}) })
render: lua
vim.cmd.colorscheme("tokyonight")
-- add anything else here
render: Lua
validations: validations:
required: false required: false

View file

@ -12,4 +12,3 @@ jobs:
with: with:
plugin: lazy.nvim plugin: lazy.nvim
repo: folke/lazy.nvim repo: folke/lazy.nvim
docs: false

View file

@ -5,7 +5,6 @@ on:
- cron: "30 1 * * *" - cron: "30 1 * * *"
jobs: jobs:
stale: ci:
if: contains(fromJSON('["folke", "LazyVim"]'), github.repository_owner)
uses: folke/github/.github/workflows/stale.yml@main uses: folke/github/.github/workflows/stale.yml@main
secrets: inherit secrets: inherit

View file

@ -7,7 +7,6 @@ on:
- cron: "0 * * * *" - cron: "0 * * * *"
jobs: jobs:
update: ci:
if: contains(fromJSON('["folke", "LazyVim"]'), github.repository_owner)
uses: folke/github/.github/workflows/update.yml@main uses: folke/github/.github/workflows/update.yml@main
secrets: inherit secrets: inherit

View file

@ -1,180 +1,5 @@
# Changelog # 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)
### Bug Fixes
* **rocks:** try building anyway even when prerequisits have not been met. (will likely fail) ([f0324de](https://github.com/folke/lazy.nvim/commit/f0324defdd43be8aa14aaf3a794ff3d5581f36ba))
* **ui:** don't treat suspended as headless. Closes [#1626](https://github.com/folke/lazy.nvim/issues/1626) ([2dfccd7](https://github.com/folke/lazy.nvim/commit/2dfccd7b948beb26d8bcff7f9113a3a5c85cbc4a))
## [11.10.3](https://github.com/folke/lazy.nvim/compare/v11.10.2...v11.10.3) (2024-07-07)
### Bug Fixes
* **git:** local plugin fixes ([#1624](https://github.com/folke/lazy.nvim/issues/1624)) ([72c0dc9](https://github.com/folke/lazy.nvim/commit/72c0dc9462ab3bf1a68198afabc1eb4e2940d299))
## [11.10.2](https://github.com/folke/lazy.nvim/compare/v11.10.1...v11.10.2) (2024-07-07) ## [11.10.2](https://github.com/folke/lazy.nvim/compare/v11.10.1...v11.10.2) (2024-07-07)

View file

@ -1,4 +1,4 @@
-- Lazy Bootstrapper -- Lay Bootstrapper
-- Usage: -- Usage:
-- ```lua -- ```lua
-- load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() -- load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))()
@ -6,20 +6,19 @@
local M = {} local M = {}
function M.setup() function M.setup()
local uv = vim.uv or vim.loop
if vim.env.LAZY_STDPATH then if vim.env.LAZY_STDPATH then
local root = vim.fn.fnamemodify(vim.env.LAZY_STDPATH, ":p"):gsub("[\\/]$", "") local root = vim.fn.fnamemodify(vim.env.LAZY_STDPATH, ":p")
for _, name in ipairs({ "config", "data", "state", "cache" }) do for _, name in ipairs({ "config", "data", "state", "cache" }) do
vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
end end
end end
if vim.env.LAZY_PATH and not uv.fs_stat(vim.env.LAZY_PATH) then if vim.env.LAZY_PATH and not vim.uv.fs_stat(vim.env.LAZY_PATH) then
vim.env.LAZY_PATH = nil vim.env.LAZY_PATH = nil
end end
local lazypath = vim.env.LAZY_PATH or vim.fn.stdpath("data") .. "/lazy/lazy.nvim" local lazypath = vim.env.LAZY_PATH or vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.env.LAZY_PATH and not uv.fs_stat(lazypath) then if not vim.env.LAZY_PATH and not (vim.uv or vim.loop).fs_stat(lazypath) then
vim.api.nvim_echo({ vim.api.nvim_echo({
{ {
"Cloning lazy.nvim\n\n", "Cloning lazy.nvim\n\n",

View file

@ -294,9 +294,9 @@ SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup*
-------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------
Property Type Description Property Type Description
---------- ----------------------------- --------------------------------------------------------- ---------- ----------------------------- ---------------------------------------------------------
init fun(LazyPlugin) init functions are always executed during startup. Mostly init fun(LazyPlugin) init functions are always executed during. Mostly useful
useful for setting vim.g.* configuration used by Vim for setting vim.g.* configuration used by Vim plugins
plugins startup startup
opts table or opts should be a table (will be merged with parent 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 fun(LazyPlugin, opts:table) specs), return a table (replaces parent specs) or should
@ -540,7 +540,9 @@ function.
keys = { keys = {
{ "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" },
}, },
opts = {}, config = function()
require("neo-tree").setup()
end,
} }
< <
@ -644,42 +646,24 @@ will be added to the plugins spec.
-- then set the below to false. This should work, but is NOT supported and will -- then set the below to false. This should work, but is NOT supported and will
-- increase downloads a lot. -- increase downloads a lot.
filter = true, 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 = { pkg = {
enabled = true, enabled = true,
cache = vim.fn.stdpath("state") .. "/lazy/pkg-cache.lua", cache = vim.fn.stdpath("state") .. "/lazy/pkg-cache.lua",
versions = true, -- Honor versions in pkg sources
-- the first package source that is found for a plugin will be used. -- the first package source that is found for a plugin will be used.
sources = { sources = {
"lazy", "lazy",
"rockspec", -- will only be used when rocks.enabled is true "rockspec",
"packspec", "packspec",
}, },
}, },
rocks = { rocks = {
enabled = true,
root = vim.fn.stdpath("data") .. "/lazy-rocks", root = vim.fn.stdpath("data") .. "/lazy-rocks",
server = "https://nvim-neorocks.github.io/rocks-binaries/", 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 = { dev = {
-- Directory where you store your local plugin projects. If a function is used, ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects
-- the plugin directory (e.g. `~/projects/plugin-name`) must be returned.
---@type string | fun(plugin: LazyPlugin): string
path = "~/projects", path = "~/projects",
---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub
patterns = {}, -- For example {"folke"} patterns = {}, -- For example {"folke"}
@ -706,7 +690,6 @@ will be added to the plugins spec.
icons = { icons = {
cmd = " ", cmd = " ",
config = "", config = "",
debug = "● ",
event = " ", event = " ",
favorite = " ", favorite = " ",
ft = " ", ft = " ",
@ -732,7 +715,7 @@ will be added to the plugins spec.
-- leave nil, to automatically select a browser depending on your OS. -- leave nil, to automatically select a browser depending on your OS.
-- If you want to use a specific browser, you can define it here -- If you want to use a specific browser, you can define it here
browser = nil, ---@type string? browser = nil, ---@type string?
throttle = 1000 / 30, -- how frequently should the ui process render events throttle = 20, -- how frequently should the ui process render events
custom_keys = { custom_keys = {
-- You can define custom key maps here. If present, the description will -- You can define custom key maps here. If present, the description will
-- be shown in the help menu. -- be shown in the help menu.
@ -747,16 +730,6 @@ will be added to the plugins spec.
desc = "Open lazygit log", desc = "Open lazygit log",
}, },
["<localleader>i"] = {
function(plugin)
Util.notify(vim.inspect(plugin), {
title = "Inspect " .. plugin.name,
lang = "lua",
})
end,
desc = "Inspect Plugin",
},
["<localleader>t"] = { ["<localleader>t"] = {
function(plugin) function(plugin)
require("lazy.util").float_term(nil, { require("lazy.util").float_term(nil, {
@ -767,17 +740,6 @@ will be added to the plugins spec.
}, },
}, },
}, },
-- 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 = {
-- diff command <d> can be one of: -- diff command <d> can be one of:
-- * browser: opens the github compare view. Note that this is always mapped to <K> as well, -- * browser: opens the github compare view. Note that this is always mapped to <K> as well,
@ -829,7 +791,7 @@ will be added to the plugins spec.
enabled = true, enabled = true,
root = vim.fn.stdpath("state") .. "/lazy/readme", root = vim.fn.stdpath("state") .. "/lazy/readme",
files = { "README.md", "lua/**/README.md" }, files = { "README.md", "lua/**/README.md" },
-- only generate markdown helptags for plugins that don't have docs -- only generate markdown helptags for plugins that dont have docs
skip_if_doc_exists = true, skip_if_doc_exists = true,
}, },
state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things
@ -875,8 +837,6 @@ If you dont want to use a Nerd Font, you can replace the icons with Unicode s
----------------------------------------------------------------------- -----------------------------------------------------------------------
Highlight Group Default Group Description Highlight Group Default Group Description
----------------------- ----------------------- ----------------------- ----------------------- ----------------------- -----------------------
LazyBold { bold = true }
LazyButton CursorLine LazyButton CursorLine
LazyButtonActive Visual LazyButtonActive Visual
@ -897,16 +857,10 @@ If you dont want to use a Nerd Font, you can replace the icons with Unicode s
LazyDir @markup.link directory LazyDir @markup.link directory
LazyError DiagnosticError task errors
LazyH1 IncSearch home button LazyH1 IncSearch home button
LazyH2 Bold titles LazyH2 Bold titles
LazyInfo DiagnosticInfo task errors
LazyItalic { italic = true }
LazyLocal Constant LazyLocal Constant
LazyNoCond DiagnosticWarn unloaded icon for a LazyNoCond DiagnosticWarn unloaded icon for a
@ -943,13 +897,13 @@ If you dont want to use a Nerd Font, you can replace the icons with Unicode s
LazySpecial @punctuation.special LazySpecial @punctuation.special
LazyTaskError ErrorMsg task errors
LazyTaskOutput MsgArea task output LazyTaskOutput MsgArea task output
LazyUrl @markup.link url LazyUrl @markup.link url
LazyValue @string value of a property LazyValue @string value of a property
LazyWarning DiagnosticWarn task errors
----------------------------------------------------------------------- -----------------------------------------------------------------------
============================================================================== ==============================================================================

File diff suppressed because it is too large Load diff

View file

@ -34,17 +34,6 @@ M.defaults = {
-- then set the below to false. This should work, but is NOT supported and will -- then set the below to false. This should work, but is NOT supported and will
-- increase downloads a lot. -- increase downloads a lot.
filter = true, 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 = { pkg = {
enabled = true, enabled = true,
@ -67,9 +56,7 @@ M.defaults = {
hererocks = nil, hererocks = nil,
}, },
dev = { dev = {
-- Directory where you store your local plugin projects. If a function is used, ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects
-- the plugin directory (e.g. `~/projects/plugin-name`) must be returned.
---@type string | fun(plugin: LazyPlugin): string
path = "~/projects", path = "~/projects",
---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub
patterns = {}, -- For example {"folke"} patterns = {}, -- For example {"folke"}
@ -96,7 +83,6 @@ M.defaults = {
icons = { icons = {
cmd = "", cmd = "",
config = "", config = "",
debug = "",
event = "", event = "",
favorite = "", favorite = "",
ft = "", ft = "",
@ -219,7 +205,7 @@ M.defaults = {
enabled = true, enabled = true,
root = vim.fn.stdpath("state") .. "/lazy/readme", root = vim.fn.stdpath("state") .. "/lazy/readme",
files = { "README.md", "lua/**/README.md" }, files = { "README.md", "lua/**/README.md" },
-- only generate markdown helptags for plugins that don't have docs -- only generate markdown helptags for plugins that dont have docs
skip_if_doc_exists = true, skip_if_doc_exists = true,
}, },
state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things
@ -242,7 +228,7 @@ function M.hererocks()
return M.options.rocks.hererocks return M.options.rocks.hererocks
end end
M.version = "11.17.1" -- x-release-please-version M.version = "11.10.2" -- x-release-please-version
M.ns = vim.api.nvim_create_namespace("lazy") M.ns = vim.api.nvim_create_namespace("lazy")
@ -267,10 +253,9 @@ M.mapleader = nil
---@type string ---@type string
M.maplocalleader = nil M.maplocalleader = nil
M.suspended = false local headless = #vim.api.nvim_list_uis() == 0
function M.headless() function M.headless()
return not M.suspended and #vim.api.nvim_list_uis() == 0 return headless
end end
---@param opts? LazyConfig ---@param opts? LazyConfig
@ -298,9 +283,6 @@ function M.setup(opts)
M.me = debug.getinfo(1, "S").source:sub(2) M.me = debug.getinfo(1, "S").source:sub(2)
M.me = Util.norm(vim.fn.fnamemodify(M.me, ":p:h:h:h:h")) 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 if M.options.performance.rtp.reset then
---@type vim.Option ---@type vim.Option
vim.opt.rtp = { vim.opt.rtp = {
@ -308,7 +290,7 @@ function M.setup(opts)
vim.fn.stdpath("data") .. "/site", vim.fn.stdpath("data") .. "/site",
M.me, M.me,
vim.env.VIMRUNTIME, vim.env.VIMRUNTIME,
lib, vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib/nvim",
vim.fn.stdpath("config") .. "/after", vim.fn.stdpath("config") .. "/after",
} }
end end
@ -356,12 +338,6 @@ function M.setup(opts)
end end
end, end,
}) })
vim.api.nvim_create_autocmd({ "VimSuspend", "VimResume" }, {
callback = function(ev)
M.suspended = ev.event == "VimSuspend"
end,
})
end, end,
}) })
end end

View file

@ -5,7 +5,7 @@ local Util = require("lazy.core.util")
---@field type LazyHandlerTypes ---@field type LazyHandlerTypes
---@field extends? LazyHandler ---@field extends? LazyHandler
---@field active table<string,table<string,string>> ---@field active table<string,table<string,string>>
---@field managed table<string,string> mapping handler keys to plugin names ---@field managed table<string,string>
---@field super LazyHandler ---@field super LazyHandler
local M = {} local M = {}
@ -114,7 +114,7 @@ function M:add(plugin)
if not self.active[key] then if not self.active[key] then
self.active[key] = {} self.active[key] = {}
self:_add(value) self:_add(value)
self.managed[key] = plugin.name self.managed[key] = key
end end
self.active[key][plugin.name] = plugin.name self.active[key][plugin.name] = plugin.name
end end

View file

@ -11,7 +11,7 @@ local Util = require("lazy.core.util")
---@class LazyKeysSpec: LazyKeysBase ---@class LazyKeysSpec: LazyKeysBase
---@field [1] string lhs ---@field [1] string lhs
---@field [2]? string|fun():string?|false rhs ---@field [2]? string|fun()|false rhs
---@field mode? string|string[] ---@field mode? string|string[]
---@class LazyKeys: LazyKeysBase ---@class LazyKeys: LazyKeysBase

View file

@ -161,7 +161,7 @@ function M.get_start_plugins()
---@type LazyPlugin[] ---@type LazyPlugin[]
local start = {} local start = {}
for _, plugin in pairs(Config.plugins) do for _, plugin in pairs(Config.plugins) do
if not plugin._.loaded and (plugin._.rtp_loaded or plugin.lazy == false) then if plugin.lazy == false and not plugin._.loaded then
start[#start + 1] = plugin start[#start + 1] = plugin
end end
end end
@ -341,9 +341,7 @@ function M._load(plugin, reason, opts)
Util.track({ plugin = plugin.name, start = reason.start }) Util.track({ plugin = plugin.name, start = reason.start })
Handler.disable(plugin) Handler.disable(plugin)
if not plugin.virtual then
M.add_to_rtp(plugin) M.add_to_rtp(plugin)
end
if plugin._.pkg and plugin._.pkg.source == "rockspec" then if plugin._.pkg and plugin._.pkg.source == "rockspec" then
M.add_to_luapath(plugin) M.add_to_luapath(plugin)
@ -355,9 +353,7 @@ function M._load(plugin, reason, opts)
end, "Failed to load deps for " .. plugin.name) end, "Failed to load deps for " .. plugin.name)
end end
if not plugin.virtual then
M.packadd(plugin.dir) M.packadd(plugin.dir)
end
if plugin.config or plugin.opts then if plugin.config or plugin.opts then
M.config(plugin) M.config(plugin)
end end
@ -497,11 +493,8 @@ function M.add_to_luapath(plugin)
local root = Config.options.rocks.root .. "/" .. plugin.name local root = Config.options.rocks.root .. "/" .. plugin.name
local path = root .. "/share/lua/5.1" local path = root .. "/share/lua/5.1"
local cpath = root .. "/lib/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.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 .. ";" .. cpath .. "/?." .. (jit.os:find("Windows") and "dll" or "so") .. ";"
package.cpath = package.cpath .. ";" .. cpath2 .. "/?." .. (jit.os:find("Windows") and "dll" or "so") .. ";"
end end
function M.source(path) function M.source(path)
@ -559,8 +552,6 @@ function M.loader(modname)
end end
if ret then if ret then
-- explicitly set to nil to prevent loading errors
package.loaded[modname] = nil
M.auto_load(modname, ret.modpath) M.auto_load(modname, ret.modpath)
local mod = package.loaded[modname] local mod = package.loaded[modname]
if type(mod) == "table" then if type(mod) == "table" then

View file

@ -179,7 +179,6 @@ function M:_rebuild(name)
local super = nil local super = nil
plugin.url = nil plugin.url = nil
plugin._.dep = true plugin._.dep = true
plugin._.top = true
plugin.optional = true plugin.optional = true
assert(#plugin._.frags > 0, "no fragments found for plugin " .. name) assert(#plugin._.frags > 0, "no fragments found for plugin " .. name)
@ -196,7 +195,6 @@ function M:_rebuild(name)
plugin._.dep = plugin._.dep and fragment.dep plugin._.dep = plugin._.dep and fragment.dep
plugin.optional = plugin.optional and (rawget(fragment.spec, "optional") == true) plugin.optional = plugin.optional and (rawget(fragment.spec, "optional") == true)
plugin.url = fragment.url or plugin.url plugin.url = fragment.url or plugin.url
plugin._.top = plugin._.top and fragment.pid == nil
-- dependencies -- dependencies
for _, dep in ipairs(fragment.deps or {}) do for _, dep in ipairs(fragment.deps or {}) do
@ -215,8 +213,6 @@ function M:_rebuild(name)
plugin.dir = super.dir plugin.dir = super.dir
if plugin.dir then if plugin.dir then
plugin.dir = Util.norm(plugin.dir) plugin.dir = Util.norm(plugin.dir)
elseif super.virtual then
plugin.dir = Util.norm("/dev/null/" .. plugin.name)
else else
if plugin.dev == nil and plugin.url then if plugin.dev == nil and plugin.url then
for _, pattern in ipairs(Config.options.dev.patterns) do for _, pattern in ipairs(Config.options.dev.patterns) do
@ -304,26 +300,13 @@ end
--- Removes plugins that are disabled. --- Removes plugins that are disabled.
function M:fix_disabled() function M:fix_disabled()
local changes = 0 local changes = 0
local function check(top)
for _, plugin in pairs(self.plugins) do 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 if plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled()) then
changes = changes + 1 changes = changes + 1
if plugin.optional then
self:del(plugin.name)
else
self:disable(plugin) self:disable(plugin)
end end
end
self:rebuild() self:rebuild()
end
end
end
end
-- 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 return changes
end end

View file

@ -146,43 +146,33 @@ function Spec:import(spec)
local imported = 0 local imported = 0
---@type {modname: string, load: fun():(LazyPluginSpec?, string?)}[] ---@type (string|(fun():LazyPluginSpec))[]
local modspecs = {} local modspecs = {}
if type(import) == "string" then if type(import) == "string" then
Util.lsmod(import, function(modname, modpath) Util.lsmod(import, function(modname, modpath)
modspecs[#modspecs + 1] = { modspecs[#modspecs + 1] = modname
modname = modname, package.preload[modname] = function()
load = function() return loadfile(modpath)()
local mod, err = loadfile(modpath)
if mod then
return mod()
else
return nil, err
end end
end,
}
end)
table.sort(modspecs, function(a, b)
return a.modname < b.modname
end) end)
table.sort(modspecs)
else else
modspecs = { { modname = import_name, load = spec.import } } modspecs = { spec.import }
end end
for _, modspec in ipairs(modspecs) do for _, modspec in ipairs(modspecs) do
imported = imported + 1 imported = imported + 1
local modname = modspec.modname local modname = type(modspec) == "string" and modspec or import_name
Util.track({ import = modname }) Util.track({ import = modname })
self.importing = modname self.importing = modname
-- unload the module so we get a clean slate -- unload the module so we get a clean slate
---@diagnostic disable-next-line: no-unknown ---@diagnostic disable-next-line: no-unknown
package.loaded[modname] = nil package.loaded[modname] = nil
Util.try(function() Util.try(function()
local mod, err = modspec.load() local mod = type(modspec) == "function" and modspec() or require(modspec)
if err then if type(mod) ~= "table" then
self:error("Failed to load `" .. modname .. "`:\n" .. err) self.importing = nil
elseif type(mod) ~= "table" then
return self:error( return self:error(
"Invalid spec module: `" "Invalid spec module: `"
.. modname .. modname
@ -190,20 +180,21 @@ function Spec:import(spec)
.. type(mod) .. type(mod)
.. "` was returned instead" .. "` was returned instead"
) )
else
self:normalize(mod)
end end
self:normalize(mod)
self.importing = nil
Util.track()
end, { end, {
msg = "Failed to load `" .. modname .. "`", msg = "Failed to load `" .. modname .. "`",
on_error = function(msg) on_error = function(msg)
self:error(msg) self:error(msg)
end,
})
self.importing = nil self.importing = nil
Util.track() Util.track()
end,
})
end end
if imported == 0 then if imported == 0 then
self:error("No specs found for module " .. vim.inspect(spec.import)) self:error("No specs found for module " .. spec.import)
end end
end end
@ -237,15 +228,12 @@ function M.update_state()
or plugin.cmd or plugin.cmd
plugin.lazy = lazy and true or false plugin.lazy = lazy and true or false
end end
if plugin.virtual then if plugin.dir:find(Config.options.root, 1, true) == 1 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 plugin._.installed = installed[plugin.name] ~= nil
installed[plugin.name] = nil installed[plugin.name] = nil
else else
plugin._.is_local = true plugin._.is_local = true
plugin._.installed = vim.fn.isdirectory(plugin.dir) == 1 plugin._.installed = true -- local plugins are managed by the user
end end
end end

View file

@ -66,7 +66,7 @@ end
---@param name string ---@param name string
---@return string ---@return string
function M.normname(name) 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 return ret
end end
@ -270,7 +270,7 @@ function M.get_unloaded_rtp(modname, opts)
local Config = require("lazy.core.config") local Config = require("lazy.core.config")
if Config.spec then if Config.spec then
for _, plugin in pairs(Config.spec.plugins) do for _, plugin in pairs(Config.spec.plugins) do
if not (plugin._.loaded or plugin.module == false or plugin.virtual) then if not (plugin._.loaded or plugin.module == false) then
if norm == M.normname(plugin.name) then if norm == M.normname(plugin.name) then
table.insert(rtp, 1, plugin.dir) table.insert(rtp, 1, plugin.dir)
else else
@ -374,7 +374,6 @@ function M.notify(msg, opts)
local lang = opts.lang or "markdown" local lang = opts.lang or "markdown"
local n = opts.once and vim.notify_once or vim.notify local n = opts.once and vim.notify_once or vim.notify
n(msg, opts.level or vim.log.levels.INFO, { n(msg, opts.level or vim.log.levels.INFO, {
ft = lang,
on_open = function(win) on_open = function(win)
local ok = pcall(function() local ok = pcall(function()
vim.treesitter.language.add("markdown") vim.treesitter.language.add("markdown")

View file

@ -131,8 +131,7 @@ function M.colors(opts)
{ "---", "---", "---" }, { "---", "---", "---" },
} }
Util.foreach(require(opts.modname).colors, function(group, link) Util.foreach(require(opts.modname).colors, function(group, link)
link = type(link) == "table" and "`" .. vim.inspect(link):gsub("%s+", " ") .. "`" or "***" .. link .. "***" lines[#lines + 1] = { "**" .. opts.name .. group .. "**", "***" .. link .. "***", comments[group] or "" }
lines[#lines + 1] = { "**" .. opts.name .. group .. "**", link, comments[group] or "" }
end) end)
return { content = M.table(lines) } return { content = M.table(lines) }
end end

View file

@ -1,5 +1,4 @@
local Config = require("lazy.core.config") local Config = require("lazy.core.config")
local Process = require("lazy.manage.process")
local uv = vim.uv or vim.loop local uv = vim.uv or vim.loop
local M = {} local M = {}
@ -37,11 +36,11 @@ function M.have(cmd, opts)
local found local found
for _, c in ipairs(cmd) do for _, c in ipairs(cmd) do
if vim.fn.executable(c) == 1 then if vim.fn.executable(c) == 1 then
local out, exit_code = Process.exec({ c, opts.version }) local version = vim.fn.system(c .. " " .. opts.version) or ""
if exit_code ~= 0 then if vim.v.shell_error ~= 0 then
opts.error(("failed to get version of {%s}\n%s"):format(c, table.concat(out, "\n"))) opts.error(("failed to get version of {%s}\n%s"):format(c, version))
else else
local version = vim.trim(out[1] or "") version = vim.trim(vim.split(version, "\n")[1])
version = version:gsub("^%s*" .. vim.pesc(c) .. "%s*", "") version = version:gsub("^%s*" .. vim.pesc(c) .. "%s*", "")
if opts.version_pattern and not version:find(opts.version_pattern, 1, true) then 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)) opts.warn(("`%s` version `%s` needed, but found `%s`"):format(c, opts.version_pattern, version))

View file

@ -35,9 +35,7 @@ end
function M.fast_check(opts) function M.fast_check(opts)
opts = opts or {} opts = opts or {}
for _, plugin in pairs(Config.plugins) do for _, plugin in pairs(Config.plugins) do
-- don't check local plugins here, since we mark them as needing updates if not plugin.pin and not plugin.dev and plugin._.installed then
-- only if local is behind upstream (if the git log task gives no output)
if plugin._.installed and not (plugin.pin or plugin._.is_local) then
plugin._.updates = nil plugin._.updates = nil
local info = Git.info(plugin.dir) local info = Git.info(plugin.dir)
local ok, target = pcall(Git.get_target, plugin) local ok, target = pcall(Git.get_target, plugin)

View file

@ -116,12 +116,6 @@ end
---@param plugin LazyPlugin ---@param plugin LazyPlugin
---@return GitInfo? ---@return GitInfo?
function M.get_target(plugin) function M.get_target(plugin)
if plugin._.is_local then
local info = M.info(plugin.dir)
local branch = assert(info and info.branch or M.get_branch(plugin))
return { branch = branch, commit = M.get_commit(plugin.dir, branch, true) }
end
local branch = assert(M.get_branch(plugin)) local branch = assert(M.get_branch(plugin))
if plugin.commit then if plugin.commit then
@ -150,6 +144,15 @@ function M.get_target(plugin)
} }
end end
end end
---@diagnostic disable-next-line: return-type-mismatch
return { branch = branch, commit = M.get_commit(plugin.dir, branch, true) }
end
---@param plugin LazyPlugin
---@return GitInfo?
function M.get_local_target(plugin)
local info = M.info(plugin.dir)
local branch = assert(info and info.branch or M.get_branch(plugin))
return { branch = branch, commit = M.get_commit(plugin.dir, branch, true) } return { branch = branch, commit = M.get_commit(plugin.dir, branch, true) }
end end

View file

@ -80,7 +80,6 @@ function M.install(opts)
opts = M.opts(opts, { mode = "install" }) opts = M.opts(opts, { mode = "install" })
return M.run({ return M.run({
pipeline = { pipeline = {
"plugin.exists",
"git.clone", "git.clone",
{ "git.checkout", lockfile = opts.lockfile }, { "git.checkout", lockfile = opts.lockfile },
"plugin.docs", "plugin.docs",
@ -109,7 +108,6 @@ function M.update(opts)
opts = M.opts(opts, { mode = "update" }) opts = M.opts(opts, { mode = "update" })
return M.run({ return M.run({
pipeline = { pipeline = {
"plugin.exists",
"git.origin", "git.origin",
"git.branch", "git.branch",
"git.fetch", "git.fetch",
@ -149,7 +147,6 @@ function M.check(opts)
opts = opts or {} opts = opts or {}
return M.run({ return M.run({
pipeline = { pipeline = {
"plugin.exists",
{ "git.origin", check = true }, { "git.origin", check = true },
"git.fetch", "git.fetch",
"git.status", "git.status",

View file

@ -42,7 +42,7 @@ function M.update()
f:write(",\n") f:write(",\n")
end end
end end
f:write("\n}\n") f:write("\n}")
f:close() f:close()
end end

View file

@ -21,23 +21,16 @@ M.clean = {
skip = function(plugin) skip = function(plugin)
return plugin._.is_local return plugin._.is_local
end, end,
---@param opts? {rocks_only?:boolean} run = function(self)
run = function(self, opts)
opts = opts or {}
local dir = self.plugin.dir:gsub("/+$", "") local dir = self.plugin.dir:gsub("/+$", "")
assert(dir:find(Config.options.root, 1, true) == 1, self.plugin.dir .. " should be under packpath!") assert(dir:find(Config.options.root, 1, true) == 1, self.plugin.dir .. " should be under packpath!")
rm(dir)
local rock_root = Config.options.rocks.root .. "/" .. self.plugin.name local rock_root = Config.options.rocks.root .. "/" .. self.plugin.name
if vim.uv.fs_stat(rock_root) then if vim.uv.fs_stat(rock_root) then
rm(rock_root) rm(rock_root)
end end
if opts.rocks_only then
return
end
rm(dir)
self.plugin._.installed = false self.plugin._.installed = false
end, end,
} }

View file

@ -1,54 +1,8 @@
local Async = require("lazy.async")
local Config = require("lazy.core.config") local Config = require("lazy.core.config")
local Git = require("lazy.manage.git") local Git = require("lazy.manage.git")
local Lock = require("lazy.manage.lock") local Lock = require("lazy.manage.lock")
local Util = require("lazy.util") 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<string, LazyTaskDef> ---@type table<string, LazyTaskDef>
local M = {} local M = {}
@ -78,13 +32,11 @@ M.log = {
"--no-show-signature", "--no-show-signature",
} }
local info, target
if opts.updated then if opts.updated then
table.insert(args, self.plugin._.updated.from .. ".." .. (self.plugin._.updated.to or "HEAD")) table.insert(args, self.plugin._.updated.from .. ".." .. (self.plugin._.updated.to or "HEAD"))
elseif opts.check then elseif opts.check then
info = assert(Git.info(self.plugin.dir)) local info = assert(Git.info(self.plugin.dir))
target = assert(Git.get_target(self.plugin)) local target = assert(self.plugin._.is_local and Git.get_local_target(self.plugin) or Git.get_target(self.plugin))
if not target.commit then if not target.commit then
for k, v in pairs(target) do for k, v in pairs(target) do
error(k .. " '" .. v .. "' not found") error(k .. " '" .. v .. "' not found")
@ -92,7 +44,6 @@ M.log = {
error("no target commit found") error("no target commit found")
end end
assert(target.commit, self.plugin.name .. " " .. target.branch) assert(target.commit, self.plugin.name .. " " .. target.branch)
if not self.plugin._.is_local then
if Git.eq(info, target) then if Git.eq(info, target) then
if Config.options.checker.check_pinned then if Config.options.checker.check_pinned then
local last_commit = Git.get_commit(self.plugin.dir, target.branch, true) local last_commit = Git.get_commit(self.plugin.dir, target.branch, true)
@ -103,7 +54,6 @@ M.log = {
else else
self.plugin._.updates = { from = info, to = target } self.plugin._.updates = { from = info, to = target }
end end
end
table.insert(args, info.commit .. ".." .. target.commit) table.insert(args, info.commit .. ".." .. target.commit)
else else
vim.list_extend(args, opts.args or Config.options.git.log) vim.list_extend(args, opts.args or Config.options.git.log)
@ -113,14 +63,6 @@ M.log = {
args = args, args = args,
cwd = self.plugin.dir, cwd = self.plugin.dir,
}) })
-- for local plugins, mark as needing updates only if local is
-- behind upstream, i.e. if git log gave no output
if opts.check and self.plugin._.is_local then
if not vim.tbl_isempty(self:get_log()) then
self.plugin._.updates = { from = info, to = target }
end
end
end, end,
} }
@ -130,7 +72,6 @@ M.clone = {
end, end,
---@async ---@async
run = function(self) run = function(self)
throttle.wait()
local args = { local args = {
"clone", "clone",
self.plugin.url, self.plugin.url,
@ -275,12 +216,11 @@ M.status = {
-- fetches all needed origin branches -- fetches all needed origin branches
M.fetch = { M.fetch = {
skip = function(plugin) skip = function(plugin)
return not plugin._.installed or plugin._.is_local or cooldown(plugin) return not plugin._.installed or plugin._.is_local
end, end,
---@async ---@async
run = function(self) run = function(self)
throttle.wait()
local args = { local args = {
"fetch", "fetch",
"--recurse-submodules", "--recurse-submodules",
@ -296,11 +236,6 @@ M.fetch = {
self:spawn("git", { self:spawn("git", {
args = args, args = args,
cwd = self.plugin.dir, cwd = self.plugin.dir,
on_exit = function(ok)
if ok then
self.plugin._.last_check = vim.uv.now()
end
end,
}) })
end, end,
} }
@ -315,7 +250,6 @@ M.checkout = {
---@async ---@async
---@param opts {lockfile?:boolean} ---@param opts {lockfile?:boolean}
run = function(self, opts) run = function(self, opts)
throttle.wait()
local info = assert(Git.info(self.plugin.dir)) local info = assert(Git.info(self.plugin.dir))
local target = assert(Git.get_target(self.plugin)) local target = assert(Git.get_target(self.plugin))
@ -335,7 +269,7 @@ M.checkout = {
end end
end end
-- don't run checkout if target is already reached. -- dont run checkout if target is already reached.
-- unless we just cloned, since then we won't have any data yet -- unless we just cloned, since then we won't have any data yet
if Git.eq(info, target) and info.branch == target.branch then if Git.eq(info, target) and info.branch == target.branch then
self.plugin._.updated = { self.plugin._.updated = {

View file

@ -19,9 +19,6 @@ local B = {}
---@param task LazyTask ---@param task LazyTask
---@param build string ---@param build string
function B.cmd(task, build) 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]] local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) --[[@as vim.api.keyset.cmd]]
task:log(vim.api.nvim_cmd(cmd, { output = true })) task:log(vim.api.nvim_cmd(cmd, { output = true }))
end end
@ -51,6 +48,10 @@ M.build = {
run = function(self) run = function(self)
vim.cmd([[silent! runtime plugin/rplugin.vim]]) 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 local builders = self.plugin.build
-- Skip if `build` is set to `false` -- Skip if `build` is set to `false`
@ -87,25 +88,14 @@ M.build = {
M.docs = { M.docs = {
skip = function(plugin) skip = function(plugin)
return not plugin._.is_local and not plugin._.dirty return not plugin._.dirty
end, end,
run = function(self) run = function(self)
local docs = self.plugin.dir .. "/doc" local docs = self.plugin.dir .. "/doc/"
if Util.file_exists(docs) then if Util.file_exists(docs) then
self:log(vim.api.nvim_cmd({ cmd = "helptags", args = { docs } }, { output = true })) self:log(vim.api.nvim_cmd({ cmd = "helptags", args = { docs } }, { output = true }))
end end
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 return M

View file

@ -25,19 +25,13 @@ function M.setup(opts)
opts = M.extend({ opts = M.extend({
local_spec = false, local_spec = false,
change_detection = { enabled = false }, change_detection = { enabled = false },
dev = {
patterns = vim.env.LAZY_DEV and vim.split(vim.env.LAZY_DEV, ",") or nil,
},
}, opts) }, opts)
local args = {} local args = {}
local is_busted = false local is_busted = false
local is_minitest = false
for _, a in ipairs(_G.arg) do for _, a in ipairs(_G.arg) do
if a == "--busted" then if a == "--busted" then
is_busted = true is_busted = true
elseif a == "--minitest" then
is_minitest = true
else else
table.insert(args, a) table.insert(args, a)
end end
@ -46,8 +40,6 @@ function M.setup(opts)
if is_busted then if is_busted then
opts = M.busted.setup(opts) opts = M.busted.setup(opts)
elseif is_minitest then
opts = M.minitest.setup(opts)
end end
-- set stdpaths to use .tests -- set stdpaths to use .tests
@ -57,6 +49,7 @@ function M.setup(opts)
vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
end end
end end
vim.o.loadplugins = true vim.o.loadplugins = true
require("lazy").setup(opts) require("lazy").setup(opts)
if vim.g.colors_name == nil then if vim.g.colors_name == nil then
@ -75,8 +68,6 @@ function M.setup(opts)
if is_busted then if is_busted then
M.busted.run() M.busted.run()
elseif is_minitest then
M.minitest.run()
end end
end end
@ -98,70 +89,6 @@ function M.repro(opts)
M.setup(opts) M.setup(opts)
end 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 = {} M.busted = {}
function M.busted.run() function M.busted.run()
@ -172,7 +99,6 @@ function M.busted.run()
if not require("lazy.core.config").headless() then 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) return vim.notify("busted can only run in headless mode. Please run with `nvim -l`", vim.log.levels.WARN)
end end
package.path = package.path .. ";" .. vim.uv.cwd() .. "/tests/?.lua"
-- run busted -- run busted
return pcall(require("busted.runner"), { return pcall(require("busted.runner"), {
standalone = false, standalone = false,

View file

@ -78,16 +78,17 @@ function M.check(opts)
else else
ok = Health.have(M.python, opts) ok = Health.have(M.python, opts)
ok = Health.have(M.hererocks.bin("luarocks")) and ok ok = Health.have(M.hererocks.bin("luarocks")) and ok
Health.have( ok = Health.have(
M.hererocks.bin("lua"), M.hererocks.bin("lua"),
vim.tbl_extend("force", opts, { vim.tbl_extend("force", opts, {
version = "-v", version = "-v",
version_pattern = "5.1", version_pattern = "5.1",
}) })
) ) and ok
end end
else else
ok = Health.have("luarocks", opts) ok = Health.have("luarocks", opts)
ok = (
Health.have( Health.have(
{ "lua5.1", "lua", "lua-5.1" }, { "lua5.1", "lua", "lua-5.1" },
vim.tbl_extend("force", opts, { vim.tbl_extend("force", opts, {
@ -95,6 +96,7 @@ function M.check(opts)
version_pattern = "5.1", version_pattern = "5.1",
}) })
) )
) and ok
end end
return ok return ok
end end
@ -102,7 +104,8 @@ end
---@async ---@async
---@param task LazyTask ---@param task LazyTask
function M.build(task) function M.build(task)
M.check({ if
not M.check({
error = function(msg) error = function(msg)
task:error(msg:gsub("[{}]", "`")) task:error(msg:gsub("[{}]", "`"))
end, end,
@ -111,8 +114,7 @@ function M.build(task)
end, end,
ok = function(msg) end, ok = function(msg) end,
}) })
then
if task:has_warnings() then
task:log({ task:log({
"", "",
"This plugin requires `luarocks`. Try one of the following:", "This plugin requires `luarocks`. Try one of the following:",
@ -121,11 +123,7 @@ function M.build(task)
or " - enable `hererocks` with `opts.rocks.hererocks = true`", or " - enable `hererocks` with `opts.rocks.hererocks = true`",
" - disable `luarocks` support completely with `opts.rocks.enabled = false`", " - disable `luarocks` support completely with `opts.rocks.enabled = false`",
}) })
task:warn("\nWill try building anyway, but will likely fail...") return
task:warn("\n" .. string.rep("-", 80) .. "\n")
task:set_level(vim.log.levels.WARN)
end end
if task.plugin.name == "hererocks" then if task.plugin.name == "hererocks" then
@ -172,6 +170,7 @@ function M.build(task)
root, root,
"--server", "--server",
Config.options.rocks.server, Config.options.rocks.server,
"--dev",
"--lua-version", "--lua-version",
"5.1", "5.1",
"install", -- use install so that we can make use of pre-built rocks "install", -- use install so that we can make use of pre-built rocks
@ -188,13 +187,11 @@ function M.build(task)
return return
end end
task:warn("Failed installing " .. rockspec.package .. " with `luarocks`.") task:warn("Failed installing " .. rockspec.package .. " with `luarocks`.\nTrying to build from source.")
task:warn("\n" .. string.rep("-", 80) .. "\n")
task:warn("Trying to build from source.")
-- install failed, so try building from source -- install failed, so try building from source
task:set_level() -- reset level task:set_level() -- reset level
ok = task:spawn(luarocks, { task:spawn(luarocks, {
args = { args = {
"--tree", "--tree",
root, root,
@ -209,9 +206,6 @@ function M.build(task)
cwd = task.plugin.dir, cwd = task.plugin.dir,
env = env, env = env,
}) })
if not ok then
require("lazy.manage.task.fs").clean.run(task, { rocks_only = true })
end
end end
---@param rockspec RockSpec ---@param rockspec RockSpec
@ -224,10 +218,9 @@ end
---@return table? ---@return table?
function M.parse(file) function M.parse(file)
local ret = {} local ret = {}
local ok = pcall(function() return pcall(function()
loadfile(file, nil, ret)() loadfile(file, "t", ret)()
end) and ret or nil end) and ret or nil
return ok and ret or nil
end end
---@param plugin LazyPlugin ---@param plugin LazyPlugin

View file

@ -10,7 +10,6 @@
---@field dirty? boolean ---@field dirty? boolean
---@field build? boolean ---@field build? boolean
---@field frags? number[] ---@field frags? number[]
---@field top? boolean
---@field handlers? LazyPluginHandlers ---@field handlers? LazyPluginHandlers
---@field installed? boolean ---@field installed? boolean
---@field is_local? boolean ---@field is_local? boolean
@ -21,7 +20,6 @@
---@field tasks? LazyTask[] ---@field tasks? LazyTask[]
---@field updated? {from:string, to:string} ---@field updated? {from:string, to:string}
---@field updates? {from:GitInfo, to:GitInfo} ---@field updates? {from:GitInfo, to:GitInfo}
---@field last_check? number
---@field working? boolean ---@field working? boolean
---@field pkg? LazyPkg ---@field pkg? LazyPkg
@ -61,7 +59,6 @@
---@field priority? number Only useful for lazy=false plugins to force loading certain plugins first. Default priority is 50 ---@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 dev? boolean If set, then link to the respective folder under your ~/projects
---@field rocks? string[] ---@field rocks? string[]
---@field virtual? boolean virtual plugins won't be installed or added to the rtp.
---@class LazyPlugin: LazyPluginBase,LazyPluginHandlers,LazyPluginHooks,LazyPluginRef ---@class LazyPlugin: LazyPluginBase,LazyPluginHandlers,LazyPluginHooks,LazyPluginRef
---@field dependencies? string[] ---@field dependencies? string[]
@ -76,8 +73,6 @@
---@field module? false ---@field module? false
---@class LazyPluginSpec: LazyPluginBase,LazyPluginSpecHandlers,LazyPluginHooks,LazyPluginRef ---@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 dependencies? string|string[]|LazyPluginSpec[]
---@field specs? string|string[]|LazyPluginSpec[] ---@field specs? string|string[]|LazyPluginSpec[]

View file

@ -146,7 +146,7 @@ end
---@return string, string[] ---@return string, string[]
function M.parse(args) function M.parse(args)
local parts = vim.split(vim.trim(args), "%s+") local parts = vim.split(vim.trim(args), "%s+")
if vim.startswith("Lazy", parts[1]) then if parts[1]:find("Lazy") then
table.remove(parts, 1) table.remove(parts, 1)
end end
if args:sub(-1) == " " then if args:sub(-1) == " " then

View file

@ -166,7 +166,7 @@ function M:mount()
self:augroup(true) self:augroup(true)
end, { win = true }) end, { win = true })
self:focus() self:focus()
self:on_key(ViewConfig.keys.close, self.close, "Close") self:on_key(ViewConfig.keys.close, self.close)
self:on({ "BufDelete", "BufHidden" }, self.close) self:on({ "BufDelete", "BufHidden" }, self.close)
if vim.bo[self.buf].buftype == "" then if vim.bo[self.buf].buftype == "" then

View file

@ -85,7 +85,7 @@ function M.create()
require("lazy.manage.process").abort() require("lazy.manage.process").abort()
require("lazy.async").abort() require("lazy.async").abort()
return ViewConfig.keys.abort return ViewConfig.keys.abort
end, { silent = true, buffer = self.buf, expr = true, desc = "Abort" }) end, { silent = true, buffer = self.buf, expr = true })
vim.keymap.set("n", "gx", "K", { buffer = self.buf, remap = true }) 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.state.plugin = open and selected or nil
self:update() self:update()
end end
end, "Details") end)
self:on_key(ViewConfig.keys.next, function() self:on_key(ViewConfig.keys.next, function()
local cursor = vim.api.nvim_win_get_cursor(self.view.win) local cursor = vim.api.nvim_win_get_cursor(self.view.win)
@ -121,7 +121,7 @@ function M.create()
return return
end end
end end
end, "Next Plugin") end)
self:on_key(ViewConfig.keys.prev, function() self:on_key(ViewConfig.keys.prev, function()
local cursor = vim.api.nvim_win_get_cursor(self.view.win) local cursor = vim.api.nvim_win_get_cursor(self.view.win)
@ -132,14 +132,14 @@ function M.create()
return return
end end
end end
end, "Prev Plugin") end)
self:on_key(ViewConfig.keys.profile_sort, function() self:on_key(ViewConfig.keys.profile_sort, function()
if self.state.mode == "profile" then if self.state.mode == "profile" then
self.state.profile.sort_time_taken = not self.state.profile.sort_time_taken self.state.profile.sort_time_taken = not self.state.profile.sort_time_taken
self:update() self:update()
end end
end, "Sort Profile") end)
self:on_key(ViewConfig.keys.profile_filter, function() self:on_key(ViewConfig.keys.profile_filter, function()
if self.state.mode == "profile" then if self.state.mode == "profile" then
@ -159,18 +159,17 @@ function M.create()
end end
end) end)
end end
end, "Filter Profile") end)
for lhs, rhs in pairs(Config.options.ui.custom_keys) do for lhs, rhs in pairs(Config.options.ui.custom_keys) do
if rhs then if rhs then
local handler = type(rhs) == "table" and rhs[1] or rhs 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() self:on_key(lhs, function()
local plugin = self.render:get_plugin() local plugin = self.render:get_plugin()
if plugin then if plugin then
handler(plugin) handler(plugin)
end end
end, desc) end)
end end
end end
@ -220,17 +219,17 @@ function M:setup_patterns()
["(https?://%S+)"] = function(url) ["(https?://%S+)"] = function(url)
Util.open(url) Util.open(url)
end, end,
}, self.hover, "Hover") }, self.hover)
self:on_pattern(ViewConfig.keys.diff, { self:on_pattern(ViewConfig.keys.diff, {
[commit_pattern] = function(hash) [commit_pattern] = function(hash)
self:diff({ commit = hash }) self:diff({ commit = hash })
end, end,
}, self.diff, "Diff") }, self.diff)
self:on_pattern(ViewConfig.commands.restore.key_plugin, { self:on_pattern(ViewConfig.commands.restore.key_plugin, {
[commit_pattern] = function(hash) [commit_pattern] = function(hash)
self:restore({ commit = hash }) self:restore({ commit = hash })
end, end,
}, self.restore, "Restore") }, self.restore)
end end
---@param opts? {commit:string} ---@param opts? {commit:string}
@ -295,8 +294,7 @@ end
---@param key string ---@param key string
---@param patterns table<string, fun(str:string)> ---@param patterns table<string, fun(str:string)>
---@param fallback? fun(self) ---@param fallback? fun(self)
---@param desc? string function M:on_pattern(key, patterns, fallback)
function M:on_pattern(key, patterns, fallback, desc)
self:on_key(key, function() self:on_key(key, function()
local line = vim.api.nvim_get_current_line() local line = vim.api.nvim_get_current_line()
local pos = vim.api.nvim_win_get_cursor(0) local pos = vim.api.nvim_win_get_cursor(0)
@ -318,7 +316,7 @@ function M:on_pattern(key, patterns, fallback, desc)
if fallback then if fallback then
fallback(self) fallback(self)
end end
end, desc) end)
end end
function M:setup_modes() function M:setup_modes()

View file

@ -94,7 +94,7 @@ function M:update()
diag.lnum = diag.row - 1 diag.lnum = diag.row - 1
return diag return diag
end, self._diagnostics), end, self._diagnostics),
{ signs = false, virtual_text = true, underline = false, virtual_lines = false } { signs = false, virtual_text = true, underline = false }
) )
end end
@ -144,6 +144,8 @@ function M:title()
if mode.name == "home" then if mode.name == "home" then
if self.view.state.mode == "home" then if self.view.state.mode == "home" then
title = " lazy.nvim " .. Config.options.ui.icons.lazy title = " lazy.nvim " .. Config.options.ui.icons.lazy
else
title = " lazy.nvim (H) "
end end
end end
@ -759,7 +761,7 @@ function M:debug()
---@type string[] ---@type string[]
plugins = vim.tbl_values(plugins) plugins = vim.tbl_values(plugins)
table.sort(plugins) table.sort(plugins)
self:append(Config.options.ui.icons.debug, "LazySpecial", { indent = 2 }) self:append("", "LazySpecial", { indent = 2 })
if handler_type == "keys" then if handler_type == "keys" then
for k, v in pairs(Config.plugins[plugins[1]]._.handlers.keys) do for k, v in pairs(Config.plugins[plugins[1]]._.handlers.keys) do
if k == value then if k == value then

View file

@ -1,3 +1,3 @@
#!/bin/env bash #!/bin/env bash
nvim -l tests/minit.lua --minitest nvim -l tests/minit.lua --busted tests -o utfTerminal "$@"

View file

@ -25,7 +25,6 @@ local function clean(plugins)
if plugin._.dep == false then if plugin._.dep == false then
plugin._.dep = nil plugin._.dep = nil
end end
plugin._.top = nil
return plugin return plugin
end, plugins) end, plugins)
end end