From 3ec5a2ce4c99202dfa76970bbaa36bfa05230cb5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 29 Nov 2022 23:16:21 +0100 Subject: [PATCH 0001/1610] perf: run cache autosave after loading --- lua/lazy/core/cache.lua | 49 ++++++++++++++++++++-------------------- lua/lazy/core/config.lua | 2 ++ 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 1fbc24a..270d6b5 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -44,7 +44,30 @@ function M.hash(file) end function M.setup() - M.load() + cache = {} + local f = io.open(cache_path, "rb") + if f then + cache_hash = M.hash(cache_path) + ---@type string + local data = f:read("*a") + f:close() + + local from = 1 + local to = data:find("\0", from, true) + while to do + local key = data:sub(from, to - 1) + from = to + 1 + to = data:find("\0", from, true) + local len = tonumber(data:sub(from, to - 1)) + from = to + 1 + cache[key] = data:sub(from, from + len - 1) + from = from + len + to = data:find("\0", from, true) + end + end +end + +function M.autosave() vim.api.nvim_create_autocmd("User", { pattern = "LazyDone", once = true, @@ -77,28 +100,4 @@ function M.save() f:close() end -function M.load() - cache = {} - local f = io.open(cache_path, "rb") - if f then - cache_hash = M.hash(cache_path) - ---@type string - local data = f:read("*a") - f:close() - - local from = 1 - local to = data:find("\0", from, true) - while to do - local key = data:sub(from, to - 1) - from = to + 1 - to = data:find("\0", from, true) - local len = tonumber(data:sub(from, to - 1)) - from = to + 1 - cache[key] = data:sub(from, from + len - 1) - from = from + len - to = data:find("\0", from, true) - end - end -end - return M diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 800eefb..641c94f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -27,6 +27,7 @@ M.defaults = { task = "✔ ", }, }, + install_missing = true, git = { -- defaults for `Lazy log` log = { "-10" }, -- last 10 commits @@ -67,6 +68,7 @@ function M.setup(opts) pattern = "VeryLazy", once = true, callback = function() + require("lazy.core.cache").autosave() require("lazy.view").setup() end, }) From 9be3d3d8409c6992cea5b2ffe0973fd6b4895dc6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 29 Nov 2022 23:16:57 +0100 Subject: [PATCH 0002/1610] feat: config option install_missing=true --- lua/lazy/init.lua | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 5d942c8..06fa663 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -25,25 +25,25 @@ function M.setup(opts) Plugin.load() Util.track() - Util.track("install") - for _, plugin in pairs(Config.plugins) do - if not plugin._.installed then - vim.cmd("do User LazyInstallPre") - require("lazy.manage").install({ - wait = true, - show = Config.options.interactive, - }) - break + if Config.options.install_missing then + Util.track("install") + for _, plugin in pairs(Config.plugins) do + if not plugin._.installed then + vim.cmd("do User LazyInstallPre") + require("lazy.manage").install({ + wait = true, + show = Config.options.interactive, + }) + break + end end + Util.track() end - Util.track() Util.track("loader") Loader.setup() Util.track() - Util.track() -- end setup - local lazy_delta = vim.loop.hrtime() - cache_start Loader.init_plugins() @@ -53,6 +53,7 @@ function M.setup(opts) end vim.cmd("do User LazyDone") + Util.track() -- end setup end function M.stats() From 4438faf9a9a72c95d88c620804db99fa44485ec9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 00:18:59 +0100 Subject: [PATCH 0003/1610] perf: removed partial spec caching. not worth the tiny performance boost --- lua/lazy/core/cache.lua | 23 ++--- lua/lazy/core/handler.lua | 32 +++--- lua/lazy/core/loader.lua | 12 --- lua/lazy/core/module.lua | 10 +- lua/lazy/core/plugin.lua | 198 ++++++++----------------------------- lua/lazy/init.lua | 17 +--- lua/lazy/manage/init.lua | 4 +- tests/core/plugin_spec.lua | 9 +- 8 files changed, 77 insertions(+), 228 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 270d6b5..8614190 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -68,27 +68,20 @@ function M.setup() end function M.autosave() - vim.api.nvim_create_autocmd("User", { - pattern = "LazyDone", - once = true, + vim.api.nvim_create_autocmd("VimLeavePre", { callback = function() - vim.api.nvim_create_autocmd("VimLeavePre", { - callback = function() - if M.dirty then - local hash = M.hash(cache_path) - -- abort when the file was changed in the meantime - if hash == nil or cache_hash == hash then - M.save() - end - end - end, - }) + if M.dirty then + local hash = M.hash(cache_path) + -- abort when the file was changed in the meantime + if hash == nil or cache_hash == hash then + M.save() + end + end end, }) end function M.save() - require("lazy.core.plugin").save() require("lazy.core.module").save() local f = assert(io.open(cache_path, "wb")) diff --git a/lua/lazy/core/handler.lua b/lua/lazy/core/handler.lua index b8f5682..fb20810 100644 --- a/lua/lazy/core/handler.lua +++ b/lua/lazy/core/handler.lua @@ -1,5 +1,6 @@ local Util = require("lazy.core.util") local Loader = require("lazy.core.loader") +local Config = require("lazy.core.config") ---@class LazyPluginHandlers ---@field event? string|string[] @@ -12,34 +13,25 @@ local M = {} ---@alias LazyHandler fun(grouped:table) ----@type table> -M._groups = nil - ----@param plugins LazyPlugin[] ----@param rebuild? boolean -function M.group(plugins, rebuild) - if M._groups == nil or rebuild then - M._groups = {} - local types = vim.tbl_keys(M.handlers) --[[@as string[] ]] - for _, key in ipairs(types) do - M._groups[key] = {} - for _, plugin in pairs(plugins) do - if plugin[key] then - ---@diagnostic disable-next-line: no-unknown - for _, value in pairs(type(plugin[key]) == "table" and plugin[key] or { plugin[key] }) do - M._groups[key][value] = M._groups[key][value] or {} - table.insert(M._groups[key][value], plugin.name) - end +function M.setup() + for key, handler in pairs(M.handlers) do + ---@type table + local group = {} + for _, plugin in pairs(Config.plugins) do + if plugin[key] then + ---@diagnostic disable-next-line: no-unknown + for _, value in pairs(type(plugin[key]) == "table" and plugin[key] or { plugin[key] }) do + group[value] = group[value] or {} + table.insert(group[value], plugin.name) end end end + handler(group) end - return M._groups end ---@type table M.handlers = {} - function M.handlers.event(grouped) local group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) for event, plugins in pairs(grouped) do diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 462e4b7..f8be35e 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -6,18 +6,6 @@ local M = {} ---@type LazyPlugin[] M.loading = {} -function M.setup() - local Handler = require("lazy.core.handler") - local groups = Handler.group(Config.plugins) - for t, handler in pairs(Handler.handlers) do - if groups[t] then - Util.track(t) - handler(groups[t]) - Util.track() - end - end -end - function M.init_plugins() Util.track("plugin_init") for _, plugin in pairs(Config.plugins) do diff --git a/lua/lazy/core/module.lua b/lua/lazy/core/module.lua index 5b0a233..3eb5780 100644 --- a/lua/lazy/core/module.lua +++ b/lua/lazy/core/module.lua @@ -5,13 +5,9 @@ local M = {} ---@type table M.hashes = {} -function M.is_dirty(modname, modpath) - return not (Cache.get(modname) and M.hashes[modname] and M.hashes[modname] == Cache.hash(modpath)) -end - ---@param modname string ---@param modpath string ----@return any, boolean +---@return any function M.load(modname, modpath) local err ---@type (string|fun())? @@ -24,9 +20,7 @@ function M.load(modname, modpath) chunk = nil end - local cached = false if chunk then - cached = true chunk, err = load(chunk --[[@as string]], "@" .. modpath, "b") else vim.schedule(function() @@ -39,7 +33,7 @@ function M.load(modname, modpath) end if chunk then - return chunk(), cached + return chunk() else error(err) end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 0f20b24..815a57e 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,17 +1,10 @@ local Config = require("lazy.core.config") local Util = require("lazy.core.util") local Module = require("lazy.core.module") -local Cache = require("lazy.core.cache") local Handler = require("lazy.core.handler") local M = {} ----@alias CachedPlugin LazyPlugin | {_funs: string[]} -local skip = { _ = true, dir = true } -local funs = { config = true, init = true, run = true } - -M.dirty = false - ---@class LazyPluginHooks ---@field init? fun(LazyPlugin) Will always be run ---@field config? fun(LazyPlugin) Will be executed when loading the plugin @@ -48,10 +41,7 @@ M.dirty = false ---@alias LazySpec string|LazyPlugin|LazySpec[]|{dependencies:LazySpec} ---@class LazySpecLoader ----@field modname string ----@field modpath string ---@field plugins table ----@field funs? table local Spec = {} M.Spec = Spec @@ -59,30 +49,12 @@ M.Spec = Spec function Spec.new(spec) local self = setmetatable({}, { __index = Spec }) self.plugins = {} - self.modname = nil - self.modpath = nil if spec then self:normalize(spec) end return self end ----@param modname string ----@param modpath string -function Spec.load(modname, modpath) - local self = setmetatable({}, { __index = Spec }) - self.plugins = {} - self.modname = modname - self.modpath = modpath - local mod, cached = Module.load(modname, modpath) - M.dirty = M.dirty or not cached - self:normalize(assert(mod)) - if modname == Config.options.plugins and not self.plugins["lazy.nvim"] then - self:add({ "folke/lazy.nvim", opt = false }) - end - return self -end - ---@param plugin LazyPlugin ---@param is_dep? boolean function Spec:add(plugin, is_dep) @@ -113,9 +85,16 @@ function Spec:add(plugin, is_dep) plugin.dep = is_dep - M.process_local(plugin) + -- check for plugins that should be local + for _, pattern in ipairs(Config.options.plugins_local.patterns) do + if plugin[1]:find(pattern, 1, true) then + plugin.uri = Config.options.plugins_local.path .. "/" .. plugin.name + break + end + end + local other = self.plugins[plugin.name] - self.plugins[plugin.name] = other and M.merge(other, plugin) or plugin + self.plugins[plugin.name] = other and self:merge(other, plugin) or plugin return self.plugins[plugin.name] end @@ -140,28 +119,10 @@ function Spec:normalize(spec, results, is_dep) return results end ----@param spec LazySpecLoader -function Spec.revive(spec) - if spec.funs then - ---@type LazySpecLoader - local loaded = nil - for fun, plugins in pairs(spec.funs) do - for _, name in pairs(plugins) do - ---@diagnostic disable-next-line: no-unknown - spec.plugins[name][fun] = function(...) - loaded = loaded or Spec.load(spec.modname, spec.modpath) - return loaded.plugins[name][fun](...) - end - end - end - end - return spec -end - ---@param old LazyPlugin ---@param new LazyPlugin ---@return LazyPlugin -function M.merge(old, new) +function Spec:merge(old, new) local is_dep = old.dep and new.dep ---@diagnostic disable-next-line: no-unknown @@ -185,25 +146,19 @@ function M.merge(old, new) return old end ----@param opts? {clean:boolean, installed:boolean, plugins?: LazyPlugin[]} -function M.update_state(opts) - opts = opts or {} - +function M.update_state() ---@type table<"opt"|"start", table> local installed = { opt = {}, start = {} } - if opts.installed ~= false then - for opt, packs in pairs(installed) do - Util.ls(Config.options.packpath .. "/" .. opt, function(_, name, type) - if type == "directory" or type == "link" then - packs[name] = type - end - end) - end + for opt, packs in pairs(installed) do + Util.ls(Config.options.packpath .. "/" .. opt, function(_, name, type) + if type == "directory" or type == "link" then + packs[name] = type + end + end) end - for _, plugin in pairs(opts.plugins or Config.plugins) do + for _, plugin in pairs(Config.plugins) do plugin._ = plugin._ or {} - plugin[1] = plugin["1"] or plugin[1] if plugin.opt == nil then plugin.opt = plugin.dep or Config.options.opt @@ -224,121 +179,52 @@ function M.update_state(opts) end end - if opts.clean then - Config.to_clean = {} - for opt, packs in pairs(installed) do - for pack in pairs(packs) do - table.insert(Config.to_clean, { - name = pack, - pack = pack, - dir = Config.options.packpath .. "/" .. opt .. "/" .. pack, - opt = opt == "opt", - _ = { - installed = true, - }, - }) - end + Config.to_clean = {} + for opt, packs in pairs(installed) do + for pack, dir_type in pairs(packs) do + table.insert(Config.to_clean, { + name = pack, + dir = Config.options.packpath .. "/" .. opt .. "/" .. pack, + opt = opt == "opt", + _ = { + installed = true, + is_symlink = dir_type == "link", + is_local = dir_type == "link", + }, + }) end end end ----@param plugin LazyPlugin -function M.process_local(plugin) - for _, pattern in ipairs(Config.options.plugins_local.patterns) do - if plugin[1]:find(pattern, 1, true) then - plugin.uri = Config.options.plugins_local.path .. "/" .. plugin.name - return - end - end -end - ----@param cache? table -function M.specs(cache) - ---@type LazySpecLoader[] - local specs = {} +function M.spec() + local spec = Spec.new() local function _load(name, modpath) local modname = Config.options.plugins .. (name and ("." .. name) or "") Util.try(function() - local spec = cache and cache[modname] - spec = spec and not Module.is_dirty(modname, modpath) and Spec.revive(spec) or Spec.load(modname, modpath) - table.insert(specs, spec) + local mod = Module.load(modname, modpath) + spec:normalize(assert(mod)) end, "Failed to load **" .. modname .. "**") end _load(nil, Config.paths.main) Util.lsmod(Config.paths.plugins, _load) - return specs + return spec end function M.load() - ---@type boolean, LazyState? - local ok, state = pcall(vim.json.decode, Cache.get("cache.state")) - if not (ok and state and vim.deep_equal(Config.options, state.config)) then - M.dirty = true - state = nil - end - -- load specs - Util.track("specs") - local specs = M.specs(state and state.specs) - Util.track() - - -- merge - Config.plugins = {} - for _, spec in ipairs(specs) do - for _, plugin in pairs(spec.plugins) do - local other = Config.plugins[plugin.name] - Config.plugins[plugin.name] = other and M.merge(other, plugin) or plugin - end + Util.track("spec") + local spec = M.spec() + if not spec.plugins["lazy.nvim"] then + spec:add({ "folke/lazy.nvim", opt = false }) end + Config.plugins = spec.plugins + Util.track() Util.track("state") M.update_state() Util.track() - - if M.dirty then - Cache.dirty = true - elseif state then - require("lazy.core.handler")._groups = state.handlers - end -end - -function M.save() - ---@class LazyState - local state = { - ---@type table - specs = {}, - handlers = require("lazy.core.handler").group(Config.plugins, true), - config = Config.options, - } - - for _, spec in ipairs(M.specs()) do - spec.funs = {} - state.specs[spec.modname] = spec - for _, plugin in pairs(spec.plugins) do - if plugin.init or (plugin.opt == false and plugin.config) then - -- no use in caching specs that need init, - -- or specs that are in start and have a config, - -- since we'll load the real spec during startup anyway - state.specs[spec.modname] = nil - break - end - ---@cast plugin CachedPlugin - for k, v in pairs(plugin) do - if type(v) == "function" then - if funs[k] then - spec.funs[k] = spec.funs[k] or {} - table.insert(spec.funs[k], plugin.name) - end - plugin[k] = nil - elseif skip[k] then - plugin[k] = nil - end - end - end - end - Cache.set("cache.state", vim.json.encode(state)) end return M diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 06fa663..50aa05f 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -10,6 +10,7 @@ function M.setup(opts) local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") + local Handler = require("lazy.core.handler") local Plugin = require("lazy.core.plugin") Util.track("cache", module_start - cache_start) @@ -21,9 +22,7 @@ function M.setup(opts) Config.setup(opts) Util.track() - Util.track("state") Plugin.load() - Util.track() if Config.options.install_missing then Util.track("install") @@ -40,12 +39,13 @@ function M.setup(opts) Util.track() end - Util.track("loader") - Loader.setup() + Util.track("handlers") + Handler.setup() Util.track() local lazy_delta = vim.loop.hrtime() - cache_start + Util.track() -- end setup Loader.init_plugins() if Config.plugins["lazy.nvim"] then @@ -53,23 +53,16 @@ function M.setup(opts) end vim.cmd("do User LazyDone") - Util.track() -- end setup end function M.stats() - local ret = { - count = 0, - loaded = 0, - } - + local ret = { count = 0, loaded = 0 } for _, plugin in pairs(require("lazy.core.config").plugins) do ret.count = ret.count + 1 - if plugin._.loaded then ret.loaded = ret.loaded + 1 end end - return ret end diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index d77115f..5dac6e9 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -115,7 +115,7 @@ end ---@param opts? ManagerOpts function M.clean(opts) - Plugin.update_state({ clean = true }) + Plugin.update_state() M.run({ pipeline = { "fs.clean" }, plugins = Config.to_clean, @@ -123,7 +123,7 @@ function M.clean(opts) end function M.clear() - Plugin.update_state({ clean = true }) + Plugin.update_state() for _, plugin in pairs(Config.plugins) do plugin._.updated = nil plugin._.cloned = nil diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 1e47788..acf3424 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -38,7 +38,8 @@ describe("plugin spec opt", function() } for _, test in ipairs(tests) do local spec = Plugin.Spec.new(test) - Plugin.update_state({ plugins = spec.plugins }) + Config.plugins = spec.plugins + Plugin.update_state() assert(vim.tbl_count(spec.plugins) == 3) assert(#spec.plugins.bar.dependencies == 2) assert(spec.plugins.bar.dep ~= true) @@ -53,7 +54,8 @@ describe("plugin spec opt", function() it("handles opt from dep", function() Config.options.opt = false local spec = Plugin.Spec.new({ "foo/dep1", { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } } }) - Plugin.update_state({ plugins = spec.plugins }) + Config.plugins = spec.plugins + Plugin.update_state() assert.same(3, vim.tbl_count(spec.plugins)) assert(spec.plugins.bar.dep ~= true) assert(spec.plugins.bar.opt == false) @@ -66,7 +68,8 @@ describe("plugin spec opt", function() it("handles opt from dep", function() Config.options.opt = false local spec = Plugin.Spec.new({ "foo/bar", module = "foo" }) - Plugin.update_state({ plugins = spec.plugins }) + Config.plugins = spec.plugins + Plugin.update_state() assert.same(1, vim.tbl_count(spec.plugins)) assert(spec.plugins.bar.dep ~= true) assert(spec.plugins.bar.opt == true) From e1c08d64b387c59343c21a6f0397b88d5b4a3acc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 14:19:50 +0100 Subject: [PATCH 0004/1610] perf: merge module/cache and use ffi to pack cache data --- lua/lazy/core/cache.lua | 96 --------------------------------- lua/lazy/core/config.lua | 2 +- lua/lazy/core/module.lua | 114 +++++++++++++++++++++++++++++---------- lua/lazy/init.lua | 12 ++--- 4 files changed, 90 insertions(+), 134 deletions(-) delete mode 100644 lua/lazy/core/cache.lua diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua deleted file mode 100644 index 8614190..0000000 --- a/lua/lazy/core/cache.lua +++ /dev/null @@ -1,96 +0,0 @@ --- Simple string cache with fast saving and loading from file -local M = {} - -M.dirty = false - -local cache_path = vim.fn.stdpath("state") .. "/lazy.state" ----@type string -local cache_hash = "" ----@type table -local used = {} ----@type table -local cache = {} - ----@return string? -function M.get(key) - if cache[key] then - used[key] = true - return cache[key] - end -end - -function M.debug() - local ret = {} - for key, value in pairs(cache) do - ret[key] = #value - end - return ret -end - -function M.set(key, value) - cache[key] = value - used[key] = true - M.dirty = true -end - -function M.del(key) - cache[key] = nil - M.dirty = true -end - -function M.hash(file) - local stat = vim.loop.fs_stat(file) - return stat and (stat.mtime.sec .. stat.mtime.nsec .. stat.size) -end - -function M.setup() - cache = {} - local f = io.open(cache_path, "rb") - if f then - cache_hash = M.hash(cache_path) - ---@type string - local data = f:read("*a") - f:close() - - local from = 1 - local to = data:find("\0", from, true) - while to do - local key = data:sub(from, to - 1) - from = to + 1 - to = data:find("\0", from, true) - local len = tonumber(data:sub(from, to - 1)) - from = to + 1 - cache[key] = data:sub(from, from + len - 1) - from = from + len - to = data:find("\0", from, true) - end - end -end - -function M.autosave() - vim.api.nvim_create_autocmd("VimLeavePre", { - callback = function() - if M.dirty then - local hash = M.hash(cache_path) - -- abort when the file was changed in the meantime - if hash == nil or cache_hash == hash then - M.save() - end - end - end, - }) -end - -function M.save() - require("lazy.core.module").save() - - local f = assert(io.open(cache_path, "wb")) - for key, value in pairs(cache) do - if used[key] then - f:write(key, "\0", tostring(#value), "\0", value) - end - end - f:close() -end - -return M diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 641c94f..802695e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -68,7 +68,7 @@ function M.setup(opts) pattern = "VeryLazy", once = true, callback = function() - require("lazy.core.cache").autosave() + require("lazy.core.module").autosave() require("lazy.view").setup() end, }) diff --git a/lua/lazy/core/module.lua b/lua/lazy/core/module.lua index 3eb5780..6d59254 100644 --- a/lua/lazy/core/module.lua +++ b/lua/lazy/core/module.lua @@ -1,51 +1,50 @@ -local Cache = require("lazy.core.cache") +local ffi = require("ffi") +---@diagnostic disable-next-line: no-unknown +local uv = vim.loop local M = {} +M.dirty = false ----@type table -M.hashes = {} +local cache_path = vim.fn.stdpath("state") .. "/lazy.state" +---@type CacheHash +local cache_hash + +---@alias CacheHash {mtime: {sec:number, nsec:number}, size:number} +---@alias CacheEntry {hash:CacheHash, chunk:string, used:boolean} +---@type table +M.cache = {} ---@param modname string ---@param modpath string ---@return any function M.load(modname, modpath) - local err - ---@type (string|fun())? - local chunk = Cache.get(modname) + local entry = M.cache[modname] + local hash = assert(M.hash(modpath)) - local hash = Cache.hash(modpath) - if hash ~= M.hashes[modname] then - M.hashes[modname] = hash - Cache.del(modname) - chunk = nil + if entry and not M.eq(entry.hash, hash) then + entry = nil end - if chunk then - chunk, err = load(chunk --[[@as string]], "@" .. modpath, "b") + local chunk, err + if entry then + entry.used = true + chunk, err = load(entry.chunk --[[@as string]], "@" .. modpath, "b") else vim.schedule(function() vim.notify("loadfile(" .. modname .. ")") end) chunk, err = loadfile(modpath) - if chunk and not err then - Cache.set(modname, string.dump(chunk)) + if chunk then + M.dirty = true + M.cache[modname] = { hash = hash, chunk = string.dump(chunk), used = true } end end - if chunk then - return chunk() - else - error(err) - end + return chunk and chunk() or error(err) end function M.setup() - -- load cache - local value = Cache.get("cache.modules") - if value then - M.hashes = vim.json.decode(value) - end - + M.load_cache() -- preload core modules local root = vim.fn.fnamemodify(debug.getinfo(1, "S").source:sub(2), ":p:h:h") for _, name in ipairs({ "util", "config", "loader", "plugin", "handler" }) do @@ -58,8 +57,67 @@ function M.setup() return M end -function M.save() - Cache.set("cache.modules", vim.json.encode(M.hashes)) +---@return CacheHash? +function M.hash(file) + return uv.fs_stat(file) +end + +---@param h1 CacheHash +---@param h2 CacheHash +function M.eq(h1, h2) + return h1 and h2 and h1.size == h2.size and h1.mtime.sec == h2.mtime.sec and h1.mtime.nsec == h2.mtime.nsec +end + +function M.save_cache() + local f = assert(uv.fs_open(cache_path, "w", 438)) + vim.loop.fs_ftruncate(f, 0) + for modname, entry in pairs(M.cache) do + if entry.used then + entry.modname = modname + local header = { entry.hash.size, entry.hash.mtime.sec, entry.hash.mtime.nsec, #modname, #entry.chunk } + uv.fs_write(f, ffi.string(ffi.new("const uint32_t[5]", header), 20)) + uv.fs_write(f, modname) + uv.fs_write(f, entry.chunk) + end + end + uv.fs_close(f) +end + +function M.load_cache() + M.cache = {} + local f = uv.fs_open(cache_path, "r", 438) + if f then + cache_hash = uv.fs_fstat(f) --[[@as CacheHash]] + local data = uv.fs_read(f, cache_hash.size, 0) --[[@as string]] + uv.fs_close(f) + + local offset = 1 + while offset + 1 < #data do + local header = ffi.cast("uint32_t*", ffi.new("const char[20]", data:sub(offset, offset + 19))) + offset = offset + 20 + local modname = data:sub(offset, offset + header[3] - 1) + offset = offset + header[3] + local chunk = data:sub(offset, offset + header[4] - 1) + offset = offset + header[4] + M.cache[modname] = { hash = { size = header[0], mtime = { sec = header[1], nsec = header[2] } }, chunk = chunk } + end + end +end + +function M.autosave() + vim.api.nvim_create_autocmd("VimLeavePre", { + callback = function() + if M.dirty then + local hash = M.hash(cache_path) + -- abort when the file was changed in the meantime + if hash == nil or M.eq(cache_hash, hash) then + vim.fn.system("echo start >> foo.txt") + M.save_cache() + vim.fn.system("echo stop >> foo.txt") + end + end + end, + }) end return M diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 50aa05f..49a978c 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -2,9 +2,6 @@ local M = {} ---@param opts? LazyConfig function M.setup(opts) - local cache_start = vim.loop.hrtime() - require("lazy.core.cache").setup() - local module_start = vim.loop.hrtime() require("lazy.core.module").setup() local Util = require("lazy.core.util") @@ -13,7 +10,6 @@ function M.setup(opts) local Handler = require("lazy.core.handler") local Plugin = require("lazy.core.plugin") - Util.track("cache", module_start - cache_start) Util.track("module", vim.loop.hrtime() - module_start) Util.track("setup") @@ -29,10 +25,7 @@ function M.setup(opts) for _, plugin in pairs(Config.plugins) do if not plugin._.installed then vim.cmd("do User LazyInstallPre") - require("lazy.manage").install({ - wait = true, - show = Config.options.interactive, - }) + require("lazy.manage").install({ wait = true, show = Config.options.interactive }) break end end @@ -43,9 +36,10 @@ function M.setup(opts) Handler.setup() Util.track() - local lazy_delta = vim.loop.hrtime() - cache_start + local lazy_delta = vim.loop.hrtime() - module_start Util.track() -- end setup + Loader.init_plugins() if Config.plugins["lazy.nvim"] then From fc0a10150f837cdaf2f1c116c4f1914496d6f618 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 30 Nov 2022 13:20:44 +0000 Subject: [PATCH 0005/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b34708d..0fa76da 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 November 29 +*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 November 30 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 39c7e21c5f611dd0965b609c3828095315d28cf7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 14:41:20 +0100 Subject: [PATCH 0006/1610] refactor: Loader.source_runtime --- lua/lazy/core/loader.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index f8be35e..093692c 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -70,18 +70,18 @@ end function M.packadd(plugin, load_start) if plugin.opt then vim.cmd.packadd(plugin.name) - M.source_plugin_files(plugin, true) + M.source_runtime(plugin, "/after/plugin") elseif load_start then vim.opt.runtimepath:append(plugin.dir) - M.source_plugin_files(plugin) - M.source_plugin_files(plugin, true) + M.source_runtime(plugin, "/plugin") + M.source_runtime(plugin, "/after/plugin") end end ---@param plugin LazyPlugin ----@param after? boolean -function M.source_plugin_files(plugin, after) - Util.walk(plugin.dir .. (after and "/after" or "") .. "/plugin", function(path, _, t) +---@param dir? string +function M.source_runtime(plugin, dir) + Util.walk(plugin.dir .. dir, function(path, _, t) local ext = path:sub(-3) if t == "file" and (ext == "lua" or ext == "vim") then vim.cmd("silent source " .. path) From 1e2f5273bb61b660dd93651c4fc44d2c8c21b905 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:05:51 +0100 Subject: [PATCH 0007/1610] fix: show proper installed/clean state for local plugins --- lua/lazy/manage/task/fs.lua | 4 ++++ lua/lazy/manage/task/git.lua | 2 ++ 2 files changed, 6 insertions(+) diff --git a/lua/lazy/manage/task/fs.lua b/lua/lazy/manage/task/fs.lua index 5b4f3e5..b8097be 100644 --- a/lua/lazy/manage/task/fs.lua +++ b/lua/lazy/manage/task/fs.lua @@ -37,6 +37,8 @@ M.symlink = { if stat then assert(stat.type == "link") if vim.loop.fs_realpath(self.plugin.uri) == vim.loop.fs_realpath(self.plugin.dir) then + self.plugin._.installed = true + self.plugin._.cloned = true return else vim.loop.fs_unlink(self.plugin.dir) @@ -44,6 +46,8 @@ M.symlink = { end vim.loop.fs_symlink(self.plugin.uri, self.plugin.dir, { dir = true }) vim.opt.runtimepath:append(self.plugin.uri) + self.plugin._.installed = true + self.plugin._.cloned = true end, } diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index cef7e88..5a404ba 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -105,6 +105,7 @@ M.fetch = { skip = function(plugin) return not plugin._.installed or plugin._.is_local end, + run = function(self) local args = { "fetch", @@ -124,6 +125,7 @@ M.checkout = { skip = function(plugin) return not plugin._.installed or plugin._.is_local end, + ---@param opts {lockfile?:boolean} run = function(self, opts) local info = assert(Git.info(self.plugin.dir)) From 03692781597b648fa3524e50c0de4bff405ba215 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:06:26 +0100 Subject: [PATCH 0008/1610] fix: update state after running operation so the ui reflects any changes from cleaning --- lua/lazy/manage/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 5dac6e9..dd2f267 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -42,6 +42,7 @@ function M.run(ropts, opts) -- wait for post-install to finish runner:wait(function() vim.cmd([[do User LazyRender]]) + Plugin.update_state() end) if opts.wait then From 47f5c124aafae70b11db7ebef502c96c80aaf845 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:07:09 +0100 Subject: [PATCH 0009/1610] config: removed interactive option. not needed --- lua/lazy/core/config.lua | 6 ------ lua/lazy/manage/init.lua | 7 ++----- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 802695e..39c562e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -11,7 +11,6 @@ M.defaults = { ---@type string[] patterns = {}, }, - interactive = true, packpath = vim.fn.stdpath("data") .. "/site/pack/lazy", lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", view = { @@ -59,11 +58,6 @@ function M.setup(opts) M.paths.plugins = vim.fn.stdpath("config") .. "/lua/" .. M.options.plugins:gsub("%.", "/") M.paths.main = M.paths.plugins .. (vim.loop.fs_stat(M.paths.plugins .. ".lua") and ".lua" or "/init.lua") - -- TODO: check what this does inside a GUI. Probably still ok - if #vim.api.nvim_list_uis() == 0 then - M.options.interactive = false - end - vim.api.nvim_create_autocmd("User", { pattern = "VeryLazy", once = true, diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index dd2f267..fea68f2 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -7,7 +7,7 @@ local M = {} ---@class ManagerOpts ---@field wait? boolean ---@field clear? boolean ----@field interactive? boolean +---@field show? boolean ---@field mode? string ---@field plugins? LazyPlugin[] @@ -15,9 +15,6 @@ local M = {} ---@param opts? ManagerOpts function M.run(ropts, opts) opts = opts or {} - if opts.interactive == nil then - opts.interactive = Config.options.interactive - end if opts.plugins then ropts.plugins = opts.plugins @@ -27,7 +24,7 @@ function M.run(ropts, opts) M.clear() end - if opts.interactive then + if opts.show ~= false then vim.schedule(function() require("lazy.view").show(opts.mode) end) From 5d81c5062b42445d5a752c3f691b08c2926b949c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:08:00 +0100 Subject: [PATCH 0010/1610] refactor: renamed plugins_local to dev --- lua/lazy/core/config.lua | 6 +++--- lua/lazy/core/plugin.lua | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 39c562e..9e03653 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -6,10 +6,10 @@ local M = {} M.defaults = { opt = true, plugins = "config.plugins", - plugins_local = { - path = vim.fn.expand("~/projects"), + dev = { + path = vim.fn.expand("~/projects"), -- the path where you store your projects ---@type string[] - patterns = {}, + patterns = {}, -- For example {"folke"} }, packpath = vim.fn.stdpath("data") .. "/site/pack/lazy", lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 815a57e..41cac42 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -86,9 +86,9 @@ function Spec:add(plugin, is_dep) plugin.dep = is_dep -- check for plugins that should be local - for _, pattern in ipairs(Config.options.plugins_local.patterns) do + for _, pattern in ipairs(Config.options.dev.patterns) do if plugin[1]:find(pattern, 1, true) then - plugin.uri = Config.options.plugins_local.path .. "/" .. plugin.name + plugin.uri = Config.options.dev.path .. "/" .. plugin.name break end end From 334f32e595055e7170347f543031224cd36f3466 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:08:40 +0100 Subject: [PATCH 0011/1610] refactor: renamed Config.opt => Config.defaults.opt --- lua/lazy/core/config.lua | 5 ++++- lua/lazy/core/plugin.lua | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9e03653..f2eeca8 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -4,8 +4,11 @@ local M = {} ---@class LazyConfig M.defaults = { - opt = true, plugins = "config.plugins", + defaults = { + opt = false, -- should plugins default to "opt" or "start" + -- version = "*", -- enable this to try installing the latest stable versions of plugins + }, dev = { path = vim.fn.expand("~/projects"), -- the path where you store your projects ---@type string[] diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 41cac42..1436f99 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -160,14 +160,14 @@ function M.update_state() for _, plugin in pairs(Config.plugins) do plugin._ = plugin._ or {} if plugin.opt == nil then - plugin.opt = plugin.dep - or Config.options.opt + local opt = plugin.dep + or Config.options.defaults.opt or plugin.module or plugin.event or plugin.keys or plugin.ft or plugin.cmd - plugin.opt = plugin.opt and true or false + plugin.opt = opt and true or false end local opt = plugin.opt and "opt" or "start" plugin.dir = Config.options.packpath .. "/" .. opt .. "/" .. plugin.name From fb96183753bfc734b081fc5a2a3d5705376d9d20 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:12:00 +0100 Subject: [PATCH 0012/1610] feat: allow config of default for version field --- lua/lazy/core/config.lua | 1 + lua/lazy/manage/git.lua | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f2eeca8..daef111 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -7,6 +7,7 @@ M.defaults = { plugins = "config.plugins", defaults = { opt = false, -- should plugins default to "opt" or "start" + version = nil, -- version = "*", -- enable this to try installing the latest stable versions of plugins }, dev = { diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 18bfb2a..df64465 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -1,5 +1,6 @@ local Util = require("lazy.util") local Semver = require("lazy.manage.semver") +local Config = require("lazy.core.config") local M = {} @@ -89,8 +90,9 @@ function M.get_target(plugin) commit = M.ref(plugin.dir, "tags/" .. plugin.tag), } end - if plugin.version then - local last = Semver.last(M.get_versions(plugin.dir, plugin.version)) + local version = plugin.version or Config.options.defaults.version + if version then + local last = Semver.last(M.get_versions(plugin.dir, version)) if last then return { branch = branch and branch.branch, From 0cff878b2e1af134892184920fd8ae64d9f954c0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:13:08 +0100 Subject: [PATCH 0013/1610] feat: config for ui border --- lua/lazy/core/config.lua | 6 ++++-- lua/lazy/view/init.lua | 1 + lua/lazy/view/render.lua | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index daef111..ae751ce 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -18,6 +18,9 @@ M.defaults = { packpath = vim.fn.stdpath("data") .. "/site/pack/lazy", lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", view = { + ui = { + -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. + border = "none", icons = { start = "", plugin = " ", @@ -26,10 +29,9 @@ M.defaults = { event = "", keys = " ", cmd = " ", - ft = "", + ft = " ", task = "✔ ", }, - }, install_missing = true, git = { -- defaults for `Lazy log` diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 51bb8e0..c7007c0 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -53,6 +53,7 @@ function M.show(mode) local opts = { relative = "editor", style = "minimal", + border = Config.options.ui.border, width = math.min(vim.o.columns - hpad * 2, 200), height = math.min(vim.o.lines - vpad * 2, 70), } diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 6c528f7..4a3b7df 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -237,7 +237,7 @@ function M:reason(reason, opts) value = value:match("User (.*)") or value end local hl = "LazyLoader" .. key:sub(1, 1):upper() .. key:sub(2) - local icon = Config.options.view.icons[key] + local icon = Config.options.ui.icons[key] if icon then self:append(icon .. " ", hl) self:append(value, hl) From a197f751f97c1b050916a8453acba914569b7bb5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:13:35 +0100 Subject: [PATCH 0014/1610] feat: config option for ui throttle --- lua/lazy/core/config.lua | 1 + lua/lazy/view/init.lua | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index ae751ce..6fa55a1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -37,6 +37,7 @@ M.defaults = { -- defaults for `Lazy log` log = { "-10" }, -- last 10 commits -- log = { "--since=3 days ago" }, -- commits from the last 3 days + throttle = 20, -- how frequently should the ui process render events }, } diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index c7007c0..645ef38 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -98,7 +98,7 @@ function M.show(mode) }) local render = Render.new(buf, win, 2) - local update = Util.throttle(30, function() + local update = Util.throttle(Config.options.ui.throttle, function() if buf and vim.api.nvim_buf_is_valid(buf) then vim.bo[buf].modifiable = true render:update() From a87b6e1005dc8f7f3305c6d844e4fd5af99a5cf1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:14:16 +0100 Subject: [PATCH 0015/1610] style: cleanup --- lua/lazy/core/config.lua | 19 +++++++++++-------- lua/lazy/core/module.lua | 2 -- lua/lazy/init.lua | 2 +- lua/lazy/view/commands.lua | 14 +++++++------- tests/core/plugin_spec.lua | 23 ++++++++++++++++++++--- 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 6fa55a1..275d0fa 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -10,14 +10,22 @@ M.defaults = { version = nil, -- version = "*", -- enable this to try installing the latest stable versions of plugins }, + packpath = vim.fn.stdpath("data") .. "/site/pack/lazy", -- package path where new plugins will be installed + lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. + install_missing = true, -- install missing plugins on startup. This doesn't increase startup time. + git = { + -- defaults for `Lazy log` + -- log = { "-10" }, -- last 10 commits + log = { "--since=1 days ago" }, -- commits from the last 3 days + }, + -- Any plugin spec that contains one of the patterns will use your + -- local repo in the projects folder instead of fetchig it from github + -- Mostly useful for plugin developers. dev = { path = vim.fn.expand("~/projects"), -- the path where you store your projects ---@type string[] patterns = {}, -- For example {"folke"} }, - packpath = vim.fn.stdpath("data") .. "/site/pack/lazy", - lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", - view = { ui = { -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", @@ -32,11 +40,6 @@ M.defaults = { ft = " ", task = "✔ ", }, - install_missing = true, - git = { - -- defaults for `Lazy log` - log = { "-10" }, -- last 10 commits - -- log = { "--since=3 days ago" }, -- commits from the last 3 days throttle = 20, -- how frequently should the ui process render events }, } diff --git a/lua/lazy/core/module.lua b/lua/lazy/core/module.lua index 6d59254..674eb57 100644 --- a/lua/lazy/core/module.lua +++ b/lua/lazy/core/module.lua @@ -111,9 +111,7 @@ function M.autosave() local hash = M.hash(cache_path) -- abort when the file was changed in the meantime if hash == nil or M.eq(cache_hash, hash) then - vim.fn.system("echo start >> foo.txt") M.save_cache() - vim.fn.system("echo stop >> foo.txt") end end end, diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 49a978c..955fd55 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -25,7 +25,7 @@ function M.setup(opts) for _, plugin in pairs(Config.plugins) do if not plugin._.installed then vim.cmd("do User LazyInstallPre") - require("lazy.manage").install({ wait = true, show = Config.options.interactive }) + require("lazy.manage").install({ wait = true }) break end end diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 52e4626..43afaa3 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -18,17 +18,17 @@ end M.commands = { clean = function(plugins) - Manage.clean({ clear = true, interactive = true, mode = "clean", plugins = plugins }) + Manage.clean({ clear = true, mode = "clean", plugins = plugins }) end, clear = function() Manage.clear() View.show() end, install = function() - Manage.install({ clear = true, interactive = true, mode = "install" }) + Manage.install({ clear = true, mode = "install" }) end, log = function(plugins) - Manage.log({ clear = true, interactive = true, mode = "log", plugins = plugins }) + Manage.log({ clear = true, mode = "log", plugins = plugins }) end, show = function() View.show() @@ -40,18 +40,18 @@ M.commands = { View.show("profile") end, sync = function() - Manage.clean({ interactive = true, clear = true, wait = true, mode = "sync" }) + Manage.clean({ clear = true, wait = true, mode = "sync" }) Manage.update({ interactive = true }) Manage.install({ interactive = true }) end, update = function(plugins) - Manage.update({ clear = true, interactive = true, mode = "update", plugins = plugins }) + Manage.update({ clear = true, mode = "update", plugins = plugins }) end, check = function(plugins) - Manage.check({ clear = true, interactive = true, mode = "check", plugins = plugins }) + Manage.check({ clear = true, mode = "check", plugins = plugins }) end, restore = function(plugins) - Manage.update({ clear = true, interactive = true, lockfile = true, mode = "restore", plugins = plugins }) + Manage.update({ clear = true, lockfile = true, mode = "restore", plugins = plugins }) end, } diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index acf3424..950a597 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -30,7 +30,7 @@ end) describe("plugin spec opt", function() it("handles dependencies", function() - Config.options.opt = false + Config.options.defaults.opt = false local tests = { { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } }, { "foo/bar", dependencies = { { "foo/dep1" }, "foo/dep2" } }, @@ -52,7 +52,7 @@ describe("plugin spec opt", function() end) it("handles opt from dep", function() - Config.options.opt = false + Config.options.defaults.opt = false local spec = Plugin.Spec.new({ "foo/dep1", { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } } }) Config.plugins = spec.plugins Plugin.update_state() @@ -65,8 +65,25 @@ describe("plugin spec opt", function() assert(spec.plugins.dep1.opt == false) end) + it("handles defaults opt", function() + do + Config.options.defaults.opt = true + local spec = Plugin.Spec.new({ "foo/bar" }) + Config.plugins = spec.plugins + Plugin.update_state() + assert(spec.plugins.bar.opt == true) + end + do + Config.options.defaults.opt = false + local spec = Plugin.Spec.new({ "foo/bar" }) + Config.plugins = spec.plugins + Plugin.update_state() + assert(spec.plugins.bar.opt == false) + end + end) + it("handles opt from dep", function() - Config.options.opt = false + Config.options.defaults.opt = false local spec = Plugin.Spec.new({ "foo/bar", module = "foo" }) Config.plugins = spec.plugins Plugin.update_state() From b2339ade847d2ccf5e898edb7cca0bca20e635a3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:14:31 +0100 Subject: [PATCH 0016/1610] feat: config option for runner concurrency --- lua/lazy/core/config.lua | 1 + lua/lazy/manage/init.lua | 2 ++ lua/lazy/manage/runner.lua | 17 +++++++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 275d0fa..dc5cfaf 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -13,6 +13,7 @@ M.defaults = { packpath = vim.fn.stdpath("data") .. "/site/pack/lazy", -- package path where new plugins will be installed lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. install_missing = true, -- install missing plugins on startup. This doesn't increase startup time. + concurrency = nil, -- set to a number to limit the maximum amount of concurrent tasks git = { -- defaults for `Lazy log` -- log = { "-10" }, -- last 10 commits diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index fea68f2..06fb037 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -20,6 +20,8 @@ function M.run(ropts, opts) ropts.plugins = opts.plugins end + ropts.concurrency = ropts.concurrency or Config.options.concurrency + if opts.clear then M.clear() end diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 218cecd..125e7ce 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -5,6 +5,7 @@ local Util = require("lazy.util") ---@class RunnerOpts ---@field pipeline (string|{[1]:string, [string]:any})[] ---@field plugins? LazyPlugin[]|fun(plugin:LazyPlugin):any? +---@field concurrency? number ---@alias PipelineStep {task:string, opts?:TaskOptions} ---@alias LazyRunnerTask {co:thread, status: {task?:LazyTask, waiting?:boolean}} @@ -53,28 +54,31 @@ function Runner:_resume(entry) end function Runner:resume(waiting) - local running = false + local running = 0 for _, entry in ipairs(self._running) do if entry.status then if waiting and entry.status.waiting then entry.status.waiting = false end if not entry.status.waiting and self:_resume(entry) then - running = true + running = running + 1 + if self._opts.concurrency and running >= self._opts.concurrency then + break + end end end end - return running or (not waiting and self:resume(true)) + return running > 0 or (not waiting and self:resume(true)) end function Runner:start() for _, plugin in pairs(self._plugins) do local co = coroutine.create(self.run_pipeline) - local ok, status = coroutine.resume(co, self, plugin) + local ok, err = coroutine.resume(co, self, plugin) if ok then - table.insert(self._running, { co = co, status = status }) + table.insert(self._running, { co = co, status = {} }) else - Util.error("Could not start tasks for " .. plugin.name .. "\n" .. status) + Util.error("Could not start tasks for " .. plugin.name .. "\n" .. err) end end @@ -95,6 +99,7 @@ end ---@async ---@param plugin LazyPlugin function Runner:run_pipeline(plugin) + coroutine.yield() for _, step in ipairs(self._pipeline) do if step.task == "wait" then coroutine.yield({ waiting = true }) From 2eb11b1f695ab05861632e036adc621b3ae9dfa1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:15:14 +0100 Subject: [PATCH 0017/1610] docs: todo --- README.md | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5672a26..d63b6e7 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,13 @@ - [x] No need for compile - [x] Fast - [x] Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?) -- [ ] Import specs from Packer - [x] Config in multiple files - [x] Patterns for local packages - [x] Profiling - [x] lockfile - [x] upvalues in `config` & `init` - [x] check for updates -- [ ] package.lua -- [ ] package-lock.lua +- [x] lazy-lock.lua - [x] tag/version support `git tag --sort version:refname` - [x] auto-loading on completion for lazy-loaded commands - [x] bootstrap code @@ -27,6 +25,21 @@ - [ ] health checks: check merge conflicts async - [ ] allow setting up plugins through config +- [ ] task timeout +- [ ] log file +- [ ] deal with resourcing init.lua. Check a global? +- [x] incorrect when switching TN from opt to start +- [ ] git tests +- [x] max concurrency +- [x] ui border +- [ ] make sure we can reload specs while keeping state +- [ ] show disabled plugins (strikethrough?) +- [ ] Import specs from Packer +- [ ] use uv file watcher (or stat) to check for config changes +- [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) + - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` + - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range + - default semver merging strategy: if no version matches all, then use highest version? - [x] support for Plugin.lock - [x] defaults for git log - [x] view keybindings for update/clean/... @@ -35,7 +48,6 @@ - [x] show time taken for op in view - [ ] package meta index (package.lua cache for all packages) - [ ] auto lazy-loading of lua modules -- [ ] use uv file watcher to check for config changes - [x] clear errors - [x] add support for versions `git tag --sort v:refname` - [x] rename requires to dependencies @@ -44,7 +56,6 @@ - [x] dependencies imply opt for deps - [x] fix local plugin spec - [ ] investigate all opt=true. Simplifies logic (easily switch between opt/start afterwards) -- [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` ## 📦 Differences with Packer @@ -53,3 +64,11 @@ - `setup` => `init` - `requires` => `dependencies` - `as` => `name` + +## 📦 Other Neovim Plugin Managers in Lua + +- [packer.nvim](https://github.com/wbthomason/packer.nvim) +- [paq-nvim](https://github.com/savq/paq-nvim) +- [neopm](https://github.com/ii14/neopm) +- [dep](https://github.com/chiyadev/dep) +- [optpack.nvim](https://github.com/notomo/optpack.nvim) From f2072f01583c26dab86ca99424604be8d9102cc4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 30 Nov 2022 22:16:15 +0000 Subject: [PATCH 0018/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0fa76da..de693b8 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -7,6 +7,7 @@ Table of Contents *lazy.nvim-table-of-contents* - Features |lazy.nvim-features| - TODO |lazy.nvim-todo| - Differences with Packer |lazy.nvim-differences-with-packer| + - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| ============================================================================== 1. lazy.nvim *lazy.nvim-lazy.nvim* @@ -20,15 +21,13 @@ FEATURES *lazy.nvim-features* - No need for compile - Fast - Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?) -- Import specs from Packer - Config in multiple files - Patterns for local packages - Profiling - lockfile - upvalues in `config` & `init` - check for updates -- package.lua -- package-lock.lua +- lazy-lock.lua - tag/version support `git tag --sort version:refname` - auto-loading on completion for lazy-loaded commands - bootstrap code @@ -41,6 +40,21 @@ TODO *lazy.nvim-todo* - health checks: check merge conflicts async - allow setting up plugins through config +- task timeout +- log file +- deal with resourcing init.lua. Check a global? +- incorrect when switching TN from opt to start +- git tests +- max concurrency +- ui border +- make sure we can reload specs while keeping state +- show disabled plugins (strikethrough?) +- Import specs from Packer +- use uv file watcher (or stat) to check for config changes +- packspec + - add support to specify `engines`, `os` and `cpu` like in `package.json` + - semver merging. Should check if two or more semver ranges are compatible and calculate the union range + - default semver merging strategy: if no version matches all, then use highest version? - support for Plugin.lock - defaults for git log - view keybindings for update/clean/… @@ -49,7 +63,6 @@ TODO *lazy.nvim-todo* - show time taken for op in view - package meta index (package.lua cache for all packages) - auto lazy-loading of lua modules -- use uv file watcher to check for config changes - clear errors - add support for versions `git tag --sort v:refname` - rename requires to dependencies @@ -58,7 +71,6 @@ TODO *lazy.nvim-todo* - dependencies imply opt for deps - fix local plugin spec - investigate all opt=true. Simplifies logic (easily switch between opt/start afterwards) -- add support to specify `engines`, `os` and `cpu` like in `package.json` DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* @@ -70,6 +82,16 @@ DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* - `as` => `name` +OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-other-neovim-plugin-managers-in-lua* + + +- packer.nvim +- paq-nvim +- neopm +- dep +- optpack.nvim + + Generated by panvimdoc vim:tw=78:ts=8:noet:ft=help:norl: From bd2d64230fc0fe931fa480f4c6a61f507fbbd2ca Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:38:45 +0100 Subject: [PATCH 0019/1610] feat: added config option for process timeout --- README.md | 2 +- lua/lazy/core/config.lua | 1 + lua/lazy/manage/process.lua | 53 +++++++++++++++++++++++++++++-------- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index d63b6e7..5e60622 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ - [ ] health checks: check merge conflicts async - [ ] allow setting up plugins through config -- [ ] task timeout +- [x] task timeout - [ ] log file - [ ] deal with resourcing init.lua. Check a global? - [x] incorrect when switching TN from opt to start diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index dc5cfaf..85ac847 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -18,6 +18,7 @@ M.defaults = { -- defaults for `Lazy log` -- log = { "-10" }, -- last 10 commits log = { "--since=1 days ago" }, -- commits from the last 3 days + timeout = 120, -- processes taking over 2 minutes will be killed }, -- Any plugin spec that contains one of the patterns will use your -- local repo in the projects folder instead of fetchig it from github diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 1a45f91..9530178 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -1,37 +1,66 @@ +local Config = require("lazy.core.config") + local M = {} ----@alias ProcessOpts {args: string[], cwd?: string, on_line?:fun(string), on_exit?: fun(ok:boolean, output:string)} +---@diagnostic disable-next-line: no-unknown +local uv = vim.loop +---@class ProcessOpts +---@field args string[] +---@field cwd? string +---@field on_line? fun(string) +---@field on_exit? fun(ok:boolean, output:string) +---@field timeout? number + +---@param opts? ProcessOpts function M.spawn(cmd, opts) opts = opts or {} + opts.timeout = opts.timeout or (Config.options.git.timeout * 1000) + local env = { "GIT_TERMINAL_PROMPT=0", "GIT_SSH_COMMAND=ssh -oBatchMode=yes", } for key, value in - pairs(vim.loop.os_environ() --[[@as string[] ]]) + pairs(uv.os_environ() --[[@as string[] ]]) do table.insert(env, key .. "=" .. value) end - local stdout = vim.loop.new_pipe() - local stderr = vim.loop.new_pipe() + local stdout = uv.new_pipe() + local stderr = uv.new_pipe() local output = "" ---@type vim.loop.Process local handle = nil - handle = vim.loop.spawn(cmd, { + local timeout + local killed = false + if opts.timeout then + timeout = uv.new_timer() + timeout:start(opts.timeout, 0, function() + if handle and not handle:is_closing() then + killed = true + uv.process_kill(handle, "sigint") + end + end) + end + + handle = uv.spawn(cmd, { stdio = { nil, stdout, stderr }, args = opts.args, cwd = opts.cwd, env = env, - }, function(exit_code) + }, function(exit_code, signal) + if timeout then + timeout:stop() + timeout:close() + end handle:close() stdout:close() stderr:close() - local check = vim.loop.new_check() + local check = uv.new_check() check:start(function() if not stdout:is_closing() or not stderr:is_closing() then return @@ -39,9 +68,12 @@ function M.spawn(cmd, opts) check:stop() if opts.on_exit then output = output:gsub("[^\r\n]+\r", "") + if killed then + output = output .. "\n" .. "Process was killed because it reached the timeout" + end vim.schedule(function() - opts.on_exit(exit_code == 0, output) + opts.on_exit(exit_code == 0 and signal == 0, output) end) end end) @@ -51,7 +83,6 @@ function M.spawn(cmd, opts) if opts.on_exit then opts.on_exit(false, "Failed to spawn process " .. cmd .. " " .. vim.inspect(opts)) end - return end @@ -71,8 +102,8 @@ function M.spawn(cmd, opts) end end - vim.loop.read_start(stdout, on_output) - vim.loop.read_start(stderr, on_output) + uv.read_start(stdout, on_output) + uv.read_start(stderr, on_output) return handle end From c1a05a5f9b29fb13424a0fe8e981a7a8c95390f1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 30 Nov 2022 23:44:10 +0100 Subject: [PATCH 0020/1610] test: process config timeout can be nil --- lua/lazy/manage/process.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 9530178..633d12d 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -15,7 +15,7 @@ local uv = vim.loop ---@param opts? ProcessOpts function M.spawn(cmd, opts) opts = opts or {} - opts.timeout = opts.timeout or (Config.options.git.timeout * 1000) + opts.timeout = opts.timeout or (Config.options.git and Config.options.git.timeout * 1000) local env = { "GIT_TERMINAL_PROMPT=0", From ec4199bada3bcc9e790e85e0c0655de0b090a8fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 22:45:10 +0000 Subject: [PATCH 0021/1610] chore(main): release 1.2.0 --- CHANGELOG.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0767dd1..ca805a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +## [1.2.0](https://github.com/folke/lazy.nvim/compare/v1.1.0...v1.2.0) (2022-11-30) + + +### Features + +* added config option for process timeout ([bd2d642](https://github.com/folke/lazy.nvim/commit/bd2d64230fc0fe931fa480f4c6a61f507fbbd2ca)) +* allow config of default for version field ([fb96183](https://github.com/folke/lazy.nvim/commit/fb96183753bfc734b081fc5a2a3d5705376d9d20)) +* config for ui border ([0cff878](https://github.com/folke/lazy.nvim/commit/0cff878b2e1af134892184920fd8ae64d9f954c0)) +* config option for runner concurrency ([b2339ad](https://github.com/folke/lazy.nvim/commit/b2339ade847d2ccf5e898edb7cca0bca20e635a3)) +* config option for ui throttle ([a197f75](https://github.com/folke/lazy.nvim/commit/a197f751f97c1b050916a8453acba914569b7bb5)) +* config option install_missing=true ([9be3d3d](https://github.com/folke/lazy.nvim/commit/9be3d3d8409c6992cea5b2ffe0973fd6b4895dc6)) + + +### Bug Fixes + +* show proper installed/clean state for local plugins ([1e2f527](https://github.com/folke/lazy.nvim/commit/1e2f5273bb61b660dd93651c4fc44d2c8c21b905)) +* update state after running operation so the ui reflects any changes from cleaning ([0369278](https://github.com/folke/lazy.nvim/commit/03692781597b648fa3524e50c0de4bff405ba215)) + + +### Performance Improvements + +* merge module/cache and use ffi to pack cache data ([e1c08d6](https://github.com/folke/lazy.nvim/commit/e1c08d64b387c59343c21a6f0397b88d5b4a3acc)) +* removed partial spec caching. not worth the tiny performance boost ([4438faf](https://github.com/folke/lazy.nvim/commit/4438faf9a9a72c95d88c620804db99fa44485ec9)) +* run cache autosave after loading ([3ec5a2c](https://github.com/folke/lazy.nvim/commit/3ec5a2ce4c99202dfa76970bbaa36bfa05230cb5)) + ## [1.1.0](https://github.com/folke/lazy.nvim/compare/v1.0.0...v1.1.0) (2022-11-29) From 042aaa4f87c6576a369cbecd86aceefb96add228 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 07:43:28 +0100 Subject: [PATCH 0022/1610] feat!: renamed Plugin.run => Plugin.build --- README.md | 4 +++- lua/lazy/core/plugin.lua | 2 +- lua/lazy/manage/init.lua | 4 ++-- lua/lazy/manage/task/plugin.lua | 18 +++++++++--------- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 5e60622..a5fa4c4 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,12 @@ ## ✅ TODO - [ ] health checks: check merge conflicts async + - [ ] unsupported props or props from other managers +- [x] rename `run` to `build` - [ ] allow setting up plugins through config - [x] task timeout - [ ] log file -- [ ] deal with resourcing init.lua. Check a global? +- [ ] deal with re-sourcing init.lua. Check a global? - [x] incorrect when switching TN from opt to start - [ ] git tests - [x] max concurrency diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 1436f99..3d3c958 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -8,7 +8,7 @@ local M = {} ---@class LazyPluginHooks ---@field init? fun(LazyPlugin) Will always be run ---@field config? fun(LazyPlugin) Will be executed when loading the plugin ----@field run? string|fun() +---@field build? string|fun(LazyPlugin) ---@class LazyPluginState ---@field loaded? {[string]:string, time:number} diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 06fb037..ce8c169 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -59,7 +59,7 @@ function M.install(opts) "git.checkout", "plugin.docs", "wait", - "plugin.run", + "plugin.build", }, plugins = function(plugin) return plugin.uri and not plugin._.installed @@ -78,7 +78,7 @@ function M.update(opts) { "git.checkout", lockfile = opts.lockfile }, "plugin.docs", "wait", - "plugin.run", + "plugin.build", { "git.log", updated = true }, }, plugins = function(plugin) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 1042624..16adc45 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -4,22 +4,22 @@ local Loader = require("lazy.core.loader") ---@type table local M = {} -M.run = { +M.build = { skip = function(plugin) - return not (plugin._.dirty and (plugin.opt == false or plugin.run)) + return not (plugin._.dirty and (plugin.opt == false or plugin.build)) end, run = function(self) Loader.load(self.plugin, { task = "run" }, { load_start = true }) - local run = self.plugin.run - if run then - if type(run) == "string" and run:sub(1, 1) == ":" then - local cmd = vim.api.nvim_parse_cmd(run:sub(2), {}) + local build = self.plugin.build + if build then + if type(build) == "string" and build:sub(1, 1) == ":" then + local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) self.output = vim.api.nvim_cmd(cmd, { output = true }) - elseif type(run) == "function" then - run() + elseif type(build) == "function" then + build() else - local args = vim.split(run, "%s+") + local args = vim.split(build, "%s+") return self:spawn(table.remove(args, 1), { args = args, cwd = self.plugin.dir, From 2d676b35d272933f3bd776d5915b8aa5a8188cb2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 Dec 2022 06:44:31 +0000 Subject: [PATCH 0023/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index de693b8..a22c6d7 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 November 30 +*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 01 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -39,10 +39,12 @@ TODO *lazy.nvim-todo* - health checks: check merge conflicts async + - unsupported props or props from other managers +- rename `run` to `build` - allow setting up plugins through config - task timeout - log file -- deal with resourcing init.lua. Check a global? +- deal with re-sourcing init.lua. Check a global? - incorrect when switching TN from opt to start - git tests - max concurrency From 44b6e54dcb1b183b52e5cd996796a21ac45ddc83 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 08:38:18 +0100 Subject: [PATCH 0024/1610] build: added selene --- selene.toml | 1 + vim.toml | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 selene.toml create mode 100644 vim.toml diff --git a/selene.toml b/selene.toml new file mode 100644 index 0000000..7312a91 --- /dev/null +++ b/selene.toml @@ -0,0 +1 @@ +std="vim" diff --git a/vim.toml b/vim.toml new file mode 100644 index 0000000..576760a --- /dev/null +++ b/vim.toml @@ -0,0 +1,46 @@ +[selene] +base = "lua51" +name = "vim" + +[vim] +any = true + +[[describe.args]] +type = "string" +[[describe.args]] +type = "function" + +[[it.args]] +type = "string" +[[it.args]] +type = "function" + +[[before_each.args]] +type = "function" +[[after_each.args]] +type = "function" + +[assert.is_not] +any = true + +[[assert.equals.args]] +type = "any" +[[assert.equals.args]] +type = "any" +[[assert.equals.args]] +type = "any" +required = false + +[[assert.same.args]] +type = "any" +[[assert.same.args]] +type = "any" + +[[assert.truthy.args]] +type = "any" + +[[assert.spy.args]] +type = "any" + +[[assert.stub.args]] +type = "any" From 5e0662727d34ff5f66ce0c1798d0a7cd3163e90a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 08:40:17 +0100 Subject: [PATCH 0025/1610] style: fixed some selene errors/warnings --- lua/lazy/core/plugin.lua | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 3d3c958..9b933f2 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -67,9 +67,7 @@ function Spec:add(plugin, is_dep) local c = pkg:sub(1, 1) if c == "~" then plugin.uri = vim.loop.os_getenv("HOME") .. pkg:sub(2) - elseif c == "/" then - plugin.uri = pkg - elseif pkg:sub(1, 4) == "http" or pkg:sub(1, 3) == "ssh" then + elseif c == "/" or pkg:sub(1, 4) == "http" or pkg:sub(1, 3) == "ssh" then plugin.uri = pkg else plugin.uri = ("https://github.com/" .. pkg .. ".git") @@ -202,8 +200,7 @@ function M.spec() local function _load(name, modpath) local modname = Config.options.plugins .. (name and ("." .. name) or "") Util.try(function() - local mod = Module.load(modname, modpath) - spec:normalize(assert(mod)) + spec:normalize(Module.load(modname, modpath)) end, "Failed to load **" .. modname .. "**") end From 5134e797f34792e34e86fe82a72cdf765ca2e284 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 11:06:44 +0100 Subject: [PATCH 0026/1610] feat!: all plugins are now opt. Plugin.opt => Plugin.lazy --- lua/lazy/core/config.lua | 2 +- lua/lazy/core/loader.lua | 24 ++++++------- lua/lazy/core/module.lua | 1 - lua/lazy/core/plugin.lua | 60 +++++++++++++++------------------ lua/lazy/init.lua | 5 ++- lua/lazy/manage/task/plugin.lua | 4 +-- tests/core/plugin_spec.lua | 28 +++++++-------- 7 files changed, 57 insertions(+), 67 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 85ac847..17ab65e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -6,7 +6,7 @@ local M = {} M.defaults = { plugins = "config.plugins", defaults = { - opt = false, -- should plugins default to "opt" or "start" + lazy = false, -- should plugins be loaded at startup? version = nil, -- version = "*", -- enable this to try installing the latest stable versions of plugins }, diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 093692c..4bd29a0 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -6,6 +6,11 @@ local M = {} ---@type LazyPlugin[] M.loading = {} +function M.setup() + local Handler = require("lazy.core.handler") + Handler.setup() +end + function M.init_plugins() Util.track("plugin_init") for _, plugin in pairs(Config.plugins) do @@ -14,7 +19,7 @@ function M.init_plugins() Util.try(plugin.init, "Failed to run `init` for **" .. plugin.name .. "**") Util.track() end - if plugin.opt == false then + if plugin.lazy == false then M.load(plugin, { start = "start" }) end end @@ -24,8 +29,7 @@ end ---@class Loader ---@param plugins string|LazyPlugin|string[]|LazyPlugin[] ---@param reason {[string]:string} ----@param opts? {load_start: boolean} -function M.load(plugins, reason, opts) +function M.load(plugins, reason) ---@diagnostic disable-next-line: cast-local-type plugins = type(plugins) == "string" or plugins.name and { plugins } or plugins ---@cast plugins (string|LazyPlugin)[] @@ -47,7 +51,7 @@ function M.load(plugins, reason, opts) table.insert(M.loading, plugin) Util.track({ plugin = plugin.name, start = reason.start }) - M.packadd(plugin, opts and opts.load_start) + M.packadd(plugin) if plugin.dependencies then M.load(plugin.dependencies, {}) @@ -67,15 +71,9 @@ function M.load(plugins, reason, opts) end ---@param plugin LazyPlugin -function M.packadd(plugin, load_start) - if plugin.opt then - vim.cmd.packadd(plugin.name) - M.source_runtime(plugin, "/after/plugin") - elseif load_start then - vim.opt.runtimepath:append(plugin.dir) - M.source_runtime(plugin, "/plugin") - M.source_runtime(plugin, "/after/plugin") - end +function M.packadd(plugin) + vim.cmd.packadd(plugin.name) + M.source_runtime(plugin, "/after/plugin") end ---@param plugin LazyPlugin diff --git a/lua/lazy/core/module.lua b/lua/lazy/core/module.lua index 674eb57..82eff95 100644 --- a/lua/lazy/core/module.lua +++ b/lua/lazy/core/module.lua @@ -70,7 +70,6 @@ end function M.save_cache() local f = assert(uv.fs_open(cache_path, "w", 438)) - vim.loop.fs_ftruncate(f, 0) for modname, entry in pairs(M.cache) do if entry.used then entry.modname = modname diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 9b933f2..986a28b 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -34,7 +34,7 @@ local M = {} ---@field dir string ---@field dep? boolean True if this plugin is only in the spec as a dependency ---@field enabled? boolean|(fun():boolean) ----@field opt? boolean +---@field lazy? boolean ---@field dependencies? string[] ---@field _ LazyPluginState @@ -145,52 +145,46 @@ function Spec:merge(old, new) end function M.update_state() - ---@type table<"opt"|"start", table> - local installed = { opt = {}, start = {} } - for opt, packs in pairs(installed) do - Util.ls(Config.options.packpath .. "/" .. opt, function(_, name, type) - if type == "directory" or type == "link" then - packs[name] = type - end - end) - end + ---@type table + local installed = {} + Util.ls(Config.options.packpath .. "/opt", function(_, name, type) + if type == "directory" or type == "link" then + installed[name] = type + end + end) for _, plugin in pairs(Config.plugins) do plugin._ = plugin._ or {} - if plugin.opt == nil then - local opt = plugin.dep - or Config.options.defaults.opt + if plugin.lazy == nil then + local lazy = plugin.dep + or Config.options.defaults.lazy or plugin.module or plugin.event or plugin.keys or plugin.ft or plugin.cmd - plugin.opt = opt and true or false + plugin.lazy = lazy and true or false end - local opt = plugin.opt and "opt" or "start" - plugin.dir = Config.options.packpath .. "/" .. opt .. "/" .. plugin.name + plugin.dir = Config.options.packpath .. "/opt/" .. plugin.name plugin._.is_local = plugin.uri:sub(1, 4) ~= "http" and plugin.uri:sub(1, 3) ~= "git" - plugin._.is_symlink = installed[opt][plugin.name] == "link" - plugin._.installed = installed[opt][plugin.name] ~= nil + plugin._.is_symlink = installed[plugin.name] == "link" + plugin._.installed = installed[plugin.name] ~= nil if plugin._.is_local == plugin._.is_symlink then - installed[opt][plugin.name] = nil + installed[plugin.name] = nil end end Config.to_clean = {} - for opt, packs in pairs(installed) do - for pack, dir_type in pairs(packs) do - table.insert(Config.to_clean, { - name = pack, - dir = Config.options.packpath .. "/" .. opt .. "/" .. pack, - opt = opt == "opt", - _ = { - installed = true, - is_symlink = dir_type == "link", - is_local = dir_type == "link", - }, - }) - end + for pack, dir_type in pairs(installed) do + table.insert(Config.to_clean, { + name = pack, + dir = Config.options.packpath .. "/opt/" .. pack, + _ = { + installed = true, + is_symlink = dir_type == "link", + is_local = dir_type == "link", + }, + }) end end @@ -214,7 +208,7 @@ function M.load() Util.track("spec") local spec = M.spec() if not spec.plugins["lazy.nvim"] then - spec:add({ "folke/lazy.nvim", opt = false }) + spec:add({ "folke/lazy.nvim", lazy = false }) end Config.plugins = spec.plugins Util.track() diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 955fd55..095e469 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -7,7 +7,6 @@ function M.setup(opts) local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") - local Handler = require("lazy.core.handler") local Plugin = require("lazy.core.plugin") Util.track("module", vim.loop.hrtime() - module_start) @@ -32,8 +31,8 @@ function M.setup(opts) Util.track() end - Util.track("handlers") - Handler.setup() + Util.track("loader") + Loader.setup() Util.track() local lazy_delta = vim.loop.hrtime() - module_start diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 16adc45..329d75c 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -6,10 +6,10 @@ local M = {} M.build = { skip = function(plugin) - return not (plugin._.dirty and (plugin.opt == false or plugin.build)) + return not (plugin._.dirty and plugin.build) end, run = function(self) - Loader.load(self.plugin, { task = "run" }, { load_start = true }) + Loader.load(self.plugin, { task = "build" }) local build = self.plugin.build if build then diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 950a597..07b7ac7 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -30,7 +30,7 @@ end) describe("plugin spec opt", function() it("handles dependencies", function() - Config.options.defaults.opt = false + Config.options.defaults.lazy = false local tests = { { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } }, { "foo/bar", dependencies = { { "foo/dep1" }, "foo/dep2" } }, @@ -43,53 +43,53 @@ describe("plugin spec opt", function() assert(vim.tbl_count(spec.plugins) == 3) assert(#spec.plugins.bar.dependencies == 2) assert(spec.plugins.bar.dep ~= true) - assert(spec.plugins.bar.opt == false) + assert(spec.plugins.bar.lazy == false) assert(spec.plugins.dep1.dep == true) - assert(spec.plugins.dep1.opt == true) + assert(spec.plugins.dep1.lazy == true) assert(spec.plugins.dep2.dep == true) - assert(spec.plugins.dep2.opt == true) + assert(spec.plugins.dep2.lazy == true) end end) it("handles opt from dep", function() - Config.options.defaults.opt = false + Config.options.defaults.lazy = false local spec = Plugin.Spec.new({ "foo/dep1", { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } } }) Config.plugins = spec.plugins Plugin.update_state() assert.same(3, vim.tbl_count(spec.plugins)) assert(spec.plugins.bar.dep ~= true) - assert(spec.plugins.bar.opt == false) + assert(spec.plugins.bar.lazy == false) assert(spec.plugins.dep2.dep == true) - assert(spec.plugins.dep2.opt == true) + assert(spec.plugins.dep2.lazy == true) assert(spec.plugins.dep1.dep ~= true) - assert(spec.plugins.dep1.opt == false) + assert(spec.plugins.dep1.lazy == false) end) it("handles defaults opt", function() do - Config.options.defaults.opt = true + Config.options.defaults.lazy = true local spec = Plugin.Spec.new({ "foo/bar" }) Config.plugins = spec.plugins Plugin.update_state() - assert(spec.plugins.bar.opt == true) + assert(spec.plugins.bar.lazy == true) end do - Config.options.defaults.opt = false + Config.options.defaults.lazy = false local spec = Plugin.Spec.new({ "foo/bar" }) Config.plugins = spec.plugins Plugin.update_state() - assert(spec.plugins.bar.opt == false) + assert(spec.plugins.bar.lazy == false) end end) it("handles opt from dep", function() - Config.options.defaults.opt = false + Config.options.defaults.lazy = false local spec = Plugin.Spec.new({ "foo/bar", module = "foo" }) Config.plugins = spec.plugins Plugin.update_state() assert.same(1, vim.tbl_count(spec.plugins)) assert(spec.plugins.bar.dep ~= true) - assert(spec.plugins.bar.opt == true) + assert(spec.plugins.bar.lazy == true) end) it("merges lazy loaders", function() From 4653119625fa8e8c647f6c0ff0b0b57ee81521b8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 11:23:34 +0100 Subject: [PATCH 0027/1610] perf: reset packpath to only include the lazy package. Improved my startup time by 2ms --- lua/lazy/core/config.lua | 13 ++++++++++++- lua/lazy/core/plugin.lua | 6 +++--- lua/lazy/core/util.lua | 4 ++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 17ab65e..c992791 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -10,7 +10,6 @@ M.defaults = { version = nil, -- version = "*", -- enable this to try installing the latest stable versions of plugins }, - packpath = vim.fn.stdpath("data") .. "/site/pack/lazy", -- package path where new plugins will be installed lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. install_missing = true, -- install missing plugins on startup. This doesn't increase startup time. concurrency = nil, -- set to a number to limit the maximum amount of concurrent tasks @@ -20,6 +19,11 @@ M.defaults = { log = { "--since=1 days ago" }, -- commits from the last 3 days timeout = 120, -- processes taking over 2 minutes will be killed }, + package = { + path = vim.fn.stdpath("data") .. "/site", + name = "lazy", -- plugins will be installed under package.path/pack/{name}/opt + reset = true, -- packpath will be reset to only include lazy. This makes packadd a lot faster + }, -- Any plugin spec that contains one of the patterns will use your -- local repo in the projects folder instead of fetchig it from github -- Mostly useful for plugin developers. @@ -49,6 +53,8 @@ M.defaults = { M.ns = vim.api.nvim_create_namespace("lazy") M.paths = { + ---@type string + opt = nil, ---@type string main = nil, ---@type string @@ -69,6 +75,11 @@ function M.setup(opts) M.options = vim.tbl_deep_extend("force", M.defaults, opts or {}) M.paths.plugins = vim.fn.stdpath("config") .. "/lua/" .. M.options.plugins:gsub("%.", "/") M.paths.main = M.paths.plugins .. (vim.loop.fs_stat(M.paths.plugins .. ".lua") and ".lua" or "/init.lua") + M.paths.opt = M.options.package.path .. "/pack/" .. M.options.package.name .. "/opt" + + if M.options.package.reset then + vim.go.packpath = M.options.package.path + end vim.api.nvim_create_autocmd("User", { pattern = "VeryLazy", diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 986a28b..a6f91a5 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -147,7 +147,7 @@ end function M.update_state() ---@type table local installed = {} - Util.ls(Config.options.packpath .. "/opt", function(_, name, type) + Util.ls(Config.paths.opt, function(_, name, type) if type == "directory" or type == "link" then installed[name] = type end @@ -165,7 +165,7 @@ function M.update_state() or plugin.cmd plugin.lazy = lazy and true or false end - plugin.dir = Config.options.packpath .. "/opt/" .. plugin.name + plugin.dir = Config.paths.opt .. "/" .. plugin.name plugin._.is_local = plugin.uri:sub(1, 4) ~= "http" and plugin.uri:sub(1, 3) ~= "git" plugin._.is_symlink = installed[plugin.name] == "link" plugin._.installed = installed[plugin.name] ~= nil @@ -178,7 +178,7 @@ function M.update_state() for pack, dir_type in pairs(installed) do table.insert(Config.to_clean, { name = pack, - dir = Config.options.packpath .. "/opt/" .. pack, + dir = Config.paths.opt .. "/" .. pack, _ = { installed = true, is_symlink = dir_type == "link", diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 8ead048..22b355d 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -40,8 +40,8 @@ function M.try(fn, msg) end if info.what == "Lua" and not info.source:find("lazy.nvim") then local source = info.source:sub(2) - if source:find(Config.options.packpath, 1, true) == 1 then - source = source:sub(#Config.options.packpath + 1):gsub("^/opt/", ""):gsub("^/start/", "") + if source:find(Config.paths.opt, 1, true) == 1 then + source = source:sub(#Config.paths.opt + 1) end source = vim.fn.fnamemodify(source, ":p:~:.") local line = " - " .. source .. ":" .. info.currentline From 0dbf72f67ef274b2e0836efcf7f2d17bb8abae40 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 11:32:52 +0100 Subject: [PATCH 0028/1610] docs: opt => lazy --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a5fa4c4..f5f9f45 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ - `setup` => `init` - `requires` => `dependencies` - `as` => `name` + - `opt` => `lazy` ## 📦 Other Neovim Plugin Managers in Lua From f0894be69d1392574f8db50fe2059c637bdebfc2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 Dec 2022 10:33:48 +0000 Subject: [PATCH 0029/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a22c6d7..8443a5e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -82,6 +82,7 @@ DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* - `setup` => `init` - `requires` => `dependencies` - `as` => `name` + - `opt` => `lazy` OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-other-neovim-plugin-managers-in-lua* From af8b8e128e20f9fa30077bedf8bcee40b779c533 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 13:33:55 +0100 Subject: [PATCH 0030/1610] feat: lazy setup with either a plugins module, or a plugins spec --- README.md | 4 +++- lua/lazy/core/config.lua | 22 +++++++++------------- lua/lazy/core/handler.lua | 1 + lua/lazy/core/loader.lua | 16 ++++++++++++++++ lua/lazy/core/plugin.lua | 30 +++++++++++++++++++----------- lua/lazy/core/util.lua | 4 ++-- lua/lazy/init.lua | 17 +++-------------- lua/lazy/view/render.lua | 13 +------------ 8 files changed, 54 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index f5f9f45..b5969cc 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,8 @@ - [ ] health checks: check merge conflicts async - [ ] unsupported props or props from other managers - [x] rename `run` to `build` -- [ ] allow setting up plugins through config +- [ ] delete lazy keymaps when a plugin loads +- [x] allow setting up plugins through config - [x] task timeout - [ ] log file - [ ] deal with re-sourcing init.lua. Check a global? @@ -67,6 +68,7 @@ - `requires` => `dependencies` - `as` => `name` - `opt` => `lazy` + - `run` => `build` ## 📦 Other Neovim Plugin Managers in Lua diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c992791..05bb89b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -4,7 +4,6 @@ local M = {} ---@class LazyConfig M.defaults = { - plugins = "config.plugins", defaults = { lazy = false, -- should plugins be loaded at startup? version = nil, @@ -52,14 +51,11 @@ M.defaults = { M.ns = vim.api.nvim_create_namespace("lazy") -M.paths = { - ---@type string - opt = nil, - ---@type string - main = nil, - ---@type string - plugins = nil, -} +---@type string|LazySpec Should be either a string pointing to a module, or a spec +M.spec = nil + +---@type string Opt directory where plugins will be installed +M.root = nil ---@type table M.plugins = {} @@ -70,12 +66,12 @@ M.to_clean = {} ---@type LazyConfig M.options = {} +---@param spec LazySpec ---@param opts? LazyConfig -function M.setup(opts) +function M.setup(spec, opts) + M.spec = spec M.options = vim.tbl_deep_extend("force", M.defaults, opts or {}) - M.paths.plugins = vim.fn.stdpath("config") .. "/lua/" .. M.options.plugins:gsub("%.", "/") - M.paths.main = M.paths.plugins .. (vim.loop.fs_stat(M.paths.plugins .. ".lua") and ".lua" or "/init.lua") - M.paths.opt = M.options.package.path .. "/pack/" .. M.options.package.name .. "/opt" + M.root = M.options.package.path .. "/pack/" .. M.options.package.name .. "/opt" if M.options.package.reset then vim.go.packpath = M.options.package.path diff --git a/lua/lazy/core/handler.lua b/lua/lazy/core/handler.lua index fb20810..b65e3ba 100644 --- a/lua/lazy/core/handler.lua +++ b/lua/lazy/core/handler.lua @@ -127,6 +127,7 @@ function M.handlers.module(grouped) if plugins then grouped[name] = nil local reason = { require = modname } + -- almost never happens, so this does not decrease performance if #Loader.loading == 0 then local f = 3 while not reason.source do diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 4bd29a0..3dcd2fb 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -7,8 +7,24 @@ local M = {} M.loading = {} function M.setup() + -- install missing plugins + if Config.options.install_missing then + Util.track("install") + for _, plugin in pairs(Config.plugins) do + if not plugin._.installed then + vim.cmd("do User LazyInstallPre") + require("lazy.manage").install({ wait = true }) + break + end + end + Util.track() + end + + -- setup handlers + Util.track("handlers") local Handler = require("lazy.core.handler") Handler.setup() + Util.track() end function M.init_plugins() diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index a6f91a5..f4ea888 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -147,7 +147,7 @@ end function M.update_state() ---@type table local installed = {} - Util.ls(Config.paths.opt, function(_, name, type) + Util.ls(Config.root, function(_, name, type) if type == "directory" or type == "link" then installed[name] = type end @@ -165,7 +165,7 @@ function M.update_state() or plugin.cmd plugin.lazy = lazy and true or false end - plugin.dir = Config.paths.opt .. "/" .. plugin.name + plugin.dir = Config.root .. "/" .. plugin.name plugin._.is_local = plugin.uri:sub(1, 4) ~= "http" and plugin.uri:sub(1, 3) ~= "git" plugin._.is_symlink = installed[plugin.name] == "link" plugin._.installed = installed[plugin.name] ~= nil @@ -178,7 +178,7 @@ function M.update_state() for pack, dir_type in pairs(installed) do table.insert(Config.to_clean, { name = pack, - dir = Config.paths.opt .. "/" .. pack, + dir = Config.root .. "/" .. pack, _ = { installed = true, is_symlink = dir_type == "link", @@ -191,15 +191,23 @@ end function M.spec() local spec = Spec.new() - local function _load(name, modpath) - local modname = Config.options.plugins .. (name and ("." .. name) or "") - Util.try(function() - spec:normalize(Module.load(modname, modpath)) - end, "Failed to load **" .. modname .. "**") - end + if type(Config.spec) == "string" then + -- spec is a module + local function _load(name, modpath) + local modname = Config.spec .. (name and ("." .. name) or "") + Util.try(function() + spec:normalize(Module.load(modname, modpath)) + end, "Failed to load **" .. modname .. "**") + end + local path_plugins = vim.fn.stdpath("config") .. "/lua/" .. Config.spec:gsub("%.", "/") + local path_main = path_plugins .. (vim.loop.fs_stat(path_plugins .. ".lua") and ".lua" or "/init.lua") - _load(nil, Config.paths.main) - Util.lsmod(Config.paths.plugins, _load) + _load(nil, path_main) + Util.lsmod(path_plugins, _load) + else + -- spec is a spec + spec:normalize(Config.spec) + end return spec end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 22b355d..adaaf6c 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -40,8 +40,8 @@ function M.try(fn, msg) end if info.what == "Lua" and not info.source:find("lazy.nvim") then local source = info.source:sub(2) - if source:find(Config.paths.opt, 1, true) == 1 then - source = source:sub(#Config.paths.opt + 1) + if source:find(Config.root, 1, true) == 1 then + source = source:sub(#Config.root + 1) end source = vim.fn.fnamemodify(source, ":p:~:.") local line = " - " .. source .. ":" .. info.currentline diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 095e469..80cf749 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -1,7 +1,8 @@ local M = {} +---@param spec LazySpec Should be a module name to load, or a plugin spec ---@param opts? LazyConfig -function M.setup(opts) +function M.setup(spec, opts) local module_start = vim.loop.hrtime() require("lazy.core.module").setup() local Util = require("lazy.core.util") @@ -14,23 +15,11 @@ function M.setup(opts) Util.track("setup") Util.track("config") - Config.setup(opts) + Config.setup(spec, opts) Util.track() Plugin.load() - if Config.options.install_missing then - Util.track("install") - for _, plugin in pairs(Config.plugins) do - if not plugin._.installed then - vim.cmd("do User LazyInstallPre") - require("lazy.manage").install({ wait = true }) - break - end - end - Util.track() - end - Util.track("loader") Loader.setup() Util.track() diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 4a3b7df..1f8fab5 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -193,25 +193,14 @@ function M:reason(reason, opts) ---@type string? local source = reason.source if source then - ---@type string? - local modname = source:match("/lua/(.*)%.lua$") - if modname then - modname = modname:gsub("/", ".") - end local name = source:match("/([^/]-)/lua") for _, other in pairs(Config.plugins) do - if (modname and other.modname == modname) or (name and other.name == name) then + if name and other.name == name then reason.plugin = other.name reason.source = nil break end end - if reason.source then - reason.source = modname or reason.source - if reason.source == "lua" then - reason.source = Config.options.plugins - end - end end local time = " " .. math.floor((reason.time or 0) / 1e6 * 100) / 100 .. "ms" if not opts.time_right then From 64af691be3ebf278c35edd6aa15fe1874a3ea6e2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 Dec 2022 12:34:59 +0000 Subject: [PATCH 0031/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 8443a5e..189087a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -41,6 +41,7 @@ TODO *lazy.nvim-todo* - health checks: check merge conflicts async - unsupported props or props from other managers - rename `run` to `build` +- delete lazy keymaps when a plugin loads - allow setting up plugins through config - task timeout - log file @@ -83,6 +84,7 @@ DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* - `requires` => `dependencies` - `as` => `name` - `opt` => `lazy` + - `run` => `build` OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-other-neovim-plugin-managers-in-lua* From 041a716f4e5291d6947c5f96b21a2c4db0aef6e3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 13:56:41 +0100 Subject: [PATCH 0032/1610] feat: show module source if loading source is under config --- lua/lazy/view/render.lua | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 1f8fab5..2669836 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -16,9 +16,7 @@ local Text = require("lazy.view.text") ---@field _diagnostics LazyDiagnostic[] ---@field plugin_range table ---@field _details? string -local M = setmetatable({}, { - __index = Text, -}) +local M = setmetatable({}, { __index = Text }) function M.new(buf, win, padding) local self = setmetatable({}, { __index = M }) @@ -201,6 +199,16 @@ function M:reason(reason, opts) break end end + if reason.source then + source = vim.loop.fs_realpath(source) or source + local config = vim.loop.fs_realpath(vim.fn.stdpath("config") .. "/lua") + if source:find(config, 1, true) == 1 then + reason.source = source:sub(#config + 2):gsub("/", "."):gsub("%.lua$", "") + if reason.source == "lua" then + reason.source = "init.lua" + end + end + end end local time = " " .. math.floor((reason.time or 0) / 1e6 * 100) / 100 .. "ms" if not opts.time_right then From 5eb2622a4e4e52bed94b5c8ae48b83ccfab0098d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 14:13:40 +0100 Subject: [PATCH 0033/1610] fix: prepend package path to packpath if package.reset=false --- lua/lazy/core/config.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 05bb89b..7b5e48b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -75,6 +75,8 @@ function M.setup(spec, opts) if M.options.package.reset then vim.go.packpath = M.options.package.path + else + vim.opt.packpath:prepend(M.options.package.path) end vim.api.nvim_create_autocmd("User", { From 714bc0a136cd72730e1c457556fbe004a22db6b7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 16:27:52 +0100 Subject: [PATCH 0034/1610] feat(ui): improvements to profiling and rendering of loaded reasons --- lua/lazy/core/config.lua | 1 + lua/lazy/core/loader.lua | 6 +++--- lua/lazy/core/plugin.lua | 2 +- lua/lazy/init.lua | 13 ++++++------- lua/lazy/view/render.lua | 11 ++++++++++- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 7b5e48b..de04c3c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -36,6 +36,7 @@ M.defaults = { border = "none", icons = { start = "", + init = " ", plugin = " ", source = " ", config = "", diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 3dcd2fb..77f2989 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -28,15 +28,15 @@ function M.setup() end function M.init_plugins() - Util.track("plugin_init") + Util.track({ start = "init" }) for _, plugin in pairs(Config.plugins) do if plugin.init then - Util.track({ plugin = plugin.name, start = "init" }) + Util.track({ plugin = plugin.name, init = "init" }) Util.try(plugin.init, "Failed to run `init` for **" .. plugin.name .. "**") Util.track() end if plugin.lazy == false then - M.load(plugin, { start = "start" }) + M.load(plugin, { start = "startup" }) end end Util.track() diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f4ea888..0ecedfa 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -11,7 +11,7 @@ local M = {} ---@field build? string|fun(LazyPlugin) ---@class LazyPluginState ----@field loaded? {[string]:string, time:number} +---@field loaded? {[string]:string}|{time:number} ---@field installed boolean ---@field tasks? LazyTask[] ---@field dirty? boolean diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 80cf749..60cf1ae 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -3,17 +3,16 @@ local M = {} ---@param spec LazySpec Should be a module name to load, or a plugin spec ---@param opts? LazyConfig function M.setup(spec, opts) - local module_start = vim.loop.hrtime() + local start = vim.loop.hrtime() require("lazy.core.module").setup() local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") local Plugin = require("lazy.core.plugin") - Util.track("module", vim.loop.hrtime() - module_start) - - Util.track("setup") + Util.track({ plugin = "lazy.nvim" }) + Util.track("module", vim.loop.hrtime() - start) Util.track("config") Config.setup(spec, opts) Util.track() @@ -24,14 +23,14 @@ function M.setup(spec, opts) Loader.setup() Util.track() - local lazy_delta = vim.loop.hrtime() - module_start + local delta = vim.loop.hrtime() - start - Util.track() -- end setup + Util.track().time = delta -- end setup Loader.init_plugins() if Config.plugins["lazy.nvim"] then - Config.plugins["lazy.nvim"]._.loaded.time = lazy_delta + Config.plugins["lazy.nvim"]._.loaded = { time = delta, source = "init.lua" } end vim.cmd("do User LazyDone") diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 2669836..dffbd96 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -217,7 +217,16 @@ function M:reason(reason, opts) self:append(" ") -- self:append(" (", "Conceal") local first = true - for key, value in pairs(reason) do + local keys = vim.tbl_keys(reason) + table.sort(keys) + if vim.tbl_contains(keys, "plugin") then + keys = vim.tbl_filter(function(key) + return key ~= "plugin" + end, keys) + table.insert(keys, "plugin") + end + for _, key in ipairs(keys) do + local value = reason[key] if type(key) == "number" then elseif key == "require" then -- self:append("require", "@function.builtin") From d46bc7795c255f121d2d279764017c7d60edff88 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 16:28:25 +0100 Subject: [PATCH 0035/1610] fix: always overwrite any plugin spec for lazy.nvim to manage itself --- lua/lazy/core/plugin.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 0ecedfa..83975cb 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -215,9 +215,11 @@ function M.load() -- load specs Util.track("spec") local spec = M.spec() - if not spec.plugins["lazy.nvim"] then - spec:add({ "folke/lazy.nvim", lazy = false }) - end + + -- add ourselves + spec.plugins["lazy.nvim"] = nil + spec:add({ "folke/lazy.nvim", lazy = true }) + Config.plugins = spec.plugins Util.track() From ac9e5401dcc2d3242b61a7b12638c11080e37ea3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 16:28:54 +0100 Subject: [PATCH 0036/1610] test: test XDG paths for tests and added a test that checks if they are setup correctly --- tests/core/init_spec.lua | 7 +++++++ tests/init.lua | 4 ++++ 2 files changed, 11 insertions(+) create mode 100644 tests/core/init_spec.lua diff --git a/tests/core/init_spec.lua b/tests/core/init_spec.lua new file mode 100644 index 0000000..3a1b4c7 --- /dev/null +++ b/tests/core/init_spec.lua @@ -0,0 +1,7 @@ +describe("init", function() + it("has correct environment for tests", function() + for _, path in ipairs({ "config", "data", "cache", "state" }) do + assert(vim.fn.stdpath(path):find(".tests/" .. path)) + end + end) +end) diff --git a/tests/init.lua b/tests/init.lua index b5a94e8..a72b101 100644 --- a/tests/init.lua +++ b/tests/init.lua @@ -27,6 +27,10 @@ function M.setup() vim.opt.runtimepath:append(M.root()) vim.opt.packpath = { M.root(".tests/site") } M.load("nvim-lua/plenary.nvim") + vim.env.XDG_CONFIG_HOME = M.root(".tests/config") + vim.env.XDG_DATA_HOME = M.root(".tests/data") + vim.env.XDG_STATE_HOME = M.root(".tests/state") + vim.env.XDG_CACHE_HOME = M.root(".tests/cache") end M.setup() From e22e8e45069785b6112a8dd7857e3c78221a79fe Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Dec 2022 16:37:50 +0100 Subject: [PATCH 0037/1610] style: added more comments to init --- lua/lazy/core/loader.lua | 2 ++ lua/lazy/init.lua | 22 +++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 77f2989..46d08d0 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -28,6 +28,7 @@ function M.setup() end function M.init_plugins() + Util.track("loader") Util.track({ start = "init" }) for _, plugin in pairs(Config.plugins) do if plugin.init then @@ -40,6 +41,7 @@ function M.init_plugins() end end Util.track() + Util.track() end ---@class Loader diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 60cf1ae..602f3c0 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -4,35 +4,39 @@ local M = {} ---@param opts? LazyConfig function M.setup(spec, opts) local start = vim.loop.hrtime() + + -- load module cache before anything else require("lazy.core.module").setup() local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") local Plugin = require("lazy.core.plugin") - Util.track({ plugin = "lazy.nvim" }) - + Util.track({ plugin = "lazy.nvim" }) -- setup start Util.track("module", vim.loop.hrtime() - start) + + -- load config Util.track("config") Config.setup(spec, opts) Util.track() + -- load the plugins Plugin.load() - Util.track("loader") + -- setup loader and handlers Loader.setup() - Util.track() + -- correct time delta and loaded local delta = vim.loop.hrtime() - start - Util.track().time = delta -- end setup - - Loader.init_plugins() - if Config.plugins["lazy.nvim"] then Config.plugins["lazy.nvim"]._.loaded = { time = delta, source = "init.lua" } end + -- load plugins with lazy=false or Plugin.init + Loader.init_plugins() + + -- all done! vim.cmd("do User LazyDone") end @@ -48,7 +52,7 @@ function M.stats() end function M.bootstrap() - local lazypath = vim.fn.stdpath("data") .. "/site/pack/lazy/start/lazy.nvim" + local lazypath = vim.fn.stdpath("data") .. "/site/pack/lazy/opt/lazy.nvim" if not vim.loop.fs_stat(lazypath) then vim.fn.system({ "git", From 723274efeeeddb82a5ee8ca38d456d393555ba94 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 08:54:27 +0100 Subject: [PATCH 0038/1610] feat(ui): better detection of plugins/config files that loaded a plugin --- lua/lazy/view/render.lua | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index dffbd96..27e2886 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -191,21 +191,22 @@ function M:reason(reason, opts) ---@type string? local source = reason.source if source then - local name = source:match("/([^/]-)/lua") + source = vim.loop.fs_realpath(source) or source for _, other in pairs(Config.plugins) do - if name and other.name == name then + if source:find(vim.loop.fs_realpath(other.dir), 1, true) then reason.plugin = other.name reason.source = nil break end end if reason.source then - source = vim.loop.fs_realpath(source) or source - local config = vim.loop.fs_realpath(vim.fn.stdpath("config") .. "/lua") - if source:find(config, 1, true) == 1 then - reason.source = source:sub(#config + 2):gsub("/", "."):gsub("%.lua$", "") - if reason.source == "lua" then - reason.source = "init.lua" + local config = vim.loop.fs_realpath(vim.fn.stdpath("config")) + if source == config .. "/init.lua" then + reason.source = "init.lua" + else + config = config .. "/lua" + if source:find(config, 1, true) == 1 then + reason.source = source:sub(#config + 2):gsub("/", "."):gsub("%.lua$", "") end end end From 0b6dec46e02b2f56ac5c180d6a809f140e50ddf6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 09:20:48 +0100 Subject: [PATCH 0039/1610] perf: module now caches all lua modules used till VimEnter --- lua/lazy/core/module.lua | 133 +++++++++++++++++++++++++++++---------- 1 file changed, 99 insertions(+), 34 deletions(-) diff --git a/lua/lazy/core/module.lua b/lua/lazy/core/module.lua index 82eff95..a1070db 100644 --- a/lua/lazy/core/module.lua +++ b/lua/lazy/core/module.lua @@ -10,51 +10,100 @@ local cache_path = vim.fn.stdpath("state") .. "/lazy.state" local cache_hash ---@alias CacheHash {mtime: {sec:number, nsec:number}, size:number} ----@alias CacheEntry {hash:CacheHash, chunk:string, used:boolean} +---@alias CacheEntry {hash:CacheHash, modpath:string, chunk:string, used:number} ---@type table M.cache = {} +M.loader_idx = 2 -- 2 so preload still works +M.enabled = true +M.ttl = 3600 * 24 * 5 -- keep unused modules for up to 5 days +-- Check if we need to load this plugin ---@param modname string ---@param modpath string ----@return any -function M.load(modname, modpath) - local entry = M.cache[modname] - local hash = assert(M.hash(modpath)) - - if entry and not M.eq(entry.hash, hash) then - entry = nil +function M.check_load(modname, modpath) + if modname:sub(1, 4) == "lazy" then + return end + require("lazy.core.loader").autoload(modname, modpath) +end + +---@param modname string +---@return any +function M.loader(modname) + if not M.enabled then + return "lazy loader is disabled" + end + + local entry = M.cache[modname] local chunk, err if entry then - entry.used = true - chunk, err = load(entry.chunk --[[@as string]], "@" .. modpath, "b") + M.check_load(modname, entry.modpath) + entry.used = os.time() + local hash = assert(M.hash(entry.modpath)) + if M.eq(entry.hash, hash) then + -- found in cache and up to date + chunk, err = load(entry.chunk --[[@as string]], "@" .. entry.modpath) + return chunk or error(err) + end + -- reload from file + entry.hash = hash + chunk, err = loadfile(entry.modpath) else - vim.schedule(function() - vim.notify("loadfile(" .. modname .. ")") - end) - chunk, err = loadfile(modpath) - if chunk then - M.dirty = true - M.cache[modname] = { hash = hash, chunk = string.dump(chunk), used = true } + -- load the module and find its modpath + local modpath + chunk, modpath = M.find(modname) + if modpath then + entry = { hash = M.hash(modpath), modpath = modpath, used = os.time() } + M.cache[modname] = entry + end + end + vim.schedule(function() + vim.notify("loading " .. modname) + end) + if entry and chunk then + M.dirty = true + entry.chunk = string.dump(chunk) + end + return chunk or error(err) +end + +---@param modname string +function M.find(modname) + -- update our loader position if needed + if package.loaders[M.loader_idx] ~= M.loader then + M.loader_idx = 1 + ---@diagnostic disable-next-line: no-unknown + for i, loader in ipairs(package.loaders) do + if loader == M.loader then + M.loader_idx = i + break + end end end - return chunk and chunk() or error(err) + -- find the module and its modpath + for i = M.loader_idx + 1, #package.loaders do + ---@diagnostic disable-next-line: no-unknown + local chunk = package.loaders[i](modname) + if type(chunk) == "function" then + local info = debug.getinfo(chunk, "S") + return chunk, (info.what ~= "C" and info.source:sub(2)) + end + end end function M.setup() M.load_cache() - -- preload core modules - local root = vim.fn.fnamemodify(debug.getinfo(1, "S").source:sub(2), ":p:h:h") - for _, name in ipairs({ "util", "config", "loader", "plugin", "handler" }) do - local modname = "lazy.core." .. name - ---@diagnostic disable-next-line: no-unknown - package.preload[modname] = function() - return M.load(modname, root .. "/core/" .. name:gsub("%.", "/") .. ".lua") - end - end - return M + table.insert(package.loaders, M.loader_idx, M.loader) + + vim.api.nvim_create_autocmd("VimEnter", { + once = true, + callback = function() + -- startup done, so stop caching + M.enabled = false + end, + }) end ---@return CacheHash? @@ -71,12 +120,21 @@ end function M.save_cache() local f = assert(uv.fs_open(cache_path, "w", 438)) for modname, entry in pairs(M.cache) do - if entry.used then + if entry.used > os.time() - M.ttl then entry.modname = modname - local header = { entry.hash.size, entry.hash.mtime.sec, entry.hash.mtime.nsec, #modname, #entry.chunk } - uv.fs_write(f, ffi.string(ffi.new("const uint32_t[5]", header), 20)) + local header = { + entry.hash.size, + entry.hash.mtime.sec, + entry.hash.mtime.nsec, + #modname, + #entry.chunk, + #entry.modpath, + entry.used, + } + uv.fs_write(f, ffi.string(ffi.new("const uint32_t[7]", header), 28)) uv.fs_write(f, modname) uv.fs_write(f, entry.chunk) + uv.fs_write(f, entry.modpath) end end uv.fs_close(f) @@ -92,13 +150,20 @@ function M.load_cache() local offset = 1 while offset + 1 < #data do - local header = ffi.cast("uint32_t*", ffi.new("const char[20]", data:sub(offset, offset + 19))) - offset = offset + 20 + local header = ffi.cast("uint32_t*", ffi.new("const char[28]", data:sub(offset, offset + 27))) + offset = offset + 28 local modname = data:sub(offset, offset + header[3] - 1) offset = offset + header[3] local chunk = data:sub(offset, offset + header[4] - 1) offset = offset + header[4] - M.cache[modname] = { hash = { size = header[0], mtime = { sec = header[1], nsec = header[2] } }, chunk = chunk } + local file = data:sub(offset, offset + header[5] - 1) + offset = offset + header[5] + M.cache[modname] = { + hash = { size = header[0], mtime = { sec = header[1], nsec = header[2] } }, + chunk = chunk, + modpath = file, + used = header[6], + } end end end From 575421b3fb22731a9f97370d794fe7e3c7b57f7b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 09:22:15 +0100 Subject: [PATCH 0040/1610] feat!: plugins are now autmatically loaded on require. `module=` no longer needed! --- lua/lazy/core/handler.lua | 33 ----------------------- lua/lazy/core/loader.lua | 57 ++++++++++++++++++++++++++++++++++++--- lua/lazy/core/plugin.lua | 30 +++++++++++---------- lua/lazy/core/util.lua | 16 ++++++++++- 4 files changed, 84 insertions(+), 52 deletions(-) diff --git a/lua/lazy/core/handler.lua b/lua/lazy/core/handler.lua index b65e3ba..eb040fd 100644 --- a/lua/lazy/core/handler.lua +++ b/lua/lazy/core/handler.lua @@ -6,7 +6,6 @@ local Config = require("lazy.core.config") ---@field event? string|string[] ---@field cmd? string|string[] ---@field ft? string|string[] ----@field module? string|string[] ---@field keys? string|string[] local M = {} @@ -116,36 +115,4 @@ function M.handlers.cmd(grouped) end end -function M.handlers.module(grouped) - ---@param modname string - table.insert(package.loaders, 2, function(modname) - local idx = modname:find(".", 1, true) or #modname + 1 - while idx do - local name = modname:sub(1, idx - 1) - ---@diagnostic disable-next-line: redefined-local - local plugins = grouped[name] - if plugins then - grouped[name] = nil - local reason = { require = modname } - -- almost never happens, so this does not decrease performance - if #Loader.loading == 0 then - local f = 3 - while not reason.source do - local info = debug.getinfo(f, "S") - if not info then - break - end - if info.what ~= "C" then - reason.source = info.source:sub(2) - end - f = f + 1 - end - end - Loader.load(plugins, reason) - end - idx = modname:find(".", idx + 1, true) - end - end) -end - return M diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 46d08d0..077cc04 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -5,6 +5,7 @@ local M = {} ---@type LazyPlugin[] M.loading = {} +M.init_done = false function M.setup() -- install missing plugins @@ -25,6 +26,9 @@ function M.setup() local Handler = require("lazy.core.handler") Handler.setup() Util.track() + + -- autoload opt plugins + table.insert(package.loaders, M.autoload) end function M.init_plugins() @@ -42,6 +46,7 @@ function M.init_plugins() end Util.track() Util.track() + M.init_done = true end ---@class Loader @@ -49,7 +54,7 @@ end ---@param reason {[string]:string} function M.load(plugins, reason) ---@diagnostic disable-next-line: cast-local-type - plugins = type(plugins) == "string" or plugins.name and { plugins } or plugins + plugins = (type(plugins) == "string" or plugins.name) and { plugins } or plugins ---@cast plugins (string|LazyPlugin)[] for _, plugin in ipairs(plugins) do @@ -64,17 +69,21 @@ function M.load(plugins, reason) end if #M.loading > 0 then plugin._.loaded.plugin = M.loading[#M.loading].name + elseif reason.require then + plugin._.loaded.source = Util.get_source() end table.insert(M.loading, plugin) Util.track({ plugin = plugin.name, start = reason.start }) - M.packadd(plugin) + + vim.opt.runtimepath:prepend(plugin.dir) if plugin.dependencies then M.load(plugin.dependencies, {}) end + M.packadd(plugin) if plugin.config then Util.try(plugin.config, "Failed to run `config` for " .. plugin.name) end @@ -90,8 +99,16 @@ end ---@param plugin LazyPlugin function M.packadd(plugin) - vim.cmd.packadd(plugin.name) - M.source_runtime(plugin, "/after/plugin") + -- FIXME: investigate further what else is needed + -- vim.cmd.packadd(plugin.name) + -- M.source_runtime(plugin, "/after/plugin") + if M.init_done then + M.source_runtime(plugin, "/plugin") + if vim.g.did_load_filetypes == 1 then + M.source_runtime(plugin, "/ftdetect") + end + M.source_runtime(plugin, "/after/plugin") + end end ---@param plugin LazyPlugin @@ -105,4 +122,36 @@ function M.source_runtime(plugin, dir) end) end +-- This loader is added as the very last one. +-- This only hits when the modname is not cached and +-- even then only once per plugin. So pretty much never. +-- +-- lazy.module will call this when loading a cached file with modpath set. +---@param modname string +---@param modpath string? +function M.autoload(modname, modpath) + -- fast return when we know the modpath + if modpath then + local plugin = require("lazy.core.plugin").find(modpath) + if plugin and not plugin._.loaded then + M.load(plugin, { require = modname }) + end + return + end + -- check if a lazy plugin should be loaded + for _, plugin in pairs(Config.plugins) do + if not plugin._.loaded then + for _, pattern in ipairs({ ".lua", "/init.lua" }) do + local path = plugin.dir .. "/lua/" .. modname:gsub("%.", "/") .. pattern + if vim.loop.fs_stat(path) then + M.load(plugin, { require = modname }) + local chunk, err = loadfile(path) + return chunk or error(err) + end + end + end + end + return modname .. " not found in unloaded opt plugins" +end + return M diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 83975cb..68d9873 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,6 +1,5 @@ local Config = require("lazy.core.config") local Util = require("lazy.core.util") -local Module = require("lazy.core.module") local Handler = require("lazy.core.handler") local M = {} @@ -38,7 +37,7 @@ local M = {} ---@field dependencies? string[] ---@field _ LazyPluginState ----@alias LazySpec string|LazyPlugin|LazySpec[]|{dependencies:LazySpec} +---@alias LazySpec string|LazyPlugin|LazyPlugin[]|{dependencies:LazySpec} ---@class LazySpecLoader ---@field plugins table @@ -156,13 +155,7 @@ function M.update_state() for _, plugin in pairs(Config.plugins) do plugin._ = plugin._ or {} if plugin.lazy == nil then - local lazy = plugin.dep - or Config.options.defaults.lazy - or plugin.module - or plugin.event - or plugin.keys - or plugin.ft - or plugin.cmd + local lazy = plugin.dep or Config.options.defaults.lazy or plugin.event or plugin.keys or plugin.ft or plugin.cmd plugin.lazy = lazy and true or false end plugin.dir = Config.root .. "/" .. plugin.name @@ -193,16 +186,15 @@ function M.spec() if type(Config.spec) == "string" then -- spec is a module - local function _load(name, modpath) - local modname = Config.spec .. (name and ("." .. name) or "") + local function _load(name) + local modname = name and (Config.spec .. "." .. name) or Config.spec Util.try(function() - spec:normalize(Module.load(modname, modpath)) + spec:normalize(require(modname)) end, "Failed to load **" .. modname .. "**") end local path_plugins = vim.fn.stdpath("config") .. "/lua/" .. Config.spec:gsub("%.", "/") - local path_main = path_plugins .. (vim.loop.fs_stat(path_plugins .. ".lua") and ".lua" or "/init.lua") - _load(nil, path_main) + _load() Util.lsmod(path_plugins, _load) else -- spec is a spec @@ -228,4 +220,14 @@ function M.load() Util.track() end +-- Finds the plugin that has this path +---@param path string +function M.find(path) + if path:find(Config.root, 1, true) == 1 then + local plugin = path:sub(#Config.root + 2) + local idx = plugin:find("/", 1, true) + return idx and Config.plugins[plugin:sub(1, idx - 1)] or nil + end +end + return M diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index adaaf6c..e29029b 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -38,7 +38,7 @@ function M.try(fn, msg) if not info then break end - if info.what == "Lua" and not info.source:find("lazy.nvim") then + if info.what ~= "C" and not info.source:find("lazy.nvim") then local source = info.source:sub(2) if source:find(Config.root, 1, true) == 1 then source = source:sub(#Config.root + 1) @@ -67,6 +67,20 @@ function M.try(fn, msg) return ok and result or nil end +function M.get_source() + local f = 2 + while true do + local info = debug.getinfo(f, "S") + if not info then + break + end + if info.what ~= "C" and not info.source:find("lazy.nvim", 1, true) then + return info.source:sub(2) + end + f = f + 1 + end +end + -- Fast implementation to check if a table is a list ---@param t table function M.is_list(t) From 98ccf556d8c1e6a8eadb004620c9d5e95733285a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 09:22:43 +0100 Subject: [PATCH 0041/1610] fix(ui): use Plugin.find to detect loading reason --- lua/lazy/view/render.lua | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 27e2886..b76bacf 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -3,6 +3,7 @@ local Util = require("lazy.util") local Sections = require("lazy.view.sections") local Handler = require("lazy.core.handler") local Git = require("lazy.manage.git") +local Plugin = require("lazy.core.plugin") local Text = require("lazy.view.text") @@ -191,16 +192,12 @@ function M:reason(reason, opts) ---@type string? local source = reason.source if source then - source = vim.loop.fs_realpath(source) or source - for _, other in pairs(Config.plugins) do - if source:find(vim.loop.fs_realpath(other.dir), 1, true) then - reason.plugin = other.name - reason.source = nil - break - end - end - if reason.source then - local config = vim.loop.fs_realpath(vim.fn.stdpath("config")) + local plugin = Plugin.find(source) + if plugin then + reason.plugin = plugin.name + reason.source = nil + else + local config = vim.fn.stdpath("config") if source == config .. "/init.lua" then reason.source = "init.lua" else From 45e18c977de1c2f036a0aef4f8d89a172989fd44 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 09:23:27 +0100 Subject: [PATCH 0042/1610] test: fix tests with `module=` --- tests/core/plugin_spec.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 07b7ac7..6608c03 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -84,7 +84,7 @@ describe("plugin spec opt", function() it("handles opt from dep", function() Config.options.defaults.lazy = false - local spec = Plugin.Spec.new({ "foo/bar", module = "foo" }) + local spec = Plugin.Spec.new({ "foo/bar", event = "foo" }) Config.plugins = spec.plugins Plugin.update_state() assert.same(1, vim.tbl_count(spec.plugins)) @@ -94,17 +94,17 @@ describe("plugin spec opt", function() it("merges lazy loaders", function() local tests = { - { { "foo/bar", module = "mod1" }, { "foo/bar", module = "mod2" } }, - { { "foo/bar", module = { "mod1" } }, { "foo/bar", module = { "mod2" } } }, - { { "foo/bar", module = "mod1" }, { "foo/bar", module = { "mod2" } } }, + { { "foo/bar", event = "mod1" }, { "foo/bar", event = "mod2" } }, + { { "foo/bar", event = { "mod1" } }, { "foo/bar", event = { "mod2" } } }, + { { "foo/bar", event = "mod1" }, { "foo/bar", event = { "mod2" } } }, } for _, test in ipairs(tests) do local spec = Plugin.Spec.new(test) assert(vim.tbl_count(spec.plugins) == 1) - assert(type(spec.plugins.bar.module) == "table") - assert(#spec.plugins.bar.module == 2) - assert(vim.tbl_contains(spec.plugins.bar.module, "mod1")) - assert(vim.tbl_contains(spec.plugins.bar.module, "mod2")) + assert(type(spec.plugins.bar.event) == "table") + assert(#spec.plugins.bar.event == 2) + assert(vim.tbl_contains(spec.plugins.bar.event, "mod1")) + assert(vim.tbl_contains(spec.plugins.bar.event, "mod2")) end end) From b0091d40e36257183f2b1aaa94c18e8644b6307e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 09:25:25 +0100 Subject: [PATCH 0043/1610] docs: updated todo --- README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b5969cc..a0fb32b 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,11 @@ - [ ] health checks: check merge conflicts async - [ ] unsupported props or props from other managers + - [ ] other packages still in site? + - [ ] other package manager artifacts still present? compiled etc - [x] rename `run` to `build` - [ ] delete lazy keymaps when a plugin loads +- [ ] temp colorscheme - [x] allow setting up plugins through config - [x] task timeout - [ ] log file @@ -37,20 +40,20 @@ - [x] ui border - [ ] make sure we can reload specs while keeping state - [ ] show disabled plugins (strikethrough?) -- [ ] Import specs from Packer +- [ ] Import specs from other plugin managers - [ ] use uv file watcher (or stat) to check for config changes - [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? + - [ ] package meta index (package.lua cache for all packages) - [x] support for Plugin.lock - [x] defaults for git log - [x] view keybindings for update/clean/... - [x] add profiler to view - [x] add buttons for actions - [x] show time taken for op in view -- [ ] package meta index (package.lua cache for all packages) -- [ ] auto lazy-loading of lua modules +- [x] auto lazy-loading of lua modules - [x] clear errors - [x] add support for versions `git tag --sort v:refname` - [x] rename requires to dependencies @@ -58,7 +61,7 @@ - [x] handlers imply opt - [x] dependencies imply opt for deps - [x] fix local plugin spec -- [ ] investigate all opt=true. Simplifies logic (easily switch between opt/start afterwards) +- [x] investigate all opt=true. Simplifies logic (easily switch between opt/start afterwards) ## 📦 Differences with Packer @@ -69,6 +72,8 @@ - `as` => `name` - `opt` => `lazy` - `run` => `build` + - `lock` => `pin` + - `module` is auto-loaded. No need to specify ## 📦 Other Neovim Plugin Managers in Lua From d04962b231b70123ab26f507a4a099f3097e4392 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 2 Dec 2022 08:26:19 +0000 Subject: [PATCH 0044/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 189087a..f368b59 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 01 +*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 02 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -40,8 +40,11 @@ TODO *lazy.nvim-todo* - health checks: check merge conflicts async - unsupported props or props from other managers + - other packages still in site? + - other package manager artifacts still present? compiled etc - rename `run` to `build` - delete lazy keymaps when a plugin loads +- temp colorscheme - allow setting up plugins through config - task timeout - log file @@ -52,19 +55,19 @@ TODO *lazy.nvim-todo* - ui border - make sure we can reload specs while keeping state - show disabled plugins (strikethrough?) -- Import specs from Packer +- Import specs from other plugin managers - use uv file watcher (or stat) to check for config changes - packspec - add support to specify `engines`, `os` and `cpu` like in `package.json` - semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? + - package meta index (package.lua cache for all packages) - support for Plugin.lock - defaults for git log - view keybindings for update/clean/… - add profiler to view - add buttons for actions - show time taken for op in view -- package meta index (package.lua cache for all packages) - auto lazy-loading of lua modules - clear errors - add support for versions `git tag --sort v:refname` @@ -85,6 +88,8 @@ DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* - `as` => `name` - `opt` => `lazy` - `run` => `build` + - `lock` => `pin` + - `module` is auto-loaded. No need to specify OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-other-neovim-plugin-managers-in-lua* From 60e8a01b941aa49000d5ed199849afcf347904fe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 Dec 2022 08:26:40 +0000 Subject: [PATCH 0045/1610] chore(main): release 2.0.0 --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca805a5..e9601ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog +## [2.0.0](https://github.com/folke/lazy.nvim/compare/v1.2.0...v2.0.0) (2022-12-02) + + +### ⚠ BREAKING CHANGES + +* plugins are now autmatically loaded on require. `module=` no longer needed! +* all plugins are now opt. Plugin.opt => Plugin.lazy +* renamed Plugin.run => Plugin.build + +### Features + +* all plugins are now opt. Plugin.opt => Plugin.lazy ([5134e79](https://github.com/folke/lazy.nvim/commit/5134e797f34792e34e86fe82a72cdf765ca2e284)) +* lazy setup with either a plugins module, or a plugins spec ([af8b8e1](https://github.com/folke/lazy.nvim/commit/af8b8e128e20f9fa30077bedf8bcee40b779c533)) +* plugins are now autmatically loaded on require. `module=` no longer needed! ([575421b](https://github.com/folke/lazy.nvim/commit/575421b3fb22731a9f97370d794fe7e3c7b57f7b)) +* renamed Plugin.run => Plugin.build ([042aaa4](https://github.com/folke/lazy.nvim/commit/042aaa4f87c6576a369cbecd86aceefb96add228)) +* show module source if loading source is under config ([041a716](https://github.com/folke/lazy.nvim/commit/041a716f4e5291d6947c5f96b21a2c4db0aef6e3)) +* **ui:** better detection of plugins/config files that loaded a plugin ([723274e](https://github.com/folke/lazy.nvim/commit/723274efeeeddb82a5ee8ca38d456d393555ba94)) +* **ui:** improvements to profiling and rendering of loaded reasons ([714bc0a](https://github.com/folke/lazy.nvim/commit/714bc0a136cd72730e1c457556fbe004a22db6b7)) + + +### Bug Fixes + +* always overwrite any plugin spec for lazy.nvim to manage itself ([d46bc77](https://github.com/folke/lazy.nvim/commit/d46bc7795c255f121d2d279764017c7d60edff88)) +* prepend package path to packpath if package.reset=false ([5eb2622](https://github.com/folke/lazy.nvim/commit/5eb2622a4e4e52bed94b5c8ae48b83ccfab0098d)) +* **ui:** use Plugin.find to detect loading reason ([98ccf55](https://github.com/folke/lazy.nvim/commit/98ccf556d8c1e6a8eadb004620c9d5e95733285a)) + + +### Performance Improvements + +* module now caches all lua modules used till VimEnter ([0b6dec4](https://github.com/folke/lazy.nvim/commit/0b6dec46e02b2f56ac5c180d6a809f140e50ddf6)) +* reset packpath to only include the lazy package. Improved my startup time by 2ms ([4653119](https://github.com/folke/lazy.nvim/commit/4653119625fa8e8c647f6c0ff0b0b57ee81521b8)) + ## [1.2.0](https://github.com/folke/lazy.nvim/compare/v1.1.0...v1.2.0) (2022-11-30) From 59fb0507677628c16425dc2741f005f5394e8102 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 10:02:34 +0100 Subject: [PATCH 0046/1610] fix: respect --noplugin --- lua/lazy/init.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 602f3c0..2b760b9 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -3,6 +3,9 @@ local M = {} ---@param spec LazySpec Should be a module name to load, or a plugin spec ---@param opts? LazyConfig function M.setup(spec, opts) + if not vim.go.loadplugins then + return + end local start = vim.loop.hrtime() -- load module cache before anything else From 3e143c6017ba3c17dd249492cc86e0d2f2750229 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 11:24:23 +0100 Subject: [PATCH 0047/1610] fix(fs): dont set cloned=true if symlink already existed --- lua/lazy/manage/task/fs.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/lua/lazy/manage/task/fs.lua b/lua/lazy/manage/task/fs.lua index b8097be..47659d9 100644 --- a/lua/lazy/manage/task/fs.lua +++ b/lua/lazy/manage/task/fs.lua @@ -35,10 +35,8 @@ M.symlink = { run = function(self) local stat = vim.loop.fs_lstat(self.plugin.dir) if stat then - assert(stat.type == "link") if vim.loop.fs_realpath(self.plugin.uri) == vim.loop.fs_realpath(self.plugin.dir) then self.plugin._.installed = true - self.plugin._.cloned = true return else vim.loop.fs_unlink(self.plugin.dir) From ae379a62dcaa0854086c6763672b806d3175b91c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 11:26:07 +0100 Subject: [PATCH 0048/1610] fix(git): fixed branch detection, get target commit from origin and always checkout a tag or commit so we dont need to use git merge --- lua/lazy/manage/git.lua | 45 +++++++++++++++++++++++------------- lua/lazy/manage/lock.lua | 3 +-- lua/lazy/manage/task/git.lua | 20 +++++++++++----- 3 files changed, 44 insertions(+), 24 deletions(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index df64465..6984afe 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -51,41 +51,54 @@ function M.get_versions(repo, spec) end ---@param plugin LazyPlugin ----@return {branch:string, commit?:string}? +---@return string? function M.get_branch(plugin) if plugin.branch then - return { - branch = plugin.branch, - commit = M.ref(plugin.dir, "heads/" .. plugin.branch), - } + return plugin.branch else + -- we need to return the default branch + -- Try origin first local main = M.ref(plugin.dir, "remotes/origin/HEAD") if main then local branch = main:match("ref: refs/remotes/origin/(.*)") if branch then - return { - branch = branch, - commit = M.ref(plugin.dir, "heads/" .. branch), - } + return branch end end + + -- fallback to local HEAD + main = assert(Util.head(plugin.dir .. "/.git/HEAD")) + return main and main:match("ref: refs/heads/(.*)") + end +end + +-- Return the last commit for the given branch +---@param repo string +---@param branch string +---@param origin? boolean +function M.get_commit(repo, branch, origin) + if origin then + -- origin ref might not exist if it is the same as local + return M.ref(repo, "remotes/origin", branch) or M.ref(repo, "heads", branch) + else + return M.ref(repo, "heads", branch) end end ---@param plugin LazyPlugin ---@return GitInfo? function M.get_target(plugin) - local branch = M.get_branch(plugin) or M.info(plugin.dir) + local branch = assert(M.get_branch(plugin)) if plugin.commit then return { - branch = branch and branch.branch, + branch = branch, commit = plugin.commit, } end if plugin.tag then return { - branch = branch and branch.branch, + branch = branch, tag = plugin.tag, commit = M.ref(plugin.dir, "tags/" .. plugin.tag), } @@ -95,7 +108,7 @@ function M.get_target(plugin) local last = Semver.last(M.get_versions(plugin.dir, version)) if last then return { - branch = branch and branch.branch, + branch = branch, version = last, tag = last.tag, commit = M.ref(plugin.dir, "tags/" .. last.tag), @@ -103,11 +116,11 @@ function M.get_target(plugin) end end ---@diagnostic disable-next-line: return-type-mismatch - return branch + return { branch = branch, commit = M.get_commit(plugin.dir, branch, true) } end -function M.ref(repo, ref) - return Util.head(repo .. "/.git/refs/" .. ref) +function M.ref(repo, ...) + return Util.head(repo .. "/.git/refs/" .. table.concat({ ... }, "/")) end return M diff --git a/lua/lazy/manage/lock.lua b/lua/lazy/manage/lock.lua index 0b03e8c..5141501 100644 --- a/lua/lazy/manage/lock.lua +++ b/lua/lazy/manage/lock.lua @@ -29,8 +29,7 @@ function M.update() if not plugin._.is_local and plugin._.installed then local info = assert(Git.info(plugin.dir)) if not info.branch then - local branch = assert(Git.get_branch(plugin)) - info.branch = branch.branch + info.branch = assert(Git.get_branch(plugin)) end info.commit = info.commit -- f:write(([[ [%q] = { branch = %q, commit = %q },]]):format(name, info.branch, info.commit) .. "\n") diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 5a404ba..c9e3051 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -30,6 +30,7 @@ M.log = { elseif opts.check then local info = assert(Git.info(self.plugin.dir)) local target = assert(Git.get_target(self.plugin)) + assert(target.commit, self.plugin.name .. " " .. target.branch) table.insert(args, info.commit .. ".." .. target.commit) else vim.list_extend(args, opts.args or Config.options.git.log) @@ -76,22 +77,23 @@ M.clone = { end, } +-- setup origin branches if needed +-- fetch will retrieve the data M.branch = { skip = function(plugin) if not plugin._.installed or plugin._.is_local then return true end local branch = assert(Git.get_branch(plugin)) - return branch and branch.commit + return Git.get_commit(plugin.dir, branch) end, run = function(self) - local branch = assert(Git.get_branch(self.plugin)) local args = { "remote", "set-branches", "--add", "origin", - branch.branch, + assert(Git.get_branch(self.plugin)), } self:spawn("git", { @@ -101,6 +103,7 @@ M.branch = { end, } +-- fetches all needed origin branches M.fetch = { skip = function(plugin) return not plugin._.installed or plugin._.is_local @@ -121,6 +124,8 @@ M.fetch = { end, } +-- checkout to the target commit +-- branches will exists at this point, so so will the commit M.checkout = { skip = function(plugin) return not plugin._.installed or plugin._.is_local @@ -131,7 +136,7 @@ M.checkout = { local info = assert(Git.info(self.plugin.dir)) local target = assert(Git.get_target(self.plugin)) - -- if the plugin is locked and we did not just clone it, + -- if the plugin is pinned and we did not just clone it, -- then don't update if self.plugin.pin and not self.plugin._.cloned then target = info @@ -139,6 +144,7 @@ M.checkout = { local lock if opts.lockfile then + -- restore to the lock if it exists lock = Lock.get(self.plugin) if lock then ---@diagnostic disable-next-line: cast-local-type @@ -146,6 +152,8 @@ M.checkout = { end end + -- dont run checkout if target is already reached. + -- unless we just clones, since then we won't have any data yet if not self.plugin._.cloned and info.commit == target.commit and info.branch == target.branch then self.plugin._.updated = { from = info.commit, @@ -165,8 +173,8 @@ M.checkout = { table.insert(args, "tags/" .. target.tag) elseif self.plugin.commit then table.insert(args, self.plugin.commit) - elseif target.branch then - table.insert(args, target.branch) + else + table.insert(args, target.commit) end self:spawn("git", { From 6fe425c91acbf2b9b948b23673e22a0c61150249 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 12:43:34 +0100 Subject: [PATCH 0049/1610] perf: caching strategy is now configurable --- lua/lazy/core/{module.lua => cache.lua} | 95 ++++++++++++++++++------- lua/lazy/core/config.lua | 7 +- lua/lazy/init.lua | 16 ++++- 3 files changed, 89 insertions(+), 29 deletions(-) rename lua/lazy/core/{module.lua => cache.lua} (68%) diff --git a/lua/lazy/core/module.lua b/lua/lazy/core/cache.lua similarity index 68% rename from lua/lazy/core/module.lua rename to lua/lazy/core/cache.lua index a1070db..a1ff412 100644 --- a/lua/lazy/core/module.lua +++ b/lua/lazy/core/cache.lua @@ -5,7 +5,19 @@ local uv = vim.loop local M = {} M.dirty = false -local cache_path = vim.fn.stdpath("state") .. "/lazy.state" +---@class LazyCacheConfig +M.config = { + enabled = true, + path = vim.fn.stdpath("state") .. "/lazy.state", + -- choose what should be cached + -- * lazy: cache all lazy.nvim core modules and your config files + -- * init: all of the above and any module needed to init your plugins + -- * VimEnter: any module till VimEnter + -- * VeryLazy: any module till VeryLazy + -- * allthethings: all mdules. Not recommended + strategy = "VimEnter", ---@type "lazy"|"init"|"VimEnter"|"allthethings" +} + ---@type CacheHash local cache_hash @@ -27,13 +39,25 @@ function M.check_load(modname, modpath) require("lazy.core.loader").autoload(modname, modpath) end +---@param step? string +function M.disable(step) + if not M.enabled then + return + end + if step and M.config.strategy ~= step then + return + end + + local idx = M.idx() + if idx then + table.remove(package.loaders, idx) + end + M.enabled = false +end + ---@param modname string ---@return any function M.loader(modname) - if not M.enabled then - return "lazy loader is disabled" - end - local entry = M.cache[modname] local chunk, err @@ -68,11 +92,10 @@ function M.loader(modname) return chunk or error(err) end ----@param modname string -function M.find(modname) +function M.idx() -- update our loader position if needed if package.loaders[M.loader_idx] ~= M.loader then - M.loader_idx = 1 + M.loader_idx = nil ---@diagnostic disable-next-line: no-unknown for i, loader in ipairs(package.loaders) do if loader == M.loader then @@ -81,29 +104,49 @@ function M.find(modname) end end end + return M.loader_idx +end - -- find the module and its modpath - for i = M.loader_idx + 1, #package.loaders do - ---@diagnostic disable-next-line: no-unknown - local chunk = package.loaders[i](modname) - if type(chunk) == "function" then - local info = debug.getinfo(chunk, "S") - return chunk, (info.what ~= "C" and info.source:sub(2)) +---@param modname string +function M.find(modname) + if M.idx() then + -- find the module and its modpath + for i = M.loader_idx + 1, #package.loaders do + ---@diagnostic disable-next-line: no-unknown + local chunk = package.loaders[i](modname) + if type(chunk) == "function" then + local info = debug.getinfo(chunk, "S") + return chunk, (info.what ~= "C" and info.source:sub(2)) + end end end end -function M.setup() +---@param opts? LazyConfig +function M.setup(opts) + -- no fancy deep extend here. just set the options + if opts and opts.performance and opts.performance.cache then + for k, v in pairs(opts.performance.cache) do + M.config[k] = v + end + end + M.load_cache() table.insert(package.loaders, M.loader_idx, M.loader) - vim.api.nvim_create_autocmd("VimEnter", { - once = true, - callback = function() - -- startup done, so stop caching - M.enabled = false - end, - }) + if M.config.strategy == "VimEnter" then + vim.api.nvim_create_autocmd("VimEnter", { + once = true, + callback = function() + -- use schedule so all other VimEnter handlers will have run + vim.schedule(function() + -- startup done, so stop caching + M.disable() + end) + end, + }) + end + return M end ---@return CacheHash? @@ -118,7 +161,7 @@ function M.eq(h1, h2) end function M.save_cache() - local f = assert(uv.fs_open(cache_path, "w", 438)) + local f = assert(uv.fs_open(M.config.path, "w", 438)) for modname, entry in pairs(M.cache) do if entry.used > os.time() - M.ttl then entry.modname = modname @@ -142,7 +185,7 @@ end function M.load_cache() M.cache = {} - local f = uv.fs_open(cache_path, "r", 438) + local f = uv.fs_open(M.config.path, "r", 438) if f then cache_hash = uv.fs_fstat(f) --[[@as CacheHash]] local data = uv.fs_read(f, cache_hash.size, 0) --[[@as string]] @@ -172,7 +215,7 @@ function M.autosave() vim.api.nvim_create_autocmd("VimLeavePre", { callback = function() if M.dirty then - local hash = M.hash(cache_path) + local hash = M.hash(M.config.path) -- abort when the file was changed in the meantime if hash == nil or M.eq(cache_hash, hash) then M.save_cache() diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index de04c3c..b452625 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -48,6 +48,10 @@ M.defaults = { }, throttle = 20, -- how frequently should the ui process render events }, + performance = { + ---@type LazyCacheConfig + cache = nil, + }, } M.ns = vim.api.nvim_create_namespace("lazy") @@ -72,6 +76,7 @@ M.options = {} function M.setup(spec, opts) M.spec = spec M.options = vim.tbl_deep_extend("force", M.defaults, opts or {}) + M.options.performance.cache = require("lazy.core.cache") M.root = M.options.package.path .. "/pack/" .. M.options.package.name .. "/opt" if M.options.package.reset then @@ -84,7 +89,7 @@ function M.setup(spec, opts) pattern = "VeryLazy", once = true, callback = function() - require("lazy.core.module").autosave() + require("lazy.core.cache").autosave() require("lazy.view").setup() end, }) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 2b760b9..1883d82 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -8,8 +8,12 @@ function M.setup(spec, opts) end local start = vim.loop.hrtime() - -- load module cache before anything else - require("lazy.core.module").setup() + local Cache + if not (opts and opts.performance and opts.performance.cache and opts.performance.cache.enabled == false) then + -- load module cache before anything else + Cache = require("lazy.core.cache").setup(opts) + end + local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") @@ -36,9 +40,17 @@ function M.setup(spec, opts) Config.plugins["lazy.nvim"]._.loaded = { time = delta, source = "init.lua" } end + if Cache then + Cache.disable("lazy") + end + -- load plugins with lazy=false or Plugin.init Loader.init_plugins() + if Cache then + Cache.disable("init") + end + -- all done! vim.cmd("do User LazyDone") end From fe6b0b03ead3cfeb3f9bcc365c0364346c8e3c9d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 12:52:06 +0100 Subject: [PATCH 0050/1610] feat: moved Config.package.reset -> Config.performance.reset_packpath --- lua/lazy/core/config.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index b452625..374ed54 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -21,7 +21,6 @@ M.defaults = { package = { path = vim.fn.stdpath("data") .. "/site", name = "lazy", -- plugins will be installed under package.path/pack/{name}/opt - reset = true, -- packpath will be reset to only include lazy. This makes packadd a lot faster }, -- Any plugin spec that contains one of the patterns will use your -- local repo in the projects folder instead of fetchig it from github @@ -51,6 +50,7 @@ M.defaults = { performance = { ---@type LazyCacheConfig cache = nil, + reset_packpath = true, -- packpath will be reset to only include lazy. This makes packadd a lot faster }, } @@ -79,7 +79,7 @@ function M.setup(spec, opts) M.options.performance.cache = require("lazy.core.cache") M.root = M.options.package.path .. "/pack/" .. M.options.package.name .. "/opt" - if M.options.package.reset then + if M.options.performance.reset_packpath then vim.go.packpath = M.options.package.path else vim.opt.packpath:prepend(M.options.package.path) From e4cf8b141681657922643e70ec21b9f9133e9fca Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 16:52:22 +0100 Subject: [PATCH 0051/1610] feat: added debug option --- lua/lazy/core/cache.lua | 10 +++++++--- lua/lazy/core/config.lua | 1 + lua/lazy/core/util.lua | 9 +++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index a1ff412..551409d 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -17,6 +17,7 @@ M.config = { -- * allthethings: all mdules. Not recommended strategy = "VimEnter", ---@type "lazy"|"init"|"VimEnter"|"allthethings" } +M.debug = false ---@type CacheHash local cache_hash @@ -82,9 +83,11 @@ function M.loader(modname) M.cache[modname] = entry end end - vim.schedule(function() - vim.notify("loading " .. modname) - end) + if M.debug then + vim.schedule(function() + vim.notify("[cache:load] " .. modname) + end) + end if entry and chunk then M.dirty = true entry.chunk = string.dump(chunk) @@ -130,6 +133,7 @@ function M.setup(opts) M.config[k] = v end end + M.debug = opts and opts.debug M.load_cache() table.insert(package.loaders, M.loader_idx, M.loader) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 374ed54..6988342 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -52,6 +52,7 @@ M.defaults = { cache = nil, reset_packpath = true, -- packpath will be reset to only include lazy. This makes packadd a lot faster }, + debug = false, } M.ns = vim.api.nvim_create_namespace("lazy") diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index e29029b..fb93edd 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -159,7 +159,9 @@ function M.lsmod(root, fn) end) end +---@param msg string|string[] function M.notify(msg, level) + msg = type(msg) == "table" and table.concat(msg, "\n") or msg vim.notify(msg, level, { on_open = function(win) vim.wo[win].conceallevel = 3 @@ -172,12 +174,19 @@ function M.notify(msg, level) }) end +---@param msg string|string[] function M.error(msg) M.notify(msg, vim.log.levels.ERROR) end +---@param msg string|string[] function M.info(msg) M.notify(msg, vim.log.levels.INFO) end +---@param msg string|string[] +function M.warn(msg) + M.notify(msg, vim.log.levels.WARN) +end + return M From ebf15fc198d6c82f64c17e0b752a30fd4c3cdbc7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 17:01:05 +0100 Subject: [PATCH 0052/1610] feat: for `event=`, fire any new autocmds created by loading the plugins for the event --- lua/lazy/core/handler.lua | 77 +++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/lua/lazy/core/handler.lua b/lua/lazy/core/handler.lua index eb040fd..b862d02 100644 --- a/lua/lazy/core/handler.lua +++ b/lua/lazy/core/handler.lua @@ -29,23 +29,79 @@ function M.setup() end end +---@param events string|string[] +---@param pattern? string +function M.get_augroups(events, pattern) + -- Check for all autocmd groups listening for the events + ---@type table + local groups = {} + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events, pattern = pattern })) do + if autocmd.group then + groups[autocmd.group] = true + end + end + return groups +end + +---@param groups table +---@param events string|string[] +---@param pattern? string +function M.trigger(groups, events, pattern) + events = type(events) == "string" and { events } or events + ---@cast events string[] + for _, event in ipairs(events) do + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = event, pattern = pattern })) do + if autocmd.event == event and autocmd.group and not groups[autocmd.group] then + if Config.options.debug then + local lines = { + "# Firing Events", + " - **event:** " .. autocmd.event, + " - **group:** `" .. autocmd.group_name .. "`", + } + if pattern then + table.insert(lines, 2, "- **pattern:** " .. pattern) + end + Util.info(lines) + end + vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false }) + end + end + end +end + ---@type table M.handlers = {} function M.handlers.event(grouped) local group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) - for event, plugins in pairs(grouped) do - ---@cast event string - if event == "VimEnter" and vim.v.vim_did_enter == 1 then - Loader.load(plugins, { event = event }) + for event_spec, plugins in pairs(grouped) do + if event_spec == "VeryLazy" then + event_spec = "User VeryLazy" + end + if event_spec == "VimEnter" and vim.v.vim_did_enter == 1 then + Loader.load(plugins, { event = event_spec }) else - local _event, pattern = event:match("^(%w+)%s+(.*)$") - vim.api.nvim_create_autocmd(_event or event, { + local event, pattern = event_spec:match("^(%w+)%s+(.*)$") + event = event or event_spec + vim.api.nvim_create_autocmd(event, { group = group, once = true, pattern = pattern, callback = function() - Util.track({ event = event }) - Loader.load(plugins, { event = event }) + Util.track({ event = event_spec }) + local events = { event } + if event == "BufRead" then + events = { "BufReadPre", "BufRead" } + elseif event == "BufReadPost" then + events = { "BufReadPre", "BufRead", "BufReadPost" } + end + + local groups = M.get_augroups(events, pattern) + + -- load the plugins + Loader.load(plugins, { event = event_spec }) + + -- check if any plugin created an event handler for this event and fire the group + M.trigger(groups, events, pattern) Util.track() end, }) @@ -55,7 +111,6 @@ end function M.handlers.keys(grouped) for keys, plugins in pairs(grouped) do - ---@cast keys string vim.keymap.set("n", keys, function() vim.keymap.del("n", keys) Util.track({ keys = keys }) @@ -69,14 +124,15 @@ end function M.handlers.ft(grouped) local group = vim.api.nvim_create_augroup("lazy_handler_ft", { clear = true }) for ft, plugins in pairs(grouped) do - ---@cast ft string vim.api.nvim_create_autocmd("FileType", { once = true, pattern = ft, group = group, callback = function() Util.track({ ft = ft }) + local groups = M.get_augroups("FileType", ft) Loader.load(plugins, { ft = ft }) + M.trigger(groups, "FileType", ft) Util.track() end, }) @@ -85,7 +141,6 @@ end function M.handlers.cmd(grouped) for cmd, plugins in pairs(grouped) do - ---@cast cmd string local function _load() vim.api.nvim_del_user_command(cmd) Util.track({ cmd = cmd }) From 330dbe72031e642d2cd04b671c6eb498d96e4b71 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 17:02:25 +0100 Subject: [PATCH 0053/1610] feat: `Plugin.specs()` can now reload and keeps existing state --- lua/lazy/core/plugin.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 68d9873..ae04a80 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -188,6 +188,7 @@ function M.spec() -- spec is a module local function _load(name) local modname = name and (Config.spec .. "." .. name) or Config.spec + package.loaded[modname] = nil Util.try(function() spec:normalize(require(modname)) end, "Failed to load **" .. modname .. "**") @@ -212,7 +213,14 @@ function M.load() spec.plugins["lazy.nvim"] = nil spec:add({ "folke/lazy.nvim", lazy = true }) + local existing = Config.plugins Config.plugins = spec.plugins + -- copy state. This wont do anything during startup + for name, plugin in pairs(existing) do + if Config.plugins[name] then + Config.plugins[name]._ = plugin._ + end + end Util.track() Util.track("state") From 756b4849d90e5c5da207195aeeb0ea36fd77e194 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 17:09:40 +0100 Subject: [PATCH 0054/1610] refactor: Plugin.dep => Plugin._.dep --- lua/lazy/core/plugin.lua | 18 ++++++++++++------ tests/core/plugin_spec.lua | 15 ++++++++------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index ae04a80..1a45afb 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -18,6 +18,7 @@ local M = {} ---@field is_local boolean ---@field is_symlink? boolean ---@field cloned? boolean +---@field dep? boolean True if this plugin is only in the spec as a dependency ---@class LazyPluginRef ---@field branch? string @@ -31,7 +32,6 @@ local M = {} ---@field name string display name and name used for plugin config files ---@field uri string ---@field dir string ----@field dep? boolean True if this plugin is only in the spec as a dependency ---@field enabled? boolean|(fun():boolean) ---@field lazy? boolean ---@field dependencies? string[] @@ -80,7 +80,8 @@ function Spec:add(plugin, is_dep) plugin.name = slash and name:sub(#name - slash + 2) or pkg:gsub("%W+", "_") end - plugin.dep = is_dep + plugin._ = {} + plugin._.dep = is_dep -- check for plugins that should be local for _, pattern in ipairs(Config.options.dev.patterns) do @@ -120,11 +121,11 @@ end ---@param new LazyPlugin ---@return LazyPlugin function Spec:merge(old, new) - local is_dep = old.dep and new.dep + local is_dep = old._.dep and new._.dep ---@diagnostic disable-next-line: no-unknown for k, v in pairs(new) do - if k == "dep" then + if k == "_" then elseif old[k] ~= nil and old[k] ~= v then if Handler.handlers[k] then local values = type(v) == "string" and { v } or v @@ -139,7 +140,7 @@ function Spec:merge(old, new) old[k] = v end end - old.dep = is_dep + old._.dep = is_dep return old end @@ -155,7 +156,12 @@ function M.update_state() for _, plugin in pairs(Config.plugins) do plugin._ = plugin._ or {} if plugin.lazy == nil then - local lazy = plugin.dep or Config.options.defaults.lazy or plugin.event or plugin.keys or plugin.ft or plugin.cmd + local lazy = plugin._.dep + or Config.options.defaults.lazy + or plugin.event + or plugin.keys + or plugin.ft + or plugin.cmd plugin.lazy = lazy and true or false end plugin.dir = Config.root .. "/" .. plugin.name diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 6608c03..7562f53 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -19,6 +19,7 @@ describe("plugin spec uri/name", function() } for _, test in ipairs(tests) do + test[2]._ = {} it("parses " .. vim.inspect(test[1]):gsub("%s+", " "), function() local spec = Plugin.Spec.new(test[1]) local plugins = vim.tbl_values(spec.plugins) @@ -42,11 +43,11 @@ describe("plugin spec opt", function() Plugin.update_state() assert(vim.tbl_count(spec.plugins) == 3) assert(#spec.plugins.bar.dependencies == 2) - assert(spec.plugins.bar.dep ~= true) + assert(spec.plugins.bar._.dep ~= true) assert(spec.plugins.bar.lazy == false) - assert(spec.plugins.dep1.dep == true) + assert(spec.plugins.dep1._.dep == true) assert(spec.plugins.dep1.lazy == true) - assert(spec.plugins.dep2.dep == true) + assert(spec.plugins.dep2._.dep == true) assert(spec.plugins.dep2.lazy == true) end end) @@ -57,11 +58,11 @@ describe("plugin spec opt", function() Config.plugins = spec.plugins Plugin.update_state() assert.same(3, vim.tbl_count(spec.plugins)) - assert(spec.plugins.bar.dep ~= true) + assert(spec.plugins.bar._.dep ~= true) assert(spec.plugins.bar.lazy == false) - assert(spec.plugins.dep2.dep == true) + assert(spec.plugins.dep2._.dep == true) assert(spec.plugins.dep2.lazy == true) - assert(spec.plugins.dep1.dep ~= true) + assert(spec.plugins.dep1._.dep ~= true) assert(spec.plugins.dep1.lazy == false) end) @@ -88,7 +89,7 @@ describe("plugin spec opt", function() Config.plugins = spec.plugins Plugin.update_state() assert.same(1, vim.tbl_count(spec.plugins)) - assert(spec.plugins.bar.dep ~= true) + assert(spec.plugins.bar._.dep ~= true) assert(spec.plugins.bar.lazy == true) end) From afcba52b1aa7f261eb37a9f6cce4e81cb44b8bec Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 19:16:21 +0100 Subject: [PATCH 0055/1610] fix: return nil when `fs_stat` fails and return nil in module loader --- lua/lazy/core/cache.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 551409d..3a8aa05 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -65,7 +65,10 @@ function M.loader(modname) if entry then M.check_load(modname, entry.modpath) entry.used = os.time() - local hash = assert(M.hash(entry.modpath)) + local hash = M.hash(entry.modpath) + if not hash then + return + end if M.eq(entry.hash, hash) then -- found in cache and up to date chunk, err = load(entry.chunk --[[@as string]], "@" .. entry.modpath) @@ -155,7 +158,8 @@ end ---@return CacheHash? function M.hash(file) - return uv.fs_stat(file) + local ok, ret = pcall(uv.fs_stat, file) + return ok and ret or nil end ---@param h1 CacheHash From 0ba218a065c956181ff62077979e96be8bbe3d6a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 19:17:38 +0100 Subject: [PATCH 0056/1610] feat: `Plugin.local` to use a local project instead of fetching remote --- lua/lazy/core/plugin.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 1a45afb..d3fb75d 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -34,6 +34,7 @@ local M = {} ---@field dir string ---@field enabled? boolean|(fun():boolean) ---@field lazy? boolean +---@field local? boolean ---@field dependencies? string[] ---@field _ LazyPluginState @@ -85,7 +86,7 @@ function Spec:add(plugin, is_dep) -- check for plugins that should be local for _, pattern in ipairs(Config.options.dev.patterns) do - if plugin[1]:find(pattern, 1, true) then + if plugin["local"] or plugin[1]:find(pattern, 1, true) then plugin.uri = Config.options.dev.path .. "/" .. plugin.name break end From 7ec65e4cd94425d08edcdab435372e4b67069d76 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 19:18:10 +0100 Subject: [PATCH 0057/1610] feat: temporary colorscheme to use during install during startup --- lua/lazy/core/config.lua | 10 +++++++++- lua/lazy/core/loader.lua | 7 ++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 6988342..2385f7b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -10,7 +10,6 @@ M.defaults = { -- version = "*", -- enable this to try installing the latest stable versions of plugins }, lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. - install_missing = true, -- install missing plugins on startup. This doesn't increase startup time. concurrency = nil, -- set to a number to limit the maximum amount of concurrent tasks git = { -- defaults for `Lazy log` @@ -30,6 +29,13 @@ M.defaults = { ---@type string[] patterns = {}, -- For example {"folke"} }, + install = { + -- install missing plugins on startup. This doesn't increase startup time. + missing = true, + -- try to load one of the colorschemes in this list when starting an install during startup + -- the first colorscheme that is found will be used + colorscheme = { "habamax" }, + }, ui = { -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", @@ -78,6 +84,8 @@ function M.setup(spec, opts) M.spec = spec M.options = vim.tbl_deep_extend("force", M.defaults, opts or {}) M.options.performance.cache = require("lazy.core.cache") + table.insert(M.options.install.colorscheme, "habamax") + M.root = M.options.package.path .. "/pack/" .. M.options.package.name .. "/opt" if M.options.performance.reset_packpath then diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 077cc04..e6c57e1 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -9,8 +9,13 @@ M.init_done = false function M.setup() -- install missing plugins - if Config.options.install_missing then + if Config.options.install.missing then Util.track("install") + for _, colorscheme in ipairs(Config.options.install.colorscheme) do + if pcall(vim.cmd.colorscheme, colorscheme) then + break + end + end for _, plugin in pairs(Config.plugins) do if not plugin._.installed then vim.cmd("do User LazyInstallPre") From ec858db225b3fb1cc17a795ad28baa425db20061 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 22:45:33 +0100 Subject: [PATCH 0058/1610] fix: temporary colorscheme should only load when installing --- lua/lazy/core/loader.lua | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index e6c57e1..36a1f68 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -11,14 +11,13 @@ function M.setup() -- install missing plugins if Config.options.install.missing then Util.track("install") - for _, colorscheme in ipairs(Config.options.install.colorscheme) do - if pcall(vim.cmd.colorscheme, colorscheme) then - break - end - end for _, plugin in pairs(Config.plugins) do if not plugin._.installed then - vim.cmd("do User LazyInstallPre") + for _, colorscheme in ipairs(Config.options.install.colorscheme) do + if pcall(vim.cmd.colorscheme, colorscheme) then + break + end + end require("lazy.manage").install({ wait = true }) break end From fbfa790d462fc3ab4de51bcb681e25a7771fa7b7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 22:48:38 +0100 Subject: [PATCH 0059/1610] refactor: `Plugin.local` => `Plugin.dev` --- lua/lazy/core/plugin.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index d3fb75d..cb76ed9 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -34,7 +34,7 @@ local M = {} ---@field dir string ---@field enabled? boolean|(fun():boolean) ---@field lazy? boolean ----@field local? boolean +---@field dev? boolean If set, then link to the respective folder under your ~/projects ---@field dependencies? string[] ---@field _ LazyPluginState @@ -86,7 +86,7 @@ function Spec:add(plugin, is_dep) -- check for plugins that should be local for _, pattern in ipairs(Config.options.dev.patterns) do - if plugin["local"] or plugin[1]:find(pattern, 1, true) then + if plugin.dev or plugin[1]:find(pattern, 1, true) then plugin.uri = Config.options.dev.path .. "/" .. plugin.name break end From 7b272b6ed66e21a15c6c95b00dec73be953b6554 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 00:12:49 +0100 Subject: [PATCH 0060/1610] feat: automatically detect config module changes in or oustside Neovim and reload --- README.md | 8 ++-- lua/lazy/core/config.lua | 3 +- lua/lazy/core/handler.lua | 4 +- lua/lazy/core/plugin.lua | 2 + lua/lazy/manage/init.lua | 3 +- lua/lazy/manage/reloader.lua | 82 ++++++++++++++++++++++++++++++++++++ 6 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 lua/lazy/manage/reloader.lua diff --git a/README.md b/README.md index a0fb32b..e8d1edb 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,8 @@ - [ ] other package manager artifacts still present? compiled etc - [x] rename `run` to `build` - [ ] delete lazy keymaps when a plugin loads -- [ ] temp colorscheme -- [x] allow setting up plugins through config +- [x] temp colorscheme +- [x] allow setting up plugins through config **fooo** - [x] task timeout - [ ] log file - [ ] deal with re-sourcing init.lua. Check a global? @@ -38,10 +38,10 @@ - [ ] git tests - [x] max concurrency - [x] ui border -- [ ] make sure we can reload specs while keeping state +- [x] make sure we can reload specs while keeping state - [ ] show disabled plugins (strikethrough?) - [ ] Import specs from other plugin managers -- [ ] use uv file watcher (or stat) to check for config changes +- [x] use uv file watcher (or stat) to check for config changes - [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 2385f7b..cc27d0c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -33,7 +33,7 @@ M.defaults = { -- install missing plugins on startup. This doesn't increase startup time. missing = true, -- try to load one of the colorschemes in this list when starting an install during startup - -- the first colorscheme that is found will be used + -- the first colorscheme that is found will be loaded colorscheme = { "habamax" }, }, ui = { @@ -100,6 +100,7 @@ function M.setup(spec, opts) callback = function() require("lazy.core.cache").autosave() require("lazy.view").setup() + require("lazy.manage.reloader").enable() end, }) diff --git a/lua/lazy/core/handler.lua b/lua/lazy/core/handler.lua index b862d02..043853b 100644 --- a/lua/lazy/core/handler.lua +++ b/lua/lazy/core/handler.lua @@ -63,7 +63,9 @@ function M.trigger(groups, events, pattern) end Util.info(lines) end - vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false }) + Util.try(function() + vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false }) + end) end end end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index cb76ed9..b83cd5a 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -195,6 +195,8 @@ function M.spec() -- spec is a module local function _load(name) local modname = name and (Config.spec .. "." .. name) or Config.spec + -- unload the module so we get a clean slate + ---@diagnostic disable-next-line: no-unknown package.loaded[modname] = nil Util.try(function() spec:normalize(require(modname)) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index ce8c169..8817c16 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -115,7 +115,6 @@ end ---@param opts? ManagerOpts function M.clean(opts) - Plugin.update_state() M.run({ pipeline = { "fs.clean" }, plugins = Config.to_clean, @@ -123,7 +122,7 @@ function M.clean(opts) end function M.clear() - Plugin.update_state() + Plugin.load() for _, plugin in pairs(Config.plugins) do plugin._.updated = nil plugin._.cloned = nil diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua new file mode 100644 index 0000000..61d4407 --- /dev/null +++ b/lua/lazy/manage/reloader.lua @@ -0,0 +1,82 @@ +local Cache = require("lazy.core.cache") +local Config = require("lazy.core.config") +local Util = require("lazy.util") +local Plugin = require("lazy.core.plugin") + +local M = {} + +---@type table +M.files = {} + +---@type vim.loop.Timer +M.timer = nil +M.main = nil +M.root = nil + +function M.enable() + if M.timer then + M.timer:stop() + end + if type(Config.spec) == "string" then + M.timer = vim.loop.new_timer() + M.root = vim.fn.stdpath("config") .. "/lua/" .. Config.spec:gsub("%.", "/") + M.main = vim.loop.fs_stat(M.root .. ".lua") and (M.root .. ".lua") or (M.root .. "/init.lua") + M.check(true) + M.timer:start(2000, 2000, M.check) + end +end + +function M.disable() + if M.timer then + M.timer:stop() + M.timer = nil + end +end + +function M.check(start) + ---@type table + local checked = {} + ---@type {file:string, what:string}[] + local changes = {} + + -- spec is a module + local function check(_, modpath) + checked[modpath] = true + local hash = Cache.hash(modpath) + if hash then + if M.files[modpath] then + if not Cache.eq(M.files[modpath], hash) then + M.files[modpath] = hash + table.insert(changes, { file = modpath, what = "changed" }) + end + else + M.files[modpath] = hash + table.insert(changes, { file = modpath, what = "added" }) + end + end + end + + check(nil, M.main) + Util.lsmod(M.root, check) + + for file in pairs(M.files) do + if not checked[file] then + table.insert(changes, { file = file, what = "deleted" }) + M.files[file] = nil + end + end + + if not (start or #changes == 0) then + vim.schedule(function() + local lines = { "# Config Change Detected. Reloading...", "" } + for _, change in ipairs(changes) do + table.insert(lines, "- **" .. change.what .. "**: `" .. vim.fn.fnamemodify(change.file, ":p:~:.") .. "`") + end + Util.warn(lines) + Plugin.load() + vim.cmd([[do User LazyRender]]) + end) + end +end + +return M From 37c7366ab02458472d97d8e35ed50583452bfe91 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 15:31:21 +0100 Subject: [PATCH 0061/1610] feat: symlinking local plugins is no longer needed --- lua/lazy/core/plugin.lua | 20 +++++++------- lua/lazy/manage/init.lua | 2 -- lua/lazy/manage/task/fs.lua | 53 +++++++++++-------------------------- 3 files changed, 25 insertions(+), 50 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index b83cd5a..659c45f 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -16,7 +16,6 @@ local M = {} ---@field dirty? boolean ---@field updated? {from:string, to:string} ---@field is_local boolean ----@field is_symlink? boolean ---@field cloned? boolean ---@field dep? boolean True if this plugin is only in the spec as a dependency @@ -165,11 +164,13 @@ function M.update_state() or plugin.cmd plugin.lazy = lazy and true or false end - plugin.dir = Config.root .. "/" .. plugin.name - plugin._.is_local = plugin.uri:sub(1, 4) ~= "http" and plugin.uri:sub(1, 3) ~= "git" - plugin._.is_symlink = installed[plugin.name] == "link" - plugin._.installed = installed[plugin.name] ~= nil - if plugin._.is_local == plugin._.is_symlink then + if plugin.uri:sub(1, 4) ~= "http" and plugin.uri:sub(1, 3) ~= "git" then + plugin._.is_local = true + plugin.dir = plugin.uri + plugin._.installed = true -- user should make sure the directory exists + else + plugin.dir = Config.root .. "/" .. plugin.name + plugin._.installed = installed[plugin.name] ~= nil installed[plugin.name] = nil end end @@ -240,11 +241,8 @@ end -- Finds the plugin that has this path ---@param path string function M.find(path) - if path:find(Config.root, 1, true) == 1 then - local plugin = path:sub(#Config.root + 2) - local idx = plugin:find("/", 1, true) - return idx and Config.plugins[plugin:sub(1, idx - 1)] or nil - end + local name = path:match("/([^/]+)/lua") or path:match("/([^/]+)/?$") + return name and Config.plugins[name] or nil end return M diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 8817c16..2e22e93 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -54,7 +54,6 @@ end function M.install(opts) M.run({ pipeline = { - "fs.symlink", "git.clone", "git.checkout", "plugin.docs", @@ -72,7 +71,6 @@ function M.update(opts) opts = opts or {} M.run({ pipeline = { - "fs.symlink", "git.branch", "git.fetch", { "git.checkout", lockfile = opts.lockfile }, diff --git a/lua/lazy/manage/task/fs.lua b/lua/lazy/manage/task/fs.lua index 47659d9..57839f4 100644 --- a/lua/lazy/manage/task/fs.lua +++ b/lua/lazy/manage/task/fs.lua @@ -1,52 +1,31 @@ local Util = require("lazy.util") +local Config = require("lazy.core.config") ---@type table local M = {} M.clean = { + skip = function(plugin) + return plugin._.is_local + end, run = function(self) local dir = self.plugin.dir:gsub("/+$", "") - local stat = vim.loop.fs_lstat(dir) + assert(dir:find(Config.root, 1, true) == 1, self.plugin.dir .. " should be under packpath!") - if stat.type == "directory" then - Util.walk(dir, function(path, _, type) - if type == "directory" then - vim.loop.fs_rmdir(path) - else - vim.loop.fs_unlink(path) - end - end) - vim.loop.fs_rmdir(dir) - else - vim.loop.fs_unlink(dir) - end + local stat = vim.loop.fs_lstat(dir) + assert(stat.type == "directory", self.plugin.dir .. " should be a directory!") + + Util.walk(dir, function(path, _, type) + if type == "directory" then + vim.loop.fs_rmdir(path) + else + vim.loop.fs_unlink(path) + end + end) + vim.loop.fs_rmdir(dir) self.plugin._.installed = false end, } -M.symlink = { - skip = function(plugin) - if not plugin._.is_local then - return true - end - return not plugin._.is_symlink and plugin._.installed - end, - run = function(self) - local stat = vim.loop.fs_lstat(self.plugin.dir) - if stat then - if vim.loop.fs_realpath(self.plugin.uri) == vim.loop.fs_realpath(self.plugin.dir) then - self.plugin._.installed = true - return - else - vim.loop.fs_unlink(self.plugin.dir) - end - end - vim.loop.fs_symlink(self.plugin.uri, self.plugin.dir, { dir = true }) - vim.opt.runtimepath:append(self.plugin.uri) - self.plugin._.installed = true - self.plugin._.cloned = true - end, -} - return M From dbe2d0942a88c1211820c2e96d719c63735e976a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 15:48:06 +0100 Subject: [PATCH 0062/1610] feat: plugins no longer need to be installed under site/pack/*/opt --- lua/lazy/core/config.lua | 14 ++------------ lua/lazy/core/loader.lua | 5 +++-- lua/lazy/core/plugin.lua | 6 +++--- lua/lazy/core/util.lua | 4 ++-- lua/lazy/manage/task/fs.lua | 2 +- lua/lazy/manage/task/plugin.lua | 3 +++ 6 files changed, 14 insertions(+), 20 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index cc27d0c..f4405e8 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -4,6 +4,7 @@ local M = {} ---@class LazyConfig M.defaults = { + root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed defaults = { lazy = false, -- should plugins be loaded at startup? version = nil, @@ -17,10 +18,6 @@ M.defaults = { log = { "--since=1 days ago" }, -- commits from the last 3 days timeout = 120, -- processes taking over 2 minutes will be killed }, - package = { - path = vim.fn.stdpath("data") .. "/site", - name = "lazy", -- plugins will be installed under package.path/pack/{name}/opt - }, -- Any plugin spec that contains one of the patterns will use your -- local repo in the projects folder instead of fetchig it from github -- Mostly useful for plugin developers. @@ -66,9 +63,6 @@ M.ns = vim.api.nvim_create_namespace("lazy") ---@type string|LazySpec Should be either a string pointing to a module, or a spec M.spec = nil ----@type string Opt directory where plugins will be installed -M.root = nil - ---@type table M.plugins = {} @@ -86,12 +80,8 @@ function M.setup(spec, opts) M.options.performance.cache = require("lazy.core.cache") table.insert(M.options.install.colorscheme, "habamax") - M.root = M.options.package.path .. "/pack/" .. M.options.package.name .. "/opt" - if M.options.performance.reset_packpath then - vim.go.packpath = M.options.package.path - else - vim.opt.packpath:prepend(M.options.package.path) + vim.go.packpath = "" end vim.api.nvim_create_autocmd("User", { diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 36a1f68..f187dcc 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -102,11 +102,12 @@ function M.load(plugins, reason) end ---@param plugin LazyPlugin -function M.packadd(plugin) +---@param force? boolean +function M.packadd(plugin, force) -- FIXME: investigate further what else is needed -- vim.cmd.packadd(plugin.name) -- M.source_runtime(plugin, "/after/plugin") - if M.init_done then + if M.init_done or force then M.source_runtime(plugin, "/plugin") if vim.g.did_load_filetypes == 1 then M.source_runtime(plugin, "/ftdetect") diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 659c45f..fde3acf 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -147,7 +147,7 @@ end function M.update_state() ---@type table local installed = {} - Util.ls(Config.root, function(_, name, type) + Util.ls(Config.options.root, function(_, name, type) if type == "directory" or type == "link" then installed[name] = type end @@ -169,7 +169,7 @@ function M.update_state() plugin.dir = plugin.uri plugin._.installed = true -- user should make sure the directory exists else - plugin.dir = Config.root .. "/" .. plugin.name + plugin.dir = Config.options.root .. "/" .. plugin.name plugin._.installed = installed[plugin.name] ~= nil installed[plugin.name] = nil end @@ -179,7 +179,7 @@ function M.update_state() for pack, dir_type in pairs(installed) do table.insert(Config.to_clean, { name = pack, - dir = Config.root .. "/" .. pack, + dir = Config.options.root .. "/" .. pack, _ = { installed = true, is_symlink = dir_type == "link", diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index fb93edd..cd73492 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -40,8 +40,8 @@ function M.try(fn, msg) end if info.what ~= "C" and not info.source:find("lazy.nvim") then local source = info.source:sub(2) - if source:find(Config.root, 1, true) == 1 then - source = source:sub(#Config.root + 1) + if source:find(Config.options.root, 1, true) == 1 then + source = source:sub(#Config.options.root + 1) end source = vim.fn.fnamemodify(source, ":p:~:.") local line = " - " .. source .. ":" .. info.currentline diff --git a/lua/lazy/manage/task/fs.lua b/lua/lazy/manage/task/fs.lua index 57839f4..9386f76 100644 --- a/lua/lazy/manage/task/fs.lua +++ b/lua/lazy/manage/task/fs.lua @@ -10,7 +10,7 @@ M.clean = { end, run = function(self) local dir = self.plugin.dir:gsub("/+$", "") - assert(dir:find(Config.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!") local stat = vim.loop.fs_lstat(dir) assert(stat.type == "directory", self.plugin.dir .. " should be a directory!") diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 329d75c..7fcf815 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -10,6 +10,9 @@ M.build = { end, run = function(self) Loader.load(self.plugin, { task = "build" }) + -- when installing during startup, add the package + -- to make sure all runtime files are loaded + Loader.packadd(self.plugin, true) local build = self.plugin.build if build then From 6affae64545da6efd2940589bff8253c08bc7252 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 3 Dec 2022 14:48:54 +0000 Subject: [PATCH 0063/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f368b59..3b87633 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 02 +*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 03 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -45,7 +45,7 @@ TODO *lazy.nvim-todo* - rename `run` to `build` - delete lazy keymaps when a plugin loads - temp colorscheme -- allow setting up plugins through config +- allow setting up plugins through config **fooo** - task timeout - log file - deal with re-sourcing init.lua. Check a global? From ccc506d5f71af1cce97ebde0c780f7a6454e2ace Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 17:42:54 +0100 Subject: [PATCH 0064/1610] perf: added option to reset rtp to just your config and the neovim runtime --- lua/lazy/core/config.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f4405e8..56d8352 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -54,6 +54,7 @@ M.defaults = { ---@type LazyCacheConfig cache = nil, reset_packpath = true, -- packpath will be reset to only include lazy. This makes packadd a lot faster + reset_rtp = true, }, debug = false, } @@ -83,6 +84,15 @@ function M.setup(spec, opts) if M.options.performance.reset_packpath then vim.go.packpath = "" end + if M.options.performance.reset_rtp then + local me = debug.getinfo(1, "S").source:sub(2) + me = vim.fn.fnamemodify(me, ":p:h:h:h:h") + vim.opt.rtp = { + vim.fn.stdpath("config"), + "$VIMRUNTIME", + me, + } + end vim.api.nvim_create_autocmd("User", { pattern = "VeryLazy", From 93d30722a011c831cce1395178b6effc1d5242de Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 17:43:55 +0100 Subject: [PATCH 0065/1610] fix: add plugin after dir to rtp for start plugins so it gets picked up during startup --- lua/lazy/core/loader.lua | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index f187dcc..9e899fa 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -37,18 +37,23 @@ end function M.init_plugins() Util.track("loader") + Util.track({ start = "init" }) for _, plugin in pairs(Config.plugins) do + -- run plugin init if plugin.init then Util.track({ plugin = plugin.name, init = "init" }) Util.try(plugin.init, "Failed to run `init` for **" .. plugin.name .. "**") Util.track() end + + -- load start plugin if plugin.lazy == false then M.load(plugin, { start = "startup" }) end end Util.track() + Util.track() M.init_done = true end @@ -82,6 +87,15 @@ function M.load(plugins, reason) Util.track({ plugin = plugin.name, start = reason.start }) vim.opt.runtimepath:prepend(plugin.dir) + if not M.init_done then + local after = plugin.dir .. "/after" + -- only add the after directories during startup + -- afterwards we only source the runtime files in after + -- Check if it exists here, to prevent further rtp file checks during startup + if vim.loop.fs_stat(after) then + vim.opt.runtimepath:append(after) + end + end if plugin.dependencies then M.load(plugin.dependencies, {}) @@ -102,24 +116,23 @@ function M.load(plugins, reason) end ---@param plugin LazyPlugin ----@param force? boolean -function M.packadd(plugin, force) +function M.packadd(plugin) -- FIXME: investigate further what else is needed -- vim.cmd.packadd(plugin.name) -- M.source_runtime(plugin, "/after/plugin") - if M.init_done or force then - M.source_runtime(plugin, "/plugin") + if M.init_done then + M.source_runtime(plugin.dir, "/plugin") if vim.g.did_load_filetypes == 1 then - M.source_runtime(plugin, "/ftdetect") + M.source_runtime(plugin.dir, "/ftdetect") end - M.source_runtime(plugin, "/after/plugin") + M.source_runtime(plugin.dir, "/after/plugin") end end ----@param plugin LazyPlugin ----@param dir? string -function M.source_runtime(plugin, dir) - Util.walk(plugin.dir .. dir, function(path, _, t) +---@param ... string +function M.source_runtime(...) + local dir = table.concat({ ... }, "/") + Util.walk(dir, function(path, _, t) local ext = path:sub(-3) if t == "file" and (ext == "lua" or ext == "vim") then vim.cmd("silent source " .. path) From 3ed24baeb0c58eb24da605a57ccfdb65d1e89b47 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 17:45:40 +0100 Subject: [PATCH 0066/1610] fix: source plugin files for plugins that want to run a build script during startup --- lua/lazy/core/loader.lua | 6 +++--- lua/lazy/manage/task/plugin.lua | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 9e899fa..af36abc 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -121,11 +121,11 @@ function M.packadd(plugin) -- vim.cmd.packadd(plugin.name) -- M.source_runtime(plugin, "/after/plugin") if M.init_done then - M.source_runtime(plugin.dir, "/plugin") + M.source_runtime(plugin.dir, "plugin") if vim.g.did_load_filetypes == 1 then - M.source_runtime(plugin.dir, "/ftdetect") + M.source_runtime(plugin.dir, "ftdetect") end - M.source_runtime(plugin.dir, "/after/plugin") + M.source_runtime(plugin.dir, "after/plugin") end end diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 7fcf815..c1703c4 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -10,9 +10,10 @@ M.build = { end, run = function(self) Loader.load(self.plugin, { task = "build" }) - -- when installing during startup, add the package - -- to make sure all runtime files are loaded - Loader.packadd(self.plugin, true) + + -- we need to source its plugin files before startup, + -- to make sure the build command has everything available + Loader.source_runtime(self.plugin.dir, "plugin") local build = self.plugin.build if build then From 24424f59a08d4135fedc01d72ff9c827694b8fa4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 17:46:10 +0100 Subject: [PATCH 0067/1610] docs: added pact.nvim --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e8d1edb..d09bc19 100644 --- a/README.md +++ b/README.md @@ -82,3 +82,4 @@ - [neopm](https://github.com/ii14/neopm) - [dep](https://github.com/chiyadev/dep) - [optpack.nvim](https://github.com/notomo/optpack.nvim) +- [pact.nvim](https://github.com/rktjmp/pact.nvim) From df95e60bdcc981d8669337d66d80ea6294af63cd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 3 Dec 2022 16:47:26 +0000 Subject: [PATCH 0068/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 3b87633..3fd6211 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -100,6 +100,7 @@ OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-other-neovim-plugin-managers-in-lu - neopm - dep - optpack.nvim +- pact.nvim Generated by panvimdoc From c1e44cbc3f6673510838a9bd508791ee8099dbee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Dec 2022 17:50:13 +0100 Subject: [PATCH 0069/1610] chore(main): release 2.1.0 (#6) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9601ec..b1c9529 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog +## [2.1.0](https://github.com/folke/lazy.nvim/compare/v2.0.0...v2.1.0) (2022-12-03) + + +### Features + +* `Plugin.local` to use a local project instead of fetching remote ([0ba218a](https://github.com/folke/lazy.nvim/commit/0ba218a065c956181ff62077979e96be8bbe3d6a)) +* `Plugin.specs()` can now reload and keeps existing state ([330dbe7](https://github.com/folke/lazy.nvim/commit/330dbe72031e642d2cd04b671c6eb498d96e4b71)) +* added debug option ([e4cf8b1](https://github.com/folke/lazy.nvim/commit/e4cf8b141681657922643e70ec21b9f9133e9fca)) +* automatically detect config module changes in or oustside Neovim and reload ([7b272b6](https://github.com/folke/lazy.nvim/commit/7b272b6ed66e21a15c6c95b00dec73be953b6554)) +* for `event=`, fire any new autocmds created by loading the plugins for the event ([ebf15fc](https://github.com/folke/lazy.nvim/commit/ebf15fc198d6c82f64c17e0b752a30fd4c3cdbc7)) +* moved Config.package.reset -> Config.performance.reset_packpath ([fe6b0b0](https://github.com/folke/lazy.nvim/commit/fe6b0b03ead3cfeb3f9bcc365c0364346c8e3c9d)) +* plugins no longer need to be installed under site/pack/*/opt ([dbe2d09](https://github.com/folke/lazy.nvim/commit/dbe2d0942a88c1211820c2e96d719c63735e976a)) +* symlinking local plugins is no longer needed ([37c7366](https://github.com/folke/lazy.nvim/commit/37c7366ab02458472d97d8e35ed50583452bfe91)) +* temporary colorscheme to use during install during startup ([7ec65e4](https://github.com/folke/lazy.nvim/commit/7ec65e4cd94425d08edcdab435372e4b67069d76)) + + +### Bug Fixes + +* add plugin after dir to rtp for start plugins so it gets picked up during startup ([93d3072](https://github.com/folke/lazy.nvim/commit/93d30722a011c831cce1395178b6effc1d5242de)) +* **fs:** dont set cloned=true if symlink already existed ([3e143c6](https://github.com/folke/lazy.nvim/commit/3e143c6017ba3c17dd249492cc86e0d2f2750229)) +* **git:** fixed branch detection, get target commit from origin and always checkout a tag or commit so we dont need to use git merge ([ae379a6](https://github.com/folke/lazy.nvim/commit/ae379a62dcaa0854086c6763672b806d3175b91c)) +* respect --noplugin ([59fb050](https://github.com/folke/lazy.nvim/commit/59fb0507677628c16425dc2741f005f5394e8102)) +* return nil when `fs_stat` fails and return nil in module loader ([afcba52](https://github.com/folke/lazy.nvim/commit/afcba52b1aa7f261eb37a9f6cce4e81cb44b8bec)) +* source plugin files for plugins that want to run a build script during startup ([3ed24ba](https://github.com/folke/lazy.nvim/commit/3ed24baeb0c58eb24da605a57ccfdb65d1e89b47)) +* temporary colorscheme should only load when installing ([ec858db](https://github.com/folke/lazy.nvim/commit/ec858db225b3fb1cc17a795ad28baa425db20061)) + + +### Performance Improvements + +* added option to reset rtp to just your config and the neovim runtime ([ccc506d](https://github.com/folke/lazy.nvim/commit/ccc506d5f71af1cce97ebde0c780f7a6454e2ace)) +* caching strategy is now configurable ([6fe425c](https://github.com/folke/lazy.nvim/commit/6fe425c91acbf2b9b948b23673e22a0c61150249)) + ## [2.0.0](https://github.com/folke/lazy.nvim/compare/v1.2.0...v2.0.0) (2022-12-02) From b2727d98a3ac49cdf462e2bdf5f195dc572a91a4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 18:59:28 +0100 Subject: [PATCH 0070/1610] perf: disable cache by default on VimEnter or on BufReadPre --- lua/lazy/core/cache.lua | 33 +++++++++------------------------ lua/lazy/init.lua | 11 +---------- 2 files changed, 10 insertions(+), 34 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 3a8aa05..12d9394 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -9,13 +9,12 @@ M.dirty = false M.config = { enabled = true, path = vim.fn.stdpath("state") .. "/lazy.state", - -- choose what should be cached - -- * lazy: cache all lazy.nvim core modules and your config files - -- * init: all of the above and any module needed to init your plugins - -- * VimEnter: any module till VimEnter - -- * VeryLazy: any module till VeryLazy - -- * allthethings: all mdules. Not recommended - strategy = "VimEnter", ---@type "lazy"|"init"|"VimEnter"|"allthethings" + -- Once one of the following events triggers, caching will be disabled. + -- To cache all modules, set this to `{}`, but that is not recommended. + -- The default is to disable on: + -- * VimEnter: not useful to cache anything else beyond startup + -- * BufReadPre: this will be triggered early when opening a file from the command line directly + disable_events = { "VimEnter", "BufReadPre" }, } M.debug = false @@ -40,15 +39,10 @@ function M.check_load(modname, modpath) require("lazy.core.loader").autoload(modname, modpath) end ----@param step? string -function M.disable(step) +function M.disable() if not M.enabled then return end - if step and M.config.strategy ~= step then - return - end - local idx = M.idx() if idx then table.remove(package.loaders, idx) @@ -141,17 +135,8 @@ function M.setup(opts) M.load_cache() table.insert(package.loaders, M.loader_idx, M.loader) - if M.config.strategy == "VimEnter" then - vim.api.nvim_create_autocmd("VimEnter", { - once = true, - callback = function() - -- use schedule so all other VimEnter handlers will have run - vim.schedule(function() - -- startup done, so stop caching - M.disable() - end) - end, - }) + if #M.config.disable_events > 0 then + vim.api.nvim_create_autocmd(M.config.disable_events, { once = true, callback = M.disable }) end return M end diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 1883d82..103bffe 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -8,10 +8,9 @@ function M.setup(spec, opts) end local start = vim.loop.hrtime() - local Cache if not (opts and opts.performance and opts.performance.cache and opts.performance.cache.enabled == false) then -- load module cache before anything else - Cache = require("lazy.core.cache").setup(opts) + require("lazy.core.cache").setup(opts) end local Util = require("lazy.core.util") @@ -40,17 +39,9 @@ function M.setup(spec, opts) Config.plugins["lazy.nvim"]._.loaded = { time = delta, source = "init.lua" } end - if Cache then - Cache.disable("lazy") - end - -- load plugins with lazy=false or Plugin.init Loader.init_plugins() - if Cache then - Cache.disable("init") - end - -- all done! vim.cmd("do User LazyDone") end From 6e44be0f2d543b680041be669a93377291b9132f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 21:06:50 +0100 Subject: [PATCH 0071/1610] fix(ui): always show branch name in details --- lua/lazy/view/render.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index b76bacf..7388d13 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -361,6 +361,7 @@ function M:details(plugin) table.insert(props, { "uri", (plugin.uri:gsub("%.git$", "")), "@text.reference" }) local git = Git.info(plugin.dir, true) if git then + git.branch = git.branch or Git.get_branch(plugin) if git.version then table.insert(props, { "version", tostring(git.version) }) end From 13b568848775de3adfd17a410ec482c1e03da489 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 21:07:11 +0100 Subject: [PATCH 0072/1610] feat(ui): show any helps files and added hover handler --- lua/lazy/view/init.lua | 1 + lua/lazy/view/render.lua | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 645ef38..ab6307c 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -155,6 +155,7 @@ function M.show(mode) local plugin = get_plugin() Util.open(plugin.dir .. "/README.md") end, + ["|(%S-)|"] = vim.cmd.help, -- vim help links ["(https?://%S+)"] = function(url) Util.open(url) end, diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 7388d13..f9689bd 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -376,6 +376,11 @@ function M:details(plugin) if Util.file_exists(plugin.dir .. "/README.md") then table.insert(props, { "readme", "README.md" }) end + Util.ls(plugin.dir .. "/doc", function(_, name) + if name:find("%.txt$") then + table.insert(props, { "help", "|" .. name:gsub("%.txt", "") .. "|" }) + end + end) for handler in pairs(Handler.handlers) do if plugin[handler] then From c98e722fa41e0aa94809e44edf859216afedd8ad Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 21:08:35 +0100 Subject: [PATCH 0073/1610] fix: always add config/after to rtp --- lua/lazy/core/config.lua | 9 +++++---- lua/lazy/core/loader.lua | 4 ---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 56d8352..1fc1936 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -6,7 +6,7 @@ local M = {} M.defaults = { root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed defaults = { - lazy = false, -- should plugins be loaded at startup? + lazy = false, -- should plugins be lazy-loaded? version = nil, -- version = "*", -- enable this to try installing the latest stable versions of plugins }, @@ -53,8 +53,8 @@ M.defaults = { performance = { ---@type LazyCacheConfig cache = nil, - reset_packpath = true, -- packpath will be reset to only include lazy. This makes packadd a lot faster - reset_rtp = true, + reset_packpath = true, -- packpath will be reset to nothing. This will improver startup time. + reset_rtp = true, -- the runtime path will be reset to $VIMRUNTIME and your config directory }, debug = false, } @@ -88,9 +88,10 @@ function M.setup(spec, opts) local me = debug.getinfo(1, "S").source:sub(2) me = vim.fn.fnamemodify(me, ":p:h:h:h:h") vim.opt.rtp = { - vim.fn.stdpath("config"), "$VIMRUNTIME", + vim.fn.stdpath("config"), me, + vim.fn.stdpath("config") .. "/after", } end diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index af36abc..d57ccc3 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -36,8 +36,6 @@ function M.setup() end function M.init_plugins() - Util.track("loader") - Util.track({ start = "init" }) for _, plugin in pairs(Config.plugins) do -- run plugin init @@ -52,8 +50,6 @@ function M.init_plugins() M.load(plugin, { start = "startup" }) end end - Util.track() - Util.track() M.init_done = true end From 3f517abfa43ec9410315e205c1ee3798b66e1153 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 23:15:50 +0100 Subject: [PATCH 0074/1610] feat: cleanup keys/cmd handlers when loading a plugin --- README.md | 24 +++-- lua/lazy/core/handler.lua | 213 +++++++++++++++++++++++--------------- lua/lazy/core/loader.lua | 3 +- lua/lazy/core/plugin.lua | 2 +- lua/lazy/core/util.lua | 9 +- lua/lazy/view/render.lua | 2 +- 6 files changed, 154 insertions(+), 99 deletions(-) diff --git a/README.md b/README.md index d09bc19..00ce00d 100644 --- a/README.md +++ b/README.md @@ -27,26 +27,28 @@ - [ ] unsupported props or props from other managers - [ ] other packages still in site? - [ ] other package manager artifacts still present? compiled etc -- [x] rename `run` to `build` -- [ ] delete lazy keymaps when a plugin loads -- [x] temp colorscheme -- [x] allow setting up plugins through config **fooo** -- [x] task timeout +- [ ] status page showing running handlers and cache stats +- [x] delete lazy keymaps when a plugin loads. Reset handlers for a plugin? +- [ ] fix plugin details +- [ ] show disabled plugins (strikethrough?) - [ ] log file - [ ] deal with re-sourcing init.lua. Check a global? -- [x] incorrect when switching TN from opt to start - [ ] git tests -- [x] max concurrency -- [x] ui border -- [x] make sure we can reload specs while keeping state -- [ ] show disabled plugins (strikethrough?) - [ ] Import specs from other plugin managers -- [x] use uv file watcher (or stat) to check for config changes - [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? - [ ] package meta index (package.lua cache for all packages) +- [x] rename `run` to `build` +- [x] temp colorscheme +- [x] allow setting up plugins through config **fooo** +- [x] task timeout +- [x] incorrect when switching TN from opt to start +- [x] max concurrency +- [x] ui border +- [x] make sure we can reload specs while keeping state +- [x] use uv file watcher (or stat) to check for config changes - [x] support for Plugin.lock - [x] defaults for git log - [x] view keybindings for update/clean/... diff --git a/lua/lazy/core/handler.lua b/lua/lazy/core/handler.lua index 043853b..111bca5 100644 --- a/lua/lazy/core/handler.lua +++ b/lua/lazy/core/handler.lua @@ -1,5 +1,4 @@ local Util = require("lazy.core.util") -local Loader = require("lazy.core.loader") local Config = require("lazy.core.config") ---@class LazyPluginHandlers @@ -10,29 +9,89 @@ local Config = require("lazy.core.config") local M = {} +---@enum LazyPluginHandlerTYpes +M.types = { + keys = "keys", + event = "event", + cmd = "cmd", + ft = "ft", +} + +M.trigger_events = { + BufRead = { "BufReadPre", "BufRead" }, + BufReadPost = { "BufReadPre", "BufRead", "BufReadPost" }, +} + ---@alias LazyHandler fun(grouped:table) function M.setup() - for key, handler in pairs(M.handlers) do - ---@type table - local group = {} - for _, plugin in pairs(Config.plugins) do - if plugin[key] then - ---@diagnostic disable-next-line: no-unknown - for _, value in pairs(type(plugin[key]) == "table" and plugin[key] or { plugin[key] }) do - group[value] = group[value] or {} - table.insert(group[value], plugin.name) - end + M.cmd() + M.event() + M.ft() + M.keys() +end + +---@param key string +---@param fn fun(plugins:LazyPlugin[], value:string) +function M.foreach_group(key, fn) + ---@type table + local group = {} + for _, plugin in pairs(Config.plugins) do + if plugin[key] then + ---@diagnostic disable-next-line: no-unknown + for _, value in pairs(type(plugin[key]) == "table" and plugin[key] or { plugin[key] }) do + group[value] = group[value] or {} + table.insert(group[value], plugin.name) end end - handler(group) + end + for value, plugins in pairs(group) do + fn(plugins, value) end end ----@param events string|string[] +---@param key string +---@param fn fun(plugin:LazyPlugin, value:string) +function M.foreach_value(key, fn) + for _, plugin in pairs(Config.plugins) do + ---@type string|string[]|nil + local values = plugin[key] + if values then + if type(values) == "string" then + fn(plugin, values) + else + for _, value in ipairs(values) do + fn(plugin, value) + end + end + end + end +end + +---@param plugin LazyPlugin +function M.cleanup(plugin) + if plugin.keys then + local keys = type(plugin.keys) == "string" and { plugin.keys } or plugin.keys + ---@cast keys string[] + for _, k in ipairs(keys) do + pcall(vim.keymap.del, "n", k) + end + end + + if plugin.cmd then + local cmd = type(plugin.cmd) == "string" and { plugin.cmd } or plugin.cmd + ---@cast cmd string[] + for _, c in ipairs(cmd) do + pcall(vim.api.nvim_del_user_command, c) + end + end +end + +-- Get all augroups for the events +---@param event string ---@param pattern? string -function M.get_augroups(events, pattern) - -- Check for all autocmd groups listening for the events +function M.get_augroups(event, pattern) + local events = M.trigger_events[event] or { event } ---@type table local groups = {} for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events, pattern = pattern })) do @@ -43,25 +102,22 @@ function M.get_augroups(events, pattern) return groups end ----@param groups table ----@param events string|string[] +---@param event string|string[] ---@param pattern? string -function M.trigger(groups, events, pattern) - events = type(events) == "string" and { events } or events +---@param groups table +function M.trigger(event, pattern, groups) + local events = M.trigger_events[event] or { event } ---@cast events string[] - for _, event in ipairs(events) do - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = event, pattern = pattern })) do - if autocmd.event == event and autocmd.group and not groups[autocmd.group] then + for _, e in ipairs(events) do + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = e, pattern = pattern })) do + if autocmd.event == e and autocmd.group and not groups[autocmd.group] then if Config.options.debug then - local lines = { + Util.info({ "# Firing Events", - " - **event:** " .. autocmd.event, " - **group:** `" .. autocmd.group_name .. "`", - } - if pattern then - table.insert(lines, 2, "- **pattern:** " .. pattern) - end - Util.info(lines) + " - **event:** " .. autocmd.event, + pattern and "- **pattern:** ", + }) end Util.try(function() vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false }) @@ -71,61 +127,48 @@ function M.trigger(groups, events, pattern) end end ----@type table -M.handlers = {} -function M.handlers.event(grouped) +function M.event() + local Loader = require("lazy.core.loader") local group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) - for event_spec, plugins in pairs(grouped) do - if event_spec == "VeryLazy" then - event_spec = "User VeryLazy" - end - if event_spec == "VimEnter" and vim.v.vim_did_enter == 1 then - Loader.load(plugins, { event = event_spec }) - else - local event, pattern = event_spec:match("^(%w+)%s+(.*)$") - event = event or event_spec - vim.api.nvim_create_autocmd(event, { - group = group, - once = true, - pattern = pattern, - callback = function() - Util.track({ event = event_spec }) - local events = { event } - if event == "BufRead" then - events = { "BufReadPre", "BufRead" } - elseif event == "BufReadPost" then - events = { "BufReadPre", "BufRead", "BufReadPost" } - end - local groups = M.get_augroups(events, pattern) - - -- load the plugins - Loader.load(plugins, { event = event_spec }) - - -- check if any plugin created an event handler for this event and fire the group - M.trigger(groups, events, pattern) - Util.track() - end, - }) - end - end + M.foreach_group("event", function(plugins, event_spec) + event_spec = event_spec == "VeryLazy" and "User VeryLazy" or event_spec + local event, pattern = event_spec:match("^(%w+)%s+(.*)$") + event = event or event_spec + vim.api.nvim_create_autocmd(event, { + group = group, + once = true, + pattern = pattern, + callback = function() + Util.track({ event = event_spec }) + local groups = M.get_augroups(event, pattern) + -- load the plugins + Loader.load(plugins, { event = event_spec }) + -- check if any plugin created an event handler for this event and fire the group + M.trigger(event, pattern, groups) + Util.track() + end, + }) + end) end -function M.handlers.keys(grouped) - for keys, plugins in pairs(grouped) do +function M.keys() + local Loader = require("lazy.core.loader") + M.foreach_value("keys", function(plugin, keys) vim.keymap.set("n", keys, function() vim.keymap.del("n", keys) Util.track({ keys = keys }) - Loader.load(plugins, { keys = keys }) + Loader.load(plugin, { keys = keys }) vim.api.nvim_input(keys) Util.track() end) - end + end) end -function M.handlers.ft(grouped) +function M.ft() + local Loader = require("lazy.core.loader") local group = vim.api.nvim_create_augroup("lazy_handler_ft", { clear = true }) - for ft, plugins in pairs(grouped) do + M.foreach_group("ft", function(plugins, ft) vim.api.nvim_create_autocmd("FileType", { once = true, pattern = ft, @@ -134,23 +177,25 @@ function M.handlers.ft(grouped) Util.track({ ft = ft }) local groups = M.get_augroups("FileType", ft) Loader.load(plugins, { ft = ft }) - M.trigger(groups, "FileType", ft) + M.trigger("FileType", ft, groups) Util.track() end, }) - end + end) end -function M.handlers.cmd(grouped) - for cmd, plugins in pairs(grouped) do - local function _load() - vim.api.nvim_del_user_command(cmd) - Util.track({ cmd = cmd }) - Loader.load(plugins, { cmd = cmd }) - Util.track() - end +function M.cmd() + local Loader = require("lazy.core.loader") + local function _load(plugin, cmd) + vim.api.nvim_del_user_command(cmd) + Util.track({ cmd = cmd }) + Loader.load(plugin, { cmd = cmd }) + Util.track() + end + + M.foreach_value("cmd", function(plugin, cmd) vim.api.nvim_create_user_command(cmd, function(event) - _load() + _load(plugin, cmd) vim.cmd( ("%s %s%s%s %s"):format( event.mods or "", @@ -164,12 +209,12 @@ function M.handlers.cmd(grouped) bang = true, nargs = "*", complete = function() - _load() + _load(plugin, cmd) -- HACK: trick Neovim to show the newly loaded command completion vim.api.nvim_input("") end, }) - end + end) end return M diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index d57ccc3..d2f9c1c 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -1,5 +1,6 @@ local Util = require("lazy.core.util") local Config = require("lazy.core.config") +local Handler = require("lazy.core.handler") local M = {} @@ -27,7 +28,6 @@ function M.setup() -- setup handlers Util.track("handlers") - local Handler = require("lazy.core.handler") Handler.setup() Util.track() @@ -81,6 +81,7 @@ function M.load(plugins, reason) table.insert(M.loading, plugin) Util.track({ plugin = plugin.name, start = reason.start }) + Handler.cleanup(plugin) vim.opt.runtimepath:prepend(plugin.dir) if not M.init_done then diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index fde3acf..0a94fa4 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -127,7 +127,7 @@ function Spec:merge(old, new) for k, v in pairs(new) do if k == "_" then elseif old[k] ~= nil and old[k] ~= v then - if Handler.handlers[k] then + if Handler.types[k] then local values = type(v) == "string" and { v } or v vim.list_extend(values, type(old[k]) == "string" and { old[k] } or old[k]) ---@diagnostic disable-next-line: no-unknown diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index cd73492..999c508 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -161,7 +161,14 @@ end ---@param msg string|string[] function M.notify(msg, level) - msg = type(msg) == "table" and table.concat(msg, "\n") or msg + if type(msg) == "table" then + msg = table.concat( + vim.tbl_filter(function(line) + return line or false + end, msg), + "\n" + ) + end vim.notify(msg, level, { on_open = function(win) vim.wo[win].conceallevel = 3 diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index f9689bd..893d14d 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -382,7 +382,7 @@ function M:details(plugin) end end) - for handler in pairs(Handler.handlers) do + for handler in pairs(Handler.types) do if plugin[handler] then table.insert(props, { handler, From 7b945eec588e499f0ea36974df90836549a3e734 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 3 Dec 2022 23:46:50 +0100 Subject: [PATCH 0075/1610] feat: dont run setup again when a user re-sources their config & show a warning --- lua/lazy/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 103bffe..a4aa4fc 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -3,9 +3,11 @@ local M = {} ---@param spec LazySpec Should be a module name to load, or a plugin spec ---@param opts? LazyConfig function M.setup(spec, opts) - if not vim.go.loadplugins then + if not vim.go.loadplugins or vim.g.lazy_did_setup then + vim.notify("Re-sourcing your config is not supported with lazy.nvim", vim.log.levels.WARN, { title = "lazy.nvim" }) return end + vim.g.lazy_did_setup = true local start = vim.loop.hrtime() if not (opts and opts.performance and opts.performance.cache and opts.performance.cache.enabled == false) then From 1ae4e0ce9a5aedc1dc599d7a66a6183cea219445 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 3 Dec 2022 22:47:38 +0000 Subject: [PATCH 0076/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 3fd6211..a9b0c00 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -42,26 +42,28 @@ TODO *lazy.nvim-todo* - unsupported props or props from other managers - other packages still in site? - other package manager artifacts still present? compiled etc -- rename `run` to `build` -- delete lazy keymaps when a plugin loads -- temp colorscheme -- allow setting up plugins through config **fooo** -- task timeout +- status page showing running handlers and cache stats +- delete lazy keymaps when a plugin loads. Reset handlers for a plugin? +- fix plugin details +- show disabled plugins (strikethrough?) - log file - deal with re-sourcing init.lua. Check a global? -- incorrect when switching TN from opt to start - git tests -- max concurrency -- ui border -- make sure we can reload specs while keeping state -- show disabled plugins (strikethrough?) - Import specs from other plugin managers -- use uv file watcher (or stat) to check for config changes - packspec - add support to specify `engines`, `os` and `cpu` like in `package.json` - semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? - package meta index (package.lua cache for all packages) +- rename `run` to `build` +- temp colorscheme +- allow setting up plugins through config **fooo** +- task timeout +- incorrect when switching TN from opt to start +- max concurrency +- ui border +- make sure we can reload specs while keeping state +- use uv file watcher (or stat) to check for config changes - support for Plugin.lock - defaults for git log - view keybindings for update/clean/… From b8d8648d28bc738eb6573878ff1c0e1369acf1ed Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 14:45:50 +0100 Subject: [PATCH 0077/1610] refactor: moved handler to separate modules --- lua/lazy/core/handler.lua | 220 -------------------------------- lua/lazy/core/handler/cmd.lua | 45 +++++++ lua/lazy/core/handler/event.lua | 97 ++++++++++++++ lua/lazy/core/handler/ft.lua | 20 +++ lua/lazy/core/handler/init.lua | 123 ++++++++++++++++++ lua/lazy/core/handler/keys.lua | 25 ++++ lua/lazy/core/loader.lua | 18 +-- 7 files changed, 320 insertions(+), 228 deletions(-) delete mode 100644 lua/lazy/core/handler.lua create mode 100644 lua/lazy/core/handler/cmd.lua create mode 100644 lua/lazy/core/handler/event.lua create mode 100644 lua/lazy/core/handler/ft.lua create mode 100644 lua/lazy/core/handler/init.lua create mode 100644 lua/lazy/core/handler/keys.lua diff --git a/lua/lazy/core/handler.lua b/lua/lazy/core/handler.lua deleted file mode 100644 index 111bca5..0000000 --- a/lua/lazy/core/handler.lua +++ /dev/null @@ -1,220 +0,0 @@ -local Util = require("lazy.core.util") -local Config = require("lazy.core.config") - ----@class LazyPluginHandlers ----@field event? string|string[] ----@field cmd? string|string[] ----@field ft? string|string[] ----@field keys? string|string[] - -local M = {} - ----@enum LazyPluginHandlerTYpes -M.types = { - keys = "keys", - event = "event", - cmd = "cmd", - ft = "ft", -} - -M.trigger_events = { - BufRead = { "BufReadPre", "BufRead" }, - BufReadPost = { "BufReadPre", "BufRead", "BufReadPost" }, -} - ----@alias LazyHandler fun(grouped:table) - -function M.setup() - M.cmd() - M.event() - M.ft() - M.keys() -end - ----@param key string ----@param fn fun(plugins:LazyPlugin[], value:string) -function M.foreach_group(key, fn) - ---@type table - local group = {} - for _, plugin in pairs(Config.plugins) do - if plugin[key] then - ---@diagnostic disable-next-line: no-unknown - for _, value in pairs(type(plugin[key]) == "table" and plugin[key] or { plugin[key] }) do - group[value] = group[value] or {} - table.insert(group[value], plugin.name) - end - end - end - for value, plugins in pairs(group) do - fn(plugins, value) - end -end - ----@param key string ----@param fn fun(plugin:LazyPlugin, value:string) -function M.foreach_value(key, fn) - for _, plugin in pairs(Config.plugins) do - ---@type string|string[]|nil - local values = plugin[key] - if values then - if type(values) == "string" then - fn(plugin, values) - else - for _, value in ipairs(values) do - fn(plugin, value) - end - end - end - end -end - ----@param plugin LazyPlugin -function M.cleanup(plugin) - if plugin.keys then - local keys = type(plugin.keys) == "string" and { plugin.keys } or plugin.keys - ---@cast keys string[] - for _, k in ipairs(keys) do - pcall(vim.keymap.del, "n", k) - end - end - - if plugin.cmd then - local cmd = type(plugin.cmd) == "string" and { plugin.cmd } or plugin.cmd - ---@cast cmd string[] - for _, c in ipairs(cmd) do - pcall(vim.api.nvim_del_user_command, c) - end - end -end - --- Get all augroups for the events ----@param event string ----@param pattern? string -function M.get_augroups(event, pattern) - local events = M.trigger_events[event] or { event } - ---@type table - local groups = {} - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events, pattern = pattern })) do - if autocmd.group then - groups[autocmd.group] = true - end - end - return groups -end - ----@param event string|string[] ----@param pattern? string ----@param groups table -function M.trigger(event, pattern, groups) - local events = M.trigger_events[event] or { event } - ---@cast events string[] - for _, e in ipairs(events) do - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = e, pattern = pattern })) do - if autocmd.event == e and autocmd.group and not groups[autocmd.group] then - if Config.options.debug then - Util.info({ - "# Firing Events", - " - **group:** `" .. autocmd.group_name .. "`", - " - **event:** " .. autocmd.event, - pattern and "- **pattern:** ", - }) - end - Util.try(function() - vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false }) - end) - end - end - end -end - -function M.event() - local Loader = require("lazy.core.loader") - local group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) - - M.foreach_group("event", function(plugins, event_spec) - event_spec = event_spec == "VeryLazy" and "User VeryLazy" or event_spec - local event, pattern = event_spec:match("^(%w+)%s+(.*)$") - event = event or event_spec - vim.api.nvim_create_autocmd(event, { - group = group, - once = true, - pattern = pattern, - callback = function() - Util.track({ event = event_spec }) - local groups = M.get_augroups(event, pattern) - -- load the plugins - Loader.load(plugins, { event = event_spec }) - -- check if any plugin created an event handler for this event and fire the group - M.trigger(event, pattern, groups) - Util.track() - end, - }) - end) -end - -function M.keys() - local Loader = require("lazy.core.loader") - M.foreach_value("keys", function(plugin, keys) - vim.keymap.set("n", keys, function() - vim.keymap.del("n", keys) - Util.track({ keys = keys }) - Loader.load(plugin, { keys = keys }) - vim.api.nvim_input(keys) - Util.track() - end) - end) -end - -function M.ft() - local Loader = require("lazy.core.loader") - local group = vim.api.nvim_create_augroup("lazy_handler_ft", { clear = true }) - M.foreach_group("ft", function(plugins, ft) - vim.api.nvim_create_autocmd("FileType", { - once = true, - pattern = ft, - group = group, - callback = function() - Util.track({ ft = ft }) - local groups = M.get_augroups("FileType", ft) - Loader.load(plugins, { ft = ft }) - M.trigger("FileType", ft, groups) - Util.track() - end, - }) - end) -end - -function M.cmd() - local Loader = require("lazy.core.loader") - local function _load(plugin, cmd) - vim.api.nvim_del_user_command(cmd) - Util.track({ cmd = cmd }) - Loader.load(plugin, { cmd = cmd }) - Util.track() - end - - M.foreach_value("cmd", function(plugin, cmd) - vim.api.nvim_create_user_command(cmd, function(event) - _load(plugin, cmd) - vim.cmd( - ("%s %s%s%s %s"):format( - event.mods or "", - event.line1 == event.line2 and "" or event.line1 .. "," .. event.line2, - cmd, - event.bang and "!" or "", - event.args or "" - ) - ) - end, { - bang = true, - nargs = "*", - complete = function() - _load(plugin, cmd) - -- HACK: trick Neovim to show the newly loaded command completion - vim.api.nvim_input("") - end, - }) - end) -end - -return M diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua new file mode 100644 index 0000000..3ebba86 --- /dev/null +++ b/lua/lazy/core/handler/cmd.lua @@ -0,0 +1,45 @@ +local Util = require("lazy.core.util") +local Loader = require("lazy.core.loader") + +---@class LazyCmdHandler:LazyHandler +local M = {} + +local function _load(plugin, cmd) + vim.api.nvim_del_user_command(cmd) + Util.track({ cmd = cmd }) + Loader.load(plugin, { cmd = cmd }) + Util.track() +end + +---@param plugin LazyPlugin +---@param cmd string +function M:_add(plugin, cmd) + vim.api.nvim_create_user_command(cmd, function(event) + _load(plugin, cmd) + vim.cmd( + ("%s %s%s%s %s"):format( + event.mods or "", + event.line1 == event.line2 and "" or event.line1 .. "," .. event.line2, + cmd, + event.bang and "!" or "", + event.args or "" + ) + ) + end, { + bang = true, + nargs = "*", + complete = function() + _load(plugin, cmd) + -- HACK: trick Neovim to show the newly loaded command completion + vim.api.nvim_input("") + end, + }) +end + +---@param _plugin LazyPlugin +---@param value string +function M:_del(_plugin, value) + pcall(vim.api.nvim_del_user_command, value) +end + +return M diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua new file mode 100644 index 0000000..545f42b --- /dev/null +++ b/lua/lazy/core/handler/event.lua @@ -0,0 +1,97 @@ +local Util = require("lazy.core.util") +local Config = require("lazy.core.config") +local Loader = require("lazy.core.loader") + +---@class LazyEventHandler:LazyHandler +---@field events table +---@field group number +local M = {} + +M.trigger_events = { + BufRead = { "BufReadPre", "BufRead" }, + BufReadPost = { "BufReadPre", "BufRead", "BufReadPost" }, +} + +function M:init() + self.group = vim.api.nvim_create_augroup("lazy_handler_" .. self.type, { clear = true }) + self.events = {} +end + +---@param event_spec string +function M:_add(_, event_spec) + if not self.events[event_spec] then + self:listen(event_spec) + end +end + +---@param value string +function M:_value(value) + return value == "VeryLazy" and "User VeryLazy" or value +end + +function M:listen(event_spec) + self.events[event_spec] = true + ---@type string?, string? + local event, pattern = event_spec:match("^(%w+)%s+(.*)$") + event = event or event_spec + vim.api.nvim_create_autocmd(event, { + group = self.group, + once = true, + pattern = pattern, + callback = function() + if not self.active[event_spec] then + return + end + Util.track({ [self.type] = event_spec }) + local groups = M.get_augroups(event, pattern) + -- load the plugins + Loader.load(self.active[event_spec], { [self.type] = event_spec }) + self.events[event_spec] = nil + -- check if any plugin created an event handler for this event and fire the group + M.trigger(event, pattern, groups) + Util.track() + end, + }) +end + +-- Get all augroups for the events +---@param event string +---@param pattern? string +function M.get_augroups(event, pattern) + local events = M.trigger_events[event] or { event } + ---@type table + local groups = {} + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events, pattern = pattern })) do + if autocmd.group then + groups[autocmd.group] = true + end + end + return groups +end + +---@param event string|string[] +---@param pattern? string +---@param groups table +function M.trigger(event, pattern, groups) + local events = M.trigger_events[event] or { event } + ---@cast events string[] + for _, e in ipairs(events) do + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = e, pattern = pattern })) do + if autocmd.event == e and autocmd.group and not groups[autocmd.group] then + if Config.options.debug then + Util.info({ + "# Firing Events", + " - **group:** `" .. autocmd.group_name .. "`", + " - **event:** " .. autocmd.event, + pattern and "- **pattern:** ", + }) + end + Util.try(function() + vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false }) + end) + end + end + end +end + +return M diff --git a/lua/lazy/core/handler/ft.lua b/lua/lazy/core/handler/ft.lua new file mode 100644 index 0000000..c9ff096 --- /dev/null +++ b/lua/lazy/core/handler/ft.lua @@ -0,0 +1,20 @@ +local Event = require("lazy.core.handler.event") +local Loader = require("lazy.core.loader") + +---@class LazyFiletypeHandler:LazyEventHandler +local M = {} +M.extends = Event + +---@param value string +function M:_value(value) + return "FileType " .. value +end + +---@param plugin LazyPlugin +---@param value string +function M:_add(plugin, value) + Loader.ftdetect(plugin) + Event._add(self, plugin, value) +end + +return M diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua new file mode 100644 index 0000000..be229c1 --- /dev/null +++ b/lua/lazy/core/handler/init.lua @@ -0,0 +1,123 @@ +local Config = require("lazy.core.config") + +---@class LazyPluginHandlers: table +---@field event? string|string[] +---@field cmd? string|string[] +---@field ft? string|string[] +---@field keys? string|string[] + +---@class LazyHandler +---@field type LazyHandlerTypes +---@field extends? LazyHandler +---@field active table> +local M = {} + +---@enum LazyHandlerTypes +M.types = { + keys = "keys", + event = "event", + cmd = "cmd", + ft = "ft", +} + +---@type table +M.handlers = {} + +function M.setup() + for _, type in pairs(M.types) do + M.handlers[type] = M.new(type) + end + for _, plugin in pairs(Config.plugins) do + M.enable(plugin) + end +end + +---@param plugin LazyPlugin +function M.disable(plugin) + for type, handler in pairs(M.handlers) do + if plugin[type] then + handler:del(plugin) + end + end +end + +---@param plugin LazyPlugin +function M.enable(plugin) + if not plugin._.loaded then + for type, handler in pairs(M.handlers) do + if plugin[type] then + handler:add(plugin) + end + end + end +end + +---@param type LazyHandlerTypes +function M.new(type) + ---@type LazyHandler + local handler = require("lazy.core.handler." .. type) + local self = setmetatable({}, { + __index = function(_, k) + return handler[k] or (handler.extends and handler.extends[k]) or M[k] + end, + }) + self.active = {} + self.type = type + self:init() + return self +end + +---@protected +function M:init() end + +---@param plugin LazyPlugin +---@param value string +---@protected +function M:_add(plugin, value) end + +---@param plugin LazyPlugin +---@param value string +---@protected +function M:_del(plugin, value) end + +---@param value string +function M:_value(value) + return value +end + +---@param values? string|string[] +---@param fn fun(value:string) +function M:foreach(values, fn) + if type(values) == "string" then + fn(values) + elseif values ~= nil then + for _, value in ipairs(values) do + fn(value) + end + end +end + +---@param plugin LazyPlugin +function M:add(plugin) + self:foreach(plugin[self.type], function(value) + value = self:_value(value) + if not (self.active[value] and self.active[value][plugin.name]) then + self.active[value] = self.active[value] or {} + self.active[value][plugin.name] = plugin.name + self:_add(plugin, value) + end + end) +end + +---@param plugin LazyPlugin +function M:del(plugin) + self:foreach(plugin[self.type], function(value) + value = self:_value(value) + if self.active[value] and self.active[value][plugin.name] then + self.active[value][plugin.name] = nil + self:_del(plugin, value) + end + end) +end + +return M diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua new file mode 100644 index 0000000..14827f2 --- /dev/null +++ b/lua/lazy/core/handler/keys.lua @@ -0,0 +1,25 @@ +local Util = require("lazy.core.util") +local Loader = require("lazy.core.loader") + +---@class LazyKeysHandler:LazyHandler +local M = {} + +---@param plugin LazyPlugin +---@param keys string +function M:_add(plugin, keys) + vim.keymap.set("n", keys, function() + vim.keymap.del("n", keys) + Util.track({ keys = keys }) + Loader.load(plugin, { keys = keys }) + vim.api.nvim_input(keys) + Util.track() + end) +end + +---@param _plugin LazyPlugin +---@param value string +function M:_del(_plugin, value) + pcall(vim.keymap.del, "n", value) +end + +return M diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index d2f9c1c..95a0c80 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -62,7 +62,7 @@ function M.load(plugins, reason) plugins = (type(plugins) == "string" or plugins.name) and { plugins } or plugins ---@cast plugins (string|LazyPlugin)[] - for _, plugin in ipairs(plugins) do + for _, plugin in pairs(plugins) do plugin = type(plugin) == "string" and Config.plugins[plugin] or plugin ---@cast plugin LazyPlugin @@ -81,7 +81,7 @@ function M.load(plugins, reason) table.insert(M.loading, plugin) Util.track({ plugin = plugin.name, start = reason.start }) - Handler.cleanup(plugin) + Handler.disable(plugin) vim.opt.runtimepath:prepend(plugin.dir) if not M.init_done then @@ -114,18 +114,20 @@ end ---@param plugin LazyPlugin function M.packadd(plugin) - -- FIXME: investigate further what else is needed - -- vim.cmd.packadd(plugin.name) - -- M.source_runtime(plugin, "/after/plugin") if M.init_done then M.source_runtime(plugin.dir, "plugin") - if vim.g.did_load_filetypes == 1 then - M.source_runtime(plugin.dir, "ftdetect") - end + M.ftdetect(plugin) M.source_runtime(plugin.dir, "after/plugin") end end +---@param plugin LazyPlugin +function M.ftdetect(plugin) + vim.cmd("augroup filetypedetect") + M.source_runtime(plugin.dir, "ftdetect") + vim.cmd("augroup END") +end + ---@param ... string function M.source_runtime(...) local dir = table.concat({ ... }, "/") From d36ad410eef90bfe1a0dddd6ec1904321a5510ed Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 14:46:11 +0100 Subject: [PATCH 0078/1610] feat: util.foreach with sorted keys --- lua/lazy/util.lua | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 2356f63..5739feb 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -134,4 +134,16 @@ function M.dump(value) return table.concat(result, "") end +---@generic V +---@param t table +---@param fn fun(key:string, value:V) +function M.foreach(t, fn) + ---@type string[] + local keys = vim.tbl_keys(t) + table.sort(keys) + for _, key in ipairs(keys) do + fn(key, t[key]) + end +end + return M From 6d68cc6ea20a5778fabe37ccca679d8568615a20 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 14:46:46 +0100 Subject: [PATCH 0079/1610] feat(ui): added debug interface to inspect active handlers and the module cache --- lua/lazy/view/colors.lua | 13 +++++----- lua/lazy/view/commands.lua | 3 +++ lua/lazy/view/init.lua | 1 + lua/lazy/view/render.lua | 51 +++++++++++++++++++++++++++++++------- 4 files changed, 53 insertions(+), 15 deletions(-) diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index 6098d7f..6da5d74 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -16,12 +16,13 @@ M.colors = { }, ProgressTodo = "LineNr", Special = "@punctuation.special", - LoaderPlugin = "Special", - LoaderEvent = "Constant", - LoaderKeys = "Statement", - LoaderStart = "@field", - LoaderSource = "Character", - LoaderCmd = "Operator", + HandlerPlugin = "Special", + HandlerEvent = "Constant", + HandlerKeys = "Statement", + HandlerStart = "@field", + HandlerSource = "Character", + HandlerFt = "Character", + HandlerCmd = "Operator", Button = "CursorLine", ButtonActive = "Visual", } diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 43afaa3..fab0bd0 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -36,6 +36,9 @@ M.commands = { help = function() View.show("help") end, + debug = function() + View.show("debug") + end, profile = function() View.show("profile") end, diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index ab6307c..9df76da 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -13,6 +13,7 @@ M.modes = { { name = "log", key = "L", desc = "Show recent updates for all plugins" }, { name = "restore", key = "R", desc = "Updates all plugins to the state in the lockfile" }, { name = "profile", key = "P", desc = "Show detailed profiling", toggle = true }, + { name = "debug", key = "D", desc = "Show debug information", toggle = true }, { name = "help", key = "?", hide = true, desc = "Toggle this help page", toggle = true }, { plugin = true, name = "update", key = "u", desc = "Update this plugin. This will also update the lockfile" }, diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 893d14d..d1fd99b 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -60,6 +60,8 @@ function M:update() self:help() elseif mode == "profile" then self:profile() + elseif mode == "debug" then + self:debug() else for _, section in ipairs(Sections) do self:section(section) @@ -109,7 +111,7 @@ function M:title() end self:nl() - if View.mode ~= "help" and View.mode ~= "profile" then + if View.mode ~= "help" and View.mode ~= "profile" and View.mode ~= "debug" then if self.progress.done < self.progress.total then self:append("Tasks: ", "LazyH2") self:append(self.progress.done .. "/" .. self.progress.total, "LazyMuted") @@ -208,8 +210,8 @@ function M:reason(reason, opts) end end end - local time = " " .. math.floor((reason.time or 0) / 1e6 * 100) / 100 .. "ms" - if not opts.time_right then + local time = reason.time and (" " .. math.floor(reason.time / 1e6 * 100) / 100 .. "ms") + if time and not opts.time_right then self:append(time, "Bold") end self:append(" ") @@ -227,10 +229,6 @@ function M:reason(reason, opts) local value = reason[key] if type(key) == "number" then elseif key == "require" then - -- self:append("require", "@function.builtin") - -- self:append("(", "@punctuation.bracket") - -- self:append('"' .. value .. '"', "@string") - -- self:append(")", "@punctuation.bracket") elseif key ~= "time" then if first then first = false @@ -239,8 +237,10 @@ function M:reason(reason, opts) end if key == "event" then value = value:match("User (.*)") or value + elseif key == "ft" then + value = value:match("FileType (.*)") or value end - local hl = "LazyLoader" .. key:sub(1, 1):upper() .. key:sub(2) + local hl = "LazyHandler" .. key:sub(1, 1):upper() .. key:sub(2) local icon = Config.options.ui.icons[key] if icon then self:append(icon .. " ", hl) @@ -251,7 +251,7 @@ function M:reason(reason, opts) end end end - if opts.time_right then + if time and opts.time_right then self:append(time, "Bold") end -- self:append(")", "Conceal") @@ -432,4 +432,37 @@ function M:profile() end end +function M:debug() + self:append("Active Handlers", "LazyH2"):nl() + self + :append( + "This shows only the lazy handlers that are still active. When a plugin loads, its handlers are removed", + "Comment", + { indent = 2 } + ) + :nl() + + Util.foreach(require("lazy.core.handler").handlers, function(type, handler) + Util.foreach(handler.active, function(value, plugins) + if not vim.tbl_isempty(plugins) then + plugins = vim.tbl_values(plugins) + table.sort(plugins) + self:append("●", "LazySpecial", { indent = 2 }) + self:reason({ [type] = value }, { time_right = true }) + for _, plugin in pairs(plugins) do + self:reason({ plugin = plugin }, { time_right = true }) + end + self:nl() + end + end) + end) + self:nl() + self:append("Cache", "LazyH2"):nl() + local Cache = require("lazy.core.cache") + Util.foreach(Cache.cache, function(modname, entry) + local kb = math.floor(#entry.chunk / 10.24) / 100 + self:append("● ", "LazySpecial", { indent = 2 }):append(modname):append(" " .. kb .. "Kb", "Bold"):nl() + end) +end + return M From 82f5f617f50a95f38fc6db4fb1799159d0532e5a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 14:47:18 +0100 Subject: [PATCH 0080/1610] docs: update todo --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 00ce00d..7d65d6e 100644 --- a/README.md +++ b/README.md @@ -27,12 +27,9 @@ - [ ] unsupported props or props from other managers - [ ] other packages still in site? - [ ] other package manager artifacts still present? compiled etc -- [ ] status page showing running handlers and cache stats -- [x] delete lazy keymaps when a plugin loads. Reset handlers for a plugin? - [ ] fix plugin details - [ ] show disabled plugins (strikethrough?) - [ ] log file -- [ ] deal with re-sourcing init.lua. Check a global? - [ ] git tests - [ ] Import specs from other plugin managers - [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) @@ -40,6 +37,9 @@ - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? - [ ] package meta index (package.lua cache for all packages) +- [x] status page showing running handlers and cache stats +- [x] delete lazy keymaps when a plugin loads. Reset handlers for a plugin? +- [x] deal with re-sourcing init.lua. Check a global? - [x] rename `run` to `build` - [x] temp colorscheme - [x] allow setting up plugins through config **fooo** From f2bfbba1348e7246d018d3578b1bb253094534c9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 5 Dec 2022 13:48:18 +0000 Subject: [PATCH 0081/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a9b0c00..85a700e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 03 +*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 05 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -42,12 +42,9 @@ TODO *lazy.nvim-todo* - unsupported props or props from other managers - other packages still in site? - other package manager artifacts still present? compiled etc -- status page showing running handlers and cache stats -- delete lazy keymaps when a plugin loads. Reset handlers for a plugin? - fix plugin details - show disabled plugins (strikethrough?) - log file -- deal with re-sourcing init.lua. Check a global? - git tests - Import specs from other plugin managers - packspec @@ -55,6 +52,9 @@ TODO *lazy.nvim-todo* - semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? - package meta index (package.lua cache for all packages) +- status page showing running handlers and cache stats +- delete lazy keymaps when a plugin loads. Reset handlers for a plugin? +- deal with re-sourcing init.lua. Check a global? - rename `run` to `build` - temp colorscheme - allow setting up plugins through config **fooo** From dda5c6c0edba9b3bc80db94d3edde92a54fd1366 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 14:49:34 +0100 Subject: [PATCH 0082/1610] chore(main): release 2.2.0 (#7) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1c9529..7b1848c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [2.2.0](https://github.com/folke/lazy.nvim/compare/v2.1.0...v2.2.0) (2022-12-05) + + +### Features + +* cleanup keys/cmd handlers when loading a plugin ([3f517ab](https://github.com/folke/lazy.nvim/commit/3f517abfa43ec9410315e205c1ee3798b66e1153)) +* dont run setup again when a user re-sources their config & show a warning ([7b945ee](https://github.com/folke/lazy.nvim/commit/7b945eec588e499f0ea36974df90836549a3e734)) +* **ui:** added debug interface to inspect active handlers and the module cache ([6d68cc6](https://github.com/folke/lazy.nvim/commit/6d68cc6ea20a5778fabe37ccca679d8568615a20)) +* **ui:** show any helps files and added hover handler ([13b5688](https://github.com/folke/lazy.nvim/commit/13b568848775de3adfd17a410ec482c1e03da489)) +* util.foreach with sorted keys ([d36ad41](https://github.com/folke/lazy.nvim/commit/d36ad410eef90bfe1a0dddd6ec1904321a5510ed)) + + +### Bug Fixes + +* always add config/after to rtp ([c98e722](https://github.com/folke/lazy.nvim/commit/c98e722fa41e0aa94809e44edf859216afedd8ad)) +* **ui:** always show branch name in details ([6e44be0](https://github.com/folke/lazy.nvim/commit/6e44be0f2d543b680041be669a93377291b9132f)) + + +### Performance Improvements + +* disable cache by default on VimEnter or on BufReadPre ([b2727d9](https://github.com/folke/lazy.nvim/commit/b2727d98a3ac49cdf462e2bdf5f195dc572a91a4)) + ## [2.1.0](https://github.com/folke/lazy.nvim/compare/v2.0.0...v2.1.0) (2022-12-03) From 71e4b92fd6fbb807ef82ebc9586cfe2a233234b4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 20:36:49 +0100 Subject: [PATCH 0083/1610] feat(api): return runner from manage operations --- lua/lazy/manage/init.lua | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 2e22e93..e7e8eaa 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -10,6 +10,7 @@ local M = {} ---@field show? boolean ---@field mode? string ---@field plugins? LazyPlugin[] +---@field concurrency? number ---@param ropts RunnerOpts ---@param opts? ManagerOpts @@ -20,7 +21,7 @@ function M.run(ropts, opts) ropts.plugins = opts.plugins end - ropts.concurrency = ropts.concurrency or Config.options.concurrency + ropts.concurrency = ropts.concurrency or opts.concurrency or Config.options.concurrency if opts.clear then M.clear() @@ -52,7 +53,7 @@ end ---@param opts? ManagerOpts function M.install(opts) - M.run({ + return M.run({ pipeline = { "git.clone", "git.checkout", @@ -69,7 +70,7 @@ end ---@param opts? ManagerOpts|{lockfile?:boolean} function M.update(opts) opts = opts or {} - M.run({ + return M.run({ pipeline = { "git.branch", "git.fetch", @@ -87,9 +88,10 @@ function M.update(opts) end) end +---@param opts? ManagerOpts function M.check(opts) opts = opts or {} - M.run({ + return M.run({ pipeline = { "git.fetch", "wait", @@ -103,7 +105,7 @@ end ---@param opts? ManagerOpts function M.log(opts) - M.run({ + return M.run({ pipeline = { "git.log" }, plugins = function(plugin) return plugin.uri and plugin._.installed @@ -113,7 +115,7 @@ end ---@param opts? ManagerOpts function M.clean(opts) - M.run({ + return M.run({ pipeline = { "fs.clean" }, plugins = Config.to_clean, }, opts) @@ -122,6 +124,7 @@ end function M.clear() Plugin.load() for _, plugin in pairs(Config.plugins) do + plugin._.has_updates = nil plugin._.updated = nil plugin._.cloned = nil plugin._.dirty = nil From 65cd28e613a7b7208a3b1e61f5effc581c7b0247 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 20:49:23 +0100 Subject: [PATCH 0084/1610] feat(ui): added update checker --- lua/lazy/core/config.lua | 10 +++++++ lua/lazy/core/plugin.lua | 1 + lua/lazy/manage/checker.lua | 51 ++++++++++++++++++++++++++++++++++++ lua/lazy/manage/task/git.lua | 1 + lua/lazy/view/init.lua | 2 +- 5 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 lua/lazy/manage/checker.lua diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1fc1936..20611b9 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -50,6 +50,13 @@ M.defaults = { }, throttle = 20, -- how frequently should the ui process render events }, + checker = { + -- lazy can automatically check for updates + enabled = false, + concurrency = 10, -- set to 1 to very slowly check for updates + notify = true, -- get a notification if new updates are found + frequency = 3600, -- every hour + }, performance = { ---@type LazyCacheConfig cache = nil, @@ -102,6 +109,9 @@ function M.setup(spec, opts) require("lazy.core.cache").autosave() require("lazy.view").setup() require("lazy.manage.reloader").enable() + if M.options.checker.enabled then + require("lazy.manage.checker").start() + end end, }) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 0a94fa4..ddbdb72 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -16,6 +16,7 @@ local M = {} ---@field dirty? boolean ---@field updated? {from:string, to:string} ---@field is_local boolean +---@field has_updates? boolean ---@field cloned? boolean ---@field dep? boolean True if this plugin is only in the spec as a dependency diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua new file mode 100644 index 0000000..ee0dabd --- /dev/null +++ b/lua/lazy/manage/checker.lua @@ -0,0 +1,51 @@ +local Config = require("lazy.core.config") +local Manage = require("lazy.manage") +local Util = require("lazy.util") +local Git = require("lazy.manage.git") + +local M = {} + +M.running = false +M.updated = {} + +function M.start() + M.fast_check() + M.check() +end + +function M.fast_check() + for _, plugin in pairs(Config.plugins) do + local info = Git.info(plugin.dir) + local target = Git.get_target(plugin) + if info and target and info.commit ~= target.commit then + plugin._.has_updates = true + end + end + M.report() +end + +function M.check() + Manage.check({ + show = false, + concurrency = Config.options.checker.concurrency, + }):wait(function() + M.report() + vim.defer_fn(M.check, Config.options.checker.frequency * 1000) + end) +end + +function M.report() + local lines = {} + for _, plugin in pairs(Config.plugins) do + if plugin._.has_updates and not vim.tbl_contains(M.updated, plugin.name) then + table.insert(lines, "- **" .. plugin.name .. "**") + table.insert(M.updated, plugin.name) + end + end + if #lines > 0 and Config.options.checker.notify then + table.insert(lines, 1, "# Plugin Updates") + Util.info(lines) + end +end + +return M diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index c9e3051..d7a3992 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -31,6 +31,7 @@ M.log = { local info = assert(Git.info(self.plugin.dir)) local target = assert(Git.get_target(self.plugin)) assert(target.commit, self.plugin.name .. " " .. target.branch) + self.plugin._.has_updates = target.commit ~= info.commit table.insert(args, info.commit .. ".." .. target.commit) else vim.list_extend(args, opts.args or Config.options.git.log) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 9df76da..e9fd17b 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -42,7 +42,7 @@ function M.show(mode) require("lazy.view.colors").setup() if M._buf and vim.api.nvim_buf_is_valid(M._buf) then - vim.api.nvim_win_set_cursor(M._win, { 1, 0 }) + -- vim.api.nvim_win_set_cursor(M._win, { 1, 0 }) vim.cmd([[do User LazyRender]]) return end From 315be83afc96f5dd1f76f943de1be7d2429b5bf7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 20:49:45 +0100 Subject: [PATCH 0085/1610] feat(ui): added statusline component to show pending updates --- lua/lazy/status.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 lua/lazy/status.lua diff --git a/lua/lazy/status.lua b/lua/lazy/status.lua new file mode 100644 index 0000000..94e9575 --- /dev/null +++ b/lua/lazy/status.lua @@ -0,0 +1,16 @@ +local Config = require("lazy.core.config") + +local M = {} + +function M.updates() + local Checker = require("lazy.manage.checker") + local updates = #Checker.updated + return updates > 0 and (Config.options.ui.icons.plugin .. "" .. updates) +end + +function M.has_updates() + local Checker = require("lazy.manage.checker") + return #Checker.updated > 0 +end + +return M From 8531995ec728676fe1642827d58d0a945e188f1d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 21:05:20 +0100 Subject: [PATCH 0086/1610] docs: updated todo --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7d65d6e..3e04acb 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ - [ ] log file - [ ] git tests - [ ] Import specs from other plugin managers +- [x] Background update checker - [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range From dc2dcd2d5a8c256497235428e129907e99e0ae58 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 21:31:26 +0100 Subject: [PATCH 0087/1610] feat: added health checks --- README.md | 8 +++---- lua/lazy/health.lua | 57 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 lua/lazy/health.lua diff --git a/README.md b/README.md index 3e04acb..b4f3fa8 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,10 @@ ## ✅ TODO -- [ ] health checks: check merge conflicts async - - [ ] unsupported props or props from other managers - - [ ] other packages still in site? - - [ ] other package manager artifacts still present? compiled etc +- [x] health checks: check merge conflicts async + - [x] unsupported props or props from other managers + - [x] other packages still in site? + - [x] other package manager artifacts still present? compiled etc - [ ] fix plugin details - [ ] show disabled plugins (strikethrough?) - [ ] log file diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua new file mode 100644 index 0000000..612736d --- /dev/null +++ b/lua/lazy/health.lua @@ -0,0 +1,57 @@ +local Util = require("lazy.util") +local Config = require("lazy.core.config") + +local M = {} + +function M.check() + vim.health.report_start("lazy.nvim") + + local existing = false + Util.ls(vim.fn.stdpath("data") .. "/site/pack/", function(path) + existing = true + vim.health.report_warn("found existing packages at `" .. path .. "`") + end) + if not existing then + vim.health.report_ok("no existing packages found by other package managers") + end + + local packer_compiled = vim.fn.stdpath("config") .. "/plugin/packer_compiled.lua" + if vim.loop.fs_stat(packer_compiled) then + vim.health.report_error("please remove the file `" .. packer_compiled .. "`") + else + vim.health.report_ok("packer_compiled.lua not found") + end + + local valid = { + 1, + "name", + "uri", + "enabled", + "lazy", + "dev", + "dependencies", + "init", + "config", + "build", + "branch", + "tag", + "commit", + "version", + "pin", + "cmd", + "event", + "keys", + "ft", + "dir", + "_", + } + for _, plugin in pairs(Config.plugins) do + for key in pairs(plugin) do + if not vim.tbl_contains(valid, key) then + vim.health.report_warn("{" .. plugin.name .. "}: unknown key <" .. key .. ">") + end + end + end +end + +return M From 4a2b954d2c2f55648ae562eaf9beddd65af12b86 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 5 Dec 2022 20:32:21 +0000 Subject: [PATCH 0088/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 85a700e..3e5ad85 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -47,6 +47,7 @@ TODO *lazy.nvim-todo* - log file - git tests - Import specs from other plugin managers +- Background update checker - packspec - add support to specify `engines`, `os` and `cpu` like in `package.json` - semver merging. Should check if two or more semver ranges are compatible and calculate the union range From 01c6ee41ba8fe17543ee4b9db545dd146d18a2c1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 21:44:22 +0100 Subject: [PATCH 0089/1610] docs: updated todo --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b4f3fa8..0b65903 100644 --- a/README.md +++ b/README.md @@ -23,21 +23,21 @@ ## ✅ TODO -- [x] health checks: check merge conflicts async - - [x] unsupported props or props from other managers - - [x] other packages still in site? - - [x] other package manager artifacts still present? compiled etc - [ ] fix plugin details - [ ] show disabled plugins (strikethrough?) - [ ] log file - [ ] git tests - [ ] Import specs from other plugin managers -- [x] Background update checker - [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? - [ ] package meta index (package.lua cache for all packages) +- [x] Background update checker +- [x] health checks: check merge conflicts async + - [x] unsupported props or props from other managers + - [x] other packages still in site? + - [x] other package manager artifacts still present? compiled etc - [x] status page showing running handlers and cache stats - [x] delete lazy keymaps when a plugin loads. Reset handlers for a plugin? - [x] deal with re-sourcing init.lua. Check a global? From 836cdb2beafb43baf1ed3289ca4a5bbfd97ec5e3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 5 Dec 2022 20:45:14 +0000 Subject: [PATCH 0090/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 3e5ad85..0220b21 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -38,21 +38,21 @@ FEATURES *lazy.nvim-features* TODO *lazy.nvim-todo* -- health checks: check merge conflicts async - - unsupported props or props from other managers - - other packages still in site? - - other package manager artifacts still present? compiled etc - fix plugin details - show disabled plugins (strikethrough?) - log file - git tests - Import specs from other plugin managers -- Background update checker - packspec - add support to specify `engines`, `os` and `cpu` like in `package.json` - semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? - package meta index (package.lua cache for all packages) +- Background update checker +- health checks: check merge conflicts async + - unsupported props or props from other managers + - other packages still in site? + - other package manager artifacts still present? compiled etc - status page showing running handlers and cache stats - delete lazy keymaps when a plugin loads. Reset handlers for a plugin? - deal with re-sourcing init.lua. Check a global? From 08d081f21d9b54ed0b20e9a94050e3b39c75de19 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 22:30:02 +0100 Subject: [PATCH 0091/1610] fix(ui): open with noautocmd=true and close with vim.schedule to prevent weird errors by other plugins --- lua/lazy/view/init.lua | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index e9fd17b..cb0bb2b 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -57,6 +57,7 @@ function M.show(mode) border = Config.options.ui.border, width = math.min(vim.o.columns - hpad * 2, 200), height = math.min(vim.o.lines - vpad * 2, 70), + noautocmd = true, } opts.row = (vim.o.lines - opts.height) / 2 opts.col = (vim.o.columns - opts.width) / 2 @@ -75,16 +76,14 @@ function M.show(mode) local function close() M._buf = nil vim.diagnostic.reset(Config.ns, buf) - - if vim.api.nvim_buf_is_valid(buf) then - vim.api.nvim_buf_delete(buf, { - force = true, - }) - end - - if vim.api.nvim_win_is_valid(win) then - vim.api.nvim_win_close(win, true) - end + vim.schedule(function() + if vim.api.nvim_buf_is_valid(buf) then + vim.api.nvim_buf_delete(buf, { force = true }) + end + if vim.api.nvim_win_is_valid(win) then + vim.api.nvim_win_close(win, true) + end + end) end vim.keymap.set("n", "q", close, { From be509c01f94821a6c0e5a2a4349d9160b4a4b6fe Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 5 Dec 2022 23:14:04 +0100 Subject: [PATCH 0092/1610] perf: added profiling for sourcing of runtime files --- lua/lazy/core/config.lua | 13 +++++++------ lua/lazy/core/loader.lua | 2 ++ lua/lazy/view/colors.lua | 1 + lua/lazy/view/render.lua | 5 +++++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 20611b9..59eb4dd 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -37,15 +37,16 @@ M.defaults = { -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { - start = "", - init = " ", - plugin = " ", - source = " ", + cmd = " ", config = "", event = "", - keys = " ", - cmd = " ", ft = " ", + init = " ", + keys = " ", + plugin = " ", + runtime = " ", + source = " ", + start = "", task = "✔ ", }, throttle = 20, -- how frequently should the ui process render events diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 95a0c80..d32e894 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -134,7 +134,9 @@ function M.source_runtime(...) Util.walk(dir, function(path, _, t) local ext = path:sub(-3) if t == "file" and (ext == "lua" or ext == "vim") then + Util.track({ runtime = path }) vim.cmd("silent source " .. path) + Util.track() end end) end diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index 6da5d74..01a6dfc 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -16,6 +16,7 @@ M.colors = { }, ProgressTodo = "LineNr", Special = "@punctuation.special", + HandlerRuntime = "@macro", HandlerPlugin = "Special", HandlerEvent = "Constant", HandlerKeys = "Statement", diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index d1fd99b..26597ef 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -210,6 +210,11 @@ function M:reason(reason, opts) end end end + if reason.runtime then + reason.runtime = reason.runtime:gsub(".*/([^/]+/plugin/.*)", "%1") + reason.runtime = reason.runtime:gsub(".*/([^/]+/after/.*)", "%1") + reason.runtime = reason.runtime:gsub(".*/([^/]+/ftdetect/.*)", "%1") + end local time = reason.time and (" " .. math.floor(reason.time / 1e6 * 100) / 100 .. "ms") if time and not opts.time_right then self:append(time, "Bold") From 0393e524e5c2e373483896efbc3730af17c3bf73 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 6 Dec 2022 10:36:31 +0100 Subject: [PATCH 0093/1610] refactor: moved plugin handler types to plugin --- lua/lazy/core/handler/init.lua | 6 ------ lua/lazy/core/plugin.lua | 16 +++++++++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index be229c1..fc023ef 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -1,11 +1,5 @@ local Config = require("lazy.core.config") ----@class LazyPluginHandlers: table ----@field event? string|string[] ----@field cmd? string|string[] ----@field ft? string|string[] ----@field keys? string|string[] - ---@class LazyHandler ---@field type LazyHandlerTypes ---@field extends? LazyHandler diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index ddbdb72..f98198a 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -4,11 +4,6 @@ local Handler = require("lazy.core.handler") local M = {} ----@class LazyPluginHooks ----@field init? fun(LazyPlugin) Will always be run ----@field config? fun(LazyPlugin) Will be executed when loading the plugin ----@field build? string|fun(LazyPlugin) - ---@class LazyPluginState ---@field loaded? {[string]:string}|{time:number} ---@field installed boolean @@ -20,6 +15,17 @@ local M = {} ---@field cloned? boolean ---@field dep? boolean True if this plugin is only in the spec as a dependency +---@class LazyPluginHooks +---@field init? fun(LazyPlugin) Will always be run +---@field config? fun(LazyPlugin) Will be executed when loading the plugin +---@field build? string|fun(LazyPlugin) + +---@class LazyPluginHandlers: table +---@field event? string|string[] +---@field cmd? string|string[] +---@field ft? string|string[] +---@field keys? string|string[] + ---@class LazyPluginRef ---@field branch? string ---@field tag? string From f52cf32f968d19ae0242d8adec84b664b7a42d89 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 6 Dec 2022 09:58:23 +0000 Subject: [PATCH 0094/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0220b21..c5934fd 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 05 +*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 43b303bd8f2eb45a251e370694cc871e20d7d557 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 6 Dec 2022 11:09:14 +0100 Subject: [PATCH 0095/1610] fix: dev plugins with dev=false should be configured as remote --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f98198a..dc06e05 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -92,7 +92,7 @@ function Spec:add(plugin, is_dep) -- check for plugins that should be local for _, pattern in ipairs(Config.options.dev.patterns) do - if plugin.dev or plugin[1]:find(pattern, 1, true) then + if plugin.dev or (plugin[1]:find(pattern, 1, true) and plugin.dev ~= false) then plugin.uri = Config.options.dev.path .. "/" .. plugin.name break end From 4cfe0b5315d7acac7c2adb78b671af16dc480941 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 6 Dec 2022 11:12:54 +0100 Subject: [PATCH 0096/1610] refactor: `Plugin.uri` => `Plugin.url` --- lua/lazy/core/plugin.lua | 16 ++++++++-------- lua/lazy/health.lua | 2 +- lua/lazy/manage/init.lua | 8 ++++---- lua/lazy/manage/task/git.lua | 2 +- lua/lazy/view/init.lua | 2 +- lua/lazy/view/render.lua | 2 +- lua/lazy/view/sections.lua | 2 +- tests/core/plugin_spec.lua | 20 ++++++++++---------- 8 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index dc06e05..31d4a03 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -36,7 +36,7 @@ local M = {} ---@class LazyPlugin: LazyPluginHandlers,LazyPluginHooks,LazyPluginRef ---@field [1] string ---@field name string display name and name used for plugin config files ----@field uri string +---@field url string ---@field dir string ---@field enabled? boolean|(fun():boolean) ---@field lazy? boolean @@ -69,14 +69,14 @@ function Spec:add(plugin, is_dep) Util.error("Invalid plugin spec " .. vim.inspect(plugin)) end - if not plugin.uri then + if not plugin.url then local c = pkg:sub(1, 1) if c == "~" then - plugin.uri = vim.loop.os_getenv("HOME") .. pkg:sub(2) + plugin.url = vim.loop.os_getenv("HOME") .. pkg:sub(2) elseif c == "/" or pkg:sub(1, 4) == "http" or pkg:sub(1, 3) == "ssh" then - plugin.uri = pkg + plugin.url = pkg else - plugin.uri = ("https://github.com/" .. pkg .. ".git") + plugin.url = ("https://github.com/" .. pkg .. ".git") end end @@ -93,7 +93,7 @@ function Spec:add(plugin, is_dep) -- check for plugins that should be local for _, pattern in ipairs(Config.options.dev.patterns) do if plugin.dev or (plugin[1]:find(pattern, 1, true) and plugin.dev ~= false) then - plugin.uri = Config.options.dev.path .. "/" .. plugin.name + plugin.url = Config.options.dev.path .. "/" .. plugin.name break end end @@ -171,9 +171,9 @@ function M.update_state() or plugin.cmd plugin.lazy = lazy and true or false end - if plugin.uri:sub(1, 4) ~= "http" and plugin.uri:sub(1, 3) ~= "git" then + if plugin.url:sub(1, 4) ~= "http" and plugin.url:sub(1, 3) ~= "git" then plugin._.is_local = true - plugin.dir = plugin.uri + plugin.dir = plugin.url plugin._.installed = true -- user should make sure the directory exists else plugin.dir = Config.options.root .. "/" .. plugin.name diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 612736d..d749903 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -25,7 +25,7 @@ function M.check() local valid = { 1, "name", - "uri", + "url", "enabled", "lazy", "dev", diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index e7e8eaa..2332d1e 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -62,7 +62,7 @@ function M.install(opts) "plugin.build", }, plugins = function(plugin) - return plugin.uri and not plugin._.installed + return plugin.url and not plugin._.installed end, }, opts) end @@ -81,7 +81,7 @@ function M.update(opts) { "git.log", updated = true }, }, plugins = function(plugin) - return plugin.uri and plugin._.installed + return plugin.url and plugin._.installed end, }, opts):wait(function() require("lazy.manage.lock").update() @@ -98,7 +98,7 @@ function M.check(opts) { "git.log", check = true }, }, plugins = function(plugin) - return plugin.uri and plugin._.installed + return plugin.url and plugin._.installed end, }, opts) end @@ -108,7 +108,7 @@ function M.log(opts) return M.run({ pipeline = { "git.log" }, plugins = function(plugin) - return plugin.uri and plugin._.installed + return plugin.url and plugin._.installed end, }, opts) end diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index d7a3992..90ba2b1 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -51,7 +51,7 @@ M.clone = { run = function(self) local args = { "clone", - self.plugin.uri, + self.plugin.url, "--filter=blob:none", "--recurse-submodules", "--single-branch", diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index cb0bb2b..b5db8b5 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -130,7 +130,7 @@ function M.show(mode) local function open(path) local plugin = get_plugin() if plugin then - local url = plugin.uri:gsub("%.git$", "") + local url = plugin.url:gsub("%.git$", "") if Util.file_exists(url) then url = "https://github.com/" .. plugin[1] end diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 26597ef..0f7feb5 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -363,7 +363,7 @@ end function M:details(plugin) ---@type string[][] local props = {} - table.insert(props, { "uri", (plugin.uri:gsub("%.git$", "")), "@text.reference" }) + table.insert(props, { "url", (plugin.url:gsub("%.git$", "")), "@text.reference" }) local git = Git.info(plugin.dir, true) if git then git.branch = git.branch or Git.get_branch(plugin) diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index 6701e90..5352c00 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -70,7 +70,7 @@ return { }, { filter = function(plugin) - return plugin._.installed and not plugin.uri + return plugin._.installed and not plugin.url end, title = "Clean", }, diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 7562f53..be134bd 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -5,17 +5,17 @@ local assert = require("luassert") Config.setup() -describe("plugin spec uri/name", function() +describe("plugin spec url/name", function() local tests = { - { { "~/foo" }, { [1] = "~/foo", name = "foo", uri = vim.fn.fnamemodify("~/foo", ":p") } }, - { { "/tmp/foo" }, { [1] = "/tmp/foo", name = "foo", uri = "/tmp/foo" } }, - { { "foo/bar" }, { [1] = "foo/bar", name = "bar", uri = "https://github.com/foo/bar.git" } }, - { { "foo/bar", name = "foobar" }, { [1] = "foo/bar", name = "foobar", uri = "https://github.com/foo/bar.git" } }, - { { "foo/bar", uri = "123" }, { [1] = "foo/bar", name = "bar", uri = "123" } }, - { { "https://foobar" }, { [1] = "https://foobar", name = "foobar", uri = "https://foobar" } }, - { { "ssh://foobar" }, { [1] = "ssh://foobar", name = "foobar", uri = "ssh://foobar" } }, - { "foo/bar", { [1] = "foo/bar", name = "bar", uri = "https://github.com/foo/bar.git" } }, - { { { { "foo/bar" } } }, { [1] = "foo/bar", name = "bar", uri = "https://github.com/foo/bar.git" } }, + { { "~/foo" }, { [1] = "~/foo", name = "foo", url = vim.fn.fnamemodify("~/foo", ":p") } }, + { { "/tmp/foo" }, { [1] = "/tmp/foo", name = "foo", url = "/tmp/foo" } }, + { { "foo/bar" }, { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } }, + { { "foo/bar", name = "foobar" }, { [1] = "foo/bar", name = "foobar", url = "https://github.com/foo/bar.git" } }, + { { "foo/bar", url = "123" }, { [1] = "foo/bar", name = "bar", url = "123" } }, + { { "https://foobar" }, { [1] = "https://foobar", name = "foobar", url = "https://foobar" } }, + { { "ssh://foobar" }, { [1] = "ssh://foobar", name = "foobar", url = "ssh://foobar" } }, + { "foo/bar", { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } }, + { { { { "foo/bar" } } }, { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } }, } for _, test in ipairs(tests) do From f24c055fe9ebc810dfb35328dd312d4cd9038db1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 13 Dec 2022 09:48:17 +0100 Subject: [PATCH 0097/1610] feat: better way of dealing with lazy loaded completions (thanks to @lewis6991) --- lua/lazy/core/handler/cmd.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index 3ebba86..a2766a4 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -28,10 +28,10 @@ function M:_add(plugin, cmd) end, { bang = true, nargs = "*", - complete = function() + complete = function(_, line) _load(plugin, cmd) - -- HACK: trick Neovim to show the newly loaded command completion - vim.api.nvim_input("") + -- NOTE: return the newly loaded command completion + return vim.fn.getcompletion(line, "cmdline") end, }) end From 2a7466abadb7987e81009cdd06042fb2d2b59366 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 13 Dec 2022 10:07:36 +0100 Subject: [PATCH 0098/1610] feat(checker): only report an update once and do a fast update check after each manage operation --- lua/lazy/core/config.lua | 2 +- lua/lazy/manage/checker.lua | 10 ++++++++-- lua/lazy/manage/init.lua | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 59eb4dd..a277475 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -54,7 +54,7 @@ M.defaults = { checker = { -- lazy can automatically check for updates enabled = false, - concurrency = 10, -- set to 1 to very slowly check for updates + concurrency = nil, ---@type number? set to 1 to very slowly check for updates notify = true, -- get a notification if new updates are found frequency = 3600, -- every hour }, diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index ee0dabd..98e2f1b 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -7,6 +7,7 @@ local M = {} M.running = false M.updated = {} +M.reported = {} function M.start() M.fast_check() @@ -15,6 +16,7 @@ end function M.fast_check() for _, plugin in pairs(Config.plugins) do + plugin._.has_updates = nil local info = Git.info(plugin.dir) local target = Git.get_target(plugin) if info and target and info.commit ~= target.commit then @@ -36,10 +38,14 @@ end function M.report() local lines = {} + M.updated = {} for _, plugin in pairs(Config.plugins) do - if plugin._.has_updates and not vim.tbl_contains(M.updated, plugin.name) then - table.insert(lines, "- **" .. plugin.name .. "**") + if plugin._.has_updates then table.insert(M.updated, plugin.name) + if not vim.tbl_contains(M.reported, plugin.name) then + table.insert(lines, "- **" .. plugin.name .. "**") + table.insert(M.reported, plugin.name) + end end end if #lines > 0 and Config.options.checker.notify then diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 2332d1e..cd801c5 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -43,6 +43,7 @@ function M.run(ropts, opts) runner:wait(function() vim.cmd([[do User LazyRender]]) Plugin.update_state() + require("lazy.manage.checker").fast_check() end) if opts.wait then From 0625493aadf025476c62841fc3d36bf836f15bc7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 13 Dec 2022 10:09:33 +0100 Subject: [PATCH 0099/1610] feat!: local plugins now always need to set `Plugin.dir` --- lua/lazy/core/config.lua | 1 + lua/lazy/core/plugin.lua | 67 +++++++++++++++++++++------------------- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index a277475..d45b38c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -17,6 +17,7 @@ M.defaults = { -- log = { "-10" }, -- last 10 commits log = { "--since=1 days ago" }, -- commits from the last 3 days timeout = 120, -- processes taking over 2 minutes will be killed + url_format = "https://github.com/%s.git", }, -- Any plugin spec that contains one of the patterns will use your -- local repo in the projects folder instead of fetchig it from github diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 31d4a03..f7cb5a9 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -61,43 +61,48 @@ function Spec.new(spec) return self end +-- PERF: optimized code to get package name without using lua patterns +function Spec.get_name(pkg) + local name = pkg:sub(-4) == ".git" and pkg:sub(1, -5) or pkg + local slash = name:reverse():find("/", 1, true) --[[@as number?]] + return slash and name:sub(#name - slash + 2) or pkg:gsub("%W+", "_") +end + ---@param plugin LazyPlugin ---@param is_dep? boolean function Spec:add(plugin, is_dep) - local pkg = plugin[1] - if type(pkg) ~= "string" then - Util.error("Invalid plugin spec " .. vim.inspect(plugin)) + if not plugin.url and plugin[1] then + plugin.url = Config.options.git.url_format:format(plugin[1]) end - if not plugin.url then - local c = pkg:sub(1, 1) - if c == "~" then - plugin.url = vim.loop.os_getenv("HOME") .. pkg:sub(2) - elseif c == "/" or pkg:sub(1, 4) == "http" or pkg:sub(1, 3) == "ssh" then - plugin.url = pkg - else - plugin.url = ("https://github.com/" .. pkg .. ".git") + if plugin.dir then + -- local plugin + plugin.name = plugin.name or Spec.get_name(plugin.dir) + elseif plugin.url then + plugin.name = plugin.name or Spec.get_name(plugin.url) + -- check for dev plugins + if plugin.dev == nil then + for _, pattern in ipairs(Config.options.dev.patterns) do + if plugin.url:find(pattern, 1, true) then + plugin.dev = true + break + end + end end - end - - -- PERF: optimized code to get package name without using lua patterns - if not plugin.name then - local name = pkg:sub(-4) == ".git" and pkg:sub(1, -5) or pkg - local slash = name:reverse():find("/", 1, true) --[[@as number?]] - plugin.name = slash and name:sub(#name - slash + 2) or pkg:gsub("%W+", "_") + -- dev plugins + if plugin.dev then + plugin.dir = Config.options.dev.path .. "/" .. plugin.name + else + -- remote plugin + plugin.dir = Config.options.root .. "/" .. plugin.name + end + else + Util.error("Invalid plugin spec " .. vim.inspect(plugin)) end plugin._ = {} plugin._.dep = is_dep - -- check for plugins that should be local - for _, pattern in ipairs(Config.options.dev.patterns) do - if plugin.dev or (plugin[1]:find(pattern, 1, true) and plugin.dev ~= false) then - plugin.url = Config.options.dev.path .. "/" .. plugin.name - break - end - end - local other = self.plugins[plugin.name] self.plugins[plugin.name] = other and self:merge(other, plugin) or plugin return self.plugins[plugin.name] @@ -171,14 +176,12 @@ function M.update_state() or plugin.cmd plugin.lazy = lazy and true or false end - if plugin.url:sub(1, 4) ~= "http" and plugin.url:sub(1, 3) ~= "git" then - plugin._.is_local = true - plugin.dir = plugin.url - plugin._.installed = true -- user should make sure the directory exists - else - plugin.dir = Config.options.root .. "/" .. plugin.name + if plugin.dir:find(Config.options.root) == 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 end end From c1fe69afd5ce7d2b5378743830bd0ab58263c88c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 13 Dec 2022 10:10:11 +0100 Subject: [PATCH 0100/1610] docs: updated todo --- README.md | 66 +++++++++++++++++++------------------------------------ 1 file changed, 23 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 0b65903..24ecb5c 100644 --- a/README.md +++ b/README.md @@ -2,27 +2,39 @@ ## ✨ Features +## ✅ TODO + +- [x] fancy UI to manage all your Neovim plugins +- [x] auto lazy-loading of lua modules +- [x] lazy-loading on events, commands, filetypes and key mappings - [x] Partial clones instead of shallow clones - [x] waits till missing deps are installed (bootstrap Neovim and start using it right away) - [x] Async -- [x] No need for compile -- [x] Fast +- [x] No need to manually compile +- [x] Fast. Automatically caches and compiles byte code of all lua modules needed during startup - [x] Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?) - [x] Config in multiple files -- [x] Patterns for local packages +- [x] dev option and patterns for local packages - [x] Profiling -- [x] lockfile +- [x] lockfile `lazy-lock.json` - [x] upvalues in `config` & `init` - [x] check for updates -- [x] lazy-lock.lua -- [x] tag/version support `git tag --sort version:refname` +- [x] commit, branch, tag, version support +- [x] semver https://devhints.io/semver - [x] auto-loading on completion for lazy-loaded commands - [x] bootstrap code -- [x] semver https://devhints.io/semver - https://semver.npmjs.com/ - -## ✅ TODO - +- [x] Background update checker +- [x] statusline component to see number of pending updates +- [x] health checks: check merge conflicts async + - [x] unsupported props or props from other managers + - [x] other packages still in site? + - [x] other package manager artifacts still present? compiled etc +- [x] status page showing running handlers and cache stats +- [x] temp colorscheme used during startup when installing missing plugins +- [x] automatically reloads when config changes are detected +- [x] handlers imply opt +- [x] dependencies imply opt for deps +- [ ] show spec errors in health - [ ] fix plugin details - [ ] show disabled plugins (strikethrough?) - [ ] log file @@ -33,38 +45,6 @@ - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? - [ ] package meta index (package.lua cache for all packages) -- [x] Background update checker -- [x] health checks: check merge conflicts async - - [x] unsupported props or props from other managers - - [x] other packages still in site? - - [x] other package manager artifacts still present? compiled etc -- [x] status page showing running handlers and cache stats -- [x] delete lazy keymaps when a plugin loads. Reset handlers for a plugin? -- [x] deal with re-sourcing init.lua. Check a global? -- [x] rename `run` to `build` -- [x] temp colorscheme -- [x] allow setting up plugins through config **fooo** -- [x] task timeout -- [x] incorrect when switching TN from opt to start -- [x] max concurrency -- [x] ui border -- [x] make sure we can reload specs while keeping state -- [x] use uv file watcher (or stat) to check for config changes -- [x] support for Plugin.lock -- [x] defaults for git log -- [x] view keybindings for update/clean/... -- [x] add profiler to view -- [x] add buttons for actions -- [x] show time taken for op in view -- [x] auto lazy-loading of lua modules -- [x] clear errors -- [x] add support for versions `git tag --sort v:refname` -- [x] rename requires to dependencies -- [x] move tasks etc to Plugin.state -- [x] handlers imply opt -- [x] dependencies imply opt for deps -- [x] fix local plugin spec -- [x] investigate all opt=true. Simplifies logic (easily switch between opt/start afterwards) ## 📦 Differences with Packer From 12ded3f4223f3dc465e671c16ff1a537a75150fa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 13 Dec 2022 10:29:40 +0100 Subject: [PATCH 0101/1610] fix: replace ~ by HOME for Plugin.dir --- lua/lazy/core/plugin.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f7cb5a9..44c32c8 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -76,6 +76,7 @@ function Spec:add(plugin, is_dep) end if plugin.dir then + plugin.dir = plugin.dir:gsub("~", os.getenv("HOME") or "~") -- local plugin plugin.name = plugin.name or Spec.get_name(plugin.dir) elseif plugin.url then From 13754096421054c64458f2d788be92180bf47260 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 13 Dec 2022 10:29:48 +0100 Subject: [PATCH 0102/1610] test: fixed tests --- tests/core/plugin_spec.lua | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index be134bd..b9744ac 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -7,13 +7,13 @@ Config.setup() describe("plugin spec url/name", function() local tests = { - { { "~/foo" }, { [1] = "~/foo", name = "foo", url = vim.fn.fnamemodify("~/foo", ":p") } }, - { { "/tmp/foo" }, { [1] = "/tmp/foo", name = "foo", url = "/tmp/foo" } }, + { { dir = "~/foo" }, { name = "foo", dir = vim.fn.fnamemodify("~/foo", ":p") } }, + { { dir = "/tmp/foo" }, { dir = "/tmp/foo", name = "foo" } }, { { "foo/bar" }, { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } }, { { "foo/bar", name = "foobar" }, { [1] = "foo/bar", name = "foobar", url = "https://github.com/foo/bar.git" } }, - { { "foo/bar", url = "123" }, { [1] = "foo/bar", name = "bar", url = "123" } }, - { { "https://foobar" }, { [1] = "https://foobar", name = "foobar", url = "https://foobar" } }, - { { "ssh://foobar" }, { [1] = "ssh://foobar", name = "foobar", url = "ssh://foobar" } }, + { { "foo/bar", url = "123" }, { [1] = "foo/bar", name = "123", url = "123" } }, + { { url = "https://foobar" }, { name = "foobar", url = "https://foobar" } }, + { { url = "ssh://foobar" }, { name = "foobar", url = "ssh://foobar" } }, { "foo/bar", { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } }, { { { { "foo/bar" } } }, { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } }, } @@ -21,6 +21,9 @@ describe("plugin spec url/name", function() for _, test in ipairs(tests) do test[2]._ = {} it("parses " .. vim.inspect(test[1]):gsub("%s+", " "), function() + if not test[2].dir then + test[2].dir = Config.options.root .. "/" .. test[2].name + end local spec = Plugin.Spec.new(test[1]) local plugins = vim.tbl_values(spec.plugins) assert.equal(1, #plugins) From b7713856e0bea0ec4f6d2a0348b0f7d2acd90aa6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 13 Dec 2022 09:30:42 +0000 Subject: [PATCH 0103/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 86 ++++++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 54 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c5934fd..976ef0f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 06 +*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 13 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -14,30 +14,40 @@ Table of Contents *lazy.nvim-table-of-contents* FEATURES *lazy.nvim-features* - -- Partial clones instead of shallow clones -- waits till missing deps are installed (bootstrap Neovim and start using it right away) -- Async -- No need for compile -- Fast -- Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?) -- Config in multiple files -- Patterns for local packages -- Profiling -- lockfile -- upvalues in `config` & `init` -- check for updates -- lazy-lock.lua -- tag/version support `git tag --sort version:refname` -- auto-loading on completion for lazy-loaded commands -- bootstrap code -- semver https://devhints.io/semver - https://semver.npmjs.com/ - - TODO *lazy.nvim-todo* +- fancy UI to manage all your Neovim plugins +- auto lazy-loading of lua modules +- lazy-loading on events, commands, filetypes and key mappings +- Partial clones instead of shallow clones +- waits till missing deps are installed (bootstrap Neovim and start using it right away) +- Async +- No need to manually compile +- Fast. Automatically caches and compiles byte code of all lua modules needed during startup +- Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?) +- Config in multiple files +- dev option and patterns for local packages +- Profiling +- lockfile `lazy-lock.json` +- upvalues in `config` & `init` +- check for updates +- commit, branch, tag, version support +- semver https://devhints.io/semver +- auto-loading on completion for lazy-loaded commands +- bootstrap code +- Background update checker +- statusline component to see number of pending updates +- health checks: check merge conflicts async + - unsupported props or props from other managers + - other packages still in site? + - other package manager artifacts still present? compiled etc +- status page showing running handlers and cache stats +- temp colorscheme used during startup when installing missing plugins +- automatically reloads when config changes are detected +- handlers imply opt +- dependencies imply opt for deps +- show spec errors in health - fix plugin details - show disabled plugins (strikethrough?) - log file @@ -48,38 +58,6 @@ TODO *lazy.nvim-todo* - semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? - package meta index (package.lua cache for all packages) -- Background update checker -- health checks: check merge conflicts async - - unsupported props or props from other managers - - other packages still in site? - - other package manager artifacts still present? compiled etc -- status page showing running handlers and cache stats -- delete lazy keymaps when a plugin loads. Reset handlers for a plugin? -- deal with re-sourcing init.lua. Check a global? -- rename `run` to `build` -- temp colorscheme -- allow setting up plugins through config **fooo** -- task timeout -- incorrect when switching TN from opt to start -- max concurrency -- ui border -- make sure we can reload specs while keeping state -- use uv file watcher (or stat) to check for config changes -- support for Plugin.lock -- defaults for git log -- view keybindings for update/clean/… -- add profiler to view -- add buttons for actions -- show time taken for op in view -- auto lazy-loading of lua modules -- clear errors -- add support for versions `git tag --sort v:refname` -- rename requires to dependencies -- move tasks etc to Plugin.state -- handlers imply opt -- dependencies imply opt for deps -- fix local plugin spec -- investigate all opt=true. Simplifies logic (easily switch between opt/start afterwards) DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* From 5c7d29e09dbf4c230627297a1ff063d4f4c9335c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 13 Dec 2022 10:36:11 +0100 Subject: [PATCH 0104/1610] chore(main): release 3.0.0 (#8) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b1848c..00598b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # Changelog +## [3.0.0](https://github.com/folke/lazy.nvim/compare/v2.2.0...v3.0.0) (2022-12-13) + + +### ⚠ BREAKING CHANGES + +* local plugins now always need to set `Plugin.dir` + +### Features + +* added health checks ([dc2dcd2](https://github.com/folke/lazy.nvim/commit/dc2dcd2d5a8c256497235428e129907e99e0ae58)) +* **api:** return runner from manage operations ([71e4b92](https://github.com/folke/lazy.nvim/commit/71e4b92fd6fbb807ef82ebc9586cfe2a233234b4)) +* better way of dealing with lazy loaded completions (thanks to [@lewis6991](https://github.com/lewis6991)) ([f24c055](https://github.com/folke/lazy.nvim/commit/f24c055fe9ebc810dfb35328dd312d4cd9038db1)) +* **checker:** only report an update once and do a fast update check after each manage operation ([2a7466a](https://github.com/folke/lazy.nvim/commit/2a7466abadb7987e81009cdd06042fb2d2b59366)) +* local plugins now always need to set `Plugin.dir` ([0625493](https://github.com/folke/lazy.nvim/commit/0625493aadf025476c62841fc3d36bf836f15bc7)) +* **ui:** added statusline component to show pending updates ([315be83](https://github.com/folke/lazy.nvim/commit/315be83afc96f5dd1f76f943de1be7d2429b5bf7)) +* **ui:** added update checker ([65cd28e](https://github.com/folke/lazy.nvim/commit/65cd28e613a7b7208a3b1e61f5effc581c7b0247)) + + +### Bug Fixes + +* dev plugins with dev=false should be configured as remote ([43b303b](https://github.com/folke/lazy.nvim/commit/43b303bd8f2eb45a251e370694cc871e20d7d557)) +* replace ~ by HOME for Plugin.dir ([12ded3f](https://github.com/folke/lazy.nvim/commit/12ded3f4223f3dc465e671c16ff1a537a75150fa)) +* **ui:** open with noautocmd=true and close with vim.schedule to prevent weird errors by other plugins ([08d081f](https://github.com/folke/lazy.nvim/commit/08d081f21d9b54ed0b20e9a94050e3b39c75de19)) + + +### Performance Improvements + +* added profiling for sourcing of runtime files ([be509c0](https://github.com/folke/lazy.nvim/commit/be509c01f94821a6c0e5a2a4349d9160b4a4b6fe)) + ## [2.2.0](https://github.com/folke/lazy.nvim/compare/v2.1.0...v2.2.0) (2022-12-05) From 8de617c01b572965d8a48362597fce01dc3ebcc7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 16:07:32 +0100 Subject: [PATCH 0105/1610] feat: getter for plugins --- lua/lazy/init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index a4aa4fc..0251c8a 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -74,4 +74,9 @@ function M.bootstrap() end end +---@return LazyPlugin[] +function M.plugins() + return vim.tbl_values(require("lazy.core.config").plugins) +end + return M From ad0b4caa648fe84eb1dff5e55d3f02d293b33ad1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 16:07:53 +0100 Subject: [PATCH 0106/1610] feat(ui): show `updates available` diagnostic when an update is available --- lua/lazy/view/render.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 0f7feb5..886d324 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -274,6 +274,10 @@ function M:diagnostics(plugin) message = "updated from " .. plugin._.updated.from:sub(1, 7) .. " to " .. plugin._.updated.to:sub(1, 7), }) end + elseif plugin._.has_updates then + self:diagnostic({ + message = "updates available", + }) end for _, task in ipairs(plugin._.tasks or {}) do if task:is_running() then From ec2f432a84bead4aaaf684b4eb2d88e41592703e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:03:53 +0100 Subject: [PATCH 0107/1610] feat!: lazy now handles the full startup sequence (`vim.go.loadplugins=false`) --- lua/lazy/core/config.lua | 53 ++++++++++++++---------- lua/lazy/core/handler/ft.lua | 2 +- lua/lazy/core/loader.lua | 79 ++++++++++++++++++++++++------------ lua/lazy/init.lua | 4 +- 4 files changed, 89 insertions(+), 49 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index d45b38c..1ca912d 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -11,27 +11,24 @@ M.defaults = { -- version = "*", -- enable this to try installing the latest stable versions of plugins }, lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. - concurrency = nil, -- set to a number to limit the maximum amount of concurrent tasks + concurrency = nil, ---@type number limit the maximum amount of concurrent tasks git = { - -- defaults for `Lazy log` - -- log = { "-10" }, -- last 10 commits - log = { "--since=1 days ago" }, -- commits from the last 3 days - timeout = 120, -- processes taking over 2 minutes will be killed + -- defaults for the `Lazy log` command + -- log = { "-10" }, -- show the last 10 commits + log = { "--since=1 days ago" }, -- show commits from the last 3 days + timeout = 120, -- kill processes that take more than 2 minutes url_format = "https://github.com/%s.git", }, - -- Any plugin spec that contains one of the patterns will use your - -- local repo in the projects folder instead of fetchig it from github - -- Mostly useful for plugin developers. dev = { - path = vim.fn.expand("~/projects"), -- the path where you store your projects - ---@type string[] + -- directory where you store your local plugin projects + path = vim.fn.expand("~/projects"), + ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} }, install = { -- install missing plugins on startup. This doesn't increase startup time. missing = true, - -- try to load one of the colorschemes in this list when starting an install during startup - -- the first colorscheme that is found will be loaded + -- try to load one of these colorschemes when starting an installation during startup colorscheme = { "habamax" }, }, ui = { @@ -53,17 +50,30 @@ M.defaults = { throttle = 20, -- how frequently should the ui process render events }, checker = { - -- lazy can automatically check for updates + -- automcatilly check for plugin updates enabled = false, - concurrency = nil, ---@type number? set to 1 to very slowly check for updates - notify = true, -- get a notification if new updates are found - frequency = 3600, -- every hour + 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 }, performance = { ---@type LazyCacheConfig cache = nil, - reset_packpath = true, -- packpath will be reset to nothing. This will improver startup time. - reset_rtp = true, -- the runtime path will be reset to $VIMRUNTIME and your config directory + 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[] list any plugins you want to disable here + disabled_plugins = { + -- "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + -- "tarPlugin", + -- "tohtml", + -- "tutor", + -- "zipPlugin", + }, + }, }, debug = false, } @@ -93,14 +103,13 @@ function M.setup(spec, opts) if M.options.performance.reset_packpath then vim.go.packpath = "" end - if M.options.performance.reset_rtp then + if M.options.performance.rtp.reset then local me = debug.getinfo(1, "S").source:sub(2) me = vim.fn.fnamemodify(me, ":p:h:h:h:h") vim.opt.rtp = { - "$VIMRUNTIME", - vim.fn.stdpath("config"), me, - vim.fn.stdpath("config") .. "/after", + vim.env.VIMRUNTIME, + vim.fn.stdpath("config"), } end diff --git a/lua/lazy/core/handler/ft.lua b/lua/lazy/core/handler/ft.lua index c9ff096..ef6c5dc 100644 --- a/lua/lazy/core/handler/ft.lua +++ b/lua/lazy/core/handler/ft.lua @@ -13,7 +13,7 @@ end ---@param plugin LazyPlugin ---@param value string function M:_add(plugin, value) - Loader.ftdetect(plugin) + Loader.ftdetect(plugin.dir) Event._add(self, plugin, value) end diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index d32e894..5412116 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -7,6 +7,8 @@ local M = {} ---@type LazyPlugin[] M.loading = {} M.init_done = false +---@type table +M.disabled_rtp_plugins = {} function M.setup() -- install missing plugins @@ -31,11 +33,38 @@ function M.setup() Handler.setup() Util.track() + for _, file in ipairs(Config.options.performance.rtp.disabled_plugins) do + M.disabled_rtp_plugins[file] = true + end + -- autoload opt plugins table.insert(package.loaders, M.autoload) end -function M.init_plugins() +-- Startup sequence +-- 1. load any start plugins and do init +function M.startup() + Util.track({ start = "startup" }) + + -- load plugins from rtp + Util.track({ start = "rtp plugins" }) + for _, path in ipairs(vim.opt.rtp:get()) do + if not path:find("after/?$") then + M.source_runtime(path, "plugin") + M.ftdetect(path) + end + end + Util.track() + + Util.track({ start = "start" }) + for _, plugin in pairs(Config.plugins) do + -- load start plugin + if plugin.lazy == false then + M.load(plugin, { start = "start" }) + end + end + Util.track() + Util.track({ start = "init" }) for _, plugin in pairs(Config.plugins) do -- run plugin init @@ -44,14 +73,22 @@ function M.init_plugins() Util.try(plugin.init, "Failed to run `init` for **" .. plugin.name .. "**") Util.track() end + end + Util.track() - -- load start plugin - if plugin.lazy == false then - M.load(plugin, { start = "startup" }) + -- load after files + Util.track({ start = "after" }) + for _, path in ipairs(vim.opt.rtp:get()) do + if path:find("after/?$") then + M.source_runtime(path, "plugin") + else + M.source_runtime(path, "after/plugin") end end Util.track() + M.init_done = true + Util.track() end ---@class Loader @@ -84,21 +121,12 @@ function M.load(plugins, reason) Handler.disable(plugin) vim.opt.runtimepath:prepend(plugin.dir) - if not M.init_done then - local after = plugin.dir .. "/after" - -- only add the after directories during startup - -- afterwards we only source the runtime files in after - -- Check if it exists here, to prevent further rtp file checks during startup - if vim.loop.fs_stat(after) then - vim.opt.runtimepath:append(after) - end - end if plugin.dependencies then M.load(plugin.dependencies, {}) end - M.packadd(plugin) + M.packadd(plugin.dir) if plugin.config then Util.try(plugin.config, "Failed to run `config` for " .. plugin.name) end @@ -112,28 +140,29 @@ function M.load(plugins, reason) end end ----@param plugin LazyPlugin -function M.packadd(plugin) +---@param path string +function M.packadd(path) + M.source_runtime(path, "plugin") + M.ftdetect(path) if M.init_done then - M.source_runtime(plugin.dir, "plugin") - M.ftdetect(plugin) - M.source_runtime(plugin.dir, "after/plugin") + M.source_runtime(path, "after/plugin") end end ----@param plugin LazyPlugin -function M.ftdetect(plugin) +---@param path string +function M.ftdetect(path) vim.cmd("augroup filetypedetect") - M.source_runtime(plugin.dir, "ftdetect") + M.source_runtime(path, "ftdetect") vim.cmd("augroup END") end ---@param ... string function M.source_runtime(...) local dir = table.concat({ ... }, "/") - Util.walk(dir, function(path, _, t) - local ext = path:sub(-3) - if t == "file" and (ext == "lua" or ext == "vim") then + Util.walk(dir, function(path, name, t) + local ext = name:sub(-3) + name = name:sub(1, -5) + if t == "file" and (ext == "lua" or ext == "vim") and not M.disabled_rtp_plugins[name] then Util.track({ runtime = path }) vim.cmd("silent source " .. path) Util.track() diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 0251c8a..fd61417 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -7,6 +7,8 @@ function M.setup(spec, opts) vim.notify("Re-sourcing your config is not supported with lazy.nvim", vim.log.levels.WARN, { title = "lazy.nvim" }) return end + vim.go.loadplugins = false + vim.g.lazy_did_setup = true local start = vim.loop.hrtime() @@ -42,7 +44,7 @@ function M.setup(spec, opts) end -- load plugins with lazy=false or Plugin.init - Loader.init_plugins() + Loader.startup() -- all done! vim.cmd("do User LazyDone") From 861f2d8a56cc4d631810ed528374a6272409a05a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:04:04 +0100 Subject: [PATCH 0108/1610] docs: added feature list --- README.md | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 24ecb5c..4b1b246 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,26 @@ -# lazy.nvim +# 💤 lazy.nvim + +Modern plugin manager for Neovim ## ✨ Features +- 📦 Manage all your Neovim plugins with a fancy UI +- 🚀 Fast startup: Automatically caches and compiles byte code of all lua modules needed during startup +- 💾 Partial clones instead of shallow clones +- 🔌 Auto lazy-loading of lua modules +- 📆 Lazy-loading on events, commands, filetypes and key mappings +- ⏳ Automatically installs missing plugins before starting up so you can start using Neovim right away +- 💪 Async execution for improved performance +- 🛠️ No need to manually compile plugins +- 🧪 Correct sequencing of dependencies +- 📁 Configurable in multiple files +- 💻 Dev option and patterns for using local plugin +- 📊 Profiling tools to optimize performance +- 🔒 Lockfile `lazy-lock.json` to keep track of installed plugin versions +- 🔎 Automatically check for updates +- 📋 Commit, branch, tag, version, and full [Semver](https://devhints.io/semver) support +- 📈 Statusline component to see the number of pending updates + ## ✅ TODO - [x] fancy UI to manage all your Neovim plugins @@ -18,13 +37,14 @@ - [x] Profiling - [x] lockfile `lazy-lock.json` - [x] upvalues in `config` & `init` -- [x] check for updates -- [x] commit, branch, tag, version support +- [x] automatically check for updates +- [x] commit, branch, tag, version and full semver support +- [x] statusline component to see number of pending updates + - [x] semver https://devhints.io/semver - [x] auto-loading on completion for lazy-loaded commands - [x] bootstrap code - [x] Background update checker -- [x] statusline component to see number of pending updates - [x] health checks: check merge conflicts async - [x] unsupported props or props from other managers - [x] other packages still in site? From fee15244aa0f70a201f01868c1e2803931b85a84 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 20:05:17 +0000 Subject: [PATCH 0109/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 976ef0f..5684aef 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 13 +*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 14 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -12,8 +12,29 @@ Table of Contents *lazy.nvim-table-of-contents* ============================================================================== 1. lazy.nvim *lazy.nvim-lazy.nvim* +Modern plugin manager for Neovim + FEATURES *lazy.nvim-features* + +- Manage all your Neovim plugins with a fancy UI +- Fast startup: Automatically caches and compiles byte code of all lua modules needed during startup +- Partial clones instead of shallow clones +- Auto lazy-loading of lua modules +- Lazy-loading on events, commands, filetypes and key mappings +- Automatically installs missing plugins before starting up so you can start using Neovim right away +- Async execution for improved performance +- No need to manually compile plugins +- Correct sequencing of dependencies +- Configurable in multiple files +- Dev option and patterns for using local plugin +- Profiling tools to optimize performance +- Lockfile `lazy-lock.json` to keep track of installed plugin versions +- Automatically check for updates +- Commit, branch, tag, version, and full Semver support +- Statusline component to see the number of pending updates + + TODO *lazy.nvim-todo* @@ -21,23 +42,26 @@ TODO *lazy.nvim-todo* - auto lazy-loading of lua modules - lazy-loading on events, commands, filetypes and key mappings - Partial clones instead of shallow clones -- waits till missing deps are installed (bootstrap Neovim and start using it right away) +- waits till missing deps are installed (bootstrap Neovim and start using it + right away) - Async - No need to manually compile -- Fast. Automatically caches and compiles byte code of all lua modules needed during startup -- Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?) +- Fast. Automatically caches and compiles byte code of all lua modules needed + during startup +- Correct sequencing of dependencies (deps should always be opt. Maybe make + everything opt?) - Config in multiple files - dev option and patterns for local packages - Profiling - lockfile `lazy-lock.json` - upvalues in `config` & `init` -- check for updates -- commit, branch, tag, version support +- automatically check for updates +- commit, branch, tag, version and full semver support +- statusline component to see number of pending updates - semver https://devhints.io/semver - auto-loading on completion for lazy-loaded commands - bootstrap code - Background update checker -- statusline component to see number of pending updates - health checks: check merge conflicts async - unsupported props or props from other managers - other packages still in site? From 002210710fffee18b04287d8674f476ad6d82d9f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:05:25 +0100 Subject: [PATCH 0110/1610] docs: added screenshot --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4b1b246..a71844e 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Modern plugin manager for Neovim +![image](https://user-images.githubusercontent.com/292349/207702945-6f1e7c89-9076-430b-b9e1-0bae8864a772.png) + ## ✨ Features - 📦 Manage all your Neovim plugins with a fancy UI From 3a14258e79eae468d296f534174167692a582d8d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 20:06:06 +0000 Subject: [PATCH 0111/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5684aef..1e8f9d7 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -14,6 +14,11 @@ Table of Contents *lazy.nvim-table-of-contents* Modern plugin manager for Neovim +
+ +

image

+
+ FEATURES *lazy.nvim-features* From 832ba79b775955b63cf74543e228afd347175c7c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:07:06 +0100 Subject: [PATCH 0112/1610] docs: added screenshot --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index a71844e..9c75593 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,11 @@ Modern plugin manager for Neovim - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? - [ ] package meta index (package.lua cache for all packages) + +## Profiler + +![image](https://user-images.githubusercontent.com/292349/207703263-3b38ca45-9779-482b-b684-4f8c3b3e76d0.png) + ## 📦 Differences with Packer From 861d180dc8834b166de844d2737c2eb036479c97 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 20:07:51 +0000 Subject: [PATCH 0113/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1e8f9d7..17dae95 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -6,6 +6,7 @@ Table of Contents *lazy.nvim-table-of-contents* 1. lazy.nvim |lazy.nvim-lazy.nvim| - Features |lazy.nvim-features| - TODO |lazy.nvim-todo| + - Profiler |lazy.nvim-profiler| - Differences with Packer |lazy.nvim-differences-with-packer| - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| @@ -89,6 +90,13 @@ TODO *lazy.nvim-todo* - package meta index (package.lua cache for all packages) +PROFILER *lazy.nvim-profiler* + +
+ +

image

+
+ DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* From e651e0110dcbc4a6f48b4d4302436f1d996bb508 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:08:28 +0100 Subject: [PATCH 0114/1610] docs: screenshots --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 9c75593..61fbd97 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,9 @@ Modern plugin manager for Neovim ![image](https://user-images.githubusercontent.com/292349/207703263-3b38ca45-9779-482b-b684-4f8c3b3e76d0.png) +![image](https://user-images.githubusercontent.com/292349/207703522-8bb20678-bb4c-4424-80e4-add3219711c3.png) + + ## 📦 Differences with Packer From 1daf3215808253ccbbc8362a9250384c24e20811 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 20:09:17 +0000 Subject: [PATCH 0115/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 17dae95..ed643e6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -97,6 +97,11 @@ PROFILER *lazy.nvim-profiler*

image

+
+ +

image

+
+ DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* From c6b76bdc70ad5595f7798f6832cf4d46c7ebd2d0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:11:01 +0100 Subject: [PATCH 0116/1610] docs: updated docs --- README.md | 53 ++++++----------------------------------------------- TODO.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 47 deletions(-) create mode 100644 TODO.md diff --git a/README.md b/README.md index 61fbd97..9c71ad7 100644 --- a/README.md +++ b/README.md @@ -23,59 +23,18 @@ Modern plugin manager for Neovim - 📋 Commit, branch, tag, version, and full [Semver](https://devhints.io/semver) support - 📈 Statusline component to see the number of pending updates -## ✅ TODO - -- [x] fancy UI to manage all your Neovim plugins -- [x] auto lazy-loading of lua modules -- [x] lazy-loading on events, commands, filetypes and key mappings -- [x] Partial clones instead of shallow clones -- [x] waits till missing deps are installed (bootstrap Neovim and start using it right away) -- [x] Async -- [x] No need to manually compile -- [x] Fast. Automatically caches and compiles byte code of all lua modules needed during startup -- [x] Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?) -- [x] Config in multiple files -- [x] dev option and patterns for local packages -- [x] Profiling -- [x] lockfile `lazy-lock.json` -- [x] upvalues in `config` & `init` -- [x] automatically check for updates -- [x] commit, branch, tag, version and full semver support -- [x] statusline component to see number of pending updates - -- [x] semver https://devhints.io/semver -- [x] auto-loading on completion for lazy-loaded commands -- [x] bootstrap code -- [x] Background update checker -- [x] health checks: check merge conflicts async - - [x] unsupported props or props from other managers - - [x] other packages still in site? - - [x] other package manager artifacts still present? compiled etc -- [x] status page showing running handlers and cache stats -- [x] temp colorscheme used during startup when installing missing plugins -- [x] automatically reloads when config changes are detected -- [x] handlers imply opt -- [x] dependencies imply opt for deps -- [ ] show spec errors in health -- [ ] fix plugin details -- [ ] show disabled plugins (strikethrough?) -- [ ] log file -- [ ] git tests -- [ ] Import specs from other plugin managers -- [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) - - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` - - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range - - default semver merging strategy: if no version matches all, then use highest version? - - [ ] package meta index (package.lua cache for all packages) - ## Profiler +The profiling view shows you why and how long it took to load your plugins. + ![image](https://user-images.githubusercontent.com/292349/207703263-3b38ca45-9779-482b-b684-4f8c3b3e76d0.png) +## Debug + +See an overview of active lazy-loading handlers and what's in the module cache + ![image](https://user-images.githubusercontent.com/292349/207703522-8bb20678-bb4c-4424-80e4-add3219711c3.png) - - ## 📦 Differences with Packer - **Plugin Spec**: diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..88eae3f --- /dev/null +++ b/TODO.md @@ -0,0 +1,44 @@ +## ✅ TODO + +- [x] fancy UI to manage all your Neovim plugins +- [x] auto lazy-loading of lua modules +- [x] lazy-loading on events, commands, filetypes and key mappings +- [x] Partial clones instead of shallow clones +- [x] waits till missing deps are installed (bootstrap Neovim and start using it right away) +- [x] Async +- [x] No need to manually compile +- [x] Fast. Automatically caches and compiles byte code of all lua modules needed during startup +- [x] Correct sequencing of dependencies (deps should always be opt. Maybe make everything opt?) +- [x] Config in multiple files +- [x] dev option and patterns for local packages +- [x] Profiling +- [x] lockfile `lazy-lock.json` +- [x] upvalues in `config` & `init` +- [x] automatically check for updates +- [x] commit, branch, tag, version and full semver support +- [x] statusline component to see number of pending updates + +- [x] semver https://devhints.io/semver +- [x] auto-loading on completion for lazy-loaded commands +- [x] bootstrap code +- [x] Background update checker +- [x] health checks: check merge conflicts async + - [x] unsupported props or props from other managers + - [x] other packages still in site? + - [x] other package manager artifacts still present? compiled etc +- [x] status page showing running handlers and cache stats +- [x] temp colorscheme used during startup when installing missing plugins +- [x] automatically reloads when config changes are detected +- [x] handlers imply opt +- [x] dependencies imply opt for deps +- [ ] show spec errors in health +- [ ] fix plugin details +- [ ] show disabled plugins (strikethrough?) +- [ ] log file +- [ ] git tests +- [ ] Import specs from other plugin managers +- [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) + - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` + - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range + - default semver merging strategy: if no version matches all, then use highest version? + - [ ] package meta index (package.lua cache for all packages) From 51cbff1c8b55ef6817a96404508e8aa453004e0a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 20:11:48 +0000 Subject: [PATCH 0117/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 58 +++++++---------------------------------------- 1 file changed, 8 insertions(+), 50 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ed643e6..f30b58a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -5,8 +5,8 @@ Table of Contents *lazy.nvim-table-of-contents* 1. lazy.nvim |lazy.nvim-lazy.nvim| - Features |lazy.nvim-features| - - TODO |lazy.nvim-todo| - Profiler |lazy.nvim-profiler| + - Debug |lazy.nvim-debug| - Differences with Packer |lazy.nvim-differences-with-packer| - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| @@ -41,62 +41,20 @@ FEATURES *lazy.nvim-features* - Statusline component to see the number of pending updates -TODO *lazy.nvim-todo* - - -- fancy UI to manage all your Neovim plugins -- auto lazy-loading of lua modules -- lazy-loading on events, commands, filetypes and key mappings -- Partial clones instead of shallow clones -- waits till missing deps are installed (bootstrap Neovim and start using it - right away) -- Async -- No need to manually compile -- Fast. Automatically caches and compiles byte code of all lua modules needed - during startup -- Correct sequencing of dependencies (deps should always be opt. Maybe make - everything opt?) -- Config in multiple files -- dev option and patterns for local packages -- Profiling -- lockfile `lazy-lock.json` -- upvalues in `config` & `init` -- automatically check for updates -- commit, branch, tag, version and full semver support -- statusline component to see number of pending updates -- semver https://devhints.io/semver -- auto-loading on completion for lazy-loaded commands -- bootstrap code -- Background update checker -- health checks: check merge conflicts async - - unsupported props or props from other managers - - other packages still in site? - - other package manager artifacts still present? compiled etc -- status page showing running handlers and cache stats -- temp colorscheme used during startup when installing missing plugins -- automatically reloads when config changes are detected -- handlers imply opt -- dependencies imply opt for deps -- show spec errors in health -- fix plugin details -- show disabled plugins (strikethrough?) -- log file -- git tests -- Import specs from other plugin managers -- packspec - - add support to specify `engines`, `os` and `cpu` like in `package.json` - - semver merging. Should check if two or more semver ranges are compatible and calculate the union range - - default semver merging strategy: if no version matches all, then use highest version? - - package meta index (package.lua cache for all packages) - - PROFILER *lazy.nvim-profiler* +The profiling view shows you why and how long it took to load your plugins. +

image

+DEBUG *lazy.nvim-debug* + +See an overview of active lazy-loading handlers and what’s in the module +cache +

image

From 0f56097612e1389dc1ec8f5a25ecebab6873e2a5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:17:38 +0100 Subject: [PATCH 0118/1610] docs: better screenshot --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c71ad7..345c94d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Modern plugin manager for Neovim -![image](https://user-images.githubusercontent.com/292349/207702945-6f1e7c89-9076-430b-b9e1-0bae8864a772.png) +![image](https://user-images.githubusercontent.com/292349/207705153-077e183e-ae5f-4cbe-b1d8-07b7bf86026e.png) ## ✨ Features From 4d19babf7ef6aae11af5b9f6412b02dda6d29c14 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 20:18:23 +0000 Subject: [PATCH 0119/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f30b58a..73e6161 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -16,7 +16,7 @@ Table of Contents *lazy.nvim-table-of-contents* Modern plugin manager for Neovim
- +

image

From 675dece8328b6007301ef6d619bd5275ba680657 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:24:51 +0100 Subject: [PATCH 0120/1610] docs: added requirements --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 345c94d..308ea55 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,10 @@ Modern plugin manager for Neovim - 📋 Commit, branch, tag, version, and full [Semver](https://devhints.io/semver) support - 📈 Statusline component to see the number of pending updates +## ⚡️ Requirements + +- Neovim >= **0.8.0** + ## Profiler The profiling view shows you why and how long it took to load your plugins. From 72f64ce1f7a3bbcbc500a7e0f8d7950376ec6a12 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:25:11 +0100 Subject: [PATCH 0121/1610] feat: added checks for Neovim version --- lua/lazy/core/config.lua | 3 +++ lua/lazy/init.lua | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1ca912d..42230b5 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -113,6 +113,9 @@ function M.setup(spec, opts) } end + -- disable plugin loading since we do all of that ourselves + vim.go.loadplugins = false + vim.api.nvim_create_autocmd("User", { pattern = "VeryLazy", once = true, diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index fd61417..51a6298 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -3,11 +3,17 @@ local M = {} ---@param spec LazySpec Should be a module name to load, or a plugin spec ---@param opts? LazyConfig function M.setup(spec, opts) - if not vim.go.loadplugins or vim.g.lazy_did_setup then + if vim.fn.has("nvim-0.8.0") ~= 1 then + vim.notify("lazy.nvim requires Neovim >= 0.8.0", vim.log.levels.ERROR, { title = "lazy.nvim" }) + return + end + if not vim.go.loadplugins then + return + end + if vim.g.lazy_did_setup then vim.notify("Re-sourcing your config is not supported with lazy.nvim", vim.log.levels.WARN, { title = "lazy.nvim" }) return end - vim.go.loadplugins = false vim.g.lazy_did_setup = true local start = vim.loop.hrtime() From 5128d896c759c0599b6da5f5ba2cee102d864cad Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:38:24 +0100 Subject: [PATCH 0122/1610] fix: destroy the cache when VIMRUNTIME has changed --- lua/lazy/core/cache.lua | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 12d9394..8bcd203 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -155,6 +155,8 @@ end function M.save_cache() local f = assert(uv.fs_open(M.config.path, "w", 438)) + uv.fs_write(f, vim.env.VIMRUNTIME) + uv.fs_write(f, "\0") for modname, entry in pairs(M.cache) do if entry.used > os.time() - M.ttl then entry.modname = modname @@ -184,7 +186,16 @@ function M.load_cache() local data = uv.fs_read(f, cache_hash.size, 0) --[[@as string]] uv.fs_close(f) - local offset = 1 + local zero = data:find("\0", 1, true) + if not zero then + return + end + + if vim.env.VIMRUNTIME ~= data:sub(1, zero - 1) then + return + end + + local offset = zero + 1 while offset + 1 < #data do local header = ffi.cast("uint32_t*", ffi.new("const char[28]", data:sub(offset, offset + 27))) offset = offset + 28 From 1ee4e8b7197ff23383a6a3306cdd15f20be04b72 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:38:40 +0100 Subject: [PATCH 0123/1610] fix: updated the bootstrap code --- lua/lazy/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 51a6298..10bbe2d 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -68,7 +68,7 @@ function M.stats() end function M.bootstrap() - local lazypath = vim.fn.stdpath("data") .. "/site/pack/lazy/opt/lazy.nvim" + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then vim.fn.system({ "git", @@ -78,7 +78,7 @@ function M.bootstrap() "https://github.com/folke/lazy.nvim.git", lazypath, }) - vim.opt.runtimepath:append(lazypath) + vim.opt.runtimepath:prepend(lazypath) end end From a27be6eb31a01a04abc17b01cbf2bad5d53a386c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:41:19 +0100 Subject: [PATCH 0124/1610] docs: added bootstrap code --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 308ea55..322a57a 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,25 @@ Modern plugin manager for Neovim - Neovim >= **0.8.0** +## 📦 Installation + +You can use the following Lua code to bootstrap **lazy.nvim** + +```lua + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" + if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "--single-branch", + "https://github.com/folke/lazy.nvim.git", + lazypath, + }) + vim.opt.runtimepath:prepend(lazypath) + end +``` + ## Profiler The profiling view shows you why and how long it took to load your plugins. From eccc3883eb88ef4f91fff8ac19d9f791e3e29cd5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 20:42:10 +0000 Subject: [PATCH 0125/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73e6161..9e1b8c7 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -5,6 +5,8 @@ Table of Contents *lazy.nvim-table-of-contents* 1. lazy.nvim |lazy.nvim-lazy.nvim| - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Installation |lazy.nvim-installation| - Profiler |lazy.nvim-profiler| - Debug |lazy.nvim-debug| - Differences with Packer |lazy.nvim-differences-with-packer| @@ -41,6 +43,32 @@ FEATURES *lazy.nvim-features* - Statusline component to see the number of pending updates +REQUIREMENTS *lazy.nvim-requirements* + + +- Neovim >= **0.8.0** + + +INSTALLATION *lazy.nvim-installation* + +You can use the following Lua code to bootstrap **lazy.nvim** + +> + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" + if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "--single-branch", + "https://github.com/folke/lazy.nvim.git", + lazypath, + }) + vim.opt.runtimepath:prepend(lazypath) + end +< + + PROFILER *lazy.nvim-profiler* The profiling view shows you why and how long it took to load your plugins. From 4392a58c2298131b1a53db28ebef82e7dad8ef87 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:54:17 +0100 Subject: [PATCH 0126/1610] docs: added usage and config --- README.md | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/README.md b/README.md index 322a57a..2cc74c6 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,108 @@ You can use the following Lua code to bootstrap **lazy.nvim** end ``` +## 🚀 Usage + +Add **lazy.nvim** to the top of your `init.lua` + +```lua +-- You can use a lua module that contains your plugins. +-- All sub modules of the lua module will also be automatically loaded +-- This is the preferred setup so your plugin specs can be properly cached. +require("lazy").setup("config.plugins", { + -- add any optional configuration options here +}) + +-- Alternatively you can specify a plugin list +require("lazy").setup({ + "folke/neodev.nvim", + "folke/which-key.nvim", + { "folke/neoconf.nvim", cmd = "Neoconf" }, + }, { + -- add any optional configuration options here +}) +``` + +## ⚙️ Configuration + +**lazy.nvim** comes with the following defaults: + +```lua +{ + root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed + defaults = { + lazy = false, -- should plugins be lazy-loaded? + version = nil, + -- version = "*", -- enable this to try installing the latest stable versions of plugins + }, + lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. + concurrency = nil, ---@type number limit the maximum amount of concurrent tasks + git = { + -- defaults for the `Lazy log` command + -- log = { "-10" }, -- show the last 10 commits + log = { "--since=1 days ago" }, -- show commits from the last 3 days + timeout = 120, -- kill processes that take more than 2 minutes + url_format = "https://github.com/%s.git", + }, + dev = { + -- directory where you store your local plugin projects + path = vim.fn.expand("~/projects"), + ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub + patterns = {}, -- For example {"folke"} + }, + 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 = { + -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. + border = "none", + icons = { + cmd = " ", + config = "", + event = "", + ft = " ", + init = " ", + keys = " ", + plugin = " ", + runtime = " ", + source = " ", + start = "", + task = "✔ ", + }, + throttle = 20, -- how frequently should the ui process render events + }, + checker = { + -- automcatilly 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 + }, + performance = { + ---@type LazyCacheConfig + cache = nil, + 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[] list any plugins you want to disable here + disabled_plugins = { + -- "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + -- "tarPlugin", + -- "tohtml", + -- "tutor", + -- "zipPlugin", + }, + }, + }, +} +``` + ## Profiler The profiling view shows you why and how long it took to load your plugins. From 136776744b55955e4f3f2e8a2d377b86352d2ae9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 20:55:03 +0000 Subject: [PATCH 0127/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 106 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9e1b8c7..8646980 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -7,6 +7,8 @@ Table of Contents *lazy.nvim-table-of-contents* - Features |lazy.nvim-features| - Requirements |lazy.nvim-requirements| - Installation |lazy.nvim-installation| + - Usage |lazy.nvim-usage| + - Configuration |lazy.nvim-configuration| - Profiler |lazy.nvim-profiler| - Debug |lazy.nvim-debug| - Differences with Packer |lazy.nvim-differences-with-packer| @@ -69,6 +71,110 @@ You can use the following Lua code to bootstrap **lazy.nvim** < +USAGE *lazy.nvim-usage* + +Add **lazy.nvim** to the top of your `init.lua` + +> + -- You can use a lua module that contains your plugins. + -- All sub modules of the lua module will also be automatically loaded + -- This is the preferred setup so your plugin specs can be properly cached. + require("lazy").setup("config.plugins", { + -- add any optional configuration options here + }) + + -- Alternatively you can specify a plugin list + require("lazy").setup({ + "folke/neodev.nvim", + "folke/which-key.nvim", + { "folke/neoconf.nvim", cmd = "Neoconf" }, + }, { + -- add any optional configuration options here + }) +< + + +CONFIGURATION *lazy.nvim-configuration* + +**lazy.nvim** comes with the following defaults: + +> + { + root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed + defaults = { + lazy = false, -- should plugins be lazy-loaded? + version = nil, + -- version = "", -- enable this to try installing the latest stable versions of plugins + }, + lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. + concurrency = nil, ---@type number limit the maximum amount of concurrent tasks + git = { + -- defaults for the `Lazy log` command + -- log = { "-10" }, -- show the last 10 commits + log = { "--since=1 days ago" }, -- show commits from the last 3 days + timeout = 120, -- kill processes that take more than 2 minutes + url_format = "https://github.com/%s.git", + }, + dev = { + -- directory where you store your local plugin projects + path = vim.fn.expand("~/projects"), + ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub + patterns = {}, -- For example {"folke"} + }, + 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 = { + -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. + border = "none", + icons = { + cmd = " ", + config = "", + event = "", + ft = " ", + init = " ", + keys = " ", + plugin = " ", + runtime = " ", + source = " ", + start = "", + task = " ", + }, + throttle = 20, -- how frequently should the ui process render events + }, + checker = { + -- automcatilly 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 + }, + performance = { + ---@type LazyCacheConfig + cache = nil, + 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[] list any plugins you want to disable here + disabled_plugins = { + -- "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + -- "tarPlugin", + -- "tohtml", + -- "tutor", + -- "zipPlugin", + }, + }, + }, + } +< + + PROFILER *lazy.nvim-profiler* The profiling view shows you why and how long it took to load your plugins. From df80b8845aa193da426bbc0502ecc558140368c2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:57:21 +0100 Subject: [PATCH 0128/1610] docs: updates --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2cc74c6..6215dc3 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,7 @@ You can use the following Lua code to bootstrap **lazy.nvim** end ``` -## 🚀 Usage - -Add **lazy.nvim** to the top of your `init.lua` +Next step is to add **lazy.nvim** to the top of your `init.lua` ```lua -- You can use a lua module that contains your plugins. @@ -148,13 +146,15 @@ require("lazy").setup({ } ``` -## Profiler +## 🚀 Usage + +## 📊 Profiler The profiling view shows you why and how long it took to load your plugins. ![image](https://user-images.githubusercontent.com/292349/207703263-3b38ca45-9779-482b-b684-4f8c3b3e76d0.png) -## Debug +## 🪲 Debug See an overview of active lazy-loading handlers and what's in the module cache From 0a34571e4996405b956de8e3d25ce42d66d0ef54 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 20:58:18 +0000 Subject: [PATCH 0129/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 8646980..a98b330 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -7,10 +7,10 @@ Table of Contents *lazy.nvim-table-of-contents* - Features |lazy.nvim-features| - Requirements |lazy.nvim-requirements| - Installation |lazy.nvim-installation| - - Usage |lazy.nvim-usage| - Configuration |lazy.nvim-configuration| + - Usage |lazy.nvim-usage| - Profiler |lazy.nvim-profiler| - - Debug |lazy.nvim-debug| + - 🪲 Debug |lazy.nvim-🪲-debug| - Differences with Packer |lazy.nvim-differences-with-packer| - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| @@ -71,9 +71,7 @@ You can use the following Lua code to bootstrap **lazy.nvim** < -USAGE *lazy.nvim-usage* - -Add **lazy.nvim** to the top of your `init.lua` +Next step is to add **lazy.nvim** to the top of your `init.lua` > -- You can use a lua module that contains your plugins. @@ -175,6 +173,8 @@ CONFIGURATION *lazy.nvim-configuration* < +USAGE *lazy.nvim-usage* + PROFILER *lazy.nvim-profiler* The profiling view shows you why and how long it took to load your plugins. @@ -184,7 +184,7 @@ The profiling view shows you why and how long it took to load your plugins.

image

-DEBUG *lazy.nvim-debug* +🪲 DEBUG *lazy.nvim-🪲-debug* See an overview of active lazy-loading handlers and what’s in the module cache From 1adebbbcc73b374ecf62ff0aa4c3336fe412386e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 21:58:55 +0100 Subject: [PATCH 0130/1610] docs: fixed the cache options --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6215dc3..54a1708 100644 --- a/README.md +++ b/README.md @@ -125,8 +125,16 @@ require("lazy").setup({ frequency = 3600, -- check for updates every hour }, performance = { - ---@type LazyCacheConfig - cache = nil, + cache = { + enabled = true, + path = vim.fn.stdpath("state") .. "/lazy.state", + -- Once one of the following events triggers, caching will be disabled. + -- To cache all modules, set this to `{}`, but that is not recommended. + -- The default is to disable on: + -- * VimEnter: not useful to cache anything else beyond startup + -- * BufReadPre: this will be triggered early when opening a file from the command line directly + disable_events = { "VimEnter", "BufReadPre" }, + }, reset_packpath = true, -- reset the package path to improve startup time rtp = { reset = true, -- reset the runtime path to $VIMRUNTIME and your config directory From 7ca0746fbf9f571911be7d17333fe242854a1c90 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 20:59:50 +0000 Subject: [PATCH 0131/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a98b330..6fed76d 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -151,8 +151,16 @@ CONFIGURATION *lazy.nvim-configuration* frequency = 3600, -- check for updates every hour }, performance = { - ---@type LazyCacheConfig - cache = nil, + cache = { + enabled = true, + path = vim.fn.stdpath("state") .. "/lazy.state", + -- Once one of the following events triggers, caching will be disabled. + -- To cache all modules, set this to `{}`, but that is not recommended. + -- The default is to disable on: + -- VimEnter: not useful to cache anything else beyond startup + -- BufReadPre: this will be triggered early when opening a file from the command line directly + disable_events = { "VimEnter", "BufReadPre" }, + }, reset_packpath = true, -- reset the package path to improve startup time rtp = { reset = true, -- reset the runtime path to $VIMRUNTIME and your config directory From 650e192c87d31cd8d577022526d7d580c8bed934 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 22:10:45 +0100 Subject: [PATCH 0132/1610] docs: updated feature list --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 54a1708..23836a7 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,23 @@ # 💤 lazy.nvim -Modern plugin manager for Neovim +**lazy.nvim** is a modern plugin manager for Neovim. ![image](https://user-images.githubusercontent.com/292349/207705153-077e183e-ae5f-4cbe-b1d8-07b7bf86026e.png) ## ✨ Features -- 📦 Manage all your Neovim plugins with a fancy UI -- 🚀 Fast startup: Automatically caches and compiles byte code of all lua modules needed during startup +- 📦 Manage all your Neovim plugins with a sleek and intuitive UI +- 🚀 Fast startup times thanks to automatic caching and bytecode compilation of lua modules. - 💾 Partial clones instead of shallow clones -- 🔌 Auto lazy-loading of lua modules -- 📆 Lazy-loading on events, commands, filetypes and key mappings -- ⏳ Automatically installs missing plugins before starting up so you can start using Neovim right away +- 🔌 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 -- 💻 Dev option and patterns for using local plugin +- 💻 Dev options and patterns for using local plugins - 📊 Profiling tools to optimize performance -- 🔒 Lockfile `lazy-lock.json` to keep track of installed plugin versions +- 🔒 Lockfile `lazy-lock.json` to keep track of installed plugins - 🔎 Automatically check for updates - 📋 Commit, branch, tag, version, and full [Semver](https://devhints.io/semver) support - 📈 Statusline component to see the number of pending updates From 72914b916646054722f6c65bf4814731f7759b8f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 21:11:38 +0000 Subject: [PATCH 0133/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6fed76d..42467f8 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -17,7 +17,7 @@ Table of Contents *lazy.nvim-table-of-contents* ============================================================================== 1. lazy.nvim *lazy.nvim-lazy.nvim* -Modern plugin manager for Neovim +**lazy.nvim** is a modern plugin manager for Neovim.
@@ -27,19 +27,18 @@ Modern plugin manager for Neovim FEATURES *lazy.nvim-features* -- Manage all your Neovim plugins with a fancy UI -- Fast startup: Automatically caches and compiles byte code of all lua modules needed during startup +- Manage all your Neovim plugins with a sleek and intuitive UI +- Fast startup times thanks to automatic caching and bytecode compilation of lua modules. - Partial clones instead of shallow clones -- Auto lazy-loading of lua modules -- Lazy-loading on events, commands, filetypes and key mappings -- Automatically installs missing plugins before starting up so you can start using Neovim right away +- 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 -- Dev option and patterns for using local plugin +- Dev options and patterns for using local plugins - Profiling tools to optimize performance -- Lockfile `lazy-lock.json` to keep track of installed plugin versions +- 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 From 48edfecb690059aaaded57ddd2963030013eff7f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 14 Dec 2022 22:34:37 +0100 Subject: [PATCH 0134/1610] chore(main): release 4.0.0 (#9) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00598b8..1d44c67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## [4.0.0](https://github.com/folke/lazy.nvim/compare/v3.0.0...v4.0.0) (2022-12-14) + + +### ⚠ BREAKING CHANGES + +* lazy now handles the full startup sequence (`vim.go.loadplugins=false`) + +### Features + +* added checks for Neovim version ([72f64ce](https://github.com/folke/lazy.nvim/commit/72f64ce1f7a3bbcbc500a7e0f8d7950376ec6a12)) +* getter for plugins ([8de617c](https://github.com/folke/lazy.nvim/commit/8de617c01b572965d8a48362597fce01dc3ebcc7)) +* lazy now handles the full startup sequence (`vim.go.loadplugins=false`) ([ec2f432](https://github.com/folke/lazy.nvim/commit/ec2f432a84bead4aaaf684b4eb2d88e41592703e)) +* **ui:** show `updates available` diagnostic when an update is available ([ad0b4ca](https://github.com/folke/lazy.nvim/commit/ad0b4caa648fe84eb1dff5e55d3f02d293b33ad1)) + + +### Bug Fixes + +* destroy the cache when VIMRUNTIME has changed ([5128d89](https://github.com/folke/lazy.nvim/commit/5128d896c759c0599b6da5f5ba2cee102d864cad)) +* updated the bootstrap code ([1ee4e8b](https://github.com/folke/lazy.nvim/commit/1ee4e8b7197ff23383a6a3306cdd15f20be04b72)) + ## [3.0.0](https://github.com/folke/lazy.nvim/compare/v2.2.0...v3.0.0) (2022-12-13) From 869e6dab4b4bec6ca37e985be9f92022ed378629 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 14 Dec 2022 23:29:00 +0100 Subject: [PATCH 0135/1610] docs: bootstrap --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 23836a7..1204adf 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,8 @@ You can use the following Lua code to bootstrap **lazy.nvim** + + ```lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then @@ -45,6 +47,8 @@ You can use the following Lua code to bootstrap **lazy.nvim** end ``` + + Next step is to add **lazy.nvim** to the top of your `init.lua` ```lua From ccdf65b5b8974438cb60c10ec00c7302c339f9da Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 00:22:18 +0100 Subject: [PATCH 0136/1610] fix: `Plugin.init` implies lazy-loading --- lua/lazy/core/plugin.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 44c32c8..5a5e9ad 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -175,6 +175,7 @@ function M.update_state() or plugin.keys or plugin.ft or plugin.cmd + or plugin.init plugin.lazy = lazy and true or false end if plugin.dir:find(Config.options.root) == 1 then From 80a7839eec62560e9160663cee4ea4c9e67196fc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 00:22:40 +0100 Subject: [PATCH 0137/1610] feat: lua code generator for the README.md --- lua/lazy/docs.lua | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 lua/lazy/docs.lua diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua new file mode 100644 index 0000000..1d20f69 --- /dev/null +++ b/lua/lazy/docs.lua @@ -0,0 +1,76 @@ +local M = {} + +function M.read(file) + local fd = assert(io.open(file, "r")) + local data = fd:read("*a") ---@type string + fd:close() + return data +end + +function M.indent(str, indent) + local lines = vim.split(str, "\n") + for l, line in ipairs(lines) do + lines[l] = (" "):rep(indent) .. line + end + return table.concat(lines, "\n") +end + +---@param str string +function M.fix_indent(str) + local lines = vim.split(str, "\n") + + local width = 120 + for _, line in ipairs(lines) do + width = math.min(width, #line:match("^%s*")) + end + + for l, line in ipairs(lines) do + lines[l] = line:sub(width) + end + return table.concat(lines, "\n") +end + +---@param contents table +function M.save(contents) + local readme = M.read("README.md") + for tag, content in pairs(contents) do + content = M.fix_indent(content) + content = content:gsub("%%", "%%%%") + content = vim.trim(content) + local pattern = "(<%!%-%- " .. tag .. "_start %-%->).*(<%!%-%- " .. tag .. "_end %-%->)" + if not readme:find(pattern) then + error("tag " .. tag .. " not found") + end + readme = readme:gsub(pattern, "%1\n\n```lua\n" .. content .. "\n```\n\n%2") + end + + local fd = assert(io.open("README.md", "w+")) + fd:write(readme) + fd:close() +end + +---@return string +function M.extract(file, pattern) + local init = M.read(file) + return assert(init:match(pattern)) +end + +function M.update() + local cache_config = M.extract("lua/lazy/core/cache.lua", "\nM%.config = ({.-\n})") + local config = M.extract("lua/lazy/core/config.lua", "\nM%.defaults = ({.-\n})") + config = config:gsub( + "\n%s*%-%-%-@type LazyCacheConfig.*cache = nil,", + "\n" .. M.indent("cache = " .. cache_config .. ",", 4) + ) + config = config:gsub("%s*debug = false.\n", "\n") + M.save({ + bootstrap = M.extract("lua/lazy/init.lua", "function M%.bootstrap%(%)\n(.-)\nend"), + config = config, + spec = M.read("lua/lazy/example.lua"), + }) + vim.cmd.checktime() +end + +M.update() + +return M From dc1d71d5cf1a2cc07d113b2b3206b62a58c91f95 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 00:23:01 +0100 Subject: [PATCH 0138/1610] docs: added plugin spec code --- README.md | 109 ++++++++++++++++++++++++++++++++++++++----- lua/lazy/example.lua | 72 ++++++++++++++++++++++++++++ 2 files changed, 169 insertions(+), 12 deletions(-) create mode 100644 lua/lazy/example.lua diff --git a/README.md b/README.md index 1204adf..17c8d67 100644 --- a/README.md +++ b/README.md @@ -33,18 +33,18 @@ You can use the following Lua code to bootstrap **lazy.nvim** ```lua - local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "--single-branch", - "https://github.com/folke/lazy.nvim.git", - lazypath, - }) - vim.opt.runtimepath:prepend(lazypath) - end +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" + if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "--single-branch", + "https://github.com/folke/lazy.nvim.git", + lazypath, + }) + vim.opt.runtimepath:prepend(lazypath) + end ``` @@ -69,10 +69,93 @@ require("lazy").setup({ }) ``` +## 🔌 Plugin Spec + + + +```lua +return { + -- the colorscheme should be available when starting Neovim + "folke/tokyonight.nvim", + + -- 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", + -- custom config that will be executed when loading the plugin + config = function() + require("neorg").setup() + end, + }, + + { + "dstein64/vim-startuptime", + -- lazy-load on a command + cmd = "StartupTime", + }, + + { + "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, + }, + + -- 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" }, + + { + "cshuaimin/ssr.nvim", + -- init is always executed during startup, but doesn't load the plugin yet. + -- init implies lazy loading + init = function() + vim.keymap.set({ "n", "x" }, "cR", function() + -- this require will automatically load the plugin + require("ssr").open() + end, { desc = "Structural Replace" }) + end, + }, + + { + "monaqa/dial.nvim", + -- lazy-load on keys + keys = { "", "" }, + }, + + -- local plugins need to be explicitely 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 configure with the dev option. + -- This will use ~/projects/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 }, +} +``` + + + ## ⚙️ Configuration **lazy.nvim** comes with the following defaults: + + ```lua { root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed @@ -157,6 +240,8 @@ require("lazy").setup({ } ``` + + ## 🚀 Usage ## 📊 Profiler diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua new file mode 100644 index 0000000..e91eb50 --- /dev/null +++ b/lua/lazy/example.lua @@ -0,0 +1,72 @@ +return { + -- the colorscheme should be available when starting Neovim + "folke/tokyonight.nvim", + + -- 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", + -- custom config that will be executed when loading the plugin + config = function() + require("neorg").setup() + end, + }, + + { + "dstein64/vim-startuptime", + -- lazy-load on a command + cmd = "StartupTime", + }, + + { + "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, + }, + + -- 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" }, + + { + "cshuaimin/ssr.nvim", + -- init is always executed during startup, but doesn't load the plugin yet. + -- init implies lazy loading + init = function() + vim.keymap.set({ "n", "x" }, "cR", function() + -- this require will automatically load the plugin + require("ssr").open() + end, { desc = "Structural Replace" }) + end, + }, + + { + "monaqa/dial.nvim", + -- lazy-load on keys + keys = { "", "" }, + }, + + -- local plugins need to be explicitely 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 configure with the dev option. + -- This will use ~/projects/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 }, +} From ed6929c6969dc54a60e3005c933b72cf9f5255be Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 23:23:54 +0000 Subject: [PATCH 0139/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 103 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 12 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 42467f8..074edb3 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -7,6 +7,7 @@ Table of Contents *lazy.nvim-table-of-contents* - Features |lazy.nvim-features| - Requirements |lazy.nvim-requirements| - Installation |lazy.nvim-installation| + - Plugin Spec |lazy.nvim-plugin-spec| - Configuration |lazy.nvim-configuration| - Usage |lazy.nvim-usage| - Profiler |lazy.nvim-profiler| @@ -55,18 +56,18 @@ INSTALLATION *lazy.nvim-installation* You can use the following Lua code to bootstrap **lazy.nvim** > - local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "--single-branch", - "https://github.com/folke/lazy.nvim.git", - lazypath, - }) - vim.opt.runtimepath:prepend(lazypath) - end + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" + if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "--single-branch", + "https://github.com/folke/lazy.nvim.git", + lazypath, + }) + vim.opt.runtimepath:prepend(lazypath) + end < @@ -91,6 +92,84 @@ Next step is to add **lazy.nvim** to the top of your `init.lua` < +PLUGIN SPEC *lazy.nvim-plugin-spec* + +> + return { + -- the colorscheme should be available when starting Neovim + "folke/tokyonight.nvim", + + -- 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", + -- custom config that will be executed when loading the plugin + config = function() + require("neorg").setup() + end, + }, + + { + "dstein64/vim-startuptime", + -- lazy-load on a command + cmd = "StartupTime", + }, + + { + "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, + }, + + -- 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" }, + + { + "cshuaimin/ssr.nvim", + -- init is always executed during startup, but doesn't load the plugin yet. + -- init implies lazy loading + init = function() + vim.keymap.set({ "n", "x" }, "cR", function() + -- this require will automatically load the plugin + require("ssr").open() + end, { desc = "Structural Replace" }) + end, + }, + + { + "monaqa/dial.nvim", + -- lazy-load on keys + keys = { "", "" }, + }, + + -- local plugins need to be explicitely 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 configure with the dev option. + -- This will use ~/projects/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 }, + } +< + + CONFIGURATION *lazy.nvim-configuration* **lazy.nvim** comes with the following defaults: From f98a663e25b5eeec2d5ba014f50e1abd8869aace Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 00:29:11 +0100 Subject: [PATCH 0140/1610] docs: added toc --- README.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 17c8d67..921f49d 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,21 @@ - 📋 Commit, branch, tag, version, and full [Semver](https://devhints.io/semver) support - 📈 Statusline component to see the number of pending updates +## Table of Contents + + + +- [⚡️ Requirements](#️-requirements) +- [📦 Installation](#📦-installation) +- [🔌 Plugin Spec](#🔌-plugin-spec) +- [⚙️ Configuration](#️-configuration) +- [🚀 Usage](#🚀-usage) +- [📊 Profiler](#📊-profiler) +- [🪲 Debug](#🪲-debug) +- [📦 Differences with Packer](#📦-differences-with-packer) +- [📦 Other Neovim Plugin Managers in Lua](#📦-other-neovim-plugin-managers-in-lua) + + ## ⚡️ Requirements - Neovim >= **0.8.0** @@ -56,7 +71,7 @@ Next step is to add **lazy.nvim** to the top of your `init.lua` -- All sub modules of the lua module will also be automatically loaded -- This is the preferred setup so your plugin specs can be properly cached. require("lazy").setup("config.plugins", { - -- add any optional configuration options here + -- add any optional configuration here }) -- Alternatively you can specify a plugin list @@ -65,12 +80,17 @@ require("lazy").setup({ "folke/which-key.nvim", { "folke/neoconf.nvim", cmd = "Neoconf" }, }, { - -- add any optional configuration options here + -- add any optional configuration here }) ``` ## 🔌 Plugin Spec +| Property | Type | Description | +| -------- | ------- | ----------- | +| Item1.1 | Item2.1 | Item3.1 | +| Item1.2 | Item2.2 | Item3.2 | + ```lua From 46d0cdba461df1491c57a836e8d3c8753b5b759e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Dec 2022 23:30:02 +0000 Subject: [PATCH 0141/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 074edb3..c30d6e2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -5,6 +5,7 @@ Table of Contents *lazy.nvim-table-of-contents* 1. lazy.nvim |lazy.nvim-lazy.nvim| - Features |lazy.nvim-features| + - Table of Contents |lazy.nvim-table-of-contents| - Requirements |lazy.nvim-requirements| - Installation |lazy.nvim-installation| - Plugin Spec |lazy.nvim-plugin-spec| @@ -45,6 +46,21 @@ FEATURES *lazy.nvim-features* - Statusline component to see the number of pending updates +TABLE OF CONTENTS *lazy.nvim-table-of-contents* + + +- |lazy.nvim-requirements| +- |lazy.nvim-installation| +- |lazy.nvim-plugin-spec| +- |lazy.nvim-configuration| +- |lazy.nvim-usage| +- |lazy.nvim-profiler| +- |lazy.nvim-🪲-debug| +- |lazy.nvim-differences-with-packer| +- |lazy.nvim-other-neovim-plugin-managers-in-lua| + + + REQUIREMENTS *lazy.nvim-requirements* @@ -78,7 +94,7 @@ Next step is to add **lazy.nvim** to the top of your `init.lua` -- All sub modules of the lua module will also be automatically loaded -- This is the preferred setup so your plugin specs can be properly cached. require("lazy").setup("config.plugins", { - -- add any optional configuration options here + -- add any optional configuration here }) -- Alternatively you can specify a plugin list @@ -87,13 +103,18 @@ Next step is to add **lazy.nvim** to the top of your `init.lua` "folke/which-key.nvim", { "folke/neoconf.nvim", cmd = "Neoconf" }, }, { - -- add any optional configuration options here + -- add any optional configuration here }) < PLUGIN SPEC *lazy.nvim-plugin-spec* +│Property│ Type │Description│ +│Item1.1 │Item2.1│Item3.1 │ +│Item1.2 │Item2.2│Item3.2 │ + + > return { -- the colorscheme should be available when starting Neovim From f4720ee9f745c0b77366f1e5e6ea7fc7bfaf8010 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 08:46:25 +0100 Subject: [PATCH 0142/1610] feat(docs): added toc generator --- lua/lazy/docs.lua | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 1d20f69..78ad63b 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -15,6 +15,26 @@ function M.indent(str, indent) return table.concat(lines, "\n") end +function M.toc(md) + local toc = {} + local lines = vim.split(md, "\n") + local toc_found = false + for _, line in ipairs(lines) do + local hash, title = line:match("^(#+)%s*(.*)") + if hash then + if toc_found then + local anchor = string.gsub(title:lower(), "[^\32-\126]", "") + anchor = string.gsub(anchor, " ", "-") + toc[#toc + 1] = string.rep(" ", #hash - 1) .. "- [" .. title .. "](#" .. anchor .. ")" + end + if title:find("Table of Contents") then + toc_found = true + end + end + end + return M.fix_indent(table.concat(toc, "\n")) +end + ---@param str string function M.fix_indent(str) local lines = vim.split(str, "\n") @@ -33,15 +53,20 @@ end ---@param contents table function M.save(contents) local readme = M.read("README.md") + contents.toc = M.toc(readme) for tag, content in pairs(contents) do content = M.fix_indent(content) content = content:gsub("%%", "%%%%") content = vim.trim(content) - local pattern = "(<%!%-%- " .. tag .. "_start %-%->).*(<%!%-%- " .. tag .. "_end %-%->)" + local pattern = "(<%!%-%- " .. tag .. ":start %-%->).*(<%!%-%- " .. tag .. ":end %-%->)" if not readme:find(pattern) then error("tag " .. tag .. " not found") end - readme = readme:gsub(pattern, "%1\n\n```lua\n" .. content .. "\n```\n\n%2") + if tag == "toc" then + readme = readme:gsub(pattern, "%1\n\n" .. content .. "\n\n%2") + else + readme = readme:gsub(pattern, "%1\n\n```lua\n" .. content .. "\n```\n\n%2") + end end local fd = assert(io.open("README.md", "w+")) From d975decf92d809c69a003b1025e7465d28de14bb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 08:46:47 +0100 Subject: [PATCH 0143/1610] docs: added plugin properties --- README.md | 63 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 921f49d..51319e2 100644 --- a/README.md +++ b/README.md @@ -22,20 +22,21 @@ - 📋 Commit, branch, tag, version, and full [Semver](https://devhints.io/semver) support - 📈 Statusline component to see the number of pending updates -## Table of Contents +## 📄 Table of Contents - + -- [⚡️ Requirements](#️-requirements) -- [📦 Installation](#📦-installation) -- [🔌 Plugin Spec](#🔌-plugin-spec) -- [⚙️ Configuration](#️-configuration) -- [🚀 Usage](#🚀-usage) -- [📊 Profiler](#📊-profiler) -- [🪲 Debug](#🪲-debug) -- [📦 Differences with Packer](#📦-differences-with-packer) -- [📦 Other Neovim Plugin Managers in Lua](#📦-other-neovim-plugin-managers-in-lua) - +- [⚡️ Requirements](#-requirements) +- [📦 Installation](#-installation) +- [🔌 Plugin Spec](#-plugin-spec) +- [⚙️ Configuration](#-configuration) +- [🚀 Usage](#-usage) +- [📊 Profiler](#-profiler) +- [🪲 Debug](#-debug) +- [📦 Differences with Packer](#-differences-with-packer) +- [📦 Other Neovim Plugin Managers in Lua](#-other-neovim-plugin-managers-in-lua) + + ## ⚡️ Requirements @@ -45,7 +46,7 @@ You can use the following Lua code to bootstrap **lazy.nvim** - + ```lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" @@ -62,7 +63,7 @@ local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" end ``` - + Next step is to add **lazy.nvim** to the top of your `init.lua` @@ -86,12 +87,30 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| -------- | ------- | ----------- | -| Item1.1 | Item2.1 | Item3.1 | -| Item1.2 | Item2.2 | Item3.2 | +| Property | Type | Description | +| ---------------- | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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 dispay name | +| **dev** | `boolean?` | When `true`, a local plugin directory will be used instead. See `config.dev` | +| **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 laz-loading handlers triggers | +| **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | +| **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **config** | `fun(LazyPlugin)` | `config` is executed when the plugin loads | +| **build** | `fun(LazyPlugin)` | `build` is executed when a plugin is installed or updated | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | +| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | +| **event** | `string?` or `string[]` | Lazy-load on event | +| **cmd** | `string?` or `string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` | Lazy-load on key mapping | - + ```lua return { @@ -168,13 +187,13 @@ return { } ``` - + ## ⚙️ Configuration **lazy.nvim** comes with the following defaults: - + ```lua { @@ -260,7 +279,7 @@ return { } ``` - + ## 🚀 Usage From 70c0ad1b9579cb71432ec0d4c047c7dea141e3cf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 15 Dec 2022 07:48:04 +0000 Subject: [PATCH 0144/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c30d6e2..7854373 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 14 +*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 15 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -58,7 +58,6 @@ TABLE OF CONTENTS *lazy.nvim-table-of-contents* - |lazy.nvim-🪲-debug| - |lazy.nvim-differences-with-packer| - |lazy.nvim-other-neovim-plugin-managers-in-lua| - REQUIREMENTS *lazy.nvim-requirements* @@ -110,9 +109,27 @@ Next step is to add **lazy.nvim** to the top of your `init.lua` PLUGIN SPEC *lazy.nvim-plugin-spec* -│Property│ Type │Description│ -│Item1.1 │Item2.1│Item3.1 │ -│Item1.2 │Item2.2│Item3.2 │ +│ Property │ Type │ Description │ +│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ +│**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 dispay name │ +│**dev** │boolean? │When true, a local plugin directory will be used instead. See config.dev │ +│**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 laz-loading handlers triggers │ +│**enabled** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be used │ +│**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ +│**init** │fun(LazyPlugin) │init functions are always executed during startup │ +│**config** │fun(LazyPlugin) │config is executed when the plugin loads │ +│**build** │fun(LazyPlugin) │build is executed when a plugin is installed or updated │ +│**branch** │string? │Branch of the repository │ +│**tag** │string? │Tag of the repository │ +│**commit** │string? │Commit of the repository │ +│**version** │string? │Version to use from the repository. Full Semver ranges are supported │ +│**pin** │boolean? │When true, this plugin will not be included in updates │ +│**event** │string? or string[] │Lazy-load on event │ +│**cmd** │string? or string[] │Lazy-load on command │ +│**ft** │string? or string[] │Lazy-load on filetype │ +│**keys** │string? or string[] │Lazy-load on key mapping │ > From c812daf9ee1498d64a3a0d56774c6da8f78c156d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 09:06:36 +0100 Subject: [PATCH 0145/1610] ci: added lua code blocks to docs --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b116d4..fab58c5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,8 @@ jobs: with: vimdoc: lazy.nvim demojify: true + - name: Code Blocks + run: sed -i 's/^>$/>lua/' doc/lazy.nvim.txt - name: Push changes uses: stefanzweifel/git-auto-commit-action@v4 with: From 1f70834e1cdcb019ba52bb5979d9be357f7ecfd8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 15 Dec 2022 08:07:46 +0000 Subject: [PATCH 0146/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 7854373..7c6ed72 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -70,7 +70,7 @@ INSTALLATION *lazy.nvim-installation* You can use the following Lua code to bootstrap **lazy.nvim** -> +>lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then vim.fn.system({ @@ -88,7 +88,7 @@ You can use the following Lua code to bootstrap **lazy.nvim** Next step is to add **lazy.nvim** to the top of your `init.lua` -> +>lua -- You can use a lua module that contains your plugins. -- All sub modules of the lua module will also be automatically loaded -- This is the preferred setup so your plugin specs can be properly cached. @@ -132,7 +132,7 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**keys** │string? or string[] │Lazy-load on key mapping │ -> +>lua return { -- the colorscheme should be available when starting Neovim "folke/tokyonight.nvim", @@ -212,7 +212,7 @@ 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 = { From aa2f982d2257ac459dcc5c95200c7866c49065f7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 09:15:55 +0100 Subject: [PATCH 0147/1610] ci: corrected Neovim version in panvimdoc --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fab58c5..871b8c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,6 +26,7 @@ jobs: uses: kdheepak/panvimdoc@main with: vimdoc: lazy.nvim + version: "Neovim >= 0.8.0" demojify: true - name: Code Blocks run: sed -i 's/^>$/>lua/' doc/lazy.nvim.txt From a2f0637c77e868e88e7098f93637e9ff8c4a9014 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 15 Dec 2022 08:18:19 +0000 Subject: [PATCH 0148/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 7c6ed72..0014000 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For NVIM v0.5.0 Last change: 2022 December 15 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 15 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 27178b5e6759f6429602acfeb674834e0dad1f13 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 14:06:52 +0100 Subject: [PATCH 0149/1610] feat: utility methods to read/write files --- lua/lazy/util.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 5739feb..c2c3d79 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -28,6 +28,20 @@ function M.open(uri) end end +function M.read_file(file) + local fd = assert(io.open(file, "r")) + ---@type string + local data = fd:read("*a") + fd:close() + return data +end + +function M.write_file(file, contents) + local fd = assert(io.open(file, "w+")) + fd:write(contents) + fd:close() +end + ---@param ms number ---@param fn fun() function M.throttle(ms, fn) From 70ca110ca19c305dfe2790de5a82f5e6789a73ee Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 14:07:37 +0100 Subject: [PATCH 0150/1610] feat: README.md files are now automagically added to help. By default only when no doc/ exists --- lua/lazy/core/config.lua | 6 +++++ lua/lazy/help.lua | 52 ++++++++++++++++++++++++++++++++++++++++ lua/lazy/manage/init.lua | 5 +++- 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 lua/lazy/help.lua diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 42230b5..522bf64 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -75,6 +75,11 @@ M.defaults = { }, }, }, + readme = { + root = vim.fn.stdpath("state") .. "/lazy/readme", + files = { "README.md" }, + skip_if_doc_exists = true, + }, debug = false, } @@ -112,6 +117,7 @@ function M.setup(spec, opts) vim.fn.stdpath("config"), } end + vim.opt.rtp:append(M.options.readme.root) -- disable plugin loading since we do all of that ourselves vim.go.loadplugins = false diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua new file mode 100644 index 0000000..4f3e549 --- /dev/null +++ b/lua/lazy/help.lua @@ -0,0 +1,52 @@ +local Config = require("lazy.core.config") +local Util = require("lazy.util") + +local M = {} + +function M.index(plugin) + if Config.options.readme.skip_if_doc_exists and vim.loop.fs_stat(plugin.dir .. "/doc") then + return {} + end + ---@type {file:string, tag:string, line:string}[] + local tags = {} + for _, file in ipairs(Config.options.readme.files) do + file = plugin.dir .. "/" .. file + if vim.loop.fs_stat(file) then + local lines = vim.split(Util.read_file(file), "\n") + for _, line in ipairs(lines) do + local title = line:match("^#+%s*(.*)") + if title then + local tag = plugin.name .. "-" .. title:lower():gsub("%W+", "-") + tag = tag:gsub("%-+", "-"):gsub("%-$", "") + table.insert(tags, { tag = tag, line = line, file = plugin.name .. ".md" }) + end + end + table.insert(lines, [[]]) + Util.write_file(Config.options.readme.root .. "/doc/" .. plugin.name .. ".md", table.concat(lines, "\n")) + end + end + return tags +end + +function M.update() + local docs = Config.options.readme.root .. "/doc" + vim.fn.mkdir(docs, "p") + + Util.ls(docs, function(path, name, type) + if type == "file" and name:sub(-2) == "md" then + vim.loop.fs_unlink(path) + end + end) + ---@type {file:string, tag:string, line:string}[] + local tags = {} + for _, plugin in pairs(Config.plugins) do + vim.list_extend(tags, M.index(plugin)) + end + local lines = { [[!_TAG_FILE_ENCODING utf-8 //]] } + for _, tag in ipairs(tags) do + table.insert(lines, ("%s\t%s\t/%s"):format(tag.tag, tag.file, tag.line)) + end + Util.write_file(docs .. "/tags", table.concat(lines, "\n")) +end + +return M diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index cd801c5..27d8821 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -65,7 +65,9 @@ function M.install(opts) plugins = function(plugin) return plugin.url and not plugin._.installed end, - }, opts) + }, opts):wait(function() + require("lazy.help").update() + end) end ---@param opts? ManagerOpts|{lockfile?:boolean} @@ -86,6 +88,7 @@ function M.update(opts) end, }, opts):wait(function() require("lazy.manage.lock").update() + require("lazy.help").update() end) end From 4dfab59c8773638b951e52e12ca3ba5ba5b8574a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 14:08:04 +0100 Subject: [PATCH 0151/1610] refactor: use Util.read_file and Util.write_file for docs --- lua/lazy/docs.lua | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 78ad63b..de179de 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -1,11 +1,6 @@ -local M = {} +local Util = require("lazy.util") -function M.read(file) - local fd = assert(io.open(file, "r")) - local data = fd:read("*a") ---@type string - fd:close() - return data -end +local M = {} function M.indent(str, indent) local lines = vim.split(str, "\n") @@ -52,7 +47,7 @@ end ---@param contents table function M.save(contents) - local readme = M.read("README.md") + local readme = Util.read_file("README.md") contents.toc = M.toc(readme) for tag, content in pairs(contents) do content = M.fix_indent(content) @@ -69,14 +64,12 @@ function M.save(contents) end end - local fd = assert(io.open("README.md", "w+")) - fd:write(readme) - fd:close() + Util.write_file("README.md", readme) end ---@return string function M.extract(file, pattern) - local init = M.read(file) + local init = Util.read_file(file) return assert(init:match(pattern)) end @@ -91,7 +84,7 @@ function M.update() M.save({ bootstrap = M.extract("lua/lazy/init.lua", "function M%.bootstrap%(%)\n(.-)\nend"), config = config, - spec = M.read("lua/lazy/example.lua"), + spec = Util.read_file("lua/lazy/example.lua"), }) vim.cmd.checktime() end From fd600be2e504e8a5bc8042afb1ccf19a14222bcd Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 14:34:08 +0100 Subject: [PATCH 0152/1610] docs: added docs on readme help indexing --- README.md | 1 + lua/lazy/core/config.lua | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 51319e2..8f6233c 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ - 🛠️ 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 diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 522bf64..4190c10 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -75,9 +75,13 @@ M.defaults = { }, }, }, + -- 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 = { root = vim.fn.stdpath("state") .. "/lazy/readme", files = { "README.md" }, + -- only generate markdown helptags for plugins that dont have docs skip_if_doc_exists = true, }, debug = false, From 9f0a02fb0fe090524344f5fa643c2638a7ba7dc1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 15 Dec 2022 13:36:25 +0000 Subject: [PATCH 0153/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0014000..8bd4ba1 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -38,6 +38,7 @@ FEATURES *lazy.nvim-features* - 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 From 57dfb05e2f3897d183091d0b8f0b8898fac65b56 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 14:43:47 +0100 Subject: [PATCH 0154/1610] docs: updated config --- README.md | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8f6233c..97bde05 100644 --- a/README.md +++ b/README.md @@ -28,14 +28,14 @@ - [⚡️ Requirements](#-requirements) -- [📦 Installation](#-installation) -- [🔌 Plugin Spec](#-plugin-spec) -- [⚙️ Configuration](#-configuration) -- [🚀 Usage](#-usage) -- [📊 Profiler](#-profiler) -- [🪲 Debug](#-debug) -- [📦 Differences with Packer](#-differences-with-packer) -- [📦 Other Neovim Plugin Managers in Lua](#-other-neovim-plugin-managers-in-lua) + - [📦 Installation](#-installation) + - [🔌 Plugin Spec](#-plugin-spec) + - [⚙️ Configuration](#-configuration) + - [🚀 Usage](#-usage) + - [📊 Profiler](#-profiler) + - [🪲 Debug](#-debug) + - [📦 Differences with Packer](#-differences-with-packer) + - [📦 Other Neovim Plugin Managers in Lua](#-other-neovim-plugin-managers-in-lua) @@ -277,6 +277,15 @@ return { }, }, }, + -- 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 = { + root = vim.fn.stdpath("state") .. "/lazy/readme", + files = { "README.md" }, + -- only generate markdown helptags for plugins that dont have docs + skip_if_doc_exists = true, + }, } ``` From 6ca03dcd1a08071ca6cc21201ad266c7f45c337e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 15 Dec 2022 13:44:45 +0000 Subject: [PATCH 0155/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 8bd4ba1..486ddad 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -294,6 +294,15 @@ CONFIGURATION *lazy.nvim-configuration* }, }, }, + -- 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 = { + root = vim.fn.stdpath("state") .. "/lazy/readme", + files = { "README.md" }, + -- only generate markdown helptags for plugins that dont have docs + skip_if_doc_exists = true, + }, } < From 7134417e89319514c9bd9a8913012a396095f48d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 23:23:18 +0100 Subject: [PATCH 0156/1610] fix: use initial rtp for rtp plugin after files and use loaded plugins for their after files --- lua/lazy/core/config.lua | 1 + lua/lazy/core/loader.lua | 39 +++++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4190c10..df1c042 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -119,6 +119,7 @@ function M.setup(spec, opts) me, vim.env.VIMRUNTIME, vim.fn.stdpath("config"), + vim.fn.stdpath("config") .. "/after", } end vim.opt.rtp:append(M.options.readme.root) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 5412116..79623f1 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -46,9 +46,11 @@ end function M.startup() Util.track({ start = "startup" }) - -- load plugins from rtp + local rtp = vim.opt.rtp:get() + + -- load plugins from rtp, excluding after Util.track({ start = "rtp plugins" }) - for _, path in ipairs(vim.opt.rtp:get()) do + for _, path in ipairs(rtp) do if not path:find("after/?$") then M.source_runtime(path, "plugin") M.ftdetect(path) @@ -56,33 +58,38 @@ function M.startup() end Util.track() + -- load start plugin Util.track({ start = "start" }) for _, plugin in pairs(Config.plugins) do - -- load start plugin if plugin.lazy == false then M.load(plugin, { start = "start" }) end end Util.track() - Util.track({ start = "init" }) + -- load after files + Util.track({ start = "after" }) + -- load after files from plugins for _, plugin in pairs(Config.plugins) do - -- run plugin init - if plugin.init then - Util.track({ plugin = plugin.name, init = "init" }) - Util.try(plugin.init, "Failed to run `init` for **" .. plugin.name .. "**") - Util.track() + if plugin._.loaded then + M.source_runtime(plugin.dir, "after/plugin") + end + end + -- load after files from rtp plugins + for _, path in ipairs(rtp) do + if path:find("after/?$") then + M.source_runtime(path, "plugin") end end Util.track() - -- load after files - Util.track({ start = "after" }) - for _, path in ipairs(vim.opt.rtp:get()) do - if path:find("after/?$") then - M.source_runtime(path, "plugin") - else - M.source_runtime(path, "after/plugin") + -- run plugin init + Util.track({ start = "init" }) + for _, plugin in pairs(Config.plugins) do + if plugin.init then + Util.track({ plugin = plugin.name, init = "init" }) + Util.try(plugin.init, "Failed to run `init` for **" .. plugin.name .. "**") + Util.track() end end Util.track() From b8fa6f960f9bff5e17a7731a204cad21d564ef34 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 23:23:45 +0100 Subject: [PATCH 0157/1610] fix: add lazy.nvim with dev=false to prevent using the dev version for myself --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 5a5e9ad..d41e2c7 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -233,7 +233,7 @@ function M.load() -- add ourselves spec.plugins["lazy.nvim"] = nil - spec:add({ "folke/lazy.nvim", lazy = true }) + spec:add({ "folke/lazy.nvim", lazy = true, dev = false }) local existing = Config.plugins Config.plugins = spec.plugins From 17d1653b4a39b80e0d59e3e4877cf23cdd9b6756 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 23:24:16 +0100 Subject: [PATCH 0158/1610] fix: bootstrap code now uses git url instead of https for beta testers + fixed rtp path --- lua/lazy/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 10bbe2d..4476603 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -75,11 +75,11 @@ function M.bootstrap() "clone", "--filter=blob:none", "--single-branch", - "https://github.com/folke/lazy.nvim.git", + "git@github.com:folke/lazy.nvim.git", lazypath, }) - vim.opt.runtimepath:prepend(lazypath) end + vim.opt.runtimepath:prepend(lazypath) end ---@return LazyPlugin[] From ecf03a6892a2128eb2a6d79769e69a191f2549a6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 16 Dec 2022 09:13:08 +0100 Subject: [PATCH 0159/1610] refactor: simplified handler code --- lua/lazy/core/handler/cmd.lua | 11 +++--- lua/lazy/core/handler/event.lua | 33 ++++++---------- lua/lazy/core/handler/ft.lua | 11 +++--- lua/lazy/core/handler/init.lua | 67 +++++++++++---------------------- lua/lazy/core/handler/keys.lua | 12 +++--- lua/lazy/core/plugin.lua | 13 +++++-- lua/lazy/view/render.lua | 2 - 7 files changed, 58 insertions(+), 91 deletions(-) diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index a2766a4..267e338 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -4,18 +4,17 @@ local Loader = require("lazy.core.loader") ---@class LazyCmdHandler:LazyHandler local M = {} -local function _load(plugin, cmd) +function M:_load(cmd) vim.api.nvim_del_user_command(cmd) Util.track({ cmd = cmd }) - Loader.load(plugin, { cmd = cmd }) + Loader.load(self.active[cmd], { cmd = cmd }) Util.track() end ----@param plugin LazyPlugin ---@param cmd string -function M:_add(plugin, cmd) +function M:_add(cmd) vim.api.nvim_create_user_command(cmd, function(event) - _load(plugin, cmd) + self:_load(cmd) vim.cmd( ("%s %s%s%s %s"):format( event.mods or "", @@ -29,7 +28,7 @@ function M:_add(plugin, cmd) bang = true, nargs = "*", complete = function(_, line) - _load(plugin, cmd) + self:_load(cmd) -- NOTE: return the newly loaded command completion return vim.fn.getcompletion(line, "cmdline") end, diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 545f42b..7e38afa 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -11,26 +11,11 @@ M.trigger_events = { BufRead = { "BufReadPre", "BufRead" }, BufReadPost = { "BufReadPre", "BufRead", "BufReadPost" }, } - -function M:init() - self.group = vim.api.nvim_create_augroup("lazy_handler_" .. self.type, { clear = true }) - self.events = {} -end - ----@param event_spec string -function M:_add(_, event_spec) - if not self.events[event_spec] then - self:listen(event_spec) - end -end +M.group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) ---@param value string -function M:_value(value) - return value == "VeryLazy" and "User VeryLazy" or value -end - -function M:listen(event_spec) - self.events[event_spec] = true +function M:_add(value) + local event_spec = self:_event(value) ---@type string?, string? local event, pattern = event_spec:match("^(%w+)%s+(.*)$") event = event or event_spec @@ -39,14 +24,13 @@ function M:listen(event_spec) once = true, pattern = pattern, callback = function() - if not self.active[event_spec] then + if not self.active[value] then return end - Util.track({ [self.type] = event_spec }) + Util.track({ [self.type] = value }) local groups = M.get_augroups(event, pattern) -- load the plugins - Loader.load(self.active[event_spec], { [self.type] = event_spec }) - self.events[event_spec] = nil + Loader.load(self.active[value], { [self.type] = value }) -- check if any plugin created an event handler for this event and fire the group M.trigger(event, pattern, groups) Util.track() @@ -54,6 +38,11 @@ function M:listen(event_spec) }) end +---@param value string +function M:_event(value) + return value == "VeryLazy" and "User VeryLazy" or value +end + -- Get all augroups for the events ---@param event string ---@param pattern? string diff --git a/lua/lazy/core/handler/ft.lua b/lua/lazy/core/handler/ft.lua index ef6c5dc..f0947c6 100644 --- a/lua/lazy/core/handler/ft.lua +++ b/lua/lazy/core/handler/ft.lua @@ -6,15 +6,16 @@ local M = {} M.extends = Event ---@param value string -function M:_value(value) +function M:_event(value) return "FileType " .. value end ---@param plugin LazyPlugin ----@param value string -function M:_add(plugin, value) - Loader.ftdetect(plugin.dir) - Event._add(self, plugin, value) +function M:add(plugin) + self.super.add(self, plugin) + if plugin.ft then + Loader.ftdetect(plugin.dir) + end end return M diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index fc023ef..4cca808 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -4,6 +4,7 @@ local Config = require("lazy.core.config") ---@field type LazyHandlerTypes ---@field extends? LazyHandler ---@field active table> +---@field super LazyHandler local M = {} ---@enum LazyHandlerTypes @@ -50,68 +51,44 @@ end function M.new(type) ---@type LazyHandler local handler = require("lazy.core.handler." .. type) - local self = setmetatable({}, { - __index = function(_, k) - return handler[k] or (handler.extends and handler.extends[k]) or M[k] - end, - }) + local super = handler.extends or M + local self = setmetatable({}, { __index = setmetatable(handler, { __index = super }) }) + self.super = super self.active = {} self.type = type - self:init() return self end +---@param value string ---@protected -function M:init() end +function M:_add(value) end + +---@param value string +---@protected +function M:_del(value) end ---@param plugin LazyPlugin ----@param value string ----@protected -function M:_add(plugin, value) end - ----@param plugin LazyPlugin ----@param value string ----@protected -function M:_del(plugin, value) end - ----@param value string -function M:_value(value) - return value -end - ----@param values? string|string[] ----@param fn fun(value:string) -function M:foreach(values, fn) - if type(values) == "string" then - fn(values) - elseif values ~= nil then - for _, value in ipairs(values) do - fn(value) +function M:add(plugin) + for _, value in ipairs(plugin[self.type] or {}) do + if not self.active[value] then + self.active[value] = {} + self:_add(value) end + self.active[value][plugin.name] = plugin.name end end ----@param plugin LazyPlugin -function M:add(plugin) - self:foreach(plugin[self.type], function(value) - value = self:_value(value) - if not (self.active[value] and self.active[value][plugin.name]) then - self.active[value] = self.active[value] or {} - self.active[value][plugin.name] = plugin.name - self:_add(plugin, value) - end - end) -end - ---@param plugin LazyPlugin function M:del(plugin) - self:foreach(plugin[self.type], function(value) - value = self:_value(value) + for _, value in ipairs(plugin[self.type] or {}) do if self.active[value] and self.active[value][plugin.name] then self.active[value][plugin.name] = nil - self:_del(plugin, value) + if vim.tbl_isempty(self.active[value]) then + self:_del(value) + self.active[value] = nil + end end - end) + end end return M diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 14827f2..301b408 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -4,22 +4,20 @@ local Loader = require("lazy.core.loader") ---@class LazyKeysHandler:LazyHandler local M = {} ----@param plugin LazyPlugin ---@param keys string -function M:_add(plugin, keys) +function M:_add(keys) vim.keymap.set("n", keys, function() vim.keymap.del("n", keys) Util.track({ keys = keys }) - Loader.load(plugin, { keys = keys }) + Loader.load(self.active[keys], { keys = keys }) vim.api.nvim_input(keys) Util.track() end) end ----@param _plugin LazyPlugin ----@param value string -function M:_del(_plugin, value) - pcall(vim.keymap.del, "n", value) +---@param keys string +function M:_del(keys) + pcall(vim.keymap.del, "n", keys) end return M diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index d41e2c7..2859465 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -21,10 +21,10 @@ local M = {} ---@field build? string|fun(LazyPlugin) ---@class LazyPluginHandlers: table ----@field event? string|string[] ----@field cmd? string|string[] ----@field ft? string|string[] ----@field keys? string|string[] +---@field event? string[] +---@field cmd? string[] +---@field ft? string[] +---@field keys? string[] ---@class LazyPluginRef ---@field branch? string @@ -101,6 +101,11 @@ function Spec:add(plugin, is_dep) Util.error("Invalid plugin spec " .. vim.inspect(plugin)) end + plugin.event = type(plugin.event) == "string" and { plugin.event } or plugin.event + plugin.keys = type(plugin.keys) == "string" and { plugin.keys } or plugin.keys + plugin.cmd = type(plugin.cmd) == "string" and { plugin.cmd } or plugin.cmd + plugin.ft = type(plugin.ft) == "string" and { plugin.ft } or plugin.ft + plugin._ = {} plugin._.dep = is_dep diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 886d324..ad4450f 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -242,8 +242,6 @@ function M:reason(reason, opts) end if key == "event" then value = value:match("User (.*)") or value - elseif key == "ft" then - value = value:match("FileType (.*)") or value end local hl = "LazyHandler" .. key:sub(1, 1):upper() .. key:sub(2) local icon = Config.options.ui.icons[key] From f23a6eef8ca3e8416167266cafd037a5e27a7cc6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 16 Dec 2022 13:06:30 +0100 Subject: [PATCH 0160/1610] perf: prevent string.match to find plugin name from a modpath --- lua/lazy/core/plugin.lua | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 2859465..541e573 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -258,8 +258,15 @@ end -- Finds the plugin that has this path ---@param path string function M.find(path) - local name = path:match("/([^/]+)/lua") or path:match("/([^/]+)/?$") - return name and Config.plugins[name] or nil + local lua = path:find("/lua", 1, true) + if lua then + local name = path:sub(1, lua - 1) + local slash = name:reverse():find("/", 1, true) + if slash then + name = name:sub(#name - slash + 2) + return name and Config.plugins[name] or nil + end + end end return M From e897524b1f37a32da15022d012c44f4588e95fc9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 16 Dec 2022 13:06:52 +0100 Subject: [PATCH 0161/1610] refactor: split autoload in autoload and check_load --- lua/lazy/core/cache.lua | 2 +- lua/lazy/core/loader.lua | 41 ++++++++++++++++++++++++---------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 8bcd203..a9aaa06 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -36,7 +36,7 @@ function M.check_load(modname, modpath) if modname:sub(1, 4) == "lazy" then return end - require("lazy.core.loader").autoload(modname, modpath) + require("lazy.core.loader").check_load(modname, modpath) end function M.disable() diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 79623f1..119b95d 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -52,8 +52,7 @@ function M.startup() Util.track({ start = "rtp plugins" }) for _, path in ipairs(rtp) do if not path:find("after/?$") then - M.source_runtime(path, "plugin") - M.ftdetect(path) + M.packadd(path) end end Util.track() @@ -83,6 +82,8 @@ function M.startup() end Util.track() + M.init_done = true + -- run plugin init Util.track({ start = "init" }) for _, plugin in pairs(Config.plugins) do @@ -94,7 +95,6 @@ function M.startup() end Util.track() - M.init_done = true Util.track() end @@ -180,19 +180,8 @@ end -- This loader is added as the very last one. -- This only hits when the modname is not cached and -- even then only once per plugin. So pretty much never. --- --- lazy.module will call this when loading a cached file with modpath set. ---@param modname string ----@param modpath string? -function M.autoload(modname, modpath) - -- fast return when we know the modpath - if modpath then - local plugin = require("lazy.core.plugin").find(modpath) - if plugin and not plugin._.loaded then - M.load(plugin, { require = modname }) - end - return - end +function M.autoload(modname) -- check if a lazy plugin should be loaded for _, plugin in pairs(Config.plugins) do if not plugin._.loaded then @@ -200,13 +189,33 @@ function M.autoload(modname, modpath) local path = plugin.dir .. "/lua/" .. modname:gsub("%.", "/") .. pattern if vim.loop.fs_stat(path) then M.load(plugin, { require = modname }) + -- check if the module has been loaded in the meantime + if type(package.loaded[modname]) == "table" then + local mod = package.loaded[modname] + return function() + return mod + end + end local chunk, err = loadfile(path) return chunk or error(err) end end end end - return modname .. " not found in unloaded opt plugins" + return modname .. " not found in lazy plugins" +end + +-- lazy.cache will call this when loading a cached file with modpath set. +---@param modname string +---@param modpath string +function M.check_load(modname, modpath) + -- no need to check anything before init + if M.init_done then + local plugin = require("lazy.core.plugin").find(modpath) + if plugin and not plugin._.loaded then + M.load(plugin, { require = modname }) + end + end end return M From 060cf23aca3826c213ad26ff1860815b03064269 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 16 Dec 2022 15:08:09 +0100 Subject: [PATCH 0162/1610] perf: when reloading plugin specs always use cache --- lua/lazy/core/cache.lua | 4 ++++ lua/lazy/core/plugin.lua | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index a9aaa06..c486e83 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -92,6 +92,10 @@ function M.loader(modname) return chunk or error(err) end +function M.require(modname) + return M.loader(modname)() +end + function M.idx() -- update our loader position if needed if package.loaders[M.loader_idx] ~= M.loader then diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 541e573..11936d8 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,6 +1,7 @@ local Config = require("lazy.core.config") local Util = require("lazy.core.util") local Handler = require("lazy.core.handler") +local Cache = require("lazy.core.cache") local M = {} @@ -217,7 +218,7 @@ function M.spec() ---@diagnostic disable-next-line: no-unknown package.loaded[modname] = nil Util.try(function() - spec:normalize(require(modname)) + spec:normalize(Cache.require(modname)) end, "Failed to load **" .. modname .. "**") end local path_plugins = vim.fn.stdpath("config") .. "/lua/" .. Config.spec:gsub("%.", "/") From 0df47d91d1e08aeac2c3b97482b1bb87d6d785d3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 16 Dec 2022 15:09:50 +0100 Subject: [PATCH 0163/1610] docs: fixed bootstrap code and make it work for beta testers --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 97bde05..c1b37c4 100644 --- a/README.md +++ b/README.md @@ -57,11 +57,11 @@ local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" "clone", "--filter=blob:none", "--single-branch", - "https://github.com/folke/lazy.nvim.git", + "git@github.com:folke/lazy.nvim.git", lazypath, }) - vim.opt.runtimepath:prepend(lazypath) end + vim.opt.runtimepath:prepend(lazypath) ``` From c5d092ed9e4b80dee9bca92a7dde24f85e132f4a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 16 Dec 2022 15:10:05 +0100 Subject: [PATCH 0164/1610] docs: added a section on startup sequence --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index c1b37c4..7900303 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ - [🚀 Usage](#-usage) - [📊 Profiler](#-profiler) - [🪲 Debug](#-debug) + - [▶️ Startup Sequence](#-startup-sequence) - [📦 Differences with Packer](#-differences-with-packer) - [📦 Other Neovim Plugin Managers in Lua](#-other-neovim-plugin-managers-in-lua) @@ -305,6 +306,14 @@ See an overview of active lazy-loading handlers and what's in the module cache ![image](https://user-images.githubusercontent.com/292349/207703522-8bb20678-bb4c-4424-80e4-add3219711c3.png) +## ▶️ 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](https://neovim.io/doc/user/starting.html#initialization) is done by Lazy. + ## 📦 Differences with Packer - **Plugin Spec**: From dcae07d01e472f6d86ea039858a77113a1a5a6e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 16 Dec 2022 14:11:06 +0000 Subject: [PATCH 0165/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 486ddad..51e580e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 15 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 16 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -13,6 +13,7 @@ Table of Contents *lazy.nvim-table-of-contents* - Usage |lazy.nvim-usage| - Profiler |lazy.nvim-profiler| - 🪲 Debug |lazy.nvim-🪲-debug| + - Startup Sequence |lazy.nvim-startup-sequence| - Differences with Packer |lazy.nvim-differences-with-packer| - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| @@ -57,6 +58,7 @@ TABLE OF CONTENTS *lazy.nvim-table-of-contents* - |lazy.nvim-usage| - |lazy.nvim-profiler| - |lazy.nvim-🪲-debug| +- |lazy.nvim-startup-sequence| - |lazy.nvim-differences-with-packer| - |lazy.nvim-other-neovim-plugin-managers-in-lua| @@ -79,11 +81,11 @@ You can use the following Lua code to bootstrap **lazy.nvim** "clone", "--filter=blob:none", "--single-branch", - "https://github.com/folke/lazy.nvim.git", + "git@github.com:folke/lazy.nvim.git", lazypath, }) - vim.opt.runtimepath:prepend(lazypath) end + vim.opt.runtimepath:prepend(lazypath) < @@ -328,6 +330,14 @@ cache

image

+STARTUP SEQUENCE *lazy.nvim-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. + DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* From fc55edc22eef79eeff1b8de771f5105f6ea9645e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 16 Dec 2022 15:21:03 +0100 Subject: [PATCH 0166/1610] chore(main): release 4.1.0 (#10) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d44c67..c0b803e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,29 @@ # Changelog +## [4.1.0](https://github.com/folke/lazy.nvim/compare/v4.0.0...v4.1.0) (2022-12-16) + + +### Features + +* **docs:** added toc generator ([f4720ee](https://github.com/folke/lazy.nvim/commit/f4720ee9f745c0b77366f1e5e6ea7fc7bfaf8010)) +* lua code generator for the README.md ([80a7839](https://github.com/folke/lazy.nvim/commit/80a7839eec62560e9160663cee4ea4c9e67196fc)) +* README.md files are now automagically added to help. By default only when no doc/ exists ([70ca110](https://github.com/folke/lazy.nvim/commit/70ca110ca19c305dfe2790de5a82f5e6789a73ee)) +* utility methods to read/write files ([27178b5](https://github.com/folke/lazy.nvim/commit/27178b5e6759f6429602acfeb674834e0dad1f13)) + + +### Bug Fixes + +* `Plugin.init` implies lazy-loading ([ccdf65b](https://github.com/folke/lazy.nvim/commit/ccdf65b5b8974438cb60c10ec00c7302c339f9da)) +* add lazy.nvim with dev=false to prevent using the dev version for myself ([b8fa6f9](https://github.com/folke/lazy.nvim/commit/b8fa6f960f9bff5e17a7731a204cad21d564ef34)) +* bootstrap code now uses git url instead of https for beta testers + fixed rtp path ([17d1653](https://github.com/folke/lazy.nvim/commit/17d1653b4a39b80e0d59e3e4877cf23cdd9b6756)) +* use initial rtp for rtp plugin after files and use loaded plugins for their after files ([7134417](https://github.com/folke/lazy.nvim/commit/7134417e89319514c9bd9a8913012a396095f48d)) + + +### Performance Improvements + +* prevent string.match to find plugin name from a modpath ([f23a6ee](https://github.com/folke/lazy.nvim/commit/f23a6eef8ca3e8416167266cafd037a5e27a7cc6)) +* when reloading plugin specs always use cache ([060cf23](https://github.com/folke/lazy.nvim/commit/060cf23aca3826c213ad26ff1860815b03064269)) + ## [4.0.0](https://github.com/folke/lazy.nvim/compare/v3.0.0...v4.0.0) (2022-12-14) From 2d6559302e6452006fe64dd11acb5d975d35b118 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 09:59:29 +0100 Subject: [PATCH 0167/1610] docs: removed toc --- README.md | 17 ----------------- lua/lazy/docs.lua | 2 +- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/README.md b/README.md index 7900303..157e8d6 100644 --- a/README.md +++ b/README.md @@ -23,23 +23,6 @@ - 📋 Commit, branch, tag, version, and full [Semver](https://devhints.io/semver) support - 📈 Statusline component to see the number of pending updates -## 📄 Table of Contents - - - -- [⚡️ Requirements](#-requirements) - - [📦 Installation](#-installation) - - [🔌 Plugin Spec](#-plugin-spec) - - [⚙️ Configuration](#-configuration) - - [🚀 Usage](#-usage) - - [📊 Profiler](#-profiler) - - [🪲 Debug](#-debug) - - [▶️ Startup Sequence](#-startup-sequence) - - [📦 Differences with Packer](#-differences-with-packer) - - [📦 Other Neovim Plugin Managers in Lua](#-other-neovim-plugin-managers-in-lua) - - - ## ⚡️ Requirements - Neovim >= **0.8.0** diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index de179de..4b2c1f1 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -48,7 +48,7 @@ end ---@param contents table function M.save(contents) local readme = Util.read_file("README.md") - contents.toc = M.toc(readme) + -- contents.toc = M.toc(readme) for tag, content in pairs(contents) do content = M.fix_indent(content) content = content:gsub("%%", "%%%%") From 23984dd1f300e09cbc1bc9a80aae3bea32a5bbcc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 10:06:40 +0100 Subject: [PATCH 0168/1610] fix: set correct dir for lazy plugin --- lua/lazy/core/config.lua | 9 ++++++--- lua/lazy/core/plugin.lua | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index df1c042..e4354b3 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -101,6 +101,9 @@ M.to_clean = {} ---@type LazyConfig M.options = {} +---@type string +M.me = nil + ---@param spec LazySpec ---@param opts? LazyConfig function M.setup(spec, opts) @@ -113,10 +116,10 @@ function M.setup(spec, opts) vim.go.packpath = "" end if M.options.performance.rtp.reset then - local me = debug.getinfo(1, "S").source:sub(2) - me = vim.fn.fnamemodify(me, ":p:h:h:h:h") + M.me = debug.getinfo(1, "S").source:sub(2) + M.me = vim.fn.fnamemodify(M.me, ":p:h:h:h:h") vim.opt.rtp = { - me, + M.me, vim.env.VIMRUNTIME, vim.fn.stdpath("config"), vim.fn.stdpath("config") .. "/after", diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 11936d8..ee6558c 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -239,7 +239,7 @@ function M.load() -- add ourselves spec.plugins["lazy.nvim"] = nil - spec:add({ "folke/lazy.nvim", lazy = true, dev = false }) + spec:add({ "folke/lazy.nvim", lazy = true, dir = Config.me }) local existing = Config.plugins Config.plugins = spec.plugins From 97366711bedc7bfc2e9a425e8dfa6f9891e9c865 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 10:06:51 +0100 Subject: [PATCH 0169/1610] feat(ui): added dir to props --- lua/lazy/view/render.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index ad4450f..4c0e3e5 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -338,6 +338,7 @@ end ---@param task LazyTask function M:log(task) + -- FIXME: only show last log task local log = vim.trim(task.output) if log ~= "" then local lines = vim.split(log, "\n") @@ -365,7 +366,10 @@ end function M:details(plugin) ---@type string[][] local props = {} - table.insert(props, { "url", (plugin.url:gsub("%.git$", "")), "@text.reference" }) + table.insert(props, { "dir", plugin.dir, "@text.reference" }) + if plugin.url then + table.insert(props, { "url", (plugin.url:gsub("%.git$", "")), "@text.reference" }) + end local git = Git.info(plugin.dir, true) if git then git.branch = git.branch or Git.get_branch(plugin) @@ -385,6 +389,7 @@ function M:details(plugin) end Util.ls(plugin.dir .. "/doc", function(_, name) if name:find("%.txt$") then + -- FIXME: the help tag is wrong table.insert(props, { "help", "|" .. name:gsub("%.txt", "") .. "|" }) end end) From 6f728e698d5e19de36dd861f6699b6b4560e5f42 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 10:38:42 +0100 Subject: [PATCH 0170/1610] fix(ui): show first tag for each help doc in details --- lua/lazy/view/render.lua | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 4c0e3e5..a2544cd 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -218,8 +218,8 @@ function M:reason(reason, opts) local time = reason.time and (" " .. math.floor(reason.time / 1e6 * 100) / 100 .. "ms") if time and not opts.time_right then self:append(time, "Bold") + self:append(" ") end - self:append(" ") -- self:append(" (", "Conceal") local first = true local keys = vim.tbl_keys(reason) @@ -387,10 +387,13 @@ function M:details(plugin) if Util.file_exists(plugin.dir .. "/README.md") then table.insert(props, { "readme", "README.md" }) end - Util.ls(plugin.dir .. "/doc", function(_, name) - if name:find("%.txt$") then - -- FIXME: the help tag is wrong - table.insert(props, { "help", "|" .. name:gsub("%.txt", "") .. "|" }) + Util.ls(plugin.dir .. "/doc", function(path, name) + if name:sub(-3) == "txt" then + local data = Util.read_file(path) + local tag = data:match("%*(%S-)%*") + if tag then + table.insert(props, { "help", "|" .. tag .. "|" }) + end end end) @@ -398,8 +401,12 @@ function M:details(plugin) if plugin[handler] then table.insert(props, { handler, - type(plugin[handler]) == "string" and plugin[handler] or table.concat(plugin[handler], ", "), - "@string", + function() + for _, value in ipairs(plugin[handler]) do + self:reason({ [handler] = value }) + self:append(" ") + end + end, }) end end @@ -410,7 +417,11 @@ function M:details(plugin) end for _, prop in ipairs(props) do self:append(prop[1] .. string.rep(" ", width - #prop[1] + 1), "LazyKey", { indent = 6 }) - self:append(prop[2], prop[3] or "LazyValue") + if type(prop[2]) == "function" then + prop[2]() + else + self:append(prop[2], prop[3] or "LazyValue") + end self:nl() end self:nl() @@ -430,7 +441,7 @@ function M:profile() local data = type(entry.data) == "string" and { source = entry.data } or entry.data data.time = entry.time local symbol = symbols[depth] or symbols[#symbols] - self:append((" "):rep(depth)):append(" " .. symbol, "LazySpecial") + self:append((" "):rep(depth)):append(" " .. symbol, "LazySpecial"):append(" ") self:reason(data, { time_right = true }) self:nl() @@ -459,10 +470,11 @@ function M:debug() if not vim.tbl_isempty(plugins) then plugins = vim.tbl_values(plugins) table.sort(plugins) - self:append("●", "LazySpecial", { indent = 2 }) - self:reason({ [type] = value }, { time_right = true }) + self:append("● ", "LazySpecial", { indent = 2 }) + self:reason({ [type] = value }) for _, plugin in pairs(plugins) do - self:reason({ plugin = plugin }, { time_right = true }) + self:append(" ") + self:reason({ plugin = plugin }) end self:nl() end From f18efa1da1b1274466444a477574ac2b6a2c24b3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 10:49:52 +0100 Subject: [PATCH 0171/1610] fix(ui): split window before opening a file from the Lazy ui, otherwise it'll get closed immediately --- lua/lazy/util.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index c2c3d79..594d5b7 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -6,6 +6,7 @@ end function M.open(uri) if M.file_exists(uri) then + vim.cmd.split() return vim.cmd.view(uri) end local cmd From 53affcaaf46a830dda344bd39506d507c961c1d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 17 Dec 2022 11:53:24 +0000 Subject: [PATCH 0172/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 51e580e..9c0f167 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,11 +1,10 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 16 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 17 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* 1. lazy.nvim |lazy.nvim-lazy.nvim| - Features |lazy.nvim-features| - - Table of Contents |lazy.nvim-table-of-contents| - Requirements |lazy.nvim-requirements| - Installation |lazy.nvim-installation| - Plugin Spec |lazy.nvim-plugin-spec| @@ -48,21 +47,6 @@ FEATURES *lazy.nvim-features* - Statusline component to see the number of pending updates -TABLE OF CONTENTS *lazy.nvim-table-of-contents* - - -- |lazy.nvim-requirements| -- |lazy.nvim-installation| -- |lazy.nvim-plugin-spec| -- |lazy.nvim-configuration| -- |lazy.nvim-usage| -- |lazy.nvim-profiler| -- |lazy.nvim-🪲-debug| -- |lazy.nvim-startup-sequence| -- |lazy.nvim-differences-with-packer| -- |lazy.nvim-other-neovim-plugin-managers-in-lua| - - REQUIREMENTS *lazy.nvim-requirements* From eeb06a5a509c27b7f0877b513f2278f27cc98f67 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 12:59:31 +0100 Subject: [PATCH 0173/1610] feat(loader): added error handler to sourcing of runtime files --- lua/lazy/core/loader.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 119b95d..c510d69 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -171,7 +171,9 @@ function M.source_runtime(...) name = name:sub(1, -5) if t == "file" and (ext == "lua" or ext == "vim") and not M.disabled_rtp_plugins[name] then Util.track({ runtime = path }) - vim.cmd("silent source " .. path) + Util.try(function() + vim.cmd("silent source " .. path) + end, "Failed to source `" .. path .. "`") Util.track() end end) From 5c0c381b56f78622df47e2057210232ed0a3275e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 13:03:34 +0100 Subject: [PATCH 0174/1610] fix(loader): runtime files are now sourced alphabetically per directory --- lua/lazy/core/loader.lua | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c510d69..60ea915 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -166,17 +166,24 @@ end ---@param ... string function M.source_runtime(...) local dir = table.concat({ ... }, "/") + ---@type string[] + local files = {} Util.walk(dir, function(path, name, t) local ext = name:sub(-3) name = name:sub(1, -5) if t == "file" and (ext == "lua" or ext == "vim") and not M.disabled_rtp_plugins[name] then - Util.track({ runtime = path }) - Util.try(function() - vim.cmd("silent source " .. path) - end, "Failed to source `" .. path .. "`") - Util.track() + files[#files + 1] = path end end) + -- plugin files are sourced alphabetically per directory + table.sort(files) + for _, path in ipairs(files) do + Util.track({ runtime = path }) + Util.try(function() + vim.cmd("silent source " .. path) + end, "Failed to source `" .. path .. "`") + Util.track() + end end -- This loader is added as the very last one. From 85e375223f21e35fd5f779cad05be0397557e72a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 14:28:41 +0100 Subject: [PATCH 0175/1610] fix(ui): always clear complete tasks with the same name when starting a new task --- lua/lazy/manage/task/init.lua | 5 ++++- lua/lazy/view/render.lua | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 0296d18..92596e3 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -9,7 +9,6 @@ local Process = require("lazy.manage.process") ---@class LazyTask ---@field plugin LazyPlugin ---@field name string ----@field type string ---@field output string ---@field status string ---@field error? string @@ -40,6 +39,10 @@ function Task.new(plugin, name, task, opts) self.output = "" self.status = "" plugin._.tasks = plugin._.tasks or {} + ---@param other LazyTask + plugin._.tasks = vim.tbl_filter(function(other) + return other.name ~= name or other:is_running() + end, plugin._.tasks) table.insert(plugin._.tasks, self) return self end diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index a2544cd..0ff5e6f 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -338,7 +338,6 @@ end ---@param task LazyTask function M:log(task) - -- FIXME: only show last log task local log = vim.trim(task.output) if log ~= "" then local lines = vim.split(log, "\n") From 9026a0e25d4e3ebfe2cac7d7a724cb8211fac4f1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 15:56:13 +0100 Subject: [PATCH 0176/1610] feat(ui): made it look a little less like a Mason rip-off :) --- lua/lazy/view/commands.lua | 6 +++--- lua/lazy/view/init.lua | 5 +++-- lua/lazy/view/render.lua | 27 ++++++++++++++++++++++----- lua/lazy/view/text.lua | 6 +++--- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index fab0bd0..7cd0e0b 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -7,7 +7,7 @@ local M = {} ---@param cmd string ---@param plugins? LazyPlugin[] function M.cmd(cmd, plugins) - cmd = cmd == "" and "show" or cmd + cmd = cmd == "" and "home" or cmd local command = M.commands[cmd] if command == nil then Util.error("Invalid lazy command '" .. cmd .. "'") @@ -30,8 +30,8 @@ M.commands = { log = function(plugins) Manage.log({ clear = true, mode = "log", plugins = plugins }) end, - show = function() - View.show() + home = function() + View.show("home") end, help = function() View.show("help") diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index b5db8b5..57f3688 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -5,6 +5,7 @@ local Config = require("lazy.core.config") local M = {} M.modes = { + { name = "home", key = "H", desc = "Go back to plugin list" }, { name = "install", key = "I", desc = "Install missing plugins" }, { name = "update", key = "U", desc = "Update all plugins. This will also update the lockfile" }, { name = "sync", key = "S", desc = "Run install, clean and update" }, @@ -14,7 +15,7 @@ M.modes = { { name = "restore", key = "R", desc = "Updates all plugins to the state in the lockfile" }, { name = "profile", key = "P", desc = "Show detailed profiling", toggle = true }, { name = "debug", key = "D", desc = "Show debug information", toggle = true }, - { name = "help", key = "?", hide = true, desc = "Toggle this help page", toggle = true }, + { name = "help", key = "?", desc = "Toggle this help page", toggle = true }, { plugin = true, name = "update", key = "u", desc = "Update this plugin. This will also update the lockfile" }, { @@ -38,7 +39,7 @@ function M.setup() end function M.show(mode) - M.mode = mode or M.mode + M.mode = mode or M.mode or "home" require("lazy.view.colors").setup() if M._buf and vim.api.nvim_buf_is_valid(M._buf) then diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 0ff5e6f..9359ac6 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -94,15 +94,32 @@ function M:get_plugin(row) end function M:title() - self:append(" lazy.nvim ", "LazyH1"):center():nl() - self:append("press "):append("", "LazySpecial"):append(" for help"):center():nl() - self:append("https://github.com/folke/lazy.nvim", "LazyMuted"):center():nl() - + self:nl():nl() local View = require("lazy.view") + for _, mode in ipairs(View.modes) do if not mode.hide and not mode.plugin then local title = " " .. mode.name:sub(1, 1):upper() .. mode.name:sub(2) .. " (" .. mode.key .. ") " - self:append(title, View.mode == mode.name and "LazyButtonActive" or "LazyButton"):append(" ") + if mode.name == "home" then + if View.mode == "home" then + title = " lazy.nvim 鈴 " + else + title = " lazy.nvim (H) " + end + end + + if View.mode == mode.name then + if mode.name == "home" then + self:append(title, "LazyH1") + else + self:append(title, "LazyButtonActive") + self:highlight({ ["%(.%)"] = "LazySpecial" }) + end + else + self:append(title, "LazyButton") + self:highlight({ ["%(.%)"] = "LazySpecial" }) + end + self:append(" ") end end self:nl() diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index ac009f4..d6f042a 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -137,9 +137,9 @@ function Text:center() end function Text:trim() - while #self._lines > 0 and #self._lines[1] == 0 do - table.remove(self._lines, 1) - end + -- while #self._lines > 0 and #self._lines[1] == 0 do + -- table.remove(self._lines, 1) + -- end while #self._lines > 0 and #self._lines[#self._lines] == 0 do table.remove(self._lines) From a46c0c04f13ef4bb10c42004a72a48356f8cfe93 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 17:35:45 +0100 Subject: [PATCH 0177/1610] feat: never source `packer_compiled.lua` --- lua/lazy/core/loader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 60ea915..3903772 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -8,7 +8,7 @@ local M = {} M.loading = {} M.init_done = false ---@type table -M.disabled_rtp_plugins = {} +M.disabled_rtp_plugins = { packer_compiled = true } function M.setup() -- install missing plugins From 0b4a04de7d264b5890210f92eef0e6521bf8d0c9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sat, 17 Dec 2022 17:36:09 +0100 Subject: [PATCH 0178/1610] feat(ui): make home bold --- lua/lazy/view/render.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 9359ac6..1755573 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -111,6 +111,7 @@ function M:title() if View.mode == mode.name then if mode.name == "home" then self:append(title, "LazyH1") + self:highlight({ ["%w+"] = "Bold" }) else self:append(title, "LazyButtonActive") self:highlight({ ["%(.%)"] = "LazySpecial" }) From f25f942eb76f485d09f770dd5ea4c4ca3bef4e0b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 11:42:27 +0100 Subject: [PATCH 0179/1610] feat: expose all commands on main lazy module --- lua/lazy/init.lua | 7 +++++++ lua/lazy/view/commands.lua | 8 ++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 4476603..6b316cd 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -1,3 +1,4 @@ +---@type LazyCommands local M = {} ---@param spec LazySpec Should be a module name to load, or a plugin spec @@ -87,4 +88,10 @@ function M.plugins() return vim.tbl_values(require("lazy.core.config").plugins) end +setmetatable(M, { + __index = function(_, key) + return require("lazy.view.commands").commands[key] + end, +}) + return M diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 7cd0e0b..241eca5 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -16,6 +16,7 @@ function M.cmd(cmd, plugins) end end +---@class LazyCommands M.commands = { clean = function(plugins) Manage.clean({ clear = true, mode = "clean", plugins = plugins }) @@ -33,6 +34,9 @@ M.commands = { home = function() View.show("home") end, + show = function() + View.show("home") + end, help = function() View.show("help") end, @@ -44,8 +48,8 @@ M.commands = { end, sync = function() Manage.clean({ clear = true, wait = true, mode = "sync" }) - Manage.update({ interactive = true }) - Manage.install({ interactive = true }) + Manage.update() + Manage.install() end, update = function(plugins) Manage.update({ clear = true, mode = "update", plugins = plugins }) From 1730661ec23157ccdda0aeeb9517cd2fd4e47bfe Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 11:42:54 +0100 Subject: [PATCH 0180/1610] docs: generate docs for commands --- README.md | 22 ++++++++++++++++++++++ lua/lazy/docs.lua | 29 ++++++++++++++++++++++++++++- lua/lazy/view/init.lua | 31 +++++++++++++++++-------------- lua/lazy/view/render.lua | 7 +++++-- 4 files changed, 72 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 157e8d6..9fb769b 100644 --- a/README.md +++ b/README.md @@ -277,6 +277,28 @@ return { ## 🚀 Usage +You can manage all your plugins with the main `:Lazy` command. +Alternatively you can start any operation with a specific command, sub command or API function: + + + +| Command | Lua | Key Mapping | Description | +| --------------------------------- | --------------------------- | ----------- | ------------------------------------------------------ | +| `:Lazy home` or `:LazyHome` | `require("lazy").home()` | `` | Go back to plugin list | +| `:Lazy install` or `:LazyInstall` | `require("lazy").install()` | `` | Install missing plugins | +| `:Lazy update` or `:LazyUpdate` | `require("lazy").update()` | `` | Update all plugins. This will also update the lockfile | +| `:Lazy sync` or `:LazySync` | `require("lazy").sync()` | `` | Run install, clean and update | +| `:Lazy clean` or `:LazyClean` | `require("lazy").clean()` | `` | Clean plugins that are no longer needed | +| `:Lazy check` or `:LazyCheck` | `require("lazy").check()` | `` | Check for updates and show the log (git fetch) | +| `:Lazy log` or `:LazyLog` | `require("lazy").log()` | `` | Show recent updates for all plugins | +| `:Lazy restore` or `:LazyRestore` | `require("lazy").restore()` | `` | Updates all plugins to the state in the lockfile | +| `:Lazy profile` or `:LazyProfile` | `require("lazy").profile()` | `

` | Show detailed profiling | +| `:Lazy debug` or `:LazyDebug` | `require("lazy").debug()` | `` | Show debug information | +| `:Lazy help` or `:LazyHelp` | `require("lazy").help()` | `` | Toggle this help page | +| `:Lazy clear` or `:LazyClear` | `require("lazy").clear()` | | Clear finished tasks | + + + ## 📊 Profiler The profiling view shows you why and how long it took to load your plugins. diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 4b2c1f1..7be8f55 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -57,7 +57,7 @@ function M.save(contents) if not readme:find(pattern) then error("tag " .. tag .. " not found") end - if tag == "toc" then + if tag == "toc" or tag == "commands" then readme = readme:gsub(pattern, "%1\n\n" .. content .. "\n\n%2") else readme = readme:gsub(pattern, "%1\n\n```lua\n" .. content .. "\n```\n\n%2") @@ -73,6 +73,32 @@ function M.extract(file, pattern) return assert(init:match(pattern)) end +function M.commands() + local commands = require("lazy.view.commands").commands + local modes = require("lazy.view").modes + local lines = { + { "Command", "Lua", "Key Mapping", "Description" }, + { "---", "---", "---", "---" }, + } + for _, mode in ipairs(modes) do + if not mode.plugin and commands[mode.name] then + lines[#lines + 1] = { + ("`:Lazy %s`"):format(mode.name) .. " or " .. ("`:Lazy%s`"):format( + mode.name:sub(1, 1):upper() .. mode.name:sub(2) + ), + ([[`require("lazy").%s()`]]):format(mode.name), + mode.key and ("`<%s>`"):format(mode.key) or "", + mode.desc, + } + end + end + local ret = {} + for _, line in ipairs(lines) do + ret[#ret + 1] = "| " .. table.concat(line, " | ") .. " |" + end + return table.concat(ret, "\n") +end + function M.update() local cache_config = M.extract("lua/lazy/core/cache.lua", "\nM%.config = ({.-\n})") local config = M.extract("lua/lazy/core/config.lua", "\nM%.defaults = ({.-\n})") @@ -85,6 +111,7 @@ function M.update() bootstrap = M.extract("lua/lazy/init.lua", "function M%.bootstrap%(%)\n(.-)\nend"), config = config, spec = Util.read_file("lua/lazy/example.lua"), + commands = M.commands(), }) vim.cmd.checktime() end diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 57f3688..df0d2a5 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -16,6 +16,7 @@ M.modes = { { name = "profile", key = "P", desc = "Show detailed profiling", toggle = true }, { name = "debug", key = "D", desc = "Show debug information", toggle = true }, { name = "help", key = "?", desc = "Toggle this help page", toggle = true }, + { name = "clear", desc = "Clear finished tasks", hide = true }, { plugin = true, name = "update", key = "u", desc = "Update this plugin. This will also update the lockfile" }, { @@ -163,21 +164,23 @@ function M.show(mode) }) for _, m in ipairs(M.modes) do - vim.keymap.set("n", m.key, function() - local Commands = require("lazy.view.commands") - if m.plugin then - local plugin = get_plugin() - if plugin then - Commands.cmd(m.name, { plugin }) + if m.key then + vim.keymap.set("n", m.key, function() + local Commands = require("lazy.view.commands") + if m.plugin then + local plugin = get_plugin() + if plugin then + Commands.cmd(m.name, { plugin }) + end + else + if M.mode == m.name and m.toggle then + M.mode = nil + return update() + end + Commands.cmd(m.name) end - else - if M.mode == m.name and m.toggle then - M.mode = nil - return update() - end - Commands.cmd(m.name) - end - end, { buffer = buf }) + end, { buffer = buf }) + end end vim.api.nvim_create_autocmd("User", { diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 1755573..04b77aa 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -150,8 +150,11 @@ function M:help() for _, mode in ipairs(View.modes) do local title = mode.name:sub(1, 1):upper() .. mode.name:sub(2) self:append("- ", "LazySpecial", { indent = 2 }) - self:append(title, "Title"):append(" <" .. mode.key .. "> ", "LazyKey") - self:append(mode.desc or ""):nl() + self:append(title, "Title") + if mode.key then + self:append(" <" .. mode.key .. ">", "LazyKey") + end + self:append(" " .. (mode.desc or "")):nl() end end From 671b163dd75fefcfbb1a9e0b3317840d0f5706fe Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 11:43:10 +0100 Subject: [PATCH 0181/1610] docs: added more details on startup sequence --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9fb769b..abf3d93 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ ## ⚡️ Requirements - Neovim >= **0.8.0** +- Built for **Linux** and **MacOS** ## 📦 Installation @@ -317,7 +318,15 @@ See an overview of active lazy-loading handlers and what's in the module cache 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](https://neovim.io/doc/user/starting.html#initialization) is done by Lazy. +In practice this means that step 10 of [Neovim Initialization](https://neovim.io/doc/user/starting.html#initialization) is done by Lazy: + +1. all files from `/plugin` and `/ftdetect` directories in you rtp are sourced (excluding `/after`) +2. all plugins with `lazy=false` are loaded. This includes sourcing `/plugin` and `/ftdetect` files. (`/after` will not be sourced yet) +3. all plugins' `/after/plugin` files are sourced +4. all `/after/plugin` files from the original rtp are sourced +5. all the plugins' `init()` functions are executed + +Files from runtime directories are always sourced in alphabetical order. ## 📦 Differences with Packer From db469ed275d0a65b6823777c51cffcbc8bb12924 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Dec 2022 10:44:05 +0000 Subject: [PATCH 0182/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9c0f167..22808e0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 17 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 18 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -51,6 +51,7 @@ REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** +- Built for **Linux** and **MacOS** INSTALLATION *lazy.nvim-installation* @@ -295,6 +296,25 @@ CONFIGURATION *lazy.nvim-configuration* USAGE *lazy.nvim-usage* +You can manage all your plugins with the main `:Lazy` command. Alternatively +you can start any operation with a specific command, sub command or API +function: + +│ Command │ Lua │Key Mapping│ Description │ +│:Lazy home or :LazyHome │require("lazy").home() │ │Go back to plugin list │ +│:Lazy install or :LazyInstall │require("lazy").install() │ │Install missing plugins │ +│:Lazy update or :LazyUpdate │require("lazy").update() │ │Update all plugins. This will also update the lockfile│ +│:Lazy sync or :LazySync │require("lazy").sync() │ │Run install, clean and update │ +│:Lazy clean or :LazyClean │require("lazy").clean() │ │Clean plugins that are no longer needed │ +│:Lazy check or :LazyCheck │require("lazy").check() │ │Check for updates and show the log (git fetch) │ +│:Lazy log or :LazyLog │require("lazy").log() │ │Show recent updates for all plugins │ +│:Lazy restore or :LazyRestore │require("lazy").restore() │ │Updates all plugins to the state in the lockfile │ +│:Lazy profile or :LazyProfile │require("lazy").profile() │

│Show detailed profiling │ +│:Lazy debug or :LazyDebug │require("lazy").debug() │ │Show debug information │ +│:Lazy help or :LazyHelp │require("lazy").help() │ │Toggle this help page │ +│:Lazy clear or :LazyClear │require("lazy").clear() │ │Clear finished tasks │ + + PROFILER *lazy.nvim-profiler* The profiling view shows you why and how long it took to load your plugins. @@ -320,7 +340,17 @@ STARTUP SEQUENCE *lazy.nvim-startup-sequence* 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. +In practice this means that step 10 of |Neovim Initialization| is done by Lazy: + + +1. all files from `/plugin` and `/ftdetect` directories in you rtp are sourced (excluding `/after`) +2. all plugins with `lazy=false` are loaded. This includes sourcing `/plugin` and `/ftdetect` files. (`/after` will not be sourced yet) +3. all plugins’ `/after/plugin` files are sourced +4. all `/after/plugin` files from the original rtp are sourced +5. all the plugins’ `init()` functions are executed + + +Files from runtime directories are always sourced in alphabetical order. DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* From b70bb1955bef012101ebe227340bf15a048e4e84 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 11:58:40 +0100 Subject: [PATCH 0183/1610] docs: added more detailed requirements --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index abf3d93..e5afbd8 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,9 @@ ## ⚡️ Requirements -- Neovim >= **0.8.0** +- Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Built for **Linux** and **MacOS** +- Git >= **2.19.0** (for partial clones support) ## 📦 Installation From 0f62ec0ad6f6ba54fddfe9683463c0eb254ee206 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Dec 2022 10:59:37 +0000 Subject: [PATCH 0184/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 22808e0..61ecd23 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -50,8 +50,9 @@ FEATURES *lazy.nvim-features* REQUIREMENTS *lazy.nvim-requirements* -- Neovim >= **0.8.0** +- Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Built for **Linux** and **MacOS** +- Git >= **2.19.0** (for partial clones support) INSTALLATION *lazy.nvim-installation* From c0d3617e0b45b68abc522778837ff8a472273c15 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 13:41:02 +0100 Subject: [PATCH 0185/1610] feat: check if ffi is available and error if not --- lua/lazy/init.lua | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 6b316cd..57c48fd 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -4,18 +4,22 @@ local M = {} ---@param spec LazySpec Should be a module name to load, or a plugin spec ---@param opts? LazyConfig function M.setup(spec, opts) - if vim.fn.has("nvim-0.8.0") ~= 1 then - vim.notify("lazy.nvim requires Neovim >= 0.8.0", vim.log.levels.ERROR, { title = "lazy.nvim" }) - return - end if not vim.go.loadplugins then return end - if vim.g.lazy_did_setup then - vim.notify("Re-sourcing your config is not supported with lazy.nvim", vim.log.levels.WARN, { title = "lazy.nvim" }) - return + if vim.fn.has("nvim-0.8.0") ~= 1 then + return vim.notify("lazy.nvim requires Neovim >= 0.8.0", vim.log.levels.ERROR, { title = "lazy.nvim" }) + end + if not pcall(require, "ffi") then + return vim.notify("lazy.nvim requires Neovim built with LuaJIT", vim.log.levels.ERROR, { title = "lazy.nvim" }) + end + if vim.g.lazy_did_setup then + return vim.notify( + "Re-sourcing your config is not supported with lazy.nvim", + vim.log.levels.WARN, + { title = "lazy.nvim" } + ) end - vim.g.lazy_did_setup = true local start = vim.loop.hrtime() From 78b284c065467d650edf05f53be6a64444aa3324 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 14:23:02 +0100 Subject: [PATCH 0186/1610] docs: added section on lazy loading --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index e5afbd8..8b56267 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,25 @@ require("lazy").setup({ | **ft** | `string?` or `string[]` | Lazy-load on filetype | | **keys** | `string?` or `string[]` | Lazy-load on key mapping | +### Lazy Loading + +**lazy.nvim** automagically lazy-loads Lua modules, so it is not needed to +specify `module=...` everywhere in your plugin specification. This mean 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. + +You can configure **lazy.nvim** to lazy-load all plugins by default with `config.defaults.lazy = true`. + +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 `cmd` key +- it defines an `init` method +- `config.defaults.lazy == true` + ```lua From c88ad91e3189ebafa36a91c0964d8dc92ceeb2a6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 14:26:24 +0100 Subject: [PATCH 0187/1610] docs: added section on versioning --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 8b56267..4ce6f2d 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,25 @@ Plugins will be lazy-loaded when one of the following is `true`: - it defines an `init` method - `config.defaults.lazy == true` +### Versioning + +If you want to install a specific revision of a plugin, you can use `commit`, +`tag`, `branch`, `version`. + +The `version` property supports [Semver](https://semver.org/) ranges: + +- `*`: 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 + +> You can set `config.defaults.version = "*"` to install the latest stable +> version of plugins that support Semver. + ```lua From 628d421c27c70a42fe33058c196eb9e2d3790413 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 14:28:49 +0100 Subject: [PATCH 0188/1610] docs: added my dots to the examples --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 4ce6f2d..b19d35f 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,17 @@ The `version` property supports [Semver](https://semver.org/) ranges: > You can set `config.defaults.version = "*"` to install the latest stable > version of plugins that support Semver. +### Examples + +My personal dots: + +- [init.lua](https://github.com/folke/dot/blob/master/config/nvim/init.lua) where I require `config.lazy` +- [config.lazy](https://github.com/folke/dot/blob/master/config/nvim/lua/config/lazy.lua) where I bootstrap and setup **lazy.nvim** +- [config.plugins](https://github.com/folke/dot/blob/master/config/nvim/lua/config/plugins.lua) is my main plugin config module +- Any submodule of [config.plugins (submodules)](https://github.com/folke/dot/tree/master/config/nvim/lua/config/plugins) will be automatically loaded as well. + +Other examples: + ```lua From 39f629eedff84edd216987d58152ce782779d3c8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Dec 2022 13:29:46 +0000 Subject: [PATCH 0189/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 61ecd23..d549ec0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -121,6 +121,64 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**keys** │string? or string[] │Lazy-load on key mapping │ +LAZY LOADING ~ + +**lazy.nvim** automagically lazy-loads Lua modules, so it is not needed to +specify `module=...` everywhere in your plugin specification. This mean 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. + +You can configure **lazy.nvim** to lazy-load all plugins by default with +`config.defaults.lazy = true`. + +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 `cmd` key +- it defines an `init` method +- `config.defaults.lazy == true` + + +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: + + +- :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 + + + + You can set `config.defaults.version = ""` to install the latest stable version + of plugins that support Semver. + + +EXAMPLES ~ + +My personal dots: + + +- init.lua where I require `config.lazy` +- config.lazy where I bootstrap and setup **lazy.nvim** +- config.plugins is my main plugin config module +- Any submodule of config.plugins (submodules) will be automatically loaded as well. + + +Other examples: + >lua return { -- the colorscheme should be available when starting Neovim From d0651e4782c3ef148ef0c714cc88a6e0784b83dc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 14:33:51 +0100 Subject: [PATCH 0190/1610] docs: added section about the lockfile --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index b19d35f..e3fc0c4 100644 --- a/README.md +++ b/README.md @@ -350,6 +350,17 @@ Alternatively you can start any operation with a specific command, sub command o +## 🔒 Lockfile `lazy-lock.json` + +After every **update**, the local lockfile 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. + +On the other machine, you can do `Lazy restore`, to update all your plugins to +the version from the lockfile + ## 📊 Profiler The profiling view shows you why and how long it took to load your plugins. From cd3d87cc82fef9702cc6f92218406eec94ced251 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Dec 2022 13:34:41 +0000 Subject: [PATCH 0191/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d549ec0..0708409 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -10,6 +10,7 @@ Table of Contents *lazy.nvim-table-of-contents* - Plugin Spec |lazy.nvim-plugin-spec| - Configuration |lazy.nvim-configuration| - Usage |lazy.nvim-usage| + - Lockfile `lazy-lock.json` |lazy.nvim-lockfile-`lazy-lock.json`| - Profiler |lazy.nvim-profiler| - 🪲 Debug |lazy.nvim-🪲-debug| - Startup Sequence |lazy.nvim-startup-sequence| @@ -374,6 +375,17 @@ function: │:Lazy clear or :LazyClear │require("lazy").clear() │ │Clear finished tasks │ +LOCKFILE `LAZY-LOCK.JSON` *lazy.nvim-lockfile-`lazy-lock.json`* + +After every **update**, the local lockfile 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. + +On the other machine, you can do `Lazy restore`, to update all your plugins to +the version from the lockfile + PROFILER *lazy.nvim-profiler* The profiling view shows you why and how long it took to load your plugins. From 5fc87f924a2bc1b94255bc685ee1e8344e75f3bd Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 14:46:33 +0100 Subject: [PATCH 0192/1610] docs: updated screenshots --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e3fc0c4..2bd229a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **lazy.nvim** is a modern plugin manager for Neovim. -![image](https://user-images.githubusercontent.com/292349/207705153-077e183e-ae5f-4cbe-b1d8-07b7bf86026e.png) +![image](https://user-images.githubusercontent.com/292349/208301737-68fb279c-ba70-43ef-a369-8c3e8367d6b1.png) ## ✨ Features @@ -365,13 +365,13 @@ the version from the lockfile The profiling view shows you why and how long it took to load your plugins. -![image](https://user-images.githubusercontent.com/292349/207703263-3b38ca45-9779-482b-b684-4f8c3b3e76d0.png) +![image](https://user-images.githubusercontent.com/292349/208301766-5c400561-83c3-4811-9667-1ec4bb3c43b8.png) ## 🪲 Debug See an overview of active lazy-loading handlers and what's in the module cache -![image](https://user-images.githubusercontent.com/292349/207703522-8bb20678-bb4c-4424-80e4-add3219711c3.png) +![image](https://user-images.githubusercontent.com/292349/208301790-7eedbfa5-d202-4e70-852e-de68aa47233b.png) ## ▶️ Startup Sequence From 968fa3fe20dbcf0269f4278f6a5112a316d2ed3b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 14:47:08 +0100 Subject: [PATCH 0193/1610] style: removed bold from home button --- lua/lazy/view/render.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 04b77aa..0b2ae04 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -111,7 +111,6 @@ function M:title() if View.mode == mode.name then if mode.name == "home" then self:append(title, "LazyH1") - self:highlight({ ["%w+"] = "Bold" }) else self:append(title, "LazyButtonActive") self:highlight({ ["%(.%)"] = "LazySpecial" }) From 2526a011e5b0ce6f402654ac890cd85e9d43d03f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Dec 2022 13:48:03 +0000 Subject: [PATCH 0194/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0708409..7325df4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -23,7 +23,7 @@ Table of Contents *lazy.nvim-table-of-contents* **lazy.nvim** is a modern plugin manager for Neovim.

- +

image

@@ -391,7 +391,7 @@ PROFILER *lazy.nvim-profiler* The profiling view shows you why and how long it took to load your plugins.
- +

image

@@ -401,7 +401,7 @@ See an overview of active lazy-loading handlers and what’s in the module cache
- +

image

From e42a18099aedaaef87b73e034efcb1ef798741a4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 14:49:13 +0100 Subject: [PATCH 0195/1610] docs: added line on `:checkhealth` --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2bd229a..af34883 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,8 @@ require("lazy").setup({ }) ``` +> ℹ️ It is recommended to run `:checkhealth lazy` after installation + ## 🔌 Plugin Spec | Property | Type | Description | From b88b7d75eb7b28b1e90d1e194e9229b1ee18f62d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Dec 2022 13:50:01 +0000 Subject: [PATCH 0196/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 7325df4..9005019 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -97,6 +97,10 @@ Next step is to add **lazy.nvim** to the top of your `init.lua` < + + It is recommended to run `:checkhealth lazy` after installation + + PLUGIN SPEC *lazy.nvim-plugin-spec* │ Property │ Type │ Description │ From c87673c4b97578d7dd6f14e421486cfa6e008b91 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 14:51:34 +0100 Subject: [PATCH 0197/1610] feat(ui): added help for on a plugin --- lua/lazy/view/render.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 0b2ae04..51b08c6 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -145,6 +145,8 @@ function M:help() local View = require("lazy.view") self:append("Help", "LazyH2"):nl():nl() + self:append("You can press "):append("", "LazySpecial"):append(" on a plugin to show its details."):nl():nl() + self:append("Keyboard Shortcuts", "LazyH2"):nl() for _, mode in ipairs(View.modes) do local title = mode.name:sub(1, 1):upper() .. mode.name:sub(2) From 48309ddf09974749a387136105b22f444f8409a3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 18 Dec 2022 15:03:51 +0100 Subject: [PATCH 0198/1610] chore(main): release 4.2.0 (#11) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0b803e..98670be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## [4.2.0](https://github.com/folke/lazy.nvim/compare/v4.1.0...v4.2.0) (2022-12-18) + + +### Features + +* check if ffi is available and error if not ([c0d3617](https://github.com/folke/lazy.nvim/commit/c0d3617e0b45b68abc522778837ff8a472273c15)) +* expose all commands on main lazy module ([f25f942](https://github.com/folke/lazy.nvim/commit/f25f942eb76f485d09f770dd5ea4c4ca3bef4e0b)) +* **loader:** added error handler to sourcing of runtime files ([eeb06a5](https://github.com/folke/lazy.nvim/commit/eeb06a5a509c27b7f0877b513f2278f27cc98f67)) +* never source `packer_compiled.lua` ([a46c0c0](https://github.com/folke/lazy.nvim/commit/a46c0c04f13ef4bb10c42004a72a48356f8cfe93)) +* **ui:** added dir to props ([9736671](https://github.com/folke/lazy.nvim/commit/97366711bedc7bfc2e9a425e8dfa6f9891e9c865)) +* **ui:** added help for <CR> on a plugin ([c87673c](https://github.com/folke/lazy.nvim/commit/c87673c4b97578d7dd6f14e421486cfa6e008b91)) +* **ui:** made it look a little less like a Mason rip-off :) ([9026a0e](https://github.com/folke/lazy.nvim/commit/9026a0e25d4e3ebfe2cac7d7a724cb8211fac4f1)) +* **ui:** make home bold ([0b4a04d](https://github.com/folke/lazy.nvim/commit/0b4a04de7d264b5890210f92eef0e6521bf8d0c9)) + + +### Bug Fixes + +* **loader:** runtime files are now sourced alphabetically per directory ([5c0c381](https://github.com/folke/lazy.nvim/commit/5c0c381b56f78622df47e2057210232ed0a3275e)) +* set correct dir for lazy plugin ([23984dd](https://github.com/folke/lazy.nvim/commit/23984dd1f300e09cbc1bc9a80aae3bea32a5bbcc)) +* **ui:** always clear complete tasks with the same name when starting a new task ([85e3752](https://github.com/folke/lazy.nvim/commit/85e375223f21e35fd5f779cad05be0397557e72a)) +* **ui:** show first tag for each help doc in details ([6f728e6](https://github.com/folke/lazy.nvim/commit/6f728e698d5e19de36dd861f6699b6b4560e5f42)) +* **ui:** split window before opening a file from the Lazy ui, otherwise it'll get closed immediately ([f18efa1](https://github.com/folke/lazy.nvim/commit/f18efa1da1b1274466444a477574ac2b6a2c24b3)) + ## [4.1.0](https://github.com/folke/lazy.nvim/compare/v4.0.0...v4.1.0) (2022-12-16) From b89e6bffd258e4dd367992c306b588e9b24b9a76 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Sun, 18 Dec 2022 17:36:32 +0100 Subject: [PATCH 0199/1610] perf: lazy-load the commands available on the `lazy` module --- lua/lazy/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 57c48fd..3d9ae2e 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -94,7 +94,9 @@ end setmetatable(M, { __index = function(_, key) - return require("lazy.view.commands").commands[key] + return function(...) + return require("lazy.view.commands").commands[key](...) + end end, }) From d4aee2715fa22ab29422320d817236e927260335 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 10:11:21 +0100 Subject: [PATCH 0200/1610] feat!: removed the LazyUpdate etc commands. sub-commands only from now on --- lua/lazy/view/commands.lua | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 241eca5..8abfe40 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -81,16 +81,6 @@ function M.setup() end, vim.tbl_keys(M.commands)) end, }) - - for name in pairs(M.commands) do - local cmd = "Lazy" .. name:sub(1, 1):upper() .. name:sub(2) - - vim.api.nvim_create_user_command(cmd, function() - M.cmd(name) - end, { - desc = "Lazy " .. name, - }) - end end return M From 1fe43f3e294cf994a52d25e16dc630e66db2970c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 12:20:02 +0100 Subject: [PATCH 0201/1610] fix(ui): focus Lazy window when auto-installing plugins in `VimEnter` --- lua/lazy/view/init.lua | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index df0d2a5..04dd42d 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -65,9 +65,19 @@ function M.show(mode) opts.col = (vim.o.columns - opts.width) / 2 local win = vim.api.nvim_open_win(buf, true, opts) M._win = win - vim.api.nvim_set_current_win(win) + -- it seems that setting the current win doesn't work before VimEnter, + -- so do that then + if vim.v.vim_did_enter ~= 1 then + vim.api.nvim_create_autocmd("VimEnter", { + once = true, + callback = function() + vim.api.nvim_set_current_win(win) + end, + }) + end + vim.bo[buf].buftype = "nofile" vim.bo[buf].bufhidden = "wipe" vim.wo[win].conceallevel = 3 From 32f2b71ff884e88358790348d5620ed494ef80b6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 12:21:20 +0100 Subject: [PATCH 0202/1610] fix(cache): do a fast check to see if a cached modpath is still valid. find it again otherwise --- lua/lazy/core/cache.lua | 73 ++++++++++++++++++++++++++++++++++------ lua/lazy/core/loader.lua | 14 +------- 2 files changed, 63 insertions(+), 24 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index c486e83..64ffe1e 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -4,6 +4,7 @@ local uv = vim.loop local M = {} M.dirty = false +M.VERSION = "1" ---@class LazyCacheConfig M.config = { @@ -28,15 +29,36 @@ M.cache = {} M.loader_idx = 2 -- 2 so preload still works M.enabled = true M.ttl = 3600 * 24 * 5 -- keep unused modules for up to 5 days +---@type string[] +M.rtp = nil --- Check if we need to load this plugin ----@param modname string ----@param modpath string -function M.check_load(modname, modpath) - if modname:sub(1, 4) == "lazy" then - return +-- checks wether the cached modpath is still valid +function M.check_path(modname, modpath) + -- check rtp exlcuding plugins. This is a very small list, so should be fast + for _, path in ipairs(M.get_rtp()) do + if modpath:find(path, 1, true) == 1 then + return true + end end - require("lazy.core.loader").check_load(modname, modpath) + + -- the correct lazy path should be part of rtp. + -- so if we get here, this is folke using the local dev instance ;) + if modname:sub(1, 4) == "lazy" then + return false + end + + -- check plugins. Again fast, since we check the plugin name from the path. + -- only needed when the plugin mod has been loaded + if package.loaded["lazy.core.plugin"] then + local plugin = require("lazy.core.plugin").find(modpath) + if plugin and modpath:find(plugin.dir, 1, true) == 1 then + if not plugin._.loaded then + require("lazy.core.loader").load(plugin, { require = modname }) + end + return true + end + end + return false end function M.disable() @@ -56,8 +78,7 @@ function M.loader(modname) local entry = M.cache[modname] local chunk, err - if entry then - M.check_load(modname, entry.modpath) + if entry and M.check_path(modname, entry.modpath) then entry.used = os.time() local hash = M.hash(entry.modpath) if not hash then @@ -126,6 +147,28 @@ function M.find(modname) end end +function M.get_rtp() + if not M.rtp then + M.rtp = {} + local skip = {} + -- only skip plugins once Config has been setup + if package.loaded["lazy.core.config"] then + local Config = require("lazy.core.config") + for _, plugin in ipairs(Config.plugins) do + if plugin.name ~= "lazy.nvim" then + skip[plugin.dir] = true + end + end + end + for _, path in ipairs(vim.api.nvim_list_runtime_paths()) do + if not skip[path] then + M.rtp[#M.rtp + 1] = path + end + end + end + return M.rtp +end + ---@param opts? LazyConfig function M.setup(opts) -- no fancy deep extend here. just set the options @@ -139,6 +182,14 @@ function M.setup(opts) M.load_cache() table.insert(package.loaders, M.loader_idx, M.loader) + -- reset rtp when it changes + vim.api.nvim_create_autocmd("OptionSet", { + pattern = "runtimepath", + callback = function() + M.rtp = nil + end, + }) + if #M.config.disable_events > 0 then vim.api.nvim_create_autocmd(M.config.disable_events, { once = true, callback = M.disable }) end @@ -159,7 +210,7 @@ end function M.save_cache() local f = assert(uv.fs_open(M.config.path, "w", 438)) - uv.fs_write(f, vim.env.VIMRUNTIME) + uv.fs_write(f, M.VERSION) uv.fs_write(f, "\0") for modname, entry in pairs(M.cache) do if entry.used > os.time() - M.ttl then @@ -195,7 +246,7 @@ function M.load_cache() return end - if vim.env.VIMRUNTIME ~= data:sub(1, zero - 1) then + if M.VERSION ~= data:sub(1, zero - 1) then return end diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 3903772..741c2af 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -1,6 +1,7 @@ local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Handler = require("lazy.core.handler") +local Cache = require("lazy.core.cache") local M = {} @@ -214,17 +215,4 @@ function M.autoload(modname) return modname .. " not found in lazy plugins" end --- lazy.cache will call this when loading a cached file with modpath set. ----@param modname string ----@param modpath string -function M.check_load(modname, modpath) - -- no need to check anything before init - if M.init_done then - local plugin = require("lazy.core.plugin").find(modpath) - if plugin and not plugin._.loaded then - M.load(plugin, { require = modname }) - end - end -end - return M From faac2dd11c932e71a0cea9bc933f8bbe1e1d2312 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 13:34:37 +0100 Subject: [PATCH 0203/1610] perf(cache): cache loadfile and no find modpaths without package.loaders --- lua/lazy/core/cache.lua | 112 ++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 51 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 64ffe1e..189b400 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -26,11 +26,12 @@ local cache_hash ---@alias CacheEntry {hash:CacheHash, modpath:string, chunk:string, used:number} ---@type table M.cache = {} -M.loader_idx = 2 -- 2 so preload still works M.enabled = true M.ttl = 3600 * 24 * 5 -- keep unused modules for up to 5 days ---@type string[] M.rtp = nil +-- selene:allow(global_usage) +M._loadfile = _G.loadfile -- checks wether the cached modpath is still valid function M.check_path(modname, modpath) @@ -65,9 +66,14 @@ function M.disable() if not M.enabled then return end - local idx = M.idx() - if idx then - table.remove(package.loaders, idx) + -- selene:allow(global_usage) + _G.loadfile = M._loadfile + ---@diagnostic disable-next-line: no-unknown + for i, loader in ipairs(package.loaders) do + if loader == M.loader then + table.remove(package.loaders, i) + break + end end M.enabled = false end @@ -79,82 +85,82 @@ function M.loader(modname) local chunk, err if entry and M.check_path(modname, entry.modpath) then - entry.used = os.time() - local hash = M.hash(entry.modpath) - if not hash then - return + chunk, err = M.load(modname, entry.modpath) + else + -- find the modpath and load the module + local modpath = M.find(modname) + if modpath then + chunk, err = M.load(modname, modpath) end + end + return chunk or (err and error(err)) or "not found in lazy cache" +end + +---@param modpath string +---@return any, string? +function M.loadfile(modpath) + return M.load(modpath, modpath) +end + +---@param modkey string +---@param modpath string +---@return function?, string? error_message +function M.load(modkey, modpath) + local hash = M.hash(modpath) + if not hash then + -- trigger correct error + return M._loadfile(modpath) + end + + local entry = M.cache[modkey] + if entry then + entry.used = os.time() if M.eq(entry.hash, hash) then -- found in cache and up to date - chunk, err = load(entry.chunk --[[@as string]], "@" .. entry.modpath) - return chunk or error(err) + return loadstring(entry.chunk --[[@as string]], "@" .. entry.modpath) end - -- reload from file - entry.hash = hash - chunk, err = loadfile(entry.modpath) else - -- load the module and find its modpath - local modpath - chunk, modpath = M.find(modname) - if modpath then - entry = { hash = M.hash(modpath), modpath = modpath, used = os.time() } - M.cache[modname] = entry - end + entry = { hash = hash, modpath = modpath, used = os.time() } + M.cache[modkey] = entry end + entry.hash = hash + if M.debug then vim.schedule(function() - vim.notify("[cache:load] " .. modname) + vim.notify("[cache:load] " .. modpath) end) end - if entry and chunk then + + local chunk, err = M._loadfile(entry.modpath) + if chunk then M.dirty = true entry.chunk = string.dump(chunk) end - return chunk or error(err) + return chunk, err end function M.require(modname) return M.loader(modname)() end -function M.idx() - -- update our loader position if needed - if package.loaders[M.loader_idx] ~= M.loader then - M.loader_idx = nil - ---@diagnostic disable-next-line: no-unknown - for i, loader in ipairs(package.loaders) do - if loader == M.loader then - M.loader_idx = i - break - end - end - end - return M.loader_idx -end - ---@param modname string +---@return string? function M.find(modname) - if M.idx() then - -- find the module and its modpath - for i = M.loader_idx + 1, #package.loaders do - ---@diagnostic disable-next-line: no-unknown - local chunk = package.loaders[i](modname) - if type(chunk) == "function" then - local info = debug.getinfo(chunk, "S") - return chunk, (info.what ~= "C" and info.source:sub(2)) - end - end - end + local basename = modname:gsub("%.", "/") + local paths = { "lua/" .. basename .. ".lua", "lua/" .. basename .. "/init.lua" } + return vim.api.nvim__get_runtime(paths, false, { is_lua = true })[1] end +-- returns the cached RTP excluding plugin dirs function M.get_rtp() if not M.rtp then M.rtp = {} + ---@type table local skip = {} -- only skip plugins once Config has been setup if package.loaded["lazy.core.config"] then local Config = require("lazy.core.config") - for _, plugin in ipairs(Config.plugins) do + for _, plugin in pairs(Config.plugins) do if plugin.name ~= "lazy.nvim" then skip[plugin.dir] = true end @@ -173,14 +179,18 @@ end function M.setup(opts) -- no fancy deep extend here. just set the options if opts and opts.performance and opts.performance.cache then + ---@diagnostic disable-next-line: no-unknown for k, v in pairs(opts.performance.cache) do + ---@diagnostic disable-next-line: no-unknown M.config[k] = v end end M.debug = opts and opts.debug M.load_cache() - table.insert(package.loaders, M.loader_idx, M.loader) + table.insert(package.loaders, 2, M.loader) + -- selene:allow(global_usage) + _G.loadfile = M.loadfile -- reset rtp when it changes vim.api.nvim_create_autocmd("OptionSet", { From 6f00cdedee62bf70bfd95534391b50ef2f679d7d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 13:36:11 +0100 Subject: [PATCH 0204/1610] docs: typos --- README.md | 6 +++--- lua/lazy/core/config.lua | 2 +- lua/lazy/example.lua | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index af34883..d74a095 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ require("lazy").setup({ | `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | | **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 dispay name | +| **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` | | **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 laz-loading handlers triggers | | **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | @@ -212,7 +212,7 @@ return { keys = { "", "" }, }, - -- local plugins need to be explicitely configured with dir + -- local plugins need to be explicitly configured with dir { dir = "~/projects/secret.nvim" }, -- you can use a custom url to fetch a plugin @@ -281,7 +281,7 @@ return { throttle = 20, -- how frequently should the ui process render events }, checker = { - -- automcatilly check for plugin updates + -- 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 diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index e4354b3..c85821f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -50,7 +50,7 @@ M.defaults = { throttle = 20, -- how frequently should the ui process render events }, checker = { - -- automcatilly check for plugin updates + -- 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 diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua index e91eb50..f3eda6c 100644 --- a/lua/lazy/example.lua +++ b/lua/lazy/example.lua @@ -59,7 +59,7 @@ return { keys = { "", "" }, }, - -- local plugins need to be explicitely configured with dir + -- local plugins need to be explicitly configured with dir { dir = "~/projects/secret.nvim" }, -- you can use a custom url to fetch a plugin From 65675808d11989d8c63480451a3cbe365a1b35ed Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 13:37:14 +0100 Subject: [PATCH 0205/1610] chore: todo --- TODO.md | 24 ++++++++++++++++++++++++ tests/core/plugin_spec.lua | 11 +++++++++++ 2 files changed, 35 insertions(+) diff --git a/TODO.md b/TODO.md index 88eae3f..c78ab19 100644 --- a/TODO.md +++ b/TODO.md @@ -38,7 +38,31 @@ - [ ] git tests - [ ] Import specs from other plugin managers - [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) + - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range - default semver merging strategy: if no version matches all, then use highest version? - [ ] package meta index (package.lua cache for all packages) + +- [x] check in cache if rtp files match +- [ ] I think the installation section, specifically the loading part, could use an + extra sentence or two. I was confused on what `config.plugins` was initially. + Maybe a quick, "for example, if you have a lua file + `~/.config/nvim/lua/config/plugins.lua` that returns a table" or something it'd + remove most question marks I think. +- [x] When autoinstalling the plugins the cursor isn't focused on the floating + window, but on the non-floating window in the background. +- [ ] Doing `:Lazy clean` doesn't show which plugins were removed. +- [ ] Shouldn't the "Versioning" section be in the "Lockfile" chapter? +- [ ] Why are personal dotfiles used as examples? Dotfiles change all the time, + there's no guarantee this will be relevant or even exist in two years. +- [ ] What's the difference between lazy-loading and verylazy-loading? +- [ ] Most emojis in "Configuration" aren't shown for me. +- [ ] add section on how to uninstall +- [ ] add `:Packadd` command or something similar + +Typos: + +- [x] **automcatilly** check for plugin updates +- [x] A custom name for the plugin used for the local plugin directory and as the **dispay** name +- [x] local plugins need to be **explicitely** configured with dir diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index b9744ac..cf6ad8f 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -123,4 +123,15 @@ describe("plugin spec opt", function() }) end) end) + + -- it("recursive deps", function() + -- local spec = Plugin.Spec.new({ + -- "nvim-telescope/telescope.nvim", + -- dependencies = { + -- "nvim-lua/plenary.nvim", + -- { "nvim-telescope/telescope-fzf-native.nvim", build = "make" }, + -- { "nvim-telescope/telescope-frecency.nvim", dependencies = "kkharji/sqlite.lua" }, + -- }, + -- }) + -- end) end) From 7eb60345d66fd76e4f40d03aaf4cdd433e5d77b9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Dec 2022 12:38:06 +0000 Subject: [PATCH 0206/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9005019..b346f75 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 18 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 19 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -107,7 +107,7 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ │**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 dispay name │ +│**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 │ │**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 laz-loading handlers triggers │ │**enabled** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be used │ @@ -246,7 +246,7 @@ Other examples: keys = { "", "" }, }, - -- local plugins need to be explicitely configured with dir + -- local plugins need to be explicitly configured with dir { dir = "~/projects/secret.nvim" }, -- you can use a custom url to fetch a plugin @@ -312,7 +312,7 @@ CONFIGURATION *lazy.nvim-configuration* throttle = 20, -- how frequently should the ui process render events }, checker = { - -- automcatilly check for plugin updates + -- 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 From 8a0da3b27ee1d2263acce8f82dae1b7c71befa37 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 13:55:00 +0100 Subject: [PATCH 0207/1610] config: move lazy cache to state/nvim/lazy/cache --- lua/lazy/core/cache.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 189b400..0f11c57 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -9,7 +9,7 @@ M.VERSION = "1" ---@class LazyCacheConfig M.config = { enabled = true, - path = vim.fn.stdpath("state") .. "/lazy.state", + path = vim.fn.stdpath("state") .. "/lazy/cache", -- Once one of the following events triggers, caching will be disabled. -- To cache all modules, set this to `{}`, but that is not recommended. -- The default is to disable on: @@ -219,6 +219,7 @@ function M.eq(h1, h2) end function M.save_cache() + vim.fn.mkdir(vim.fn.fnamemodify(M.config.path, ":p:h"), "p") local f = assert(uv.fs_open(M.config.path, "w", 438)) uv.fs_write(f, M.VERSION) uv.fs_write(f, "\0") From 2dd623001891ad98845523c92e8fcc6043993019 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 14:19:10 +0100 Subject: [PATCH 0208/1610] feat: added `:Lazy load foobar.nvim` to load a plugin --- README.md | 31 ++++++++++++++++--------------- lua/lazy/docs.lua | 4 +--- lua/lazy/view/commands.lua | 33 ++++++++++++++++++++++++++++++--- lua/lazy/view/init.lua | 5 +++++ 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index d74a095..c14f998 100644 --- a/README.md +++ b/README.md @@ -290,7 +290,7 @@ return { performance = { cache = { enabled = true, - path = vim.fn.stdpath("state") .. "/lazy.state", + path = vim.fn.stdpath("state") .. "/lazy/cache", -- Once one of the following events triggers, caching will be disabled. -- To cache all modules, set this to `{}`, but that is not recommended. -- The default is to disable on: @@ -335,20 +335,21 @@ Alternatively you can start any operation with a specific command, sub command o -| Command | Lua | Key Mapping | Description | -| --------------------------------- | --------------------------- | ----------- | ------------------------------------------------------ | -| `:Lazy home` or `:LazyHome` | `require("lazy").home()` | `` | Go back to plugin list | -| `:Lazy install` or `:LazyInstall` | `require("lazy").install()` | `` | Install missing plugins | -| `:Lazy update` or `:LazyUpdate` | `require("lazy").update()` | `` | Update all plugins. This will also update the lockfile | -| `:Lazy sync` or `:LazySync` | `require("lazy").sync()` | `` | Run install, clean and update | -| `:Lazy clean` or `:LazyClean` | `require("lazy").clean()` | `` | Clean plugins that are no longer needed | -| `:Lazy check` or `:LazyCheck` | `require("lazy").check()` | `` | Check for updates and show the log (git fetch) | -| `:Lazy log` or `:LazyLog` | `require("lazy").log()` | `` | Show recent updates for all plugins | -| `:Lazy restore` or `:LazyRestore` | `require("lazy").restore()` | `` | Updates all plugins to the state in the lockfile | -| `:Lazy profile` or `:LazyProfile` | `require("lazy").profile()` | `

` | Show detailed profiling | -| `:Lazy debug` or `:LazyDebug` | `require("lazy").debug()` | `` | Show debug information | -| `:Lazy help` or `:LazyHelp` | `require("lazy").help()` | `` | Toggle this help page | -| `:Lazy clear` or `:LazyClear` | `require("lazy").clear()` | | Clear finished tasks | +| Command | Lua | Key Mapping | Description | +| --------------- | --------------------------- | ----------- | --------------------------------------------------------------------------------------------- | +| `:Lazy home` | `require("lazy").home()` | `` | Go back to plugin list | +| `:Lazy install` | `require("lazy").install()` | `` | Install missing plugins | +| `:Lazy update` | `require("lazy").update()` | `` | Update all plugins. This will also update the lockfile | +| `:Lazy sync` | `require("lazy").sync()` | `` | Run install, clean and update | +| `:Lazy clean` | `require("lazy").clean()` | `` | Clean plugins that are no longer needed | +| `:Lazy check` | `require("lazy").check()` | `` | Check for updates and show the log (git fetch) | +| `:Lazy log` | `require("lazy").log()` | `` | Show recent updates for all plugins | +| `:Lazy restore` | `require("lazy").restore()` | `` | Updates all plugins to the state in the lockfile | +| `:Lazy profile` | `require("lazy").profile()` | `

` | Show detailed profiling | +| `:Lazy debug` | `require("lazy").debug()` | `` | Show debug information | +| `:Lazy help` | `require("lazy").help()` | `` | Toggle this help page | +| `:Lazy clear` | `require("lazy").clear()` | | Clear finished tasks | +| `:Lazy load` | `require("lazy").load()` | | Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim` | diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 7be8f55..965f4e3 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -83,9 +83,7 @@ function M.commands() for _, mode in ipairs(modes) do if not mode.plugin and commands[mode.name] then lines[#lines + 1] = { - ("`:Lazy %s`"):format(mode.name) .. " or " .. ("`:Lazy%s`"):format( - mode.name:sub(1, 1):upper() .. mode.name:sub(2) - ), + ("`:Lazy %s`"):format(mode.name), ([[`require("lazy").%s()`]]):format(mode.name), mode.key and ("`<%s>`"):format(mode.key) or "", mode.desc, diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 8abfe40..7427e45 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -1,6 +1,7 @@ local View = require("lazy.view") local Manage = require("lazy.manage") local Util = require("lazy.util") +local Config = require("lazy.core.config") local M = {} @@ -60,20 +61,46 @@ M.commands = { restore = function(plugins) Manage.update({ clear = true, lockfile = true, mode = "restore", plugins = plugins }) end, + load = function(plugins) + require("lazy.core.loader").load(plugins, { cmd = "LazyLoad" }) + end, } +function M.complete_unloaded(prefix) + local plugins = {} + for name, plugin in pairs(Config.plugins) do + if not plugin._.loaded then + plugins[#plugins + 1] = name + end + end + table.sort(plugins) + ---@param key string + return vim.tbl_filter(function(key) + return key:find(prefix) == 1 + end, plugins) +end + function M.setup() - vim.api.nvim_create_user_command("Lazy", function(args) - M.cmd(vim.trim(args.args or "")) + vim.api.nvim_create_user_command("Lazy", function(cmd) + local args = vim.split(vim.trim(cmd.args or ""), " ") + local name = args[1] + table.remove(args, 1) + M.cmd(name, #args > 0 and args or nil) end, { nargs = "?", desc = "Lazy", complete = function(_, line) + ---@type string? + local prefix = line:match("^%s*Lazy load (%w*)") + if prefix then + return M.complete_unloaded(prefix) + end + if line:match("^%s*Lazy %w+ ") then return {} end - local prefix = line:match("^%s*Lazy (%w*)") or "" + prefix = line:match("^%s*Lazy (%w*)") or "" ---@param key string return vim.tbl_filter(function(key) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 04dd42d..b440620 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -17,6 +17,11 @@ M.modes = { { name = "debug", key = "D", desc = "Show debug information", toggle = true }, { name = "help", key = "?", desc = "Toggle this help page", toggle = true }, { name = "clear", desc = "Clear finished tasks", hide = true }, + { + name = "load", + desc = "Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim`", + hide = true, + }, { plugin = true, name = "update", key = "u", desc = "Update this plugin. This will also update the lockfile" }, { From c065ca2b32b9fff8a83786ab31844910cd3149b3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Dec 2022 13:23:33 +0000 Subject: [PATCH 0209/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b346f75..4986ac2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -321,7 +321,7 @@ CONFIGURATION *lazy.nvim-configuration* performance = { cache = { enabled = true, - path = vim.fn.stdpath("state") .. "/lazy.state", + path = vim.fn.stdpath("state") .. "/lazy/cache", -- Once one of the following events triggers, caching will be disabled. -- To cache all modules, set this to `{}`, but that is not recommended. -- The default is to disable on: @@ -364,19 +364,20 @@ You can manage all your plugins with the main `:Lazy` command. Alternatively you can start any operation with a specific command, sub command or API function: -│ Command │ Lua │Key Mapping│ Description │ -│:Lazy home or :LazyHome │require("lazy").home() │ │Go back to plugin list │ -│:Lazy install or :LazyInstall │require("lazy").install() │ │Install missing plugins │ -│:Lazy update or :LazyUpdate │require("lazy").update() │ │Update all plugins. This will also update the lockfile│ -│:Lazy sync or :LazySync │require("lazy").sync() │ │Run install, clean and update │ -│:Lazy clean or :LazyClean │require("lazy").clean() │ │Clean plugins that are no longer needed │ -│:Lazy check or :LazyCheck │require("lazy").check() │ │Check for updates and show the log (git fetch) │ -│:Lazy log or :LazyLog │require("lazy").log() │ │Show recent updates for all plugins │ -│:Lazy restore or :LazyRestore │require("lazy").restore() │ │Updates all plugins to the state in the lockfile │ -│:Lazy profile or :LazyProfile │require("lazy").profile() │

│Show detailed profiling │ -│:Lazy debug or :LazyDebug │require("lazy").debug() │ │Show debug information │ -│:Lazy help or :LazyHelp │require("lazy").help() │ │Toggle this help page │ -│:Lazy clear or :LazyClear │require("lazy").clear() │ │Clear finished tasks │ +│ Command │ Lua │Key Mapping│ Description │ +│:Lazy home │require("lazy").home() │ │Go back to plugin list │ +│:Lazy install │require("lazy").install() │ │Install missing plugins │ +│:Lazy update │require("lazy").update() │ │Update all plugins. This will also update the lockfile │ +│:Lazy sync │require("lazy").sync() │ │Run install, clean and update │ +│:Lazy clean │require("lazy").clean() │ │Clean plugins that are no longer needed │ +│:Lazy check │require("lazy").check() │ │Check for updates and show the log (git fetch) │ +│:Lazy log │require("lazy").log() │ │Show recent updates for all plugins │ +│:Lazy restore │require("lazy").restore() │ │Updates all plugins to the state in the lockfile │ +│:Lazy profile │require("lazy").profile() │

│Show detailed profiling │ +│:Lazy debug │require("lazy").debug() │ │Show debug information │ +│:Lazy help │require("lazy").help() │ │Toggle this help page │ +│:Lazy clear │require("lazy").clear() │ │Clear finished tasks │ +│:Lazy load │require("lazy").load() │ │Load a plugin that has not been loaded yet. Similar to :packadd. Like :Lazy load foo.nvim │ LOCKFILE `LAZY-LOCK.JSON` *lazy.nvim-lockfile-`lazy-lock.json`* From bac34cc6b6327dafe2de17788c675c19995dc242 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 14:30:31 +0100 Subject: [PATCH 0210/1610] docs: added section on uninstalling --- README.md | 10 ++++++++++ TODO.md | 10 ++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c14f998..dd5922a 100644 --- a/README.md +++ b/README.md @@ -404,6 +404,16 @@ Files from runtime directories are always sourced in alphabetical order. - `lock` => `pin` - `module` is auto-loaded. No need to specify +## ❌ 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. + ## 📦 Other Neovim Plugin Managers in Lua - [packer.nvim](https://github.com/wbthomason/packer.nvim) diff --git a/TODO.md b/TODO.md index c78ab19..f20ddb2 100644 --- a/TODO.md +++ b/TODO.md @@ -58,11 +58,5 @@ there's no guarantee this will be relevant or even exist in two years. - [ ] What's the difference between lazy-loading and verylazy-loading? - [ ] Most emojis in "Configuration" aren't shown for me. -- [ ] add section on how to uninstall -- [ ] add `:Packadd` command or something similar - -Typos: - -- [x] **automcatilly** check for plugin updates -- [x] A custom name for the plugin used for the local plugin directory and as the **dispay** name -- [x] local plugins need to be **explicitely** configured with dir +- [x] add section on how to uninstall +- [x] add `:Packadd` command or something similar From 55d194cf9c0044b508d8b5b7a407f594f6bef030 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Dec 2022 13:31:18 +0000 Subject: [PATCH 0211/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4986ac2..a3fb368 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -15,6 +15,7 @@ Table of Contents *lazy.nvim-table-of-contents* - 🪲 Debug |lazy.nvim-🪲-debug| - Startup Sequence |lazy.nvim-startup-sequence| - Differences with Packer |lazy.nvim-differences-with-packer| + - Uninstalling |lazy.nvim-uninstalling| - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| ============================================================================== @@ -441,6 +442,21 @@ DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* - `module` is auto-loaded. No need to specify +UNINSTALLING *lazy.nvim-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. + + OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-other-neovim-plugin-managers-in-lua* From 1efa710210ded9677dce8ceb523e08e133c10e1f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 14:56:43 +0100 Subject: [PATCH 0212/1610] feat: added `module=false` to skip auto-loading of plugins on `require` --- README.md | 3 +++ lua/lazy/core/loader.lua | 2 +- lua/lazy/core/plugin.lua | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dd5922a..4c26b29 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,9 @@ module of plugin `A`, then plugin `A` will be loaded on demand as expected. You can configure **lazy.nvim** to lazy-load all plugins by default with `config.defaults.lazy = true`. +If you don't want this behavior for a certain plugin, you can specify that with `module=false`. +You can then manually load the plugin with `:Lazy load foobar.nvim`. + Additionally, you can also lazy-load on **events**, **commands**, **file types** and **key mappings**. diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 741c2af..bd11ea8 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -194,7 +194,7 @@ end function M.autoload(modname) -- check if a lazy plugin should be loaded for _, plugin in pairs(Config.plugins) do - if not plugin._.loaded then + if not (plugin._.loaded or plugin.module == false) then for _, pattern in ipairs({ ".lua", "/init.lua" }) do local path = plugin.dir .. "/lua/" .. modname:gsub("%.", "/") .. pattern if vim.loop.fs_stat(path) then diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index ee6558c..39598b9 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -26,6 +26,7 @@ local M = {} ---@field cmd? string[] ---@field ft? string[] ---@field keys? string[] +---@field module? false ---@class LazyPluginRef ---@field branch? string From f29f3d21575ba09cdf77217f46cd3a88d4c7517d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Dec 2022 13:57:32 +0000 Subject: [PATCH 0213/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a3fb368..97ebfb4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -137,6 +137,10 @@ module of plugin `A`, then plugin `A` will be loaded on demand as expected. You can configure **lazy.nvim** to lazy-load all plugins by default with `config.defaults.lazy = true`. +If you don’t want this behavior for a certain plugin, you can specify that +with `module=false`. You can then manually load the plugin with `:Lazy load +foobar.nvim`. + Additionally, you can also lazy-load on **events**, **commands**, **file types** and **key mappings**. From b46278751f7fe518380489e5d93b529e8444a8e7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 15:20:38 +0100 Subject: [PATCH 0214/1610] docs: added optional plugins to docs for commands and methods --- README.md | 30 +++++++++++++++--------------- lua/lazy/docs.lua | 34 +++++++++++++++++++++++++++------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 4c26b29..ac2bc78 100644 --- a/README.md +++ b/README.md @@ -338,21 +338,21 @@ Alternatively you can start any operation with a specific command, sub command o -| Command | Lua | Key Mapping | Description | -| --------------- | --------------------------- | ----------- | --------------------------------------------------------------------------------------------- | -| `:Lazy home` | `require("lazy").home()` | `` | Go back to plugin list | -| `:Lazy install` | `require("lazy").install()` | `` | Install missing plugins | -| `:Lazy update` | `require("lazy").update()` | `` | Update all plugins. This will also update the lockfile | -| `:Lazy sync` | `require("lazy").sync()` | `` | Run install, clean and update | -| `:Lazy clean` | `require("lazy").clean()` | `` | Clean plugins that are no longer needed | -| `:Lazy check` | `require("lazy").check()` | `` | Check for updates and show the log (git fetch) | -| `:Lazy log` | `require("lazy").log()` | `` | Show recent updates for all plugins | -| `:Lazy restore` | `require("lazy").restore()` | `` | Updates all plugins to the state in the lockfile | -| `:Lazy profile` | `require("lazy").profile()` | `

` | Show detailed profiling | -| `:Lazy debug` | `require("lazy").debug()` | `` | Show debug information | -| `:Lazy help` | `require("lazy").help()` | `` | Toggle this help page | -| `:Lazy clear` | `require("lazy").clear()` | | Clear finished tasks | -| `:Lazy load` | `require("lazy").load()` | | Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim` | +| Command | Lua | Description | +| ------------------------- | ----------------------------------- | --------------------------------------------------------------------------------------------- | +| `:Lazy home` | `require("lazy").home()` | Go back to plugin list | +| `:Lazy install [plugins]` | `require("lazy").install(plugins?)` | Install missing plugins | +| `:Lazy update [plugins]` | `require("lazy").update(plugins?)` | Update all plugins. This will also update the lockfile | +| `:Lazy sync` | `require("lazy").sync()` | Run install, clean and update | +| `:Lazy clean [plugins]` | `require("lazy").clean(plugins?)` | Clean plugins that are no longer needed | +| `:Lazy check [plugins]` | `require("lazy").check(plugins?)` | Check for updates and show the log (git fetch) | +| `:Lazy log [plugins]` | `require("lazy").log(plugins?)` | Show recent updates for all plugins | +| `:Lazy restore [plugins]` | `require("lazy").restore(plugins?)` | Updates all plugins to the state in the lockfile | +| `:Lazy profile` | `require("lazy").profile()` | Show detailed profiling | +| `:Lazy debug` | `require("lazy").debug()` | Show debug information | +| `:Lazy help` | `require("lazy").help()` | Toggle this help page | +| `:Lazy clear` | `require("lazy").clear()` | Clear finished tasks | +| `:Lazy load {plugins}` | `require("lazy").load(plugins)` | Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim` | diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 965f4e3..73090c5 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -77,17 +77,37 @@ function M.commands() local commands = require("lazy.view.commands").commands local modes = require("lazy.view").modes local lines = { - { "Command", "Lua", "Key Mapping", "Description" }, + { "Command", "Lua", "Description" }, { "---", "---", "---", "---" }, } + local with_plugins = {} + for _, mode in ipairs(modes) do + if mode.plugin then + with_plugins[mode.name] = true + end + end + local plugins_required = { load = true } for _, mode in ipairs(modes) do if not mode.plugin and commands[mode.name] then - lines[#lines + 1] = { - ("`:Lazy %s`"):format(mode.name), - ([[`require("lazy").%s()`]]):format(mode.name), - mode.key and ("`<%s>`"):format(mode.key) or "", - mode.desc, - } + if plugins_required[mode.name] then + lines[#lines + 1] = { + ("`:Lazy %s {plugins}`"):format(mode.name), + ([[`require("lazy").%s(plugins)`]]):format(mode.name), + mode.desc, + } + elseif with_plugins[mode.name] then + lines[#lines + 1] = { + ("`:Lazy %s [plugins]`"):format(mode.name), + ([[`require("lazy").%s(plugins?)`]]):format(mode.name), + mode.desc, + } + else + lines[#lines + 1] = { + ("`:Lazy %s`"):format(mode.name), + ([[`require("lazy").%s()`]]):format(mode.name), + mode.desc, + } + end end end local ret = {} From 5ed9855d1c31440957eb54b2741a992ed51cc969 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 15:20:56 +0100 Subject: [PATCH 0215/1610] feat: added completion for all lazy commands --- lua/lazy/view/commands.lua | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 7427e45..a0ad820 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -66,10 +66,19 @@ M.commands = { end, } -function M.complete_unloaded(prefix) +function M.complete(cmd, prefix) + local with_plugins = false + for _, mode in ipairs(View.modes) do + if mode.name == cmd and mode.plugin then + with_plugins = true + end + end + if not with_plugins then + return + end local plugins = {} for name, plugin in pairs(Config.plugins) do - if not plugin._.loaded then + if cmd ~= "load" or not plugin._.loaded then plugins[#plugins + 1] = name end end @@ -91,9 +100,9 @@ function M.setup() desc = "Lazy", complete = function(_, line) ---@type string? - local prefix = line:match("^%s*Lazy load (%w*)") + local cmd, prefix = line:match("^%s*Lazy (%w+) (%w*)") if prefix then - return M.complete_unloaded(prefix) + return M.complete(cmd, prefix) end if line:match("^%s*Lazy %w+ ") then From 706fe6f9c5ab0dc4cb421c9bb750fabf7c5b5c6a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Dec 2022 14:23:42 +0000 Subject: [PATCH 0216/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 97ebfb4..a24521a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -369,20 +369,20 @@ You can manage all your plugins with the main `:Lazy` command. Alternatively you can start any operation with a specific command, sub command or API function: -│ Command │ Lua │Key Mapping│ Description │ -│:Lazy home │require("lazy").home() │ │Go back to plugin list │ -│:Lazy install │require("lazy").install() │ │Install missing plugins │ -│:Lazy update │require("lazy").update() │ │Update all plugins. This will also update the lockfile │ -│:Lazy sync │require("lazy").sync() │ │Run install, clean and update │ -│:Lazy clean │require("lazy").clean() │ │Clean plugins that are no longer needed │ -│:Lazy check │require("lazy").check() │ │Check for updates and show the log (git fetch) │ -│:Lazy log │require("lazy").log() │ │Show recent updates for all plugins │ -│:Lazy restore │require("lazy").restore() │ │Updates all plugins to the state in the lockfile │ -│:Lazy profile │require("lazy").profile() │

│Show detailed profiling │ -│:Lazy debug │require("lazy").debug() │ │Show debug information │ -│:Lazy help │require("lazy").help() │ │Toggle this help page │ -│:Lazy clear │require("lazy").clear() │ │Clear finished tasks │ -│:Lazy load │require("lazy").load() │ │Load a plugin that has not been loaded yet. Similar to :packadd. Like :Lazy load foo.nvim │ +│ Command │ Lua │ Description │ +│:Lazy home │require("lazy").home() │Go back to plugin list │ +│:Lazy install [plugins] │require("lazy").install(plugins?) │Install missing plugins │ +│:Lazy update [plugins] │require("lazy").update(plugins?) │Update all plugins. This will also update the lockfile │ +│:Lazy sync │require("lazy").sync() │Run install, clean and update │ +│:Lazy clean [plugins] │require("lazy").clean(plugins?) │Clean plugins that are no longer needed │ +│:Lazy check [plugins] │require("lazy").check(plugins?) │Check for updates and show the log (git fetch) │ +│:Lazy log [plugins] │require("lazy").log(plugins?) │Show recent updates for all plugins │ +│:Lazy restore [plugins] │require("lazy").restore(plugins?) │Updates all plugins to the state in the lockfile │ +│:Lazy profile │require("lazy").profile() │Show detailed profiling │ +│:Lazy debug │require("lazy").debug() │Show debug information │ +│:Lazy help │require("lazy").help() │Toggle this help page │ +│:Lazy clear │require("lazy").clear() │Clear finished tasks │ +│:Lazy load {plugins} │require("lazy").load(plugins) │Load a plugin that has not been loaded yet. Similar to :packadd. Like :Lazy load foo.nvim │ LOCKFILE `LAZY-LOCK.JSON` *lazy.nvim-lockfile-`lazy-lock.json`* From 713dcb6901863085074496697757fa1332e57577 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 19:07:12 +0100 Subject: [PATCH 0217/1610] build: added markdownlint config --- .markdownlint.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .markdownlint.yaml diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 0000000..f30bf5c --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,12 @@ +MD013: + line_length: 120 + tables: false +MD033: + allowed_elements: + - "details" + - "summary" + - "b" + - "table" + - "tr" + - "td" + - "a" From 980cfa95f3de9dd0aba24148b37813614412303f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 19:09:49 +0100 Subject: [PATCH 0218/1610] docs: added config example when not using a Nerd Font --- README.md | 26 ++++++++++++++++++++++++++ TODO.md | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ac2bc78..18808d3 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Built for **Linux** and **MacOS** - Git >= **2.19.0** (for partial clones support) +- a [Nerd Font](https://www.nerdfonts.com/) **_(optional)_** ## 📦 Installation @@ -331,6 +332,31 @@ return { +

+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 = "💻", + source = "📄", + start = "🚀", + task = "📌", + }, + }, +} +``` + +
+ ## 🚀 Usage You can manage all your plugins with the main `:Lazy` command. diff --git a/TODO.md b/TODO.md index f20ddb2..7842f87 100644 --- a/TODO.md +++ b/TODO.md @@ -57,6 +57,6 @@ - [ ] Why are personal dotfiles used as examples? Dotfiles change all the time, there's no guarantee this will be relevant or even exist in two years. - [ ] What's the difference between lazy-loading and verylazy-loading? -- [ ] Most emojis in "Configuration" aren't shown for me. +- [x] Most emojis in "Configuration" aren't shown for me. - [x] add section on how to uninstall - [x] add `:Packadd` command or something similar From 1e163632e46454bb272202bed6c9d75f7115c534 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Dec 2022 18:10:49 +0000 Subject: [PATCH 0219/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a24521a..13ecad5 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -55,6 +55,7 @@ REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Built for **Linux** and **MacOS** - Git >= **2.19.0** (for partial clones support) +- a Nerd Font **_(optional)_** INSTALLATION *lazy.nvim-installation* @@ -363,6 +364,29 @@ CONFIGURATION *lazy.nvim-configuration* < +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 = "", + source = "", + start = "", + task = "", + }, + }, + } +< + + USAGE *lazy.nvim-usage* You can manage all your plugins with the main `:Lazy` command. Alternatively From d827d8a402bad3ef9809eece23f10caf8468dd84 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 19:15:46 +0100 Subject: [PATCH 0220/1610] docs: collapse semver examples --- README.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 18808d3..3c72080 100644 --- a/README.md +++ b/README.md @@ -107,11 +107,11 @@ specify `module=...` everywhere in your plugin specification. This mean 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. -You can configure **lazy.nvim** to lazy-load all plugins by default with `config.defaults.lazy = true`. - If you don't want this behavior for a certain plugin, you can specify that with `module=false`. You can then manually load the plugin with `:Lazy load foobar.nvim`. +You can configure **lazy.nvim** to lazy-load all plugins by default with `config.defaults.lazy = true`. + Additionally, you can also lazy-load on **events**, **commands**, **file types** and **key mappings**. @@ -127,7 +127,10 @@ Plugins will be lazy-loaded when one of the following is `true`: If you want to install a specific revision of a plugin, you can use `commit`, `tag`, `branch`, `version`. -The `version` property supports [Semver](https://semver.org/) ranges: +The `version` property supports [Semver](https://semver.org/) ranges. + +
+Click to see some 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. @@ -138,8 +141,10 @@ The `version` property supports [Semver](https://semver.org/) ranges: - `<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 -> You can set `config.defaults.version = "*"` to install the latest stable -> version of plugins that support Semver. +
+ +You can set `config.defaults.version = "*"` to install the latest stable +version of plugins that support Semver. ### Examples From 1baa92f8ca525cdb9e28ab97af7e918a328c7732 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 19:49:47 +0100 Subject: [PATCH 0221/1610] docs: added docs on `` and `` --- README.md | 17 ++++++++++++----- lua/lazy/view/render.lua | 6 +++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3c72080..4765145 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ## ✨ Features -- 📦 Manage all your Neovim plugins with a sleek and intuitive UI +- 📦 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. @@ -200,8 +200,9 @@ return { }, -- 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" }, + -- load later and are not important for rendering the initial UI + -- The event is triggered by Lazy, so it does exist :) + { "stevearc/dressing.nvim", event = "User VeryLazy" }, { "cshuaimin/ssr.nvim", @@ -364,8 +365,14 @@ return { ## 🚀 Usage -You can manage all your plugins with the main `:Lazy` command. -Alternatively you can start any operation with a specific command, sub command or API function: +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 and +git commits. + +Any operation can alternatively be started with a sub command or API function: diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 51b08c6..19e869d 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -145,7 +145,11 @@ function M:help() local View = require("lazy.view") self:append("Help", "LazyH2"):nl():nl() - self:append("You can press "):append("", "LazySpecial"):append(" on a plugin to show its details."):nl():nl() + self:append("You can press "):append("", "LazySpecial"):append(" on a plugin to show its details."):nl() + + self:append("Most properties can be hovered with ") + self:append("", "LazySpecial") + self:append(" to open links, help files, readmes and git commits."):nl():nl() self:append("Keyboard Shortcuts", "LazyH2"):nl() for _, mode in ipairs(View.modes) do From 92fd0d43a017c97caa017573d546c68242f541f0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 21:04:05 +0100 Subject: [PATCH 0222/1610] docs: updated installation and structuring plugins --- README.md | 59 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 4765145..0b07b14 100644 --- a/README.md +++ b/README.md @@ -56,24 +56,24 @@ local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" Next step is to add **lazy.nvim** to the top of your `init.lua` ```lua --- You can use a lua module that contains your plugins. --- All sub modules of the lua module will also be automatically loaded --- This is the preferred setup so your plugin specs can be properly cached. -require("lazy").setup("config.plugins", { - -- add any optional configuration here -}) +require("lazy").setup(plugins, opts) +``` --- Alternatively you can specify a plugin list +- **plugins**: this should be a `table` or a `string` + - `table`: a list with your [Plugin Spec](#-plugin-spec) + - `string`: a Lua module name that contains your [Plugin Spec](#-plugin-spec). See [Structuring Your Plugins](#-structuring-your-plugins) +- **opts**: see [Configuration](#%EF%B8%8F-configuration) **_(optional)_** + +```lua +-- example using a list of specs with the default options require("lazy").setup({ - "folke/neodev.nvim", - "folke/which-key.nvim", - { "folke/neoconf.nvim", cmd = "Neoconf" }, - }, { - -- add any optional configuration here + "folke/which-key.nvim", + { "folke/neoconf.nvim", cmd = "Neoconf" }, + "folke/neodev.nvim", }) ``` -> ℹ️ It is recommended to run `:checkhealth lazy` after installation +ℹ️ It is recommended to run `:checkhealth lazy` after installation ## 🔌 Plugin Spec @@ -433,6 +433,39 @@ In practice this means that step 10 of [Neovim Initialization](https://neovim.io Files from runtime directories are always sourced in alphabetical order. +## 📂 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 **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` + +```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 + ## 📦 Differences with Packer - **Plugin Spec**: From 0c0b8b72315f1921f6784db2263642186bd467a4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 21:05:18 +0100 Subject: [PATCH 0223/1610] docs: todo --- TODO.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index 7842f87..da44046 100644 --- a/TODO.md +++ b/TODO.md @@ -45,7 +45,7 @@ - [ ] package meta index (package.lua cache for all packages) - [x] check in cache if rtp files match -- [ ] I think the installation section, specifically the loading part, could use an +- [x] I think the installation section, specifically the loading part, could use an extra sentence or two. I was confused on what `config.plugins` was initially. Maybe a quick, "for example, if you have a lua file `~/.config/nvim/lua/config/plugins.lua` that returns a table" or something it'd @@ -56,7 +56,7 @@ - [ ] Shouldn't the "Versioning" section be in the "Lockfile" chapter? - [ ] Why are personal dotfiles used as examples? Dotfiles change all the time, there's no guarantee this will be relevant or even exist in two years. -- [ ] What's the difference between lazy-loading and verylazy-loading? +- [x] What's the difference between lazy-loading and verylazy-loading? - [x] Most emojis in "Configuration" aren't shown for me. - [x] add section on how to uninstall - [x] add `:Packadd` command or something similar From 66dad89f580277d6547b1dc2a1707872f92591c0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Dec 2022 20:06:18 +0000 Subject: [PATCH 0224/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 111 +++++++++++++++++++++++++++++++++------------- 1 file changed, 81 insertions(+), 30 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 13ecad5..792381b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -14,6 +14,7 @@ Table of Contents *lazy.nvim-table-of-contents* - Profiler |lazy.nvim-profiler| - 🪲 Debug |lazy.nvim-🪲-debug| - Startup Sequence |lazy.nvim-startup-sequence| + - Structuring Your Plugins |lazy.nvim-structuring-your-plugins| - Differences with Packer |lazy.nvim-differences-with-packer| - Uninstalling |lazy.nvim-uninstalling| - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| @@ -31,7 +32,7 @@ Table of Contents *lazy.nvim-table-of-contents* FEATURES *lazy.nvim-features* -- Manage all your Neovim plugins with a sleek and intuitive UI +- 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. @@ -81,28 +82,29 @@ You can use the following Lua code to bootstrap **lazy.nvim** Next step is to add **lazy.nvim** to the top of your `init.lua` >lua - -- You can use a lua module that contains your plugins. - -- All sub modules of the lua module will also be automatically loaded - -- This is the preferred setup so your plugin specs can be properly cached. - require("lazy").setup("config.plugins", { - -- add any optional configuration here - }) - - -- Alternatively you can specify a plugin list - require("lazy").setup({ - "folke/neodev.nvim", - "folke/which-key.nvim", - { "folke/neoconf.nvim", cmd = "Neoconf" }, - }, { - -- add any optional configuration here - }) + require("lazy").setup(plugins, opts) < - It is recommended to run `:checkhealth lazy` after installation +- **plugins**: this should be a `table` or a `string` + - `table`: a list with your |lazy.nvim-plugin-spec| + - `string`: a Lua module name that contains your |lazy.nvim-plugin-spec|. See |lazy.nvim-structuring-your-plugins| +- **opts**: see |lazy.nvim-configuration| **_(optional)_** +>lua + -- example using a list of specs with the default options + require("lazy").setup({ + "folke/which-key.nvim", + { "folke/neoconf.nvim", cmd = "Neoconf" }, + "folke/neodev.nvim", + }) +< + + +It is recommended to run `:checkhealth lazy` after installation + PLUGIN SPEC *lazy.nvim-plugin-spec* │ Property │ Type │ Description │ @@ -135,13 +137,13 @@ specify `module=...` everywhere in your plugin specification. This mean 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. -You can configure **lazy.nvim** to lazy-load all plugins by default with -`config.defaults.lazy = true`. - If you don’t want this behavior for a certain plugin, you can specify that with `module=false`. You can then manually load the plugin with `:Lazy load foobar.nvim`. +You can configure **lazy.nvim** to lazy-load all plugins by default with +`config.defaults.lazy = true`. + Additionally, you can also lazy-load on **events**, **commands**, **file types** and **key mappings**. @@ -159,7 +161,9 @@ 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: +The `version` property supports Semver ranges. + +Click to see some examples - :latest stable version (this excludes pre-release versions) @@ -172,10 +176,8 @@ The `version` property supports Semver ranges: - `<=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 - - You can set `config.defaults.version = ""` to install the latest stable version - of plugins that support Semver. - +You can set `config.defaults.version = ""` to install the latest stable version +of plugins that support Semver. EXAMPLES ~ @@ -231,8 +233,9 @@ Other examples: }, -- 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" }, + -- load later and are not important for rendering the initial UI + -- The event is triggered by Lazy, so it does exist :) + { "stevearc/dressing.nvim", event = "User VeryLazy" }, { "cshuaimin/ssr.nvim", @@ -389,9 +392,13 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s USAGE *lazy.nvim-usage* -You can manage all your plugins with the main `:Lazy` command. Alternatively -you can start any operation with a specific command, sub command or API -function: +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 and git commits. + +Any operation can alternatively be started with a sub command or API function: │ Command │ Lua │ Description │ │:Lazy home │require("lazy").home() │Go back to plugin list │ @@ -457,6 +464,50 @@ In practice this means that step 10 of |Neovim Initialization| is done by Lazy: Files from runtime directories are always sourced in alphabetical order. +STRUCTURING YOUR PLUGINS *lazy.nvim-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 **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` + + +>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 + + DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* From b7bf18abd377ef3ecfb4310455802cc5c05e9bc2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 21:11:28 +0100 Subject: [PATCH 0225/1610] style: spelling --- CHANGELOG.md | 6 +++--- lua/lazy/core/cache.lua | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98670be..a25afec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -155,7 +155,7 @@ ### ⚠ BREAKING CHANGES -* plugins are now autmatically loaded on require. `module=` no longer needed! +* plugins are now automatically loaded on require. `module=` no longer needed! * all plugins are now opt. Plugin.opt => Plugin.lazy * renamed Plugin.run => Plugin.build @@ -163,7 +163,7 @@ * all plugins are now opt. Plugin.opt => Plugin.lazy ([5134e79](https://github.com/folke/lazy.nvim/commit/5134e797f34792e34e86fe82a72cdf765ca2e284)) * lazy setup with either a plugins module, or a plugins spec ([af8b8e1](https://github.com/folke/lazy.nvim/commit/af8b8e128e20f9fa30077bedf8bcee40b779c533)) -* plugins are now autmatically loaded on require. `module=` no longer needed! ([575421b](https://github.com/folke/lazy.nvim/commit/575421b3fb22731a9f97370d794fe7e3c7b57f7b)) +* plugins are now automatically loaded on require. `module=` no longer needed! ([575421b](https://github.com/folke/lazy.nvim/commit/575421b3fb22731a9f97370d794fe7e3c7b57f7b)) * renamed Plugin.run => Plugin.build ([042aaa4](https://github.com/folke/lazy.nvim/commit/042aaa4f87c6576a369cbecd86aceefb96add228)) * show module source if loading source is under config ([041a716](https://github.com/folke/lazy.nvim/commit/041a716f4e5291d6947c5f96b21a2c4db0aef6e3)) * **ui:** better detection of plugins/config files that loaded a plugin ([723274e](https://github.com/folke/lazy.nvim/commit/723274efeeeddb82a5ee8ca38d456d393555ba94)) @@ -261,7 +261,7 @@ * new render features like profile etc ([48199f8](https://github.com/folke/lazy.nvim/commit/48199f803189284b9585b96066f84d3805cce6b1)) * new task pipeline runner ([ab1b512](https://github.com/folke/lazy.nvim/commit/ab1b512545fd1a4fd3e6742d5cb7d13b7bcd92ff)) * plugin manager tasks ([a612e6f](https://github.com/folke/lazy.nvim/commit/a612e6f6f4ffbcef6ae7f94955ac406d436284d8)) -* return wether a module was loaded from cache or from file (dirty) ([38e2711](https://github.com/folke/lazy.nvim/commit/38e2711cdb8c342c9d6687b22f347d7038094011)) +* return whether a module was loaded from cache or from file (dirty) ([38e2711](https://github.com/folke/lazy.nvim/commit/38e2711cdb8c342c9d6687b22f347d7038094011)) * task docs and options for logs ([fe6d0b1](https://github.com/folke/lazy.nvim/commit/fe6d0b1745cb8171c441e81168df23a09238fc9e)) * **text:** center text ([88869e6](https://github.com/folke/lazy.nvim/commit/88869e67d2f06c7778b9bdbf57681615d3d41f11)) * **text:** multiline support and pattern highlights ([815bb2c](https://github.com/folke/lazy.nvim/commit/815bb2ce6cdc359115a7e65021a21c3347e8a5f6)) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 0f11c57..b1321fa 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -33,9 +33,9 @@ M.rtp = nil -- selene:allow(global_usage) M._loadfile = _G.loadfile --- checks wether the cached modpath is still valid +-- checks whether the cached modpath is still valid function M.check_path(modname, modpath) - -- check rtp exlcuding plugins. This is a very small list, so should be fast + -- check rtp excluding plugins. This is a very small list, so should be fast for _, path in ipairs(M.get_rtp()) do if modpath:find(path, 1, true) == 1 then return true From ff893190f2ee3fec557f9bf9ffb33b97e32b3948 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 19 Dec 2022 21:27:36 +0100 Subject: [PATCH 0226/1610] docs: removed dots from features --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0b07b14..ee2a157 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,10 @@ ## ✨ Features - 📦 Manage all your Neovim plugins with a powerful UI -- 🚀 Fast startup times thanks to automatic caching and bytecode compilation of lua modules. +- 🚀 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. +- 🔌 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 From 833b3872136c658252200e71187008948c475e6f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Dec 2022 20:28:48 +0000 Subject: [PATCH 0227/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 792381b..8a812c2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -33,10 +33,10 @@ FEATURES *lazy.nvim-features* - Manage all your Neovim plugins with a powerful UI -- Fast startup times thanks to automatic caching and bytecode compilation of lua modules. +- 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. +- 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 From a18988372faecbd097946dbef6286dd82dca744d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 07:15:26 +0100 Subject: [PATCH 0228/1610] fix: check for installed plugins with plain find --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 39598b9..88ef2af 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -185,7 +185,7 @@ function M.update_state() or plugin.init plugin.lazy = lazy and true or false end - if plugin.dir:find(Config.options.root) == 1 then + if plugin.dir:find(Config.options.root, 1, true) == 1 then plugin._.installed = installed[plugin.name] ~= nil installed[plugin.name] = nil else From 198963fdabdb24e530808542090c5de3f28ec808 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 07:19:41 +0100 Subject: [PATCH 0229/1610] feat: utility method to normalize a path --- lua/lazy/core/util.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 999c508..ce89952 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -27,6 +27,13 @@ function M.track(data, time) end end +function M.norm(path) + if path:sub(1, 1) == "~" then + path = vim.loop.os_homedir() .. "/" .. path:sub(2) + end + return path:gsub("\\", "/") +end + function M.try(fn, msg) -- error handler local error_handler = function(err) From bb1c2f4c3ef83f79263d7832dd3a91991fcf62d7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 07:19:55 +0100 Subject: [PATCH 0230/1610] feat: added support for Windows --- lua/lazy/core/config.lua | 9 +++++++-- lua/lazy/core/plugin.lua | 4 ++-- lua/lazy/view/render.lua | 4 +++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c85821f..73761de 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -21,7 +21,7 @@ M.defaults = { }, dev = { -- directory where you store your local plugin projects - path = vim.fn.expand("~/projects"), + path = "~/projects", ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} }, @@ -112,12 +112,17 @@ function M.setup(spec, opts) M.options.performance.cache = require("lazy.core.cache") table.insert(M.options.install.colorscheme, "habamax") + M.options.root = Util.norm(M.options.root) + M.options.dev.path = Util.norm(M.options.dev.path) + M.options.lockfile = Util.norm(M.options.lockfile) + M.options.readme.root = Util.norm(M.options.readme.root) + if M.options.performance.reset_packpath then vim.go.packpath = "" end if M.options.performance.rtp.reset then M.me = debug.getinfo(1, "S").source:sub(2) - M.me = vim.fn.fnamemodify(M.me, ":p:h:h:h:h") + M.me = Util.norm(vim.fn.fnamemodify(M.me, ":p:h:h:h:h")) vim.opt.rtp = { M.me, vim.env.VIMRUNTIME, diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 88ef2af..eda70ee 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -78,7 +78,7 @@ function Spec:add(plugin, is_dep) end if plugin.dir then - plugin.dir = plugin.dir:gsub("~", os.getenv("HOME") or "~") + plugin.dir = Util.norm(plugin.dir) -- local plugin plugin.name = plugin.name or Spec.get_name(plugin.dir) elseif plugin.url then @@ -168,7 +168,7 @@ function M.update_state() ---@type table local installed = {} Util.ls(Config.options.root, function(_, name, type) - if type == "directory" or type == "link" then + if type == "directory" and name ~= "readme" then installed[name] = type end end) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 19e869d..67d306b 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -220,12 +220,13 @@ function M:reason(reason, opts) ---@type string? local source = reason.source if source then + source = Util.norm(source) local plugin = Plugin.find(source) if plugin then reason.plugin = plugin.name reason.source = nil else - local config = vim.fn.stdpath("config") + local config = Util.norm(vim.fn.stdpath("config")) if source == config .. "/init.lua" then reason.source = "init.lua" else @@ -237,6 +238,7 @@ function M:reason(reason, opts) end end if reason.runtime then + reason.runtime = Util.norm(reason.runtime) reason.runtime = reason.runtime:gsub(".*/([^/]+/plugin/.*)", "%1") reason.runtime = reason.runtime:gsub(".*/([^/]+/after/.*)", "%1") reason.runtime = reason.runtime:gsub(".*/([^/]+/ftdetect/.*)", "%1") From 62c1542141926aeeb79435cb8a8593e47cc89e43 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 08:31:19 +0100 Subject: [PATCH 0231/1610] fix(cache): normalize paths --- lua/lazy/core/cache.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index b1321fa..7038171 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -99,6 +99,7 @@ end ---@param modpath string ---@return any, string? function M.loadfile(modpath) + modpath = modpath:gsub("\\", "/") return M.load(modpath, modpath) end @@ -106,6 +107,7 @@ end ---@param modpath string ---@return function?, string? error_message function M.load(modkey, modpath) + modpath = modpath:gsub("\\", "/") local hash = M.hash(modpath) if not hash then -- trigger correct error @@ -167,6 +169,7 @@ function M.get_rtp() end end for _, path in ipairs(vim.api.nvim_list_runtime_paths()) do + path = path:gsub("\\", "/") if not skip[path] then M.rtp[#M.rtp + 1] = path end From af87108605b624608b46e0f3365cc9a2539c5ec8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 08:47:01 +0100 Subject: [PATCH 0232/1610] fix(util): fixed double slashes --- lua/lazy/core/util.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index ce89952..4475d60 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -29,7 +29,11 @@ end function M.norm(path) if path:sub(1, 1) == "~" then - path = vim.loop.os_homedir() .. "/" .. path:sub(2) + local home = vim.loop.os_homedir() + if home:sub(-1) == "\\" or home:sub(-1) == "/" then + home = home:sub(1, -2) + end + path = home .. path:sub(2) end return path:gsub("\\", "/") end From 75a36f3c941e7712e827ff93b4916e462fdfd0ba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 07:47:50 +0000 Subject: [PATCH 0233/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 8a812c2..80de355 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 19 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 20 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From cb87aa38935d679352c585da4ac8c04bdacb33f7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 08:56:59 +0100 Subject: [PATCH 0234/1610] ci: run tests on linux only for nw --- .github/workflows/ci.yml | 18 ++++++++++++++---- tests/core/e2e_spec.lua | 35 +++++++++++++++++++++++++++++++++++ tests/run | 2 +- 3 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 tests/core/e2e_spec.lua diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 871b8c6..2b1982d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,17 +5,27 @@ on: jobs: tests: - runs-on: ubuntu-latest + strategy: + matrix: + # os: [ubuntu-latest, windows-latest] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - name: Install Neovim + shell: bash run: | - wget -q https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.deb -O /tmp/nvim.deb - sudo dpkg -i /tmp/nvim.deb + if [ "$RUNNER_OS" == "Linux" ]; then + wget -q https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.deb -O /tmp/nvim.deb + sudo dpkg -i /tmp/nvim.deb + else + choco install neovim --pre + echo "C:/tools/neovim/nvim-win64/bin" >> $GITHUB_PATH + fi - name: Run Tests run: | nvim --version - ./tests/run + nvim --headless -u tests/init.lua -c "PlenaryBustedDirectory tests// {minimal_init = 'tests//init.lua', sequential = true}" docs: runs-on: ubuntu-latest needs: tests diff --git a/tests/core/e2e_spec.lua b/tests/core/e2e_spec.lua new file mode 100644 index 0000000..db59155 --- /dev/null +++ b/tests/core/e2e_spec.lua @@ -0,0 +1,35 @@ +describe("lazy", function() + before_each(function() + vim.g.lazy_did_setup = false + vim.go.loadplugins = true + for modname in pairs(package.loaded) do + if modname:find("lazy") == 1 then + package.loaded[modname] = nil + end + end + end) + + local root = ".tests/data/nvim/lazy" + + it("installs plugins", function() + local Lazy = require("lazy") + local Config = require("lazy.core.config") + + local neodev = false + Lazy.setup({ + { + "folke/neodev.nvim", + config = function() + neodev = true + end, + }, + "folke/paint.nvim", + }, { install_missing = true, defaults = { lazy = true } }) + assert(3 == vim.tbl_count(Config.plugins)) + assert(vim.loop.fs_stat(root .. "/paint.nvim/README.md")) + assert(vim.loop.fs_stat(root .. "/neodev.nvim/README.md")) + assert(not neodev) + assert(Config.plugins["neodev.nvim"]._.installed) + assert(not Config.plugins["neodev.nvim"]._.is_local) + end) +end) diff --git a/tests/run b/tests/run index f37e539..412d7b5 100755 --- a/tests/run +++ b/tests/run @@ -1,3 +1,3 @@ #!/bin/sh -nvim --headless -u tests/init.lua -c "PlenaryBustedDirectory tests/ {minimal_init = 'tests/init.lua', sequential = true}" +nvim --headless -u tests/init.lua -c "PlenaryBustedDirectory tests {minimal_init = 'tests//init.lua', sequential = true}" From b906ad959c6aaa0d82a00ed39a9ccfd9f86f6a4a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 10:19:00 +0100 Subject: [PATCH 0235/1610] docs: added windows to supported platforms --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee2a157..6d2b688 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ ## ⚡️ Requirements - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) -- Built for **Linux** and **MacOS** +- Works on **Linux**, **MacOS** and **Windows** - Git >= **2.19.0** (for partial clones support) - a [Nerd Font](https://www.nerdfonts.com/) **_(optional)_** From dbcf675f8733869e8ae8b607eed7d2207e1b1921 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 09:20:06 +0000 Subject: [PATCH 0236/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 80de355..1fd4a65 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -54,7 +54,7 @@ REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) -- Built for **Linux** and **MacOS** +- Works on **Linux**, **MacOS** and **Windows** - Git >= **2.19.0** (for partial clones support) - a Nerd Font **_(optional)_** From 2f59ead5740871b502a346d4113a5f96070ee17c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 20 Dec 2022 10:20:19 +0100 Subject: [PATCH 0237/1610] chore(main): release 5.0.0 (#12) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a25afec..ec2516d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # Changelog +## [5.0.0](https://github.com/folke/lazy.nvim/compare/v4.2.0...v5.0.0) (2022-12-20) + + +### ⚠ BREAKING CHANGES + +* removed the LazyUpdate etc commands. sub-commands only from now on + +### Features + +* added `:Lazy load foobar.nvim` to load a plugin ([2dd6230](https://github.com/folke/lazy.nvim/commit/2dd623001891ad98845523c92e8fcc6043993019)) +* added `module=false` to skip auto-loading of plugins on `require` ([1efa710](https://github.com/folke/lazy.nvim/commit/1efa710210ded9677dce8ceb523e08e133c10e1f)) +* added completion for all lazy commands ([5ed9855](https://github.com/folke/lazy.nvim/commit/5ed9855d1c31440957eb54b2741a992ed51cc969)) +* added support for Windows ([bb1c2f4](https://github.com/folke/lazy.nvim/commit/bb1c2f4c3ef83f79263d7832dd3a91991fcf62d7)) +* removed the LazyUpdate etc commands. sub-commands only from now on ([d4aee27](https://github.com/folke/lazy.nvim/commit/d4aee2715fa22ab29422320d817236e927260335)) +* utility method to normalize a path ([198963f](https://github.com/folke/lazy.nvim/commit/198963fdabdb24e530808542090c5de3f28ec808)) + + +### Bug Fixes + +* **cache:** do a fast check to see if a cached modpath is still valid. find it again otherwise ([32f2b71](https://github.com/folke/lazy.nvim/commit/32f2b71ff884e88358790348d5620ed494ef80b6)) +* **cache:** normalize paths ([62c1542](https://github.com/folke/lazy.nvim/commit/62c1542141926aeeb79435cb8a8593e47cc89e43)) +* check for installed plugins with plain find ([a189883](https://github.com/folke/lazy.nvim/commit/a18988372faecbd097946dbef6286dd82dca744d)) +* **ui:** focus Lazy window when auto-installing plugins in `VimEnter` ([1fe43f3](https://github.com/folke/lazy.nvim/commit/1fe43f3e294cf994a52d25e16dc630e66db2970c)) +* **util:** fixed double slashes ([af87108](https://github.com/folke/lazy.nvim/commit/af87108605b624608b46e0f3365cc9a2539c5ec8)) + + +### Performance Improvements + +* **cache:** cache loadfile and no find modpaths without package.loaders ([faac2dd](https://github.com/folke/lazy.nvim/commit/faac2dd11c932e71a0cea9bc933f8bbe1e1d2312)) +* lazy-load the commands available on the `lazy` module ([b89e6bf](https://github.com/folke/lazy.nvim/commit/b89e6bffd258e4dd367992c306b588e9b24b9a76)) + ## [4.2.0](https://github.com/folke/lazy.nvim/compare/v4.1.0...v4.2.0) (2022-12-18) From 36cb7ea5979f10acb74a63ea2407d78d6e00192f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 10:24:57 +0100 Subject: [PATCH 0238/1610] docs: migration guide --- README.md | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6d2b688..8baeb21 100644 --- a/README.md +++ b/README.md @@ -466,17 +466,23 @@ return { - any lua file in `~/.config/nvim/lua/plugins/*.lua` will be automatically merged in the main plugin spec -## 📦 Differences with Packer +## 📦 Migration Guide -- **Plugin Spec**: +### [packer.nvim](https://github.com/wbthomason/packer.nvim) - - `setup` => `init` - - `requires` => `dependencies` - - `as` => `name` - - `opt` => `lazy` - - `run` => `build` - - `lock` => `pin` - - `module` is auto-loaded. No need to specify +- `setup` ➡️ `init` +- `requires` ➡️ `dependencies` +- `as` ➡️ `name` +- `opt` ➡️ `lazy` +- `run` ➡️ `build` +- `lock` ➡️ `pin` +- `module` is auto-loaded. No need to specify + +### [paq-nvim](https://github.com/savq/paq-nvim) + +- `as` ➡️ `name` +- `opt` ➡️ `lazy` +- `run` ➡️ `build` ## ❌ Uninstalling From ca430184b3fdf6103c9ebb76e56e49f03b1dbb5f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 09:25:55 +0000 Subject: [PATCH 0239/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1fd4a65..62b7b26 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -15,7 +15,7 @@ Table of Contents *lazy.nvim-table-of-contents* - 🪲 Debug |lazy.nvim-🪲-debug| - Startup Sequence |lazy.nvim-startup-sequence| - Structuring Your Plugins |lazy.nvim-structuring-your-plugins| - - Differences with Packer |lazy.nvim-differences-with-packer| + - Migration Guide |lazy.nvim-migration-guide| - Uninstalling |lazy.nvim-uninstalling| - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| @@ -508,17 +508,26 @@ Example: - any lua file in `~/.config/nvim/lua/plugins/.lua` will be automatically merged in the main plugin spec -DIFFERENCES WITH PACKER *lazy.nvim-differences-with-packer* +MIGRATION GUIDE *lazy.nvim-migration-guide* + +PACKER.NVIM ~ -- **Plugin Spec**: - - `setup` => `init` - - `requires` => `dependencies` - - `as` => `name` - - `opt` => `lazy` - - `run` => `build` - - `lock` => `pin` - - `module` is auto-loaded. No need to specify +- `setup` `init` +- `requires` `dependencies` +- `as` `name` +- `opt` `lazy` +- `run` `build` +- `lock` `pin` +- `module` is auto-loaded. No need to specify + + +PAQ-NVIM ~ + + +- `as` `name` +- `opt` `lazy` +- `run` `build` UNINSTALLING *lazy.nvim-uninstalling* From 72d66cdd73ea32cf2039299102babb6cea592688 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 10:26:47 +0100 Subject: [PATCH 0240/1610] docs: updated lua stuff --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8baeb21..0b9e35a 100644 --- a/README.md +++ b/README.md @@ -200,9 +200,8 @@ return { }, -- you can use the VeryLazy event for things that can - -- load later and are not important for rendering the initial UI - -- The event is triggered by Lazy, so it does exist :) - { "stevearc/dressing.nvim", event = "User VeryLazy" }, + -- load later and are not important for the initial UI + { "stevearc/dressing.nvim", event = "VeryLazy" }, { "cshuaimin/ssr.nvim", @@ -262,7 +261,7 @@ return { }, dev = { -- directory where you store your local plugin projects - path = vim.fn.expand("~/projects"), + path = "~/projects", ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} }, From 82aea47c35d4983c402ce7128007e3e46197c745 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 09:27:34 +0000 Subject: [PATCH 0241/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 62b7b26..3b68fef 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -233,9 +233,8 @@ Other examples: }, -- you can use the VeryLazy event for things that can - -- load later and are not important for rendering the initial UI - -- The event is triggered by Lazy, so it does exist :) - { "stevearc/dressing.nvim", event = "User VeryLazy" }, + -- load later and are not important for the initial UI + { "stevearc/dressing.nvim", event = "VeryLazy" }, { "cshuaimin/ssr.nvim", @@ -292,7 +291,7 @@ CONFIGURATION *lazy.nvim-configuration* }, dev = { -- directory where you store your local plugin projects - path = vim.fn.expand("~/projects"), + path = "~/projects", ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} }, From abe026a5ae72e4b4a451183b90f3697d436dd4e0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 10:55:58 +0100 Subject: [PATCH 0242/1610] docs: added section on performance --- README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0b9e35a..d07c2ae 100644 --- a/README.md +++ b/README.md @@ -368,8 +368,8 @@ 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 and -git commits. +can be hovered with `` to open links, help files, readmes, +git commits and git issues. Any operation can alternatively be started with a sub command or API function: @@ -404,8 +404,13 @@ ensure that the same version of every plugin is installed. On the other machine, you can do `Lazy restore`, to update all your plugins to the version from the lockfile -## 📊 Profiler +## ⚡ Performance +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](https://github.com/lewis6991/impatient.nvim) does. + +**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. ![image](https://user-images.githubusercontent.com/292349/208301766-5c400561-83c3-4811-9667-1ec4bb3c43b8.png) @@ -465,6 +470,8 @@ return { - any lua file in `~/.config/nvim/lua/plugins/*.lua` will be automatically merged in the main plugin spec +## ⚡ Performance + ## 📦 Migration Guide ### [packer.nvim](https://github.com/wbthomason/packer.nvim) From 99163185226ab6dd37b84ff8dc48d308fb9b16d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 09:56:46 +0000 Subject: [PATCH 0243/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 3b68fef..0b23d64 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -11,10 +11,11 @@ Table of Contents *lazy.nvim-table-of-contents* - Configuration |lazy.nvim-configuration| - Usage |lazy.nvim-usage| - Lockfile `lazy-lock.json` |lazy.nvim-lockfile-`lazy-lock.json`| - - Profiler |lazy.nvim-profiler| + - Performance |lazy.nvim-performance| - 🪲 Debug |lazy.nvim-🪲-debug| - Startup Sequence |lazy.nvim-startup-sequence| - Structuring Your Plugins |lazy.nvim-structuring-your-plugins| + - Performance |lazy.nvim-performance| - Migration Guide |lazy.nvim-migration-guide| - Uninstalling |lazy.nvim-uninstalling| - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| @@ -395,7 +396,8 @@ 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 and git commits. +hovered with `` to open links, help files, readmes, git commits and git +issues. Any operation can alternatively be started with a sub command or API function: @@ -426,9 +428,16 @@ ensure that the same version of every plugin is installed. On the other machine, you can do `Lazy restore`, to update all your plugins to the version from the lockfile -PROFILER *lazy.nvim-profiler* +PERFORMANCE *lazy.nvim-performance* -The profiling view shows you why and how long it took to load your plugins. +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. + +**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.
@@ -507,6 +516,8 @@ Example: - any lua file in `~/.config/nvim/lua/plugins/.lua` will be automatically merged in the main plugin spec +PERFORMANCE *lazy.nvim-performance* + MIGRATION GUIDE *lazy.nvim-migration-guide* PACKER.NVIM ~ From 1fa2d87ae2f44c83597081ac3d57a8a960252e26 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 11:01:43 +0100 Subject: [PATCH 0244/1610] docs: moved my dots to structuring plugins --- README.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index d07c2ae..95f9f72 100644 --- a/README.md +++ b/README.md @@ -148,15 +148,6 @@ version of plugins that support Semver. ### Examples -My personal dots: - -- [init.lua](https://github.com/folke/dot/blob/master/config/nvim/init.lua) where I require `config.lazy` -- [config.lazy](https://github.com/folke/dot/blob/master/config/nvim/lua/config/lazy.lua) where I bootstrap and setup **lazy.nvim** -- [config.plugins](https://github.com/folke/dot/blob/master/config/nvim/lua/config/plugins.lua) is my main plugin config module -- Any submodule of [config.plugins (submodules)](https://github.com/folke/dot/tree/master/config/nvim/lua/config/plugins) will be automatically loaded as well. - -Other examples: - ```lua @@ -470,6 +461,13 @@ return { - 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 my personal dots: + +- [init.lua](https://github.com/folke/dot/blob/master/config/nvim/init.lua) where I require `config.lazy` +- [config.lazy](https://github.com/folke/dot/blob/master/config/nvim/lua/config/lazy.lua) where I bootstrap and setup **lazy.nvim** +- [config.plugins](https://github.com/folke/dot/blob/master/config/nvim/lua/config/plugins.lua) is my main plugin config module +- Any submodule of [config.plugins (submodules)](https://github.com/folke/dot/tree/master/config/nvim/lua/config/plugins) will be automatically loaded as well. + ## ⚡ Performance ## 📦 Migration Guide From dfe8a65d7df3a935d0945c30a09beb166425f0b4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 11:02:28 +0100 Subject: [PATCH 0245/1610] docs: removed extra performance section --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 95f9f72..0e64d0f 100644 --- a/README.md +++ b/README.md @@ -468,8 +468,6 @@ For a real-life example, you can check my personal dots: - [config.plugins](https://github.com/folke/dot/blob/master/config/nvim/lua/config/plugins.lua) is my main plugin config module - Any submodule of [config.plugins (submodules)](https://github.com/folke/dot/tree/master/config/nvim/lua/config/plugins) will be automatically loaded as well. -## ⚡ Performance - ## 📦 Migration Guide ### [packer.nvim](https://github.com/wbthomason/packer.nvim) From 48a596e1d4f4253693e961222f85a25922dae598 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 10:03:19 +0000 Subject: [PATCH 0246/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0b23d64..cbb3bdb 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -15,7 +15,6 @@ Table of Contents *lazy.nvim-table-of-contents* - 🪲 Debug |lazy.nvim-🪲-debug| - Startup Sequence |lazy.nvim-startup-sequence| - Structuring Your Plugins |lazy.nvim-structuring-your-plugins| - - Performance |lazy.nvim-performance| - Migration Guide |lazy.nvim-migration-guide| - Uninstalling |lazy.nvim-uninstalling| - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| @@ -182,17 +181,6 @@ of plugins that support Semver. EXAMPLES ~ -My personal dots: - - -- init.lua where I require `config.lazy` -- config.lazy where I bootstrap and setup **lazy.nvim** -- config.plugins is my main plugin config module -- Any submodule of config.plugins (submodules) will be automatically loaded as well. - - -Other examples: - >lua return { -- the colorscheme should be available when starting Neovim @@ -516,7 +504,14 @@ Example: - any lua file in `~/.config/nvim/lua/plugins/.lua` will be automatically merged in the main plugin spec -PERFORMANCE *lazy.nvim-performance* +For a real-life example, you can check my personal dots: + + +- init.lua where I require `config.lazy` +- config.lazy where I bootstrap and setup **lazy.nvim** +- config.plugins is my main plugin config module +- Any submodule of config.plugins (submodules) will be automatically loaded as well. + MIGRATION GUIDE *lazy.nvim-migration-guide* From 17fd57a5f3d6e55ca4fb49ce9c43854f3edf10f3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 11:40:12 +0100 Subject: [PATCH 0247/1610] docs: added docs for statusline and count --- README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/README.md b/README.md index 0e64d0f..253e638 100644 --- a/README.md +++ b/README.md @@ -384,6 +384,36 @@ Any operation can alternatively be started with a sub command or API function: +If you want to display the number of plugins on your dashboard, you can use +this simple API: + +```lua +local plugins = require("lazy").stats().count +``` + +**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" }, + }, + }, + }, +}) + +``` + +
+ ## 🔒 Lockfile `lazy-lock.json` After every **update**, the local lockfile is updated with the installed revisions. @@ -401,6 +431,8 @@ Great care has been taken to make the startup code (`lazy.core`) as efficient as During startup, all lua files used before `VimEnter` or `BufReadPre` are byte-compiled and cached, similar to what [impatient.nvim](https://github.com/lewis6991/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. From 7225b055f53c5c0f13c6e290052db1a05114f099 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 10:40:52 +0000 Subject: [PATCH 0248/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index cbb3bdb..f5a7ef5 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -405,6 +405,35 @@ Any operation can alternatively be started with a sub command or API function: │:Lazy load {plugins} │require("lazy").load(plugins) │Load a plugin that has not been loaded yet. Similar to :packadd. Like :Lazy load foo.nvim │ +If you want to display the number of plugins on your dashboard, you can use +this simple API: + +>lua + local plugins = require("lazy").stats().count +< + + +**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" }, + }, + }, + }, + }) +< + + LOCKFILE `LAZY-LOCK.JSON` *lazy.nvim-lockfile-`lazy-lock.json`* After every **update**, the local lockfile is updated with the installed @@ -423,6 +452,9 @@ 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. From ae644a604d4f4a4307775ccc163596a90668da34 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 11:58:54 +0100 Subject: [PATCH 0249/1610] fix: only run updated checker for installed plugins. Fixes #16 --- lua/lazy/manage/checker.lua | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 98e2f1b..7b9fe3c 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -16,11 +16,13 @@ end function M.fast_check() for _, plugin in pairs(Config.plugins) do - plugin._.has_updates = nil - local info = Git.info(plugin.dir) - local target = Git.get_target(plugin) - if info and target and info.commit ~= target.commit then - plugin._.has_updates = true + if plugin._.installed then + plugin._.has_updates = nil + local info = Git.info(plugin.dir) + local target = Git.get_target(plugin) + if info and target and info.commit ~= target.commit then + plugin._.has_updates = true + end end end M.report() From 5ecc988610d09e8379a16f9813b331063199fe1c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 12:34:05 +0100 Subject: [PATCH 0250/1610] docs: use https to bootstrap lazy --- README.md | 2 +- lua/lazy/init.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 253e638..8f05934 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" "clone", "--filter=blob:none", "--single-branch", - "git@github.com:folke/lazy.nvim.git", + "https://github.com/folke/lazy.nvim.git", lazypath, }) end diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 3d9ae2e..3291c0a 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -80,7 +80,7 @@ function M.bootstrap() "clone", "--filter=blob:none", "--single-branch", - "git@github.com:folke/lazy.nvim.git", + "https://github.com/folke/lazy.nvim.git", lazypath, }) end From 175405647587d4d49e3b9c0992c6a8ae31cda706 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 12:34:24 +0100 Subject: [PATCH 0251/1610] fix: use jobstart instead of system to open urls --- lua/lazy/util.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 594d5b7..fdff2ad 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -11,15 +11,16 @@ function M.open(uri) end local cmd if vim.fn.has("win32") == 1 then - cmd = { "cmd.exe", "/c", "start", '""', vim.fn.shellescape(uri) } + cmd = { "explorer", uri } + -- cmd = { 'cmd.exe', '/c', 'start', '""', uri } elseif vim.fn.has("macunix") == 1 then cmd = { "open", uri } else cmd = { "xdg-open", uri } end - local ret = vim.fn.system(cmd) - if vim.v.shell_error ~= 0 then + local ret = vim.fn.jobstart(cmd, { detach = true }) + if ret <= 0 then local msg = { "Failed to open uri", ret, From b8a005510cd30b33d4e0849ee3b616ef327d3b45 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 11:35:11 +0000 Subject: [PATCH 0252/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f5a7ef5..5ca647f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -71,7 +71,7 @@ You can use the following Lua code to bootstrap **lazy.nvim** "clone", "--filter=blob:none", "--single-branch", - "git@github.com:folke/lazy.nvim.git", + "https://github.com/folke/lazy.nvim.git", lazypath, }) end From f78d8bf376a86349de99696c4004c36b97e859e4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 13:36:18 +0100 Subject: [PATCH 0253/1610] fix: show error when merging, but continue --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index eda70ee..e53d3ee 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -153,7 +153,7 @@ function Spec:merge(old, new) ---@diagnostic disable-next-line: no-unknown old[k] = values else - error("Merging plugins is not supported for key `" .. k .. "`") + Util.error("Merging plugins is not supported for key `" .. k .. "`\n" .. vim.inspect({ old = old, new = new })) end else ---@diagnostic disable-next-line: no-unknown From 50ba619d9ed61d754acbd5344d28ac02c28a9387 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 13:40:09 +0100 Subject: [PATCH 0254/1610] test: fix tests --- tests/core/plugin_spec.lua | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index cf6ad8f..7973414 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -113,15 +113,13 @@ describe("plugin spec opt", function() end) it("refuses to merge", function() - assert.has.errors(function() - Plugin.Spec.new({ - { "foo/dep1", config = 1 }, - { - "foo/bar", - dependencies = { { "foo/dep1", config = 2 }, "foo/dep2" }, - }, - }) - end) + Plugin.Spec.new({ + { "foo/dep1", config = 1 }, + { + "foo/bar", + dependencies = { { "foo/dep1", config = 2 }, "foo/dep2" }, + }, + }) end) -- it("recursive deps", function() From ddf36d77486ee80fb8358da88411b28e479d9b0a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 13:44:21 +0100 Subject: [PATCH 0255/1610] fix: checker should not error on non-existing dirs --- lua/lazy/manage/checker.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 7b9fe3c..d3676d4 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -19,8 +19,8 @@ function M.fast_check() if plugin._.installed then plugin._.has_updates = nil local info = Git.info(plugin.dir) - local target = Git.get_target(plugin) - if info and target and info.commit ~= target.commit then + local ok, target = pcall(Git.get_target, plugin) + if ok and info and target and info.commit ~= target.commit then plugin._.has_updates = true end end From 6404d421555de681638907bdd4d0ab4f19774ce4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 13:47:53 +0100 Subject: [PATCH 0256/1610] fix: move re-sourcing check to the top --- lua/lazy/init.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 3291c0a..ae4309b 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -4,6 +4,14 @@ local M = {} ---@param spec LazySpec Should be a module name to load, or a plugin spec ---@param opts? LazyConfig function M.setup(spec, opts) + if vim.g.lazy_did_setup then + return vim.notify( + "Re-sourcing your config is not supported with lazy.nvim", + vim.log.levels.WARN, + { title = "lazy.nvim" } + ) + end + vim.g.lazy_did_setup = true if not vim.go.loadplugins then return end @@ -13,14 +21,6 @@ function M.setup(spec, opts) if not pcall(require, "ffi") then return vim.notify("lazy.nvim requires Neovim built with LuaJIT", vim.log.levels.ERROR, { title = "lazy.nvim" }) end - if vim.g.lazy_did_setup then - return vim.notify( - "Re-sourcing your config is not supported with lazy.nvim", - vim.log.levels.WARN, - { title = "lazy.nvim" } - ) - end - vim.g.lazy_did_setup = true local start = vim.loop.hrtime() if not (opts and opts.performance and opts.performance.cache and opts.performance.cache.enabled == false) then From ec0f8d0947a3e80e577838549df707da496930cb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 13:49:29 +0100 Subject: [PATCH 0257/1610] docs: added config.dev.path to the example --- README.md | 2 +- lua/lazy/example.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8f05934..b94da2d 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,7 @@ return { { url = "git@github.com:folke/noice.nvim.git" }, -- local plugins can also be configure with the dev option. - -- This will use ~/projects/noice.nvim/ instead of fetching it from Github + -- 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 }, } diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua index f3eda6c..cd99e16 100644 --- a/lua/lazy/example.lua +++ b/lua/lazy/example.lua @@ -66,7 +66,7 @@ return { { url = "git@github.com:folke/noice.nvim.git" }, -- local plugins can also be configure with the dev option. - -- This will use ~/projects/noice.nvim/ instead of fetching it from Github + -- 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 }, } From 6e32759c5ddc43d7095793de952fa2c62f61cb22 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 14:01:59 +0100 Subject: [PATCH 0258/1610] fix: deepcopy lazyspec before processing --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index e53d3ee..a1bebb8 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -228,7 +228,7 @@ function M.spec() Util.lsmod(path_plugins, _load) else -- spec is a spec - spec:normalize(Config.spec) + spec:normalize(vim.deepcopy(Config.spec)) end return spec end From 423432254d3970806b95e6191c0210c1022169b1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 13:02:51 +0000 Subject: [PATCH 0259/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5ca647f..869bd8b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -250,7 +250,7 @@ EXAMPLES ~ { url = "git@github.com:folke/noice.nvim.git" }, -- local plugins can also be configure with the dev option. - -- This will use ~/projects/noice.nvim/ instead of fetching it from Github + -- 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 }, } From e9d3a73bbceaac0dafacd6a3c6c76ab37799d15b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 14:13:52 +0100 Subject: [PATCH 0260/1610] fix: default logs are now since 3 days ago to be in line with the docs --- README.md | 2 +- lua/lazy/core/config.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b94da2d..36d55a8 100644 --- a/README.md +++ b/README.md @@ -246,7 +246,7 @@ return { git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits - log = { "--since=1 days ago" }, -- show commits from the last 3 days + log = { "--since=3 days ago" }, -- show commits from the last 3 days timeout = 120, -- kill processes that take more than 2 minutes url_format = "https://github.com/%s.git", }, diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 73761de..203faab 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -15,7 +15,7 @@ M.defaults = { git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits - log = { "--since=1 days ago" }, -- show commits from the last 3 days + log = { "--since=3 days ago" }, -- show commits from the last 3 days timeout = 120, -- kill processes that take more than 2 minutes url_format = "https://github.com/%s.git", }, From 49b69b7f9fa19e763d439b6a1b0c2dd7427c21bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 13:14:47 +0000 Subject: [PATCH 0261/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 869bd8b..9abdb89 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -274,7 +274,7 @@ CONFIGURATION *lazy.nvim-configuration* git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits - log = { "--since=1 days ago" }, -- show commits from the last 3 days + log = { "--since=3 days ago" }, -- show commits from the last 3 days timeout = 120, -- kill processes that take more than 2 minutes url_format = "https://github.com/%s.git", }, From df6c9863dc05b309db9739b05bfabff55f08bf62 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 15:03:16 +0100 Subject: [PATCH 0262/1610] fix: add neovim libs to rtp for treesitter parsers etc --- lua/lazy/core/config.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 203faab..3f3a0de 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -126,6 +126,7 @@ function M.setup(spec, opts) vim.opt.rtp = { M.me, vim.env.VIMRUNTIME, + vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib/nvim", vim.fn.stdpath("config"), vim.fn.stdpath("config") .. "/after", } From 992c6791ef1f9f75b9f20833903bc3a9e43dce90 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 16:02:06 +0100 Subject: [PATCH 0263/1610] fix: always set Config.me regardless of reset rtp --- lua/lazy/core/config.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 3f3a0de..5e1745f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -120,9 +120,10 @@ function M.setup(spec, opts) if M.options.performance.reset_packpath then vim.go.packpath = "" end + + M.me = debug.getinfo(1, "S").source:sub(2) + M.me = Util.norm(vim.fn.fnamemodify(M.me, ":p:h:h:h:h")) if M.options.performance.rtp.reset then - M.me = debug.getinfo(1, "S").source:sub(2) - M.me = Util.norm(vim.fn.fnamemodify(M.me, ":p:h:h:h:h")) vim.opt.rtp = { M.me, vim.env.VIMRUNTIME, From 316503f124eb4caf5b3bac0da16ee6ac10322424 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 16:02:22 +0100 Subject: [PATCH 0264/1610] fix: dont autoload cached modules when module=false --- lua/lazy/core/cache.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 7038171..b408a33 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -54,6 +54,9 @@ function M.check_path(modname, modpath) local plugin = require("lazy.core.plugin").find(modpath) if plugin and modpath:find(plugin.dir, 1, true) == 1 then if not plugin._.loaded then + if plugin.module == false then + error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") + end require("lazy.core.loader").load(plugin, { require = modname }) end return true From ffabe91b2d72d686fb21d3159e20bf8faab7ed24 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 16:41:11 +0100 Subject: [PATCH 0265/1610] fix(cache): if mod is loaded already in the loader, then return that --- lua/lazy/core/cache.lua | 6 ++++++ lua/lazy/core/plugin.lua | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index b408a33..a57dabb 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -88,6 +88,12 @@ function M.loader(modname) local chunk, err if entry and M.check_path(modname, entry.modpath) then + local mod = package.loaded[modname] + if type(mod) == "table" then + return function() + return mod + end + end chunk, err = M.load(modname, entry.modpath) else -- find the modpath and load the module diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index a1bebb8..65172da 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -36,10 +36,10 @@ local M = {} ---@field pin? boolean ---@class LazyPlugin: LazyPluginHandlers,LazyPluginHooks,LazyPluginRef ----@field [1] string ----@field name string display name and name used for plugin config files ----@field url string ----@field dir string +---@field [1] string? +---@field name string? display name and name used for plugin config files +---@field url string? +---@field dir string? ---@field enabled? boolean|(fun():boolean) ---@field lazy? boolean ---@field dev? boolean If set, then link to the respective folder under your ~/projects From 1371a141677afe2b0d0d66c96e15ed3ba271bbd9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 16:57:02 +0100 Subject: [PATCH 0266/1610] fix(build): use the shell to execute build commands --- lua/lazy/manage/task/plugin.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index c1703c4..7bb9f33 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -23,9 +23,11 @@ M.build = { elseif type(build) == "function" then build() else - local args = vim.split(build, "%s+") - return self:spawn(table.remove(args, 1), { - args = args, + local shell = vim.env.SHELL or vim.o.shell + local shell_args = shell:find("cmd.exe", 1, true) and "/c" or "-c" + + return self:spawn(shell, { + args = { shell_args, build }, cwd = self.plugin.dir, }) end From 4d782030c84bbdbd9a86d15a94c75aa339baece8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 20 Dec 2022 16:59:11 +0100 Subject: [PATCH 0267/1610] chore(main): release 5.0.1 (#17) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec2516d..d275e8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## [5.0.1](https://github.com/folke/lazy.nvim/compare/v5.0.0...v5.0.1) (2022-12-20) + + +### Bug Fixes + +* add neovim libs to rtp for treesitter parsers etc ([df6c986](https://github.com/folke/lazy.nvim/commit/df6c9863dc05b309db9739b05bfabff55f08bf62)) +* always set Config.me regardless of reset rtp ([992c679](https://github.com/folke/lazy.nvim/commit/992c6791ef1f9f75b9f20833903bc3a9e43dce90)) +* **build:** use the shell to execute build commands ([1371a14](https://github.com/folke/lazy.nvim/commit/1371a141677afe2b0d0d66c96e15ed3ba271bbd9)) +* **cache:** if mod is loaded already in the loader, then return that ([ffabe91](https://github.com/folke/lazy.nvim/commit/ffabe91b2d72d686fb21d3159e20bf8faab7ed24)) +* checker should not error on non-existing dirs ([ddf36d7](https://github.com/folke/lazy.nvim/commit/ddf36d77486ee80fb8358da88411b28e479d9b0a)) +* deepcopy lazyspec before processing ([6e32759](https://github.com/folke/lazy.nvim/commit/6e32759c5ddc43d7095793de952fa2c62f61cb22)) +* default logs are now since 3 days ago to be in line with the docs ([e9d3a73](https://github.com/folke/lazy.nvim/commit/e9d3a73bbceaac0dafacd6a3c6c76ab37799d15b)) +* dont autoload cached modules when module=false ([316503f](https://github.com/folke/lazy.nvim/commit/316503f124eb4caf5b3bac0da16ee6ac10322424)) +* move re-sourcing check to the top ([6404d42](https://github.com/folke/lazy.nvim/commit/6404d421555de681638907bdd4d0ab4f19774ce4)) +* only run updated checker for installed plugins. Fixes [#16](https://github.com/folke/lazy.nvim/issues/16) ([ae644a6](https://github.com/folke/lazy.nvim/commit/ae644a604d4f4a4307775ccc163596a90668da34)) +* show error when merging, but continue ([f78d8bf](https://github.com/folke/lazy.nvim/commit/f78d8bf376a86349de99696c4004c36b97e859e4)) +* use jobstart instead of system to open urls ([1754056](https://github.com/folke/lazy.nvim/commit/175405647587d4d49e3b9c0992c6a8ae31cda706)) + ## [5.0.0](https://github.com/folke/lazy.nvim/compare/v4.2.0...v5.0.0) (2022-12-20) From 2927b0597e1860ec3eb87d354018dc3e1d1b55e0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 17:56:21 +0100 Subject: [PATCH 0268/1610] docs: added lincense --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From 52984419ffa051d66bccec9f93e7cbb4fdd94976 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 18:24:40 +0100 Subject: [PATCH 0269/1610] fix: use nvim_feekeys instead of nvim_input for keys handler. Fixes #28 --- lua/lazy/core/handler/keys.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 301b408..34f8ea9 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -10,9 +10,10 @@ function M:_add(keys) vim.keymap.del("n", keys) Util.track({ keys = keys }) Loader.load(self.active[keys], { keys = keys }) - vim.api.nvim_input(keys) + local feed = vim.api.nvim_replace_termcodes(keys, true, false, true) + vim.api.nvim_feedkeys(feed, "m", false) Util.track() - end) + end, { silent = true }) end ---@param keys string From 941df31a41560b4131260c47c482bd12502ed8c5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 19:29:28 +0100 Subject: [PATCH 0270/1610] feat(ui): make the windoww size configurable. Fixes #34 --- README.md | 2 ++ lua/lazy/core/config.lua | 2 ++ lua/lazy/view/init.lua | 11 +++++++---- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 36d55a8..6992b66 100644 --- a/README.md +++ b/README.md @@ -263,6 +263,8 @@ return { colorscheme = { "habamax" }, }, ui = { + -- a number <1 is a percentage., >1 is a fixed size + size = { width = 0.8, height = 0.8 }, -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5e1745f..9ddbfa3 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -32,6 +32,8 @@ M.defaults = { colorscheme = { "habamax" }, }, ui = { + -- a number <1 is a percentage., >1 is a fixed size + size = { width = 0.8, height = 0.8 }, -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index b440620..9f7ed69 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -56,16 +56,19 @@ function M.show(mode) local buf = vim.api.nvim_create_buf(false, false) M._buf = buf - local vpad = 6 - local hpad = 20 + + local function size(max, value) + return value > 1 and math.min(value, max) or math.floor(max * value) + end local opts = { relative = "editor", style = "minimal", border = Config.options.ui.border, - width = math.min(vim.o.columns - hpad * 2, 200), - height = math.min(vim.o.lines - vpad * 2, 70), + width = size(vim.o.columns, Config.options.ui.size.width), + height = size(vim.o.lines, Config.options.ui.size.height), noautocmd = true, } + opts.row = (vim.o.lines - opts.height) / 2 opts.col = (vim.o.columns - opts.width) / 2 local win = vim.api.nvim_open_win(buf, true, opts) From cd162f342aa2097f0d9df875cdb2e2357c5870f5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 18:30:15 +0000 Subject: [PATCH 0271/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9abdb89..d8dcde2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -291,6 +291,8 @@ CONFIGURATION *lazy.nvim-configuration* colorscheme = { "habamax" }, }, ui = { + -- a number <1 is a percentage., >1 is a fixed size + size = { width = 0.8, height = 0.8 }, -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { From 6c767a604de025c0d03c4e2b65f6c4a01ec4918d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 19:38:32 +0100 Subject: [PATCH 0272/1610] feat: added options to configure change detection. Fixes #32 --- lua/lazy/core/config.lua | 9 ++++++++- lua/lazy/manage/reloader.lua | 10 ++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9ddbfa3..9ef5c42 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -58,6 +58,11 @@ M.defaults = { notify = true, -- get a notification when new updates are found frequency = 3600, -- check for updates every hour }, + change_detection = { + -- automatically check for config file changes and reload the ui + enabled = true, + notify = true, -- get a notification when changes are found + }, performance = { ---@type LazyCacheConfig cache = nil, @@ -145,7 +150,9 @@ function M.setup(spec, opts) callback = function() require("lazy.core.cache").autosave() require("lazy.view").setup() - require("lazy.manage.reloader").enable() + if M.options.change_detection.enabled then + require("lazy.manage.reloader").enable() + end if M.options.checker.enabled then require("lazy.manage.checker").start() end diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index 61d4407..3b0af3c 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -68,11 +68,13 @@ function M.check(start) if not (start or #changes == 0) then vim.schedule(function() - local lines = { "# Config Change Detected. Reloading...", "" } - for _, change in ipairs(changes) do - table.insert(lines, "- **" .. change.what .. "**: `" .. vim.fn.fnamemodify(change.file, ":p:~:.") .. "`") + if Config.options.change_detection.notify then + local lines = { "# Config Change Detected. Reloading...", "" } + for _, change in ipairs(changes) do + table.insert(lines, "- **" .. change.what .. "**: `" .. vim.fn.fnamemodify(change.file, ":p:~:.") .. "`") + end + Util.warn(lines) end - Util.warn(lines) Plugin.load() vim.cmd([[do User LazyRender]]) end) From 3cffb2acefae990501b866895afd59db6f2bb190 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 19:39:07 +0100 Subject: [PATCH 0273/1610] docs: added change detection to the readme --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 6992b66..dc6721b 100644 --- a/README.md +++ b/README.md @@ -289,6 +289,11 @@ return { notify = true, -- get a notification when new updates are found frequency = 3600, -- check for updates every hour }, + 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, From 1f86cb37d1a6f9092cdd4d9a4d92efa308361a38 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 18:39:54 +0000 Subject: [PATCH 0274/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d8dcde2..e5d6be2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -317,6 +317,11 @@ CONFIGURATION *lazy.nvim-configuration* notify = true, -- get a notification when new updates are found frequency = 3600, -- check for updates every hour }, + 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, From 7fb0652dbaaa0285fc7405621998d1241eb5a1aa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 19:43:46 +0100 Subject: [PATCH 0275/1610] docs: added docs on update checker --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dc6721b..517bc1f 100644 --- a/README.md +++ b/README.md @@ -369,7 +369,10 @@ 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. -Any operation can alternatively be started with a sub command or API function: +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: From 06ffcf5874a281c18cce7b69bc9171641da61b83 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 18:44:49 +0000 Subject: [PATCH 0276/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e5d6be2..e8e9588 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -394,7 +394,11 @@ 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. -Any operation can alternatively be started with a sub command or API function: +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 home │require("lazy").home() │Go back to plugin list │ From 9d12cdcc0624c8a7f3c7c89f87abf992bc6c217e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 19:58:48 +0100 Subject: [PATCH 0277/1610] fix(git): don't run git log for submodules. Fixes #33 --- lua/lazy/manage/task/git.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 90ba2b1..4ac3058 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -12,7 +12,8 @@ M.log = { if opts.updated and not (plugin._.updated and plugin._.updated.from ~= plugin._.updated.to) then return true end - return not Util.file_exists(plugin.dir .. "/.git") + local stat = vim.loop.fs_stat(plugin.dir .. "/.git") + return stat and stat.type ~= "directory" end, ---@param opts {args?: string[], updated?:boolean, check?:boolean} run = function(self, opts) From ffcd0ab7bb61bd15b24d2a47509861e30644143c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 20:32:37 +0100 Subject: [PATCH 0278/1610] fix(loader): source filetype.lua before plugins. Fixes #35 --- lua/lazy/core/loader.lua | 7 +++++++ lua/lazy/view/render.lua | 1 + 2 files changed, 8 insertions(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index bd11ea8..718f6df 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -49,6 +49,13 @@ function M.startup() local rtp = vim.opt.rtp:get() + Util.track({ start = "filetype" }) + local ft = vim.env.VIMRUNTIME .. "/filetype.lua" + Util.try(function() + vim.cmd("silent source " .. ft) + end, "Failed to source `" .. ft .. "`") + Util.track() + -- load plugins from rtp, excluding after Util.track({ start = "rtp plugins" }) for _, path in ipairs(rtp) do diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 67d306b..bf67683 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -242,6 +242,7 @@ function M:reason(reason, opts) reason.runtime = reason.runtime:gsub(".*/([^/]+/plugin/.*)", "%1") reason.runtime = reason.runtime:gsub(".*/([^/]+/after/.*)", "%1") reason.runtime = reason.runtime:gsub(".*/([^/]+/ftdetect/.*)", "%1") + reason.runtime = reason.runtime:gsub(".*/(runtime/.*)", "%1") end local time = reason.time and (" " .. math.floor(reason.time / 1e6 * 100) / 100 .. "ms") if time and not opts.time_right then From 06ac8bda66caccca08a18ddac7d25526dff45bb6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 20:53:00 +0100 Subject: [PATCH 0279/1610] perf(ui): clear existing extmarks before rendering --- lua/lazy/view/text.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index d6f042a..974e3de 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -65,6 +65,7 @@ function Text:render(buf) end vim.api.nvim_buf_set_lines(buf, 0, -1, false, lines) + vim.api.nvim_buf_clear_namespace(buf, Config.ns, 0, -1) for l, line in ipairs(self._lines) do local col = self.padding From 78e9d6c01de51c92e06284b7af25511fa633a9f7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 21:15:39 +0100 Subject: [PATCH 0280/1610] docs: add a note about mapleader --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 517bc1f..ad24d68 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ ## 📦 Installation -You can use the following Lua code to bootstrap **lazy.nvim** +You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim** @@ -66,6 +66,8 @@ require("lazy").setup(plugins, opts) ```lua -- example using a list of specs with the default options +vim.g.mapleader = " " -- make sure to set `mapleader` before lazy so your mappings are correct + require("lazy").setup({ "folke/which-key.nvim", { "folke/neoconf.nvim", cmd = "Neoconf" }, From 14300b3d044a66d2ae4412995f6b23514722b7cf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Dec 2022 20:16:27 +0000 Subject: [PATCH 0281/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e8e9588..4e2b2a2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -61,7 +61,8 @@ REQUIREMENTS *lazy.nvim-requirements* INSTALLATION *lazy.nvim-installation* -You can use the following Lua code to bootstrap **lazy.nvim** +You can add the following Lua code to your `init.lua` to bootstrap +**lazy.nvim** >lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" @@ -95,6 +96,8 @@ Next step is to add **lazy.nvim** to the top of your `init.lua` >lua -- example using a list of specs with the default options + vim.g.mapleader = " " -- make sure to set `mapleader` before lazy so your mappings are correct + require("lazy").setup({ "folke/which-key.nvim", { "folke/neoconf.nvim", cmd = "Neoconf" }, From 897d6df5ac8d0e575d52eec60722ce9ffc80cf6f Mon Sep 17 00:00:00 2001 From: Dan Sully Date: Tue, 20 Dec 2022 21:23:00 +0100 Subject: [PATCH 0282/1610] fix: add filetype to window buffer. (#41) Add a filetype to the Lazy window buffer, which allows plugins like codewindow to ignore it. --- lua/lazy/view/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 9f7ed69..f93424f 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -87,6 +87,7 @@ function M.show(mode) end vim.bo[buf].buftype = "nofile" + vim.bo[buf].filetype = "lazy" vim.bo[buf].bufhidden = "wipe" vim.wo[win].conceallevel = 3 vim.wo[win].spell = false From 7be46bceeff47e22a3213be90a33462b0af5fe35 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 22:32:16 +0100 Subject: [PATCH 0283/1610] style: removed unused requires --- lua/lazy/core/loader.lua | 1 - lua/lazy/manage/task/git.lua | 1 - 2 files changed, 2 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 718f6df..8a4a7fd 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -1,7 +1,6 @@ local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Handler = require("lazy.core.handler") -local Cache = require("lazy.core.cache") local M = {} diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 4ac3058..32b73fb 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -1,4 +1,3 @@ -local Util = require("lazy.util") local Git = require("lazy.manage.git") local Lock = require("lazy.manage.lock") local Config = require("lazy.core.config") From b193f96f7b71026f80fd89b6c3fc55fe982bbd1a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 23:14:49 +0100 Subject: [PATCH 0284/1610] fix(spec): only process a spec once --- lua/lazy/core/plugin.lua | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 65172da..f510ee8 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -37,9 +37,9 @@ local M = {} ---@class LazyPlugin: LazyPluginHandlers,LazyPluginHooks,LazyPluginRef ---@field [1] string? ----@field name string? display name and name used for plugin config files +---@field name string display name and name used for plugin config files ---@field url string? ----@field dir string? +---@field dir string ---@field enabled? boolean|(fun():boolean) ---@field lazy? boolean ---@field dev? boolean If set, then link to the respective folder under your ~/projects @@ -129,9 +129,16 @@ function Spec:normalize(spec, results, is_dep) self:normalize(s, results, is_dep) end elseif spec.enabled == nil or spec.enabled == true or (type(spec.enabled) == "function" and spec.enabled()) then - ---@cast spec LazyPlugin - local plugin = self:add(spec, is_dep) - plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil + local plugin + -- check if we already processed this spec. Can happen when a user uses the same instance of a spec in multiple specs + -- see https://github.com/folke/lazy.nvim/issues/45 + if spec._ then + plugin = spec + else + ---@cast spec LazyPlugin + plugin = self:add(spec, is_dep) + plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil + end table.insert(results, plugin.name) end return results From 3606d62918c8ddc92f801c2bb9a2a362c9348cd2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 20 Dec 2022 23:35:06 +0100 Subject: [PATCH 0285/1610] fix: add after directories to rtp to make after/ftplugin and others work. Fixes #47 --- lua/lazy/core/cache.lua | 2 +- lua/lazy/core/loader.lua | 40 +++++++++++++++++----------------------- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index a57dabb..81d85f6 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -179,7 +179,7 @@ function M.get_rtp() end for _, path in ipairs(vim.api.nvim_list_runtime_paths()) do path = path:gsub("\\", "/") - if not skip[path] then + if not skip[path] and not path:find("after/?$") then M.rtp[#M.rtp + 1] = path end end diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 8a4a7fd..f705f7c 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -46,18 +46,11 @@ end function M.startup() Util.track({ start = "startup" }) - local rtp = vim.opt.rtp:get() - - Util.track({ start = "filetype" }) - local ft = vim.env.VIMRUNTIME .. "/filetype.lua" - Util.try(function() - vim.cmd("silent source " .. ft) - end, "Failed to source `" .. ft .. "`") - Util.track() + M.source(vim.env.VIMRUNTIME .. "/filetype.lua") -- load plugins from rtp, excluding after Util.track({ start = "rtp plugins" }) - for _, path in ipairs(rtp) do + for _, path in ipairs(vim.opt.rtp:get()) do if not path:find("after/?$") then M.packadd(path) end @@ -73,16 +66,9 @@ function M.startup() end Util.track() - -- load after files + -- load after plugins Util.track({ start = "after" }) - -- load after files from plugins - for _, plugin in pairs(Config.plugins) do - if plugin._.loaded then - M.source_runtime(plugin.dir, "after/plugin") - end - end - -- load after files from rtp plugins - for _, path in ipairs(rtp) do + for _, path in ipairs(vim.opt.rtp:get()) do if path:find("after/?$") then M.source_runtime(path, "plugin") end @@ -135,6 +121,10 @@ function M.load(plugins, reason) Handler.disable(plugin) vim.opt.runtimepath:prepend(plugin.dir) + local after = plugin.dir .. "/after" + if vim.loop.fs_stat(after) then + vim.opt.runtimepath:append(after) + end if plugin.dependencies then M.load(plugin.dependencies, {}) @@ -185,14 +175,18 @@ function M.source_runtime(...) -- plugin files are sourced alphabetically per directory table.sort(files) for _, path in ipairs(files) do - Util.track({ runtime = path }) - Util.try(function() - vim.cmd("silent source " .. path) - end, "Failed to source `" .. path .. "`") - Util.track() + M.source(path) end end +function M.source(path) + Util.track({ runtime = path }) + Util.try(function() + vim.cmd("silent source " .. path) + end, "Failed to source `" .. path .. "`") + Util.track() +end + -- This loader is added as the very last one. -- This only hits when the modname is not cached and -- even then only once per plugin. So pretty much never. From 3a7b8c8132ad7d848ed7ac4fe5013788d6d6e70e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 20 Dec 2022 23:35:55 +0100 Subject: [PATCH 0286/1610] chore(main): release 5.1.0 (#30) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d275e8d..a220c4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [5.1.0](https://github.com/folke/lazy.nvim/compare/v5.0.1...v5.1.0) (2022-12-20) + + +### Features + +* added options to configure change detection. Fixes [#32](https://github.com/folke/lazy.nvim/issues/32) ([6c767a6](https://github.com/folke/lazy.nvim/commit/6c767a604de025c0d03c4e2b65f6c4a01ec4918d)) +* **ui:** make the windoww size configurable. Fixes [#34](https://github.com/folke/lazy.nvim/issues/34) ([941df31](https://github.com/folke/lazy.nvim/commit/941df31a41560b4131260c47c482bd12502ed8c5)) + + +### Bug Fixes + +* add filetype to window buffer. ([#41](https://github.com/folke/lazy.nvim/issues/41)) ([897d6df](https://github.com/folke/lazy.nvim/commit/897d6df5ac8d0e575d52eec60722ce9ffc80cf6f)) +* **git:** don't run git log for submodules. Fixes [#33](https://github.com/folke/lazy.nvim/issues/33) ([9d12cdc](https://github.com/folke/lazy.nvim/commit/9d12cdcc0624c8a7f3c7c89f87abf992bc6c217e)) +* **loader:** source filetype.lua before plugins. Fixes [#35](https://github.com/folke/lazy.nvim/issues/35) ([ffcd0ab](https://github.com/folke/lazy.nvim/commit/ffcd0ab7bb61bd15b24d2a47509861e30644143c)) +* **spec:** only process a spec once ([b193f96](https://github.com/folke/lazy.nvim/commit/b193f96f7b71026f80fd89b6c3fc55fe982bbd1a)) +* use nvim_feekeys instead of nvim_input for keys handler. Fixes [#28](https://github.com/folke/lazy.nvim/issues/28) ([5298441](https://github.com/folke/lazy.nvim/commit/52984419ffa051d66bccec9f93e7cbb4fdd94976)) + + +### Performance Improvements + +* **ui:** clear existing extmarks before rendering ([06ac8bd](https://github.com/folke/lazy.nvim/commit/06ac8bda66caccca08a18ddac7d25526dff45bb6)) + ## [5.0.1](https://github.com/folke/lazy.nvim/compare/v5.0.0...v5.0.1) (2022-12-20) From 3814883aaae3facc931087bfa7352ca18fa658ac Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 08:33:10 +0100 Subject: [PATCH 0287/1610] fix(ui): set current win only when its valid --- TODO.md | 1 + lua/lazy/view/init.lua | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index da44046..3d795d2 100644 --- a/TODO.md +++ b/TODO.md @@ -60,3 +60,4 @@ - [x] Most emojis in "Configuration" aren't shown for me. - [x] add section on how to uninstall - [x] add `:Packadd` command or something similar +- [ ] headless install diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index f93424f..4b601de 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -81,7 +81,9 @@ function M.show(mode) vim.api.nvim_create_autocmd("VimEnter", { once = true, callback = function() - vim.api.nvim_set_current_win(win) + if win and vim.api.nvim_win_is_valid(win) then + pcall(vim.api.nvim_set_current_win, win) + end end, }) end From f5734f512fe2102d25e8b819139cd9576d38e3a7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Dec 2022 07:34:02 +0000 Subject: [PATCH 0288/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4e2b2a2..edc9063 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 20 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 21 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 44f80a7f5d80a56dbfcc5cda34cc805a78ac7189 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 09:03:40 +0100 Subject: [PATCH 0289/1610] feat(plugin): allow plugin files only without a main plugin module. Fixes #53 --- README.md | 2 +- lua/lazy/core/plugin.lua | 8 ++------ lua/lazy/core/util.lua | 22 ++++++++++++++++++---- lua/lazy/manage/reloader.lua | 7 ++----- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index ad24d68..c271afc 100644 --- a/README.md +++ b/README.md @@ -493,7 +493,7 @@ Example: require("lazy").setup("plugins") ``` -- `~/.config/nvim/lua/plugins.lua` or `~/.config/nvim/lua/plugins/init.lua` +- `~/.config/nvim/lua/plugins.lua` or `~/.config/nvim/lua/plugins/init.lua` **_(this file is optional)_** ```lua return { diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f510ee8..1a6d439 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -220,8 +220,7 @@ function M.spec() if type(Config.spec) == "string" then -- spec is a module - local function _load(name) - local modname = name and (Config.spec .. "." .. name) or Config.spec + local function _load(modname) -- unload the module so we get a clean slate ---@diagnostic disable-next-line: no-unknown package.loaded[modname] = nil @@ -229,10 +228,7 @@ function M.spec() spec:normalize(Cache.require(modname)) end, "Failed to load **" .. modname .. "**") end - local path_plugins = vim.fn.stdpath("config") .. "/lua/" .. Config.spec:gsub("%.", "/") - - _load() - Util.lsmod(path_plugins, _load) + Util.lsmod(Config.spec --[[@as string]], _load) else -- spec is a spec spec:normalize(vim.deepcopy(Config.spec)) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 4475d60..f63807b 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -158,14 +158,28 @@ function M.walk(path, fn) end) end +---@param modname string ---@param root string ---@param fn fun(modname:string, modpath:string) -function M.lsmod(root, fn) +---@overload fun(modname:string, fn: fun(modname:string, modpath:string)) +function M.lsmod(modname, root, fn) + if type(root) == "function" then + fn = root + root = vim.fn.stdpath("config") .. "/lua" + end + root = root .. "/" .. modname:gsub("%.", "/") + if vim.loop.fs_stat(root .. ".lua") then + fn(modname, root .. ".lua") + end M.ls(root, function(path, name, type) - if type == "file" and name:sub(-4) == ".lua" and name ~= "init.lua" then - fn(name:sub(1, -5), path) + if type == "file" and name:sub(-4) == ".lua" then + if name == "init.lua" then + fn(modname, path) + else + fn(modname .. "." .. name:sub(1, -5), path) + end elseif type == "directory" and vim.loop.fs_stat(path .. "/init.lua") then - fn(name, path .. "/init.lua") + fn(modname .. "." .. name, path .. "/init.lua") end end) end diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index 3b0af3c..b3b7eeb 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -10,7 +10,6 @@ M.files = {} ---@type vim.loop.Timer M.timer = nil -M.main = nil M.root = nil function M.enable() @@ -19,8 +18,7 @@ function M.enable() end if type(Config.spec) == "string" then M.timer = vim.loop.new_timer() - M.root = vim.fn.stdpath("config") .. "/lua/" .. Config.spec:gsub("%.", "/") - M.main = vim.loop.fs_stat(M.root .. ".lua") and (M.root .. ".lua") or (M.root .. "/init.lua") + M.root = vim.fn.stdpath("config") .. "/lua/" M.check(true) M.timer:start(2000, 2000, M.check) end @@ -56,8 +54,7 @@ function M.check(start) end end - check(nil, M.main) - Util.lsmod(M.root, check) + Util.lsmod(Config.spec --[[@as string]], M.root, check) for file in pairs(M.files) do if not checked[file] then From 3c3a711ddaf6bd5ddf7a5ac607e575942001f1d3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Dec 2022 08:04:42 +0000 Subject: [PATCH 0290/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index edc9063..83fbc37 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -534,7 +534,7 @@ Example: -- `~/.config/nvim/lua/plugins.lua` or `~/.config/nvim/lua/plugins/init.lua` +- `~/.config/nvim/lua/plugins.lua` or `~/.config/nvim/lua/plugins/init.lua` **_(this file is optional)_** >lua From e95da35d09989d15122ec4bb1364d9c36e36317d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 10:12:39 +0100 Subject: [PATCH 0291/1610] feat(util): utility method to get sync process output --- lua/lazy/manage/process.lua | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 633d12d..8b11674 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -108,4 +108,22 @@ function M.spawn(cmd, opts) return handle end +---@param cmd string[] +---@param opts? {cwd:string} +function M.exec(cmd, opts) + opts = opts or {} + ---@type string[] + local lines + local job = vim.fn.jobstart(cmd, { + cwd = opts.cwd, + pty = false, + stdout_buffered = true, + on_stdout = function(_, _lines) + lines = _lines + end, + }) + vim.fn.jobwait({ job }) + return lines +end + return M From 86eaa118c6d6b5c2806c38aac8db664ba6d780f6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 10:13:18 +0100 Subject: [PATCH 0292/1610] fix(git): dereference tag refs. Fixes #54 --- lua/lazy/manage/git.lua | 45 +++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 6984afe..22f8cde 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -1,12 +1,14 @@ local Util = require("lazy.util") local Semver = require("lazy.manage.semver") local Config = require("lazy.core.config") +local Process = require("lazy.manage.process") local M = {} ---@alias GitInfo {branch?:string, commit?:string, tag?:string, version?:Semver} ----@param details? boolean +---@param repo string +---@param details? boolean Fetching details is slow! Don't loop over a plugin to fetch all details! ---@return GitInfo? function M.info(repo, details) local line = Util.head(repo .. "/.git/HEAD") @@ -19,13 +21,13 @@ function M.info(repo, details) } or { commit = line } if details then - Util.ls(repo .. "/.git/refs/tags", function(_, name) - if M.ref(repo, "tags/" .. name) == ret.commit then - ret.tag = name - ret.version = Semver.version(name) - return false + for tag, tag_ref in pairs(M.get_tag_refs(repo)) do + if tag_ref == ret.commit then + ret.tag = tag + ret.version = Semver.version(tag) + break end - end) + end end return ret end @@ -120,7 +122,34 @@ function M.get_target(plugin) end function M.ref(repo, ...) - return Util.head(repo .. "/.git/refs/" .. table.concat({ ... }, "/")) + local ref = table.concat({ ... }, "/") + + -- if this is a tag ref, then dereference it instead + if ref:find("tags/", 1, true) == 1 then + local tags = M.get_tag_refs(repo, ref) + for _, tag_ref in pairs(tags) do + return tag_ref + end + end + + -- otherwise just get the ref + return Util.head(repo .. "/.git/refs/" .. ref) +end + +-- this is slow, so don't use on a loop over all plugins! +---@param tagref string? +function M.get_tag_refs(repo, tagref) + tagref = tagref or "--tags" + ---@type table + local tags = {} + local lines = Process.exec({ "git", "show-ref", "-d", tagref }, { cwd = repo }) + for _, line in ipairs(lines) do + local ref, tag = line:match("^(%w+) refs/tags/([^%^]+)%^?{?}?$") + if ref then + tags[tag] = ref + end + end + return tags end return M From 540847b7cb4afc66fea0d7a539821431c5a2b216 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 10:17:10 +0100 Subject: [PATCH 0293/1610] fix: strip `/` from dirs. Fixes #60 --- lua/lazy/core/util.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index f63807b..50d207e 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -35,7 +35,8 @@ function M.norm(path) end path = home .. path:sub(2) end - return path:gsub("\\", "/") + path = path:gsub("\\", "/") + return path:sub(-1) == "/" and path:sub(1, -2) or path end function M.try(fn, msg) From 4ca30390ec4149763169201b651ad9e78c56896f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 10:51:31 +0100 Subject: [PATCH 0294/1610] feat(loader): warn when mapleader is changed after init --- lua/lazy/core/config.lua | 4 ++++ lua/lazy/manage/reloader.lua | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9ef5c42..f204183 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -111,6 +111,9 @@ M.options = {} ---@type string M.me = nil +---@type string +M.mapleader = nil + ---@param spec LazySpec ---@param opts? LazyConfig function M.setup(spec, opts) @@ -143,6 +146,7 @@ function M.setup(spec, opts) -- disable plugin loading since we do all of that ourselves vim.go.loadplugins = false + M.mapleader = vim.g.mapleader vim.api.nvim_create_autocmd("User", { pattern = "VeryLazy", diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index b3b7eeb..882327a 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -2,6 +2,7 @@ local Cache = require("lazy.core.cache") local Config = require("lazy.core.config") local Util = require("lazy.util") local Plugin = require("lazy.core.plugin") +local Loader = require("lazy.core.loader") local M = {} @@ -63,6 +64,11 @@ function M.check(start) end end + if Loader.init_done and Config.mapleader ~= vim.g.mapleader then + require("lazy.core.util").warn("You need to set `vim.g.mapleader` **BEFORE** loading lazy") + Config.mapleader = vim.g.mapleader + end + if not (start or #changes == 0) then vim.schedule(function() if Config.options.change_detection.notify then From 232232da5a2d012da0da27b424a016379c83c2f9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 11:18:41 +0100 Subject: [PATCH 0295/1610] fix(ui): install command can have plugins as a parameter --- TODO.md | 13 +++++++------ lua/lazy/view/commands.lua | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/TODO.md b/TODO.md index 3d795d2..5fe44a4 100644 --- a/TODO.md +++ b/TODO.md @@ -31,12 +31,12 @@ - [x] automatically reloads when config changes are detected - [x] handlers imply opt - [x] dependencies imply opt for deps -- [ ] show spec errors in health -- [ ] fix plugin details +- [x] show spec errors in health +- [x] fix plugin details - [ ] show disabled plugins (strikethrough?) - [ ] log file -- [ ] git tests -- [ ] Import specs from other plugin managers +- [x] git tests +- [x] Import specs from other plugin managers - [ ] [packspec](https://github.com/nvim-lua/nvim-package-specification) - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` @@ -53,11 +53,12 @@ - [x] When autoinstalling the plugins the cursor isn't focused on the floating window, but on the non-floating window in the background. - [ ] Doing `:Lazy clean` doesn't show which plugins were removed. -- [ ] Shouldn't the "Versioning" section be in the "Lockfile" chapter? -- [ ] Why are personal dotfiles used as examples? Dotfiles change all the time, +- [x] Shouldn't the "Versioning" section be in the "Lockfile" chapter? +- [x] Why are personal dotfiles used as examples? Dotfiles change all the time, there's no guarantee this will be relevant or even exist in two years. - [x] What's the difference between lazy-loading and verylazy-loading? - [x] Most emojis in "Configuration" aren't shown for me. - [x] add section on how to uninstall - [x] add `:Packadd` command or something similar - [ ] headless install +- [ ] better keys handling diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index a0ad820..eae1ba7 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -26,8 +26,8 @@ M.commands = { Manage.clear() View.show() end, - install = function() - Manage.install({ clear = true, mode = "install" }) + install = function(plugins) + Manage.install({ clear = true, mode = "install", plugins = plugins }) end, log = function(plugins) Manage.log({ clear = true, mode = "log", plugins = plugins }) From 71b2e2ff7d3a149c8e5fb10aacc4c5ac6bdcba45 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 11:35:43 +0100 Subject: [PATCH 0296/1610] docs: lazy works on all OSs now --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index c271afc..83a95f9 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,6 @@ ## ⚡️ Requirements - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) -- Works on **Linux**, **MacOS** and **Windows** - Git >= **2.19.0** (for partial clones support) - a [Nerd Font](https://www.nerdfonts.com/) **_(optional)_** From 9dfeface3fc7e483a6688427e5a9dd04cb36a93b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 11:43:05 +0100 Subject: [PATCH 0297/1610] docs: fixed indentation of auto-generated code blocks --- README.md | 22 +++++++++++----------- lua/lazy/docs.lua | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 83a95f9..62ac8ab 100644 --- a/README.md +++ b/README.md @@ -37,17 +37,17 @@ You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim** ```lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "--single-branch", - "https://github.com/folke/lazy.nvim.git", - lazypath, - }) - end - vim.opt.runtimepath:prepend(lazypath) +if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "--single-branch", + "https://github.com/folke/lazy.nvim.git", + lazypath, + }) +end +vim.opt.runtimepath:prepend(lazypath) ``` diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 73090c5..b8020ae 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -40,7 +40,7 @@ function M.fix_indent(str) end for l, line in ipairs(lines) do - lines[l] = line:sub(width) + lines[l] = line:sub(width + 1) end return table.concat(lines, "\n") end From b802729bf63a6d56cf27469dbed2098b3227c1c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Dec 2022 10:43:46 +0000 Subject: [PATCH 0298/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 83fbc37..ad7c533 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -54,7 +54,6 @@ REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) -- Works on **Linux**, **MacOS** and **Windows** - Git >= **2.19.0** (for partial clones support) - a Nerd Font **_(optional)_** @@ -66,17 +65,17 @@ You can add the following Lua code to your `init.lua` to bootstrap >lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "--single-branch", - "https://github.com/folke/lazy.nvim.git", - lazypath, - }) - end - vim.opt.runtimepath:prepend(lazypath) + if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "--single-branch", + "https://github.com/folke/lazy.nvim.git", + lazypath, + }) + end + vim.opt.runtimepath:prepend(lazypath) < From ff24f493ee053f25fc8b34b74443a9f000fdbd55 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 14:34:31 +0100 Subject: [PATCH 0299/1610] fix(loader): source rtp `/plugin` files after loading start plugins. Fixes --- README.md | 9 ++++----- lua/lazy/core/loader.lua | 26 +++++++++++++++----------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 62ac8ab..1586c80 100644 --- a/README.md +++ b/README.md @@ -463,11 +463,10 @@ startup sequence for more flexibility and better performance. In practice this means that step 10 of [Neovim Initialization](https://neovim.io/doc/user/starting.html#initialization) is done by Lazy: -1. all files from `/plugin` and `/ftdetect` directories in you rtp are sourced (excluding `/after`) -2. all plugins with `lazy=false` are loaded. This includes sourcing `/plugin` and `/ftdetect` files. (`/after` will not be sourced yet) -3. all plugins' `/after/plugin` files are sourced -4. all `/after/plugin` files from the original rtp are sourced -5. all the plugins' `init()` functions are executed +1. all plugins with `lazy=false` are loaded. This includes sourcing `/plugin` and `/ftdetect` files. (`/after` will not be sourced yet) +2. all files from `/plugin` and `/ftdetect` directories in you rtp are sourced (excluding `/after`) +3. all `/after/plugin` files are sourced (this inludes `/after` from plugins) +4. all the plugins' `init()` functions are executed Files from runtime directories are always sourced in alphabetical order. diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index f705f7c..931cf4c 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -46,18 +46,13 @@ end function M.startup() Util.track({ start = "startup" }) + -- load filetype.lua first since plugins might depend on that M.source(vim.env.VIMRUNTIME .. "/filetype.lua") - -- load plugins from rtp, excluding after - Util.track({ start = "rtp plugins" }) - for _, path in ipairs(vim.opt.rtp:get()) do - if not path:find("after/?$") then - M.packadd(path) - end - end - Util.track() + -- backup original rtp + local rtp = vim.opt.rtp:get() - -- load start plugin + -- 1. load start plugin Util.track({ start = "start" }) for _, plugin in pairs(Config.plugins) do if plugin.lazy == false then @@ -66,7 +61,16 @@ function M.startup() end Util.track() - -- load after plugins + -- 2. load plugins from rtp, excluding after + Util.track({ start = "rtp plugins" }) + for _, path in ipairs(rtp) do + if not path:find("after/?$") then + M.packadd(path) + end + end + Util.track() + + -- 3. load after plugins Util.track({ start = "after" }) for _, path in ipairs(vim.opt.rtp:get()) do if path:find("after/?$") then @@ -77,7 +81,7 @@ function M.startup() M.init_done = true - -- run plugin init + -- 4. run plugin init Util.track({ start = "init" }) for _, plugin in pairs(Config.plugins) do if plugin.init then From 57bea32e4fa4ca066459163699003e8ba398ff19 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Dec 2022 13:35:54 +0000 Subject: [PATCH 0300/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ad7c533..8dd7fab 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -496,11 +496,10 @@ sequence for more flexibility and better performance. In practice this means that step 10 of |Neovim Initialization| is done by Lazy: -1. all files from `/plugin` and `/ftdetect` directories in you rtp are sourced (excluding `/after`) -2. all plugins with `lazy=false` are loaded. This includes sourcing `/plugin` and `/ftdetect` files. (`/after` will not be sourced yet) -3. all plugins’ `/after/plugin` files are sourced -4. all `/after/plugin` files from the original rtp are sourced -5. all the plugins’ `init()` functions are executed +1. all plugins with `lazy=false` are loaded. This includes sourcing `/plugin` and `/ftdetect` files. (`/after` will not be sourced yet) +2. all files from `/plugin` and `/ftdetect` directories in you rtp are sourced (excluding `/after`) +3. all `/after/plugin` files are sourced (this inludes `/after` from plugins) +4. all the plugins’ `init()` functions are executed Files from runtime directories are always sourced in alphabetical order. From a939243639d452ef5f50fd8f87b8659862f16d37 Mon Sep 17 00:00:00 2001 From: Tsakiris Tryfon Date: Wed, 21 Dec 2022 15:39:08 +0200 Subject: [PATCH 0301/1610] fix(checker): allow git checks only for non-pinned plugins (#61) --- lua/lazy/manage/checker.lua | 2 +- lua/lazy/manage/task/git.lua | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index d3676d4..ba2c359 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -16,7 +16,7 @@ end function M.fast_check() for _, plugin in pairs(Config.plugins) do - if plugin._.installed then + if not plugin.pin and plugin._.installed then plugin._.has_updates = nil local info = Git.info(plugin.dir) local ok, target = pcall(Git.get_target, plugin) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 32b73fb..e058973 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -8,6 +8,9 @@ local M = {} M.log = { ---@param opts {updated?:boolean, check?: boolean} skip = function(plugin, opts) + if opts.check and plugin.pin then + return true + end if opts.updated and not (plugin._.updated and plugin._.updated.from ~= plugin._.updated.to) then return true end From bbace14dc96cd2379aa3f49446ba35a1ad5bfdfa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 14:45:32 +0100 Subject: [PATCH 0302/1610] fix(git): only mark a plugin as dirty if an update changed the commit HEAD. Fixes #62 --- lua/lazy/manage/task/git.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index e058973..502d7be 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -192,8 +192,10 @@ M.checkout = { from = info.commit, to = new_info.commit, } + if self.plugin._.updated.from ~= self.plugin._.updated.to then + self.plugin._.dirty = true + end end - self.plugin._.dirty = true end end, }) From a345649510aad552c0dab4e7a666d387b4ea22d3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 14:56:46 +0100 Subject: [PATCH 0303/1610] fix(cache): if we can't load from the cache modpath, find path again instead of erroring right away --- lua/lazy/core/cache.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 81d85f6..c710412 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -95,7 +95,8 @@ function M.loader(modname) end end chunk, err = M.load(modname, entry.modpath) - else + end + if not chunk then -- find the modpath and load the module local modpath = M.find(modname) if modpath then From 876f7bd47124b4b2881917b36c5d29f3a898eab5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 15:19:14 +0100 Subject: [PATCH 0304/1610] feat(loader): allow to add extra paths to rtp reset. Fixes #64 --- README.md | 2 ++ lua/lazy/core/config.lua | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index 1586c80..f3c8d25 100644 --- a/README.md +++ b/README.md @@ -309,6 +309,8 @@ return { 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 indluce in the rtp ---@type string[] list any plugins you want to disable here disabled_plugins = { -- "gzip", diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f204183..63bc99f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -69,6 +69,8 @@ M.defaults = { 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 indluce in the rtp ---@type string[] list any plugins you want to disable here disabled_plugins = { -- "gzip", @@ -142,6 +144,9 @@ function M.setup(spec, opts) vim.fn.stdpath("config") .. "/after", } end + for _, path in ipairs(M.options.performance.rtp.paths) do + vim.opt.rtp:append(path) + end vim.opt.rtp:append(M.options.readme.root) -- disable plugin loading since we do all of that ourselves From 95fc8148180bf388e5bffb10c726c208a7fe74cb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Dec 2022 14:19:58 +0000 Subject: [PATCH 0305/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 8dd7fab..436b037 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -338,6 +338,8 @@ CONFIGURATION *lazy.nvim-configuration* 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 indluce in the rtp ---@type string[] list any plugins you want to disable here disabled_plugins = { -- "gzip", From bbebb67934a5bb9dbbbe30713f8fb92682b8ec29 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 15:37:46 +0100 Subject: [PATCH 0306/1610] ci: Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 11 +++++++---- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index e1c163b..fb70b53 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,9 +1,10 @@ --- name: Bug report -about: "Create a report to help us improve" -title: "" -labels: "bug" -assignees: "" +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' + --- **Describe the bug** @@ -13,6 +14,8 @@ A clear and concise description of what the bug is. Gui(specify which GUI client you are using)? Nightly? Version? **To Reproduce** +Make sure to read [creating a minimal init.lua to reproduce an issue](https://github.com/folke/lazy.nvim/wiki/Minimal-%60init.lua%60-to-Reproduce-an-Issue) + Steps to reproduce the behavior: 1. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 36014cd..11fc491 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Feature request about: Suggest an idea for this project title: '' -labels: 'enhancement' +labels: enhancement assignees: '' --- From b68f94b95a6f312b0546b11a079d669944621cea Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 15:39:44 +0100 Subject: [PATCH 0307/1610] ci: Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index fb70b53..2cb0fea 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -14,7 +14,7 @@ A clear and concise description of what the bug is. Gui(specify which GUI client you are using)? Nightly? Version? **To Reproduce** -Make sure to read [creating a minimal init.lua to reproduce an issue](https://github.com/folke/lazy.nvim/wiki/Minimal-%60init.lua%60-to-Reproduce-an-Issue) +Make sure to read https://github.com/folke/lazy.nvim/wiki/Minimal-%60init.lua%60-to-Reproduce-an-Issue Steps to reproduce the behavior: From c228908ffc485ee01a5ac118e23e13ce3d19cbf9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 16:07:49 +0100 Subject: [PATCH 0308/1610] fix(health): don't show warning on `module=false` --- README.md | 1 + lua/lazy/health.lua | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f3c8d25..e8faab1 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ require("lazy").setup({ | **cmd** | `string?` or `string[]` | Lazy-load on command | | **ft** | `string?` or `string[]` | Lazy-load on filetype | | **keys** | `string?` or `string[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this lua module when it's required somewhere | ### Lazy Loading diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index d749903..88d5b23 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -37,6 +37,7 @@ function M.check() "tag", "commit", "version", + "module", "pin", "cmd", "event", @@ -48,7 +49,9 @@ function M.check() for _, plugin in pairs(Config.plugins) do for key in pairs(plugin) do if not vim.tbl_contains(valid, key) then - vim.health.report_warn("{" .. plugin.name .. "}: unknown key <" .. key .. ">") + if key ~= "module" or type(plugin.module) ~= "boolean" then + vim.health.report_warn("{" .. plugin.name .. "}: unknown key <" .. key .. ">") + end end end end From 7a57ea28d30698abed15f22f71f34dfb4dc36c88 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Dec 2022 15:08:40 +0000 Subject: [PATCH 0309/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 436b037..e472482 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -130,6 +130,7 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**cmd** │string? or string[] │Lazy-load on command │ │**ft** │string? or string[] │Lazy-load on filetype │ │**keys** │string? or string[] │Lazy-load on key mapping │ +│**module** │false? │Do not automatically load this lua module when it’s required somewhere │ LAZY LOADING ~ From b7c489b08f79765b7c840addc4e542b875438f47 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 16:27:56 +0100 Subject: [PATCH 0310/1610] fix(loader): lua modules can be links instead of files. Fixes #66 --- lua/lazy/core/loader.lua | 2 +- lua/lazy/core/util.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 931cf4c..c4b0df2 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -172,7 +172,7 @@ function M.source_runtime(...) Util.walk(dir, function(path, name, t) local ext = name:sub(-3) name = name:sub(1, -5) - if t == "file" and (ext == "lua" or ext == "vim") and not M.disabled_rtp_plugins[name] then + if (t == "file" or t == "link") and (ext == "lua" or ext == "vim") and not M.disabled_rtp_plugins[name] then files[#files + 1] = path end end) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 50d207e..4f79800 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -173,7 +173,7 @@ function M.lsmod(modname, root, fn) fn(modname, root .. ".lua") end M.ls(root, function(path, name, type) - if type == "file" and name:sub(-4) == ".lua" then + if (type == "file" or type == "link") and name:sub(-4) == ".lua" then if name == "init.lua" then fn(modname, path) else From eab449b9e50be61decf1ba3f1603ee7a4b612120 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 18:22:50 +0100 Subject: [PATCH 0311/1610] build: added .repro and debug to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 42c0336..58426cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ tt.lua .tests doc/tags +debug +.repro From 2fd78fbed8d22524af83a78558dbc895df15d58d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 18:23:27 +0100 Subject: [PATCH 0312/1610] fix(help): sort tags files for readmes so tags work properly. Fixes #67 --- lua/lazy/help.lua | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index 4f3e549..d13174b 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -7,7 +7,7 @@ function M.index(plugin) if Config.options.readme.skip_if_doc_exists and vim.loop.fs_stat(plugin.dir .. "/doc") then return {} end - ---@type {file:string, tag:string, line:string}[] + ---@type table local tags = {} for _, file in ipairs(Config.options.readme.files) do file = plugin.dir .. "/" .. file @@ -18,7 +18,7 @@ function M.index(plugin) if title then local tag = plugin.name .. "-" .. title:lower():gsub("%W+", "-") tag = tag:gsub("%-+", "-"):gsub("%-$", "") - table.insert(tags, { tag = tag, line = line, file = plugin.name .. ".md" }) + tags[tag] = { tag = tag, line = line, file = plugin.name .. ".md" } end end table.insert(lines, [[]]) @@ -40,12 +40,14 @@ function M.update() ---@type {file:string, tag:string, line:string}[] local tags = {} for _, plugin in pairs(Config.plugins) do - vim.list_extend(tags, M.index(plugin)) + for key, tag in pairs(M.index(plugin)) do + tags[key] = tag + end end local lines = { [[!_TAG_FILE_ENCODING utf-8 //]] } - for _, tag in ipairs(tags) do + Util.foreach(tags, function(_, tag) table.insert(lines, ("%s\t%s\t/%s"):format(tag.tag, tag.file, tag.line)) - end + end) Util.write_file(docs .. "/tags", table.concat(lines, "\n")) end From d34a02d7b276950e43b9385a7f8263a86b271c75 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 18:49:00 +0100 Subject: [PATCH 0313/1610] ci: Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 43 ++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 2cb0fea..9232dc7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -28,6 +28,49 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. +
+repro.lua + +```lua +local root = vim.fn.fnamemodify("./.repro", ":p") + +-- 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", + "--single-branch", + "https://github.com/folke/lazy.nvim.git", + lazypath, + }) +end +vim.opt.runtimepath:prepend(lazypath) + +-- install plugins +local plugins = { + -- do not remove the colorscheme! + "folke/tokyonight.nvim", + -- add any other pugins here +} +require("lazy").setup(plugins, { + root = root .. "/plugins", +}) + +-- add anything else here +vim.opt.termguicolors = true +-- do not remove the colorscheme! +vim.cmd([[colorscheme tokyonight]]) +``` + +
+ **Log** Please include any related errors from the Noice log file. (open with `:Lazy log`) From 2ab651864f30022751252e66b4cd2c1e36800d06 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 19:01:58 +0100 Subject: [PATCH 0314/1610] fix(keys): feedkeys should include pending keys. Fixes #71 --- lua/lazy/core/handler/keys.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 34f8ea9..e6bf6f2 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -10,7 +10,15 @@ function M:_add(keys) vim.keymap.del("n", keys) Util.track({ keys = keys }) Loader.load(self.active[keys], { keys = keys }) - local feed = vim.api.nvim_replace_termcodes(keys, true, false, true) + local extra = "" + while true do + local c = vim.fn.getchar(0) + if c == 0 then + break + end + extra = extra .. vim.fn.nr2char(c) + end + local feed = vim.api.nvim_replace_termcodes(keys .. extra, true, true, true) vim.api.nvim_feedkeys(feed, "m", false) Util.track() end, { silent = true }) From f0e1b853a0d0d34584ecf9ecbf6ef8599db8b5c2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 19:04:08 +0100 Subject: [PATCH 0315/1610] feat: make hover easy to override --- lua/lazy/view/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 4b601de..eeac8f6 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -36,6 +36,8 @@ M.modes = { { plugin = true, name = "restore", key = "r", desc = "Restore this plugin to the state in the lockfile" }, } +M.hover = "K" + ---@type string? M.mode = nil @@ -240,7 +242,7 @@ function M.keys(buf, handlers) end, { buffer = buf, silent = true }) end - map("K") + map(M.hover) end return M From 472a091b777496bcb5066ec65d766b76cae7c6c1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 21 Dec 2022 19:08:11 +0100 Subject: [PATCH 0316/1610] chore(main): release 5.2.0 (#55) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a220c4a..e68ec46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # Changelog +## [5.2.0](https://github.com/folke/lazy.nvim/compare/v5.1.0...v5.2.0) (2022-12-21) + + +### Features + +* **loader:** allow to add extra paths to rtp reset. Fixes [#64](https://github.com/folke/lazy.nvim/issues/64) ([876f7bd](https://github.com/folke/lazy.nvim/commit/876f7bd47124b4b2881917b36c5d29f3a898eab5)) +* **loader:** warn when mapleader is changed after init ([4ca3039](https://github.com/folke/lazy.nvim/commit/4ca30390ec4149763169201b651ad9e78c56896f)) +* make hover easy to override ([f0e1b85](https://github.com/folke/lazy.nvim/commit/f0e1b853a0d0d34584ecf9ecbf6ef8599db8b5c2)) +* **plugin:** allow plugin files only without a main plugin module. Fixes [#53](https://github.com/folke/lazy.nvim/issues/53) ([44f80a7](https://github.com/folke/lazy.nvim/commit/44f80a7f5d80a56dbfcc5cda34cc805a78ac7189)) +* **util:** utility method to get sync process output ([e95da35](https://github.com/folke/lazy.nvim/commit/e95da35d09989d15122ec4bb1364d9c36e36317d)) + + +### Bug Fixes + +* **cache:** if we can't load from the cache modpath, find path again instead of erroring right away ([a345649](https://github.com/folke/lazy.nvim/commit/a345649510aad552c0dab4e7a666d387b4ea22d3)) +* **checker:** allow git checks only for non-pinned plugins ([#61](https://github.com/folke/lazy.nvim/issues/61)) ([a939243](https://github.com/folke/lazy.nvim/commit/a939243639d452ef5f50fd8f87b8659862f16d37)) +* **git:** dereference tag refs. Fixes [#54](https://github.com/folke/lazy.nvim/issues/54) ([86eaa11](https://github.com/folke/lazy.nvim/commit/86eaa118c6d6b5c2806c38aac8db664ba6d780f6)) +* **git:** only mark a plugin as dirty if an update changed the commit HEAD. Fixes [#62](https://github.com/folke/lazy.nvim/issues/62) ([bbace14](https://github.com/folke/lazy.nvim/commit/bbace14dc96cd2379aa3f49446ba35a1ad5bfdfa)) +* **health:** don't show warning on `module=false` ([c228908](https://github.com/folke/lazy.nvim/commit/c228908ffc485ee01a5ac118e23e13ce3d19cbf9)) +* **help:** sort tags files for readmes so tags work properly. Fixes [#67](https://github.com/folke/lazy.nvim/issues/67) ([2fd78fb](https://github.com/folke/lazy.nvim/commit/2fd78fbed8d22524af83a78558dbc895df15d58d)) +* **keys:** feedkeys should include pending keys. Fixes [#71](https://github.com/folke/lazy.nvim/issues/71) ([2ab6518](https://github.com/folke/lazy.nvim/commit/2ab651864f30022751252e66b4cd2c1e36800d06)) +* **loader:** lua modules can be links instead of files. Fixes [#66](https://github.com/folke/lazy.nvim/issues/66) ([b7c489b](https://github.com/folke/lazy.nvim/commit/b7c489b08f79765b7c840addc4e542b875438f47)) +* **loader:** source rtp `/plugin` files after loading start plugins. Fixes ([ff24f49](https://github.com/folke/lazy.nvim/commit/ff24f493ee053f25fc8b34b74443a9f000fdbd55)) +* strip `/` from dirs. Fixes [#60](https://github.com/folke/lazy.nvim/issues/60) ([540847b](https://github.com/folke/lazy.nvim/commit/540847b7cb4afc66fea0d7a539821431c5a2b216)) +* **ui:** install command can have plugins as a parameter ([232232d](https://github.com/folke/lazy.nvim/commit/232232da5a2d012da0da27b424a016379c83c2f9)) +* **ui:** set current win only when its valid ([3814883](https://github.com/folke/lazy.nvim/commit/3814883aaae3facc931087bfa7352ca18fa658ac)) + ## [5.1.0](https://github.com/folke/lazy.nvim/compare/v5.0.1...v5.1.0) (2022-12-20) From 1fb10b987b5abf24180676a6b6a8bfe370617549 Mon Sep 17 00:00:00 2001 From: "C.D. MacEachern" Date: Wed, 21 Dec 2022 13:48:53 -0500 Subject: [PATCH 0317/1610] docs: 'cmd' repeat twice (#75) Probably meant `keys`? --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e8faab1..33dafa8 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ Additionally, you can also lazy-load on **events**, **commands**, 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 `cmd` key +- it has an `event`, `cmd`, `ft` or `keys` key - it defines an `init` method - `config.defaults.lazy == true` From 6dbcdcec838ac8546c7b21a3427d22be747c1248 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Dec 2022 18:49:36 +0000 Subject: [PATCH 0318/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e472482..9c639f2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -154,7 +154,7 @@ 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 `cmd` key +- it has an `event`, `cmd`, `ft` or `keys` key - it defines an `init` method - `config.defaults.lazy == true` From 94d012511d19a4438c0098fff000a6d63198f2c8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 19:58:20 +0100 Subject: [PATCH 0319/1610] fix(rtp): keep site in rtp --- lua/lazy/core/config.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 63bc99f..5b0e829 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -142,6 +142,7 @@ function M.setup(spec, opts) vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib/nvim", vim.fn.stdpath("config"), vim.fn.stdpath("config") .. "/after", + vim.fn.stdpath("data") .. "/site", } end for _, path in ipairs(M.options.performance.rtp.paths) do From 58f0876e81881c487ea10e393fa828a1c45c74f4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 20:09:12 +0100 Subject: [PATCH 0320/1610] fix: removed spell again from site. not needed. can download in config/spell --- lua/lazy/core/config.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5b0e829..63bc99f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -142,7 +142,6 @@ function M.setup(spec, opts) vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib/nvim", vim.fn.stdpath("config"), vim.fn.stdpath("config") .. "/after", - vim.fn.stdpath("data") .. "/site", } end for _, path in ipairs(M.options.performance.rtp.paths) do From fd1fbefc3df2b8e92209ed932144edc49877c41e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 21:08:13 +0100 Subject: [PATCH 0321/1610] feat(checker): defer checker to after VeryLazy to make sure nvim-notify and others are loaded --- lua/lazy/core/config.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 63bc99f..cff8108 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -163,7 +163,9 @@ function M.setup(spec, opts) require("lazy.manage.reloader").enable() end if M.options.checker.enabled then - require("lazy.manage.checker").start() + vim.defer_fn(function() + require("lazy.manage.checker").start() + end, 10) end end, }) From bc617474a0bbd9a2e8ec68fd97e09c1682be7ff9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 22:27:36 +0100 Subject: [PATCH 0322/1610] feat!: lazy api commands now take an opts table instead of a list of plugins --- README.md | 44 ++++++++++++++------- lua/lazy/docs.lua | 40 ++++++++++--------- lua/lazy/manage/init.lua | 32 ++++++++++++++- lua/lazy/view/commands.lua | 81 ++++++++++++++++++-------------------- lua/lazy/view/init.lua | 4 +- 5 files changed, 123 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index 33dafa8..2d91ff2 100644 --- a/README.md +++ b/README.md @@ -380,24 +380,38 @@ Any operation can be started from the UI, with a sub command or an API function: -| Command | Lua | Description | -| ------------------------- | ----------------------------------- | --------------------------------------------------------------------------------------------- | -| `:Lazy home` | `require("lazy").home()` | Go back to plugin list | -| `:Lazy install [plugins]` | `require("lazy").install(plugins?)` | Install missing plugins | -| `:Lazy update [plugins]` | `require("lazy").update(plugins?)` | Update all plugins. This will also update the lockfile | -| `:Lazy sync` | `require("lazy").sync()` | Run install, clean and update | -| `:Lazy clean [plugins]` | `require("lazy").clean(plugins?)` | Clean plugins that are no longer needed | -| `:Lazy check [plugins]` | `require("lazy").check(plugins?)` | Check for updates and show the log (git fetch) | -| `:Lazy log [plugins]` | `require("lazy").log(plugins?)` | Show recent updates for all plugins | -| `:Lazy restore [plugins]` | `require("lazy").restore(plugins?)` | Updates all plugins to the state in the lockfile | -| `:Lazy profile` | `require("lazy").profile()` | Show detailed profiling | -| `:Lazy debug` | `require("lazy").debug()` | Show debug information | -| `:Lazy help` | `require("lazy").help()` | Toggle this help page | -| `:Lazy clear` | `require("lazy").clear()` | Clear finished tasks | -| `:Lazy load {plugins}` | `require("lazy").load(plugins)` | Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim` | +| Command | Lua | Description | +| ------------------------- | -------------------------------- | --------------------------------------------------------------------------------------------- | +| `: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 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` | +| `:Lazy log [plugins]` | `require("lazy").log(opts?)` | Show recent updates for all plugins | +| `:Lazy profile` | `require("lazy").profile()` | Show detailed profiling | +| `:Lazy restore [plugins]` | `require("lazy").restore(opts?)` | Updates all plugins to the state in the lockfile | +| `:Lazy sync [plugins]` | `require("lazy").sync(opts?)` | Run install, clean and update | +| `:Lazy update [plugins]` | `require("lazy").update(opts?)` | Update all 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 + If you want to display the number of plugins on your dashboard, you can use this simple API: diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index b8020ae..755892b 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -75,41 +75,43 @@ end function M.commands() local commands = require("lazy.view.commands").commands - local modes = require("lazy.view").modes + ---@type table + local modes = {} + for _, mode in ipairs(require("lazy.view").modes) do + modes[mode.name] = modes[mode.name] or {} + modes[mode.name].plugin = modes[mode.name].plugin or mode.plugin + if not modes[mode.name].desc or not mode.plugin then + modes[mode.name].desc = mode.desc + end + end + modes.load.opts = true local lines = { { "Command", "Lua", "Description" }, { "---", "---", "---", "---" }, } - local with_plugins = {} - for _, mode in ipairs(modes) do - if mode.plugin then - with_plugins[mode.name] = true - end - end - local plugins_required = { load = true } - for _, mode in ipairs(modes) do - if not mode.plugin and commands[mode.name] then - if plugins_required[mode.name] then + Util.foreach(modes, function(name, mode) + if commands[name] then + if mode.opts then lines[#lines + 1] = { - ("`:Lazy %s {plugins}`"):format(mode.name), - ([[`require("lazy").%s(plugins)`]]):format(mode.name), + ("`:Lazy %s {plugins}`"):format(name), + ([[`require("lazy").%s(opts)`]]):format(name), mode.desc, } - elseif with_plugins[mode.name] then + elseif mode.plugin then lines[#lines + 1] = { - ("`:Lazy %s [plugins]`"):format(mode.name), - ([[`require("lazy").%s(plugins?)`]]):format(mode.name), + ("`:Lazy %s [plugins]`"):format(name), + ([[`require("lazy").%s(opts?)`]]):format(name), mode.desc, } else lines[#lines + 1] = { - ("`:Lazy %s`"):format(mode.name), - ([[`require("lazy").%s()`]]):format(mode.name), + ("`:Lazy %s`"):format(name), + ([[`require("lazy").%s()`]]):format(name), mode.desc, } end end - end + end) local ret = {} for _, line in ipairs(lines) do ret[#ret + 1] = "| " .. table.concat(line, " | ") .. " |" diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 27d8821..cac6efc 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -52,8 +52,17 @@ function M.run(ropts, opts) return runner end +---@generic O: ManagerOpts +---@param opts? O +---@param defaults? ManagerOpts +---@return O +function M.opts(opts, defaults) + return vim.tbl_deep_extend("force", { clear = true }, defaults or {}, opts or {}) +end + ---@param opts? ManagerOpts function M.install(opts) + opts = M.opts(opts, { mode = "install" }) return M.run({ pipeline = { "git.clone", @@ -72,7 +81,7 @@ end ---@param opts? ManagerOpts|{lockfile?:boolean} function M.update(opts) - opts = opts or {} + opts = M.opts(opts, { mode = "update" }) return M.run({ pipeline = { "git.branch", @@ -91,9 +100,16 @@ function M.update(opts) require("lazy.help").update() end) end +-- +---@param opts? ManagerOpts +function M.restore(opts) + opts = M.opts(opts, { mode = "restore", lockfile = true }) + return M.update(opts) +end ---@param opts? ManagerOpts function M.check(opts) + opts = M.opts(opts, { mode = "check" }) opts = opts or {} return M.run({ pipeline = { @@ -109,6 +125,7 @@ end ---@param opts? ManagerOpts function M.log(opts) + opts = M.opts(opts, { mode = "log" }) return M.run({ pipeline = { "git.log" }, plugins = function(plugin) @@ -117,8 +134,21 @@ function M.log(opts) }, opts) end +---@param opts? ManagerOpts +function M.sync(opts) + opts = M.opts(opts, { mode = "sync" }) + if opts.clear then + M.clear() + opts.clear = false + end + M.clean(opts) + M.install(opts) + M.update(opts) +end + ---@param opts? ManagerOpts function M.clean(opts) + opts = M.opts(opts, { mode = "clean" }) return M.run({ pipeline = { "fs.clean" }, plugins = Config.to_clean, diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index eae1ba7..0005848 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -6,32 +6,23 @@ local Config = require("lazy.core.config") local M = {} ---@param cmd string ----@param plugins? LazyPlugin[] -function M.cmd(cmd, plugins) +---@param opts? ManagerOpts +function M.cmd(cmd, opts) cmd = cmd == "" and "home" or cmd local command = M.commands[cmd] if command == nil then Util.error("Invalid lazy command '" .. cmd .. "'") else - command(plugins) + command(opts) end end ---@class LazyCommands M.commands = { - clean = function(plugins) - Manage.clean({ clear = true, mode = "clean", plugins = plugins }) - end, clear = function() Manage.clear() View.show() end, - install = function(plugins) - Manage.install({ clear = true, mode = "install", plugins = plugins }) - end, - log = function(plugins) - Manage.log({ clear = true, mode = "log", plugins = plugins }) - end, home = function() View.show("home") end, @@ -47,23 +38,20 @@ M.commands = { profile = function() View.show("profile") end, - sync = function() - Manage.clean({ clear = true, wait = true, mode = "sync" }) - Manage.update() - Manage.install() - end, - update = function(plugins) - Manage.update({ clear = true, mode = "update", plugins = plugins }) - end, - check = function(plugins) - Manage.check({ clear = true, mode = "check", plugins = plugins }) - end, - restore = function(plugins) - Manage.update({ clear = true, lockfile = true, mode = "restore", plugins = plugins }) - end, - load = function(plugins) - require("lazy.core.loader").load(plugins, { cmd = "LazyLoad" }) + ---@param opts ManagerOpts + load = function(opts) + if not (opts and opts.plugins and #opts.plugins > 0) then + return Util.error("`Lazy load` requires at least one plugin name to load") + end + require("lazy.core.loader").load(opts.plugins, { cmd = "LazyLoad" }) end, + log = Manage.log, + clean = Manage.clean, + install = Manage.install, + sync = Manage.sync, + update = Manage.update, + check = Manage.check, + restore = Manage.restore, } function M.complete(cmd, prefix) @@ -91,26 +79,23 @@ end function M.setup() vim.api.nvim_create_user_command("Lazy", function(cmd) - local args = vim.split(vim.trim(cmd.args or ""), " ") - local name = args[1] - table.remove(args, 1) - M.cmd(name, #args > 0 and args or nil) + ---@type ManagerOpts + local opts = { wait = cmd.bang == true } + local prefix, args = M.parse(cmd.args) + if #args > 0 then + opts.plugins = args + end + M.cmd(prefix, opts) end, { + bang = true, nargs = "?", desc = "Lazy", complete = function(_, line) - ---@type string? - local cmd, prefix = line:match("^%s*Lazy (%w+) (%w*)") - if prefix then - return M.complete(cmd, prefix) + local prefix, args = M.parse(line) + if #args > 0 then + return M.complete(prefix, args[#args]) end - if line:match("^%s*Lazy %w+ ") then - return {} - end - - prefix = line:match("^%s*Lazy (%w*)") or "" - ---@param key string return vim.tbl_filter(function(key) return key:find(prefix) == 1 @@ -119,4 +104,16 @@ function M.setup() }) end +---@return string, string[] +function M.parse(args) + local parts = vim.split(vim.trim(args), "%s+") + if parts[1]:find("Lazy") then + table.remove(parts, 1) + end + if args:sub(-1) == " " then + parts[#parts + 1] = "" + end + return table.remove(parts, 1) or "", parts +end + return M diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index eeac8f6..07d655e 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -21,7 +21,9 @@ M.modes = { name = "load", desc = "Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim`", hide = true, + plugin = true, }, + { name = "sync", desc = "Run install, clean and update", hide = true, plugin = true }, { plugin = true, name = "update", key = "u", desc = "Update this plugin. This will also update the lockfile" }, { @@ -193,7 +195,7 @@ function M.show(mode) if m.plugin then local plugin = get_plugin() if plugin then - Commands.cmd(m.name, { plugin }) + Commands.cmd(m.name, { plugins = { plugin } }) end else if M.mode == m.name and m.toggle then From 2e14a2f3243e2979e00405fe417bc530bf1e8ca3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 22:28:09 +0100 Subject: [PATCH 0323/1610] feat: added support for `nvim --headless "+Lazy! sync" +qa` --- lua/lazy/core/config.lua | 38 ++++++++++++++++++++++---------------- lua/lazy/view/init.lua | 8 +++----- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index cff8108..bd89f95 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -116,6 +116,8 @@ M.me = nil ---@type string M.mapleader = nil +M.headless = #vim.api.nvim_list_uis() == 0 + ---@param spec LazySpec ---@param opts? LazyConfig function M.setup(spec, opts) @@ -153,22 +155,26 @@ function M.setup(spec, opts) vim.go.loadplugins = false M.mapleader = vim.g.mapleader - vim.api.nvim_create_autocmd("User", { - pattern = "VeryLazy", - once = true, - callback = function() - require("lazy.core.cache").autosave() - require("lazy.view").setup() - if M.options.change_detection.enabled then - require("lazy.manage.reloader").enable() - end - if M.options.checker.enabled then - vim.defer_fn(function() - require("lazy.manage.checker").start() - end, 10) - end - end, - }) + if M.headless then + require("lazy.view.commands").setup() + else + vim.api.nvim_create_autocmd("User", { + pattern = "VeryLazy", + once = true, + callback = function() + require("lazy.core.cache").autosave() + require("lazy.view.commands").setup() + if M.options.change_detection.enabled then + require("lazy.manage.reloader").enable() + end + if M.options.checker.enabled then + vim.defer_fn(function() + require("lazy.manage.checker").start() + end, 10) + end + end, + }) + end Util.very_lazy() end diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 07d655e..1808ab4 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -43,12 +43,10 @@ M.hover = "K" ---@type string? M.mode = nil -function M.setup() - require("lazy.view.commands").setup() - require("lazy.view.colors").setup() -end - function M.show(mode) + if Config.headless then + return + end M.mode = mode or M.mode or "home" require("lazy.view.colors").setup() From a39d37b51a4a3fc9e23b87bdef048c98c7c7a7c8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Dec 2022 21:28:58 +0000 Subject: [PATCH 0324/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9c639f2..7ff847e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -405,20 +405,37 @@ 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 home │require("lazy").home() │Go back to plugin list │ -│:Lazy install [plugins] │require("lazy").install(plugins?) │Install missing plugins │ -│:Lazy update [plugins] │require("lazy").update(plugins?) │Update all plugins. This will also update the lockfile │ -│:Lazy sync │require("lazy").sync() │Run install, clean and update │ -│:Lazy clean [plugins] │require("lazy").clean(plugins?) │Clean plugins that are no longer needed │ -│:Lazy check [plugins] │require("lazy").check(plugins?) │Check for updates and show the log (git fetch) │ -│:Lazy log [plugins] │require("lazy").log(plugins?) │Show recent updates for all plugins │ -│:Lazy restore [plugins] │require("lazy").restore(plugins?) │Updates all plugins to the state in the lockfile │ -│:Lazy profile │require("lazy").profile() │Show detailed profiling │ -│:Lazy debug │require("lazy").debug() │Show debug information │ -│:Lazy help │require("lazy").help() │Toggle this help page │ -│:Lazy clear │require("lazy").clear() │Clear finished tasks │ -│:Lazy load {plugins} │require("lazy").load(plugins) │Load a plugin that has not been loaded yet. Similar to :packadd. Like :Lazy load foo.nvim │ +│ Command │ Lua │ Description │ +│: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 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 │ +│:Lazy log [plugins] │require("lazy").log(opts?) │Show recent updates for all plugins │ +│:Lazy profile │require("lazy").profile() │Show detailed profiling │ +│:Lazy restore [plugins] │require("lazy").restore(opts?) │Updates all plugins to the state in the lockfile │ +│:Lazy sync [plugins] │require("lazy").sync(opts?) │Run install, clean and update │ +│:Lazy update [plugins] │require("lazy").update(opts?) │Update all 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: + +>lua + $ 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 If you want to display the number of plugins on your dashboard, you can use From 7f6f31d66f2aba99fad86a64789b7d5d3e61a2cb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 23:13:18 +0100 Subject: [PATCH 0325/1610] fix(git): make sure we properly fetch git submodules. Fixes #72 --- lua/lazy/manage/task/git.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 502d7be..9fdbd12 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -57,9 +57,8 @@ M.clone = { self.plugin.url, "--filter=blob:none", "--recurse-submodules", + "--also-filter-submodules", "--single-branch", - "--shallow-submodules", - "--no-checkout", "--progress", } @@ -117,7 +116,6 @@ M.fetch = { local args = { "fetch", "--recurse-submodules", - "--update-shallow", "--progress", } @@ -157,8 +155,8 @@ M.checkout = { end -- dont run checkout if target is already reached. - -- unless we just clones, since then we won't have any data yet - if not self.plugin._.cloned and info.commit == target.commit and info.branch == target.branch then + -- unless we just cloned, since then we won't have any data yet + if info.commit == target.commit and info.branch == target.branch then self.plugin._.updated = { from = info.commit, to = info.commit, @@ -169,6 +167,7 @@ M.checkout = { local args = { "checkout", "--progress", + "--recurse-submodules", } if lock then From 4cf176bdabbd1a18a20b3b4a608175fb1ba3250e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 23:18:35 +0100 Subject: [PATCH 0326/1610] fix(install): update lockfile also on install --- lua/lazy/manage/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index cac6efc..44f7179 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -75,6 +75,7 @@ function M.install(opts) return plugin.url and not plugin._.installed end, }, opts):wait(function() + require("lazy.manage.lock").update() require("lazy.help").update() end) end From dc150df4560ee381072f69e5931a050329869c31 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Wed, 21 Dec 2022 23:22:04 +0100 Subject: [PATCH 0327/1610] test(lockfile): create config dir if it does not exist --- lua/lazy/manage/lock.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/manage/lock.lua b/lua/lazy/manage/lock.lua index 5141501..4545f74 100644 --- a/lua/lazy/manage/lock.lua +++ b/lua/lazy/manage/lock.lua @@ -8,6 +8,7 @@ M.lock = {} M._loaded = false function M.update() + vim.fn.mkdir(vim.fn.fnamemodify(Config.options.lockfile, ":p:h"), "p") local f = assert(io.open(Config.options.lockfile, "w")) f:write("{\n") M.lock = {} From 488b48779c1ee6fb4a0d69e31a6c58784cceb403 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 08:08:07 +0100 Subject: [PATCH 0328/1610] fix(git): remove --also-filter-submodules. Fixes #86 #83 --- lua/lazy/manage/task/git.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 9fdbd12..278d19b 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -57,7 +57,6 @@ M.clone = { self.plugin.url, "--filter=blob:none", "--recurse-submodules", - "--also-filter-submodules", "--single-branch", "--progress", } From 63418e89329ae5625f022d5d1eaac09478ebe13d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Dec 2022 07:08:53 +0000 Subject: [PATCH 0329/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 7ff847e..6df82a9 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 21 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 22 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From dd9648f8ec6526ac376f3ffa85062f6a21385f4d Mon Sep 17 00:00:00 2001 From: EdenEast Date: Thu, 22 Dec 2022 02:09:28 -0500 Subject: [PATCH 0330/1610] fix(clean): update lockfile on clean (#88) --- lua/lazy/manage/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 44f7179..ea03c54 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -153,7 +153,9 @@ function M.clean(opts) return M.run({ pipeline = { "fs.clean" }, plugins = Config.to_clean, - }, opts) + }, opts):wait(function() + require("lazy.manage.lock").update() + end) end function M.clear() From 63042310f4eaae19ff8a46dfd2ef931c1f498b0f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 09:09:35 +0100 Subject: [PATCH 0331/1610] feat(ui): show modpaths in debug --- lua/lazy/view/render.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index bf67683..66e7ca3 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -513,7 +513,11 @@ function M:debug() local Cache = require("lazy.core.cache") Util.foreach(Cache.cache, function(modname, entry) local kb = math.floor(#entry.chunk / 10.24) / 100 - self:append("● ", "LazySpecial", { indent = 2 }):append(modname):append(" " .. kb .. "Kb", "Bold"):nl() + self:append("● ", "LazySpecial", { indent = 2 }):append(modname):append(" " .. kb .. "Kb", "Bold") + if entry.modpath ~= modname then + self:append(" " .. vim.fn.fnamemodify(entry.modpath, ":p:~:."), "Comment") + end + self:nl() end) end From 22002841653574d57cef7a3137303a25da0796f6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 09:10:11 +0100 Subject: [PATCH 0332/1610] fix(cache): overwrite cache entry with new modpath when loading a file. Fixes #90 --- lua/lazy/core/cache.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index c710412..960f449 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -126,6 +126,7 @@ function M.load(modkey, modpath) local entry = M.cache[modkey] if entry then + entry.modpath = modpath entry.used = os.time() if M.eq(entry.hash, hash) then -- found in cache and up to date From 28f1511e0a19d41f9c5e53a64ece257449681b4d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 09:12:06 +0100 Subject: [PATCH 0333/1610] fix: show mapleader warning with vim.schedule. Fixes #91 --- lua/lazy/manage/reloader.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index 882327a..23c8863 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -65,7 +65,9 @@ function M.check(start) end if Loader.init_done and Config.mapleader ~= vim.g.mapleader then - require("lazy.core.util").warn("You need to set `vim.g.mapleader` **BEFORE** loading lazy") + vim.schedule(function() + require("lazy.core.util").warn("You need to set `vim.g.mapleader` **BEFORE** loading lazy") + end) Config.mapleader = vim.g.mapleader end From 1c07ea15a37442b7d07dcce9791c497c343ee853 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 10:32:21 +0100 Subject: [PATCH 0334/1610] feat(keys): more advanced options for setting lazy key mappings --- README.md | 73 ++++++++++++++++++++++----------- lua/lazy/core/handler/keys.lua | 74 +++++++++++++++++++++++++--------- lua/lazy/util.lua | 2 +- lua/lazy/view/render.lua | 8 +++- 4 files changed, 111 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 2d91ff2..3fb6069 100644 --- a/README.md +++ b/README.md @@ -78,29 +78,29 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | -| **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 laz-loading handlers triggers | -| **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | -| **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **config** | `fun(LazyPlugin)` | `config` is executed when the plugin loads | -| **build** | `fun(LazyPlugin)` | `build` is executed when a plugin is installed or updated | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | -| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | -| **event** | `string?` or `string[]` | Lazy-load on event | -| **cmd** | `string?` or `string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this lua module when it's required somewhere | +| Property | Type | Description | +| ---------------- | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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` | +| **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 laz-loading handlers triggers | +| **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | +| **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **config** | `fun(LazyPlugin)` | `config` is executed when the plugin loads | +| **build** | `fun(LazyPlugin)` | `build` is executed when a plugin is installed or updated | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | +| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | +| **event** | `string?` or `string[]` | Lazy-load on event | +| **cmd** | `string?` or `string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this lua module when it's required somewhere | ### Lazy Loading @@ -124,6 +124,33 @@ Plugins will be lazy-loaded when one of the following is `true`: - it defines an `init` method - `config.defaults.lazy == true` +#### ⌨️ Lazy Key Mappings + +The `keys` property can be a `string` or `string[]` for simple normal-mode mappings, or it +can be a `LazyKeys` table with the following key-value pairs: + +- **[1]**: (`string`) lhs **_(required)_** +- **[2]**: (`string|fun()`) rhs **_(optional)_** +- **mode**: (`string|string[]`) mode **_(optional, defaults to `"n"`)_** +- 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" }, + }, + config = function() + require("neo-tree").setup() + end, +} +``` + ### Versioning If you want to install a specific revision of a plugin, you can use `commit`, diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index e6bf6f2..e65120d 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -1,32 +1,66 @@ local Util = require("lazy.core.util") local Loader = require("lazy.core.loader") +---@class LazyKeys +---@field [1] string lhs +---@field [2]? string|fun() rhs +---@field desc? string +---@field mode? string|string[] +---@field noremap? boolean +---@field remap? boolean +---@field expr? boolean + ---@class LazyKeysHandler:LazyHandler local M = {} ----@param keys string -function M:_add(keys) - vim.keymap.set("n", keys, function() - vim.keymap.del("n", keys) - Util.track({ keys = keys }) - Loader.load(self.active[keys], { keys = keys }) - local extra = "" - while true do - local c = vim.fn.getchar(0) - if c == 0 then - break - end - extra = extra .. vim.fn.nr2char(c) +function M.retrigger(keys) + local pending = "" + while true do + local c = vim.fn.getchar(0) + if c == 0 then + break end - local feed = vim.api.nvim_replace_termcodes(keys .. extra, true, true, true) - vim.api.nvim_feedkeys(feed, "m", false) - Util.track() - end, { silent = true }) + pending = pending .. vim.fn.nr2char(c) + end + local feed = vim.api.nvim_replace_termcodes(keys .. pending, true, true, true) + vim.api.nvim_feedkeys(feed, "m", false) end ----@param keys string -function M:_del(keys) - pcall(vim.keymap.del, "n", keys) +---@param value string|LazyKeys +function M.parse(value) + return (type(value) == "string" and { value } or value) --[[@as LazyKeys]] +end + +function M.opts(keys) + local opts = {} + for k, v in pairs(keys) do + if type(k) ~= "number" and k ~= "mode" then + opts[k] = v + end + end + return opts +end + +---@param value string|LazyKeys +function M:_add(value) + local keys = M.parse(value) + local lhs = keys[1] + vim.keymap.set(keys.mode or "n", lhs, function() + Util.track({ keys = lhs }) + self:_del(value) + Loader.load(self.active[value], { keys = lhs }) + M.retrigger(lhs) + Util.track() + end, M.opts(keys)) +end + +---@param value string|LazyKeys +function M:_del(value) + local keys = M.parse(value) + pcall(vim.keymap.del, "n", keys[1]) + if keys[2] then + vim.keymap.set(keys.mode or "n", keys[1], keys[2], M.opts(keys)) + end end return M diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index fdff2ad..0dbe496 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -156,7 +156,7 @@ end function M.foreach(t, fn) ---@type string[] local keys = vim.tbl_keys(t) - table.sort(keys) + pcall(table.sort, keys) for _, key in ipairs(keys) do fn(key, t[key]) end diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 66e7ca3..d0a9800 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -272,6 +272,9 @@ function M:reason(reason, opts) if key == "event" then value = value:match("User (.*)") or value end + if key == "keys" then + value = type(value) == "string" and value or value[1] + end local hl = "LazyHandler" .. key:sub(1, 1):upper() .. key:sub(2) local icon = Config.options.ui.icons[key] if icon then @@ -493,13 +496,14 @@ function M:debug() ) :nl() - Util.foreach(require("lazy.core.handler").handlers, function(type, handler) + Util.foreach(require("lazy.core.handler").handlers, function(handler_type, handler) Util.foreach(handler.active, function(value, plugins) + value = type(value) == "table" and value[1] or value if not vim.tbl_isempty(plugins) then plugins = vim.tbl_values(plugins) table.sort(plugins) self:append("● ", "LazySpecial", { indent = 2 }) - self:reason({ [type] = value }) + self:reason({ [handler_type] = value }) for _, plugin in pairs(plugins) do self:append(" ") self:reason({ plugin = plugin }) From a8fe63e4d5c08807d6c7d4d46c8adc8a0f88b0b3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Dec 2022 09:33:10 +0000 Subject: [PATCH 0335/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 79 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 22 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6df82a9..c763f12 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -109,28 +109,28 @@ It is recommended to run `:checkhealth lazy` after installation PLUGIN SPEC *lazy.nvim-plugin-spec* -│ Property │ Type │ Description │ -│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ -│**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 │ -│**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 laz-loading handlers triggers │ -│**enabled** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be used │ -│**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ -│**init** │fun(LazyPlugin) │init functions are always executed during startup │ -│**config** │fun(LazyPlugin) │config is executed when the plugin loads │ -│**build** │fun(LazyPlugin) │build is executed when a plugin is installed or updated │ -│**branch** │string? │Branch of the repository │ -│**tag** │string? │Tag of the repository │ -│**commit** │string? │Commit of the repository │ -│**version** │string? │Version to use from the repository. Full Semver ranges are supported │ -│**pin** │boolean? │When true, this plugin will not be included in updates │ -│**event** │string? or string[] │Lazy-load on event │ -│**cmd** │string? or string[] │Lazy-load on command │ -│**ft** │string? or string[] │Lazy-load on filetype │ -│**keys** │string? or string[] │Lazy-load on key mapping │ -│**module** │false? │Do not automatically load this lua module when it’s required somewhere │ +│ Property │ Type │ Description │ +│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ +│**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 │ +│**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 laz-loading handlers triggers │ +│**enabled** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be used │ +│**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ +│**init** │fun(LazyPlugin) │init functions are always executed during startup │ +│**config** │fun(LazyPlugin) │config is executed when the plugin loads │ +│**build** │fun(LazyPlugin) │build is executed when a plugin is installed or updated │ +│**branch** │string? │Branch of the repository │ +│**tag** │string? │Tag of the repository │ +│**commit** │string? │Commit of the repository │ +│**version** │string? │Version to use from the repository. Full Semver ranges are supported │ +│**pin** │boolean? │When true, this plugin will not be included in updates │ +│**event** │string? or string[] │Lazy-load on event │ +│**cmd** │string? or string[] │Lazy-load on command │ +│**ft** │string? or string[] │Lazy-load on filetype │ +│**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ +│**module** │false? │Do not automatically load this lua module when it’s required somewhere │ LAZY LOADING ~ @@ -159,6 +159,41 @@ Plugins will be lazy-loaded when one of the following is `true`: - `config.defaults.lazy == true` + *lazy.nvim-Lazy-Key-Mappings* + +Lazy Key Mappings The `keys` property can be a `string` or + `string[]` for simple normal-mode + mappings, or it can be a `LazyKeys` + table with the following key-value + pairs: + + + +- **[1]**: (`string`) lhs **_(required)_** +- **[2]**: (`string|fun()`) rhs **_(optional)_** +- **mode**: (`string|string[]`) mode **_(optional, defaults to `"n"`)_** +- 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" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + VERSIONING ~ If you want to install a specific revision of a plugin, you can use `commit`, From c0c2e1bd68b48610cdca1d3e6a540fd68fc36527 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 10:36:56 +0100 Subject: [PATCH 0336/1610] fix(cmd): allow ranges. Fixes #93 --- lua/lazy/core/handler/cmd.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index 267e338..d10bd4b 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -26,6 +26,7 @@ function M:_add(cmd) ) end, { bang = true, + range = true, nargs = "*", complete = function(_, line) self:_load(cmd) From 3415a61789d319fb9ee37ee6e273bbf3c623b4a5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 10:45:45 +0100 Subject: [PATCH 0337/1610] fix(ui): properly wrap ui elements on small screens. Fixes #92 --- lua/lazy/view/init.lua | 2 +- lua/lazy/view/render.lua | 3 ++- lua/lazy/view/text.lua | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 1808ab4..b2fcbb9 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -122,7 +122,7 @@ function M.show(mode) callback = close, }) - local render = Render.new(buf, win, 2) + local render = Render.new(buf, win, 2, opts.width) local update = Util.throttle(Config.options.ui.throttle, function() if buf and vim.api.nvim_buf_is_valid(buf) then vim.bo[buf].modifiable = true diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index d0a9800..4e2f781 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -19,11 +19,12 @@ local Text = require("lazy.view.text") ---@field _details? string local M = setmetatable({}, { __index = Text }) -function M.new(buf, win, padding) +function M.new(buf, win, padding, wrap) local self = setmetatable({}, { __index = M }) self.buf = buf self.win = win self.padding = padding or 0 + self.wrap = wrap return self end diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index 974e3de..2d8567f 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -6,6 +6,7 @@ local Config = require("lazy.core.config") ---@class Text ---@field _lines TextSegment[][] ---@field padding number +---@field wrap number local Text = {} function Text.new() @@ -37,6 +38,9 @@ function Text:append(str, hl, opts) if l > 1 then self:nl() end + if self:col() > 0 and self:col() + vim.fn.strwidth(line) + self.padding > self.wrap then + self:nl() + end table.insert(self._lines[#self._lines], { str = line, hl = hl, From 210d1703ecc695878f942e594450196b26cf389f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 22 Dec 2022 10:46:27 +0100 Subject: [PATCH 0338/1610] chore(main): release 6.0.0 (#76) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e68ec46..163c173 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## [6.0.0](https://github.com/folke/lazy.nvim/compare/v5.2.0...v6.0.0) (2022-12-22) + + +### ⚠ BREAKING CHANGES + +* lazy api commands now take an opts table instead of a list of plugins + +### Features + +* added support for `nvim --headless "+Lazy! sync" +qa` ([2e14a2f](https://github.com/folke/lazy.nvim/commit/2e14a2f3243e2979e00405fe417bc530bf1e8ca3)) +* **checker:** defer checker to after VeryLazy to make sure nvim-notify and others are loaded ([fd1fbef](https://github.com/folke/lazy.nvim/commit/fd1fbefc3df2b8e92209ed932144edc49877c41e)) +* **keys:** more advanced options for setting lazy key mappings ([1c07ea1](https://github.com/folke/lazy.nvim/commit/1c07ea15a37442b7d07dcce9791c497c343ee853)) +* lazy api commands now take an opts table instead of a list of plugins ([bc61747](https://github.com/folke/lazy.nvim/commit/bc617474a0bbd9a2e8ec68fd97e09c1682be7ff9)) +* **ui:** show modpaths in debug ([6304231](https://github.com/folke/lazy.nvim/commit/63042310f4eaae19ff8a46dfd2ef931c1f498b0f)) + + +### Bug Fixes + +* **cache:** overwrite cache entry with new modpath when loading a file. Fixes [#90](https://github.com/folke/lazy.nvim/issues/90) ([2200284](https://github.com/folke/lazy.nvim/commit/22002841653574d57cef7a3137303a25da0796f6)) +* **clean:** update lockfile on clean ([#88](https://github.com/folke/lazy.nvim/issues/88)) ([dd9648f](https://github.com/folke/lazy.nvim/commit/dd9648f8ec6526ac376f3ffa85062f6a21385f4d)) +* **cmd:** allow ranges. Fixes [#93](https://github.com/folke/lazy.nvim/issues/93) ([c0c2e1b](https://github.com/folke/lazy.nvim/commit/c0c2e1bd68b48610cdca1d3e6a540fd68fc36527)) +* **git:** make sure we properly fetch git submodules. Fixes [#72](https://github.com/folke/lazy.nvim/issues/72) ([7f6f31d](https://github.com/folke/lazy.nvim/commit/7f6f31d66f2aba99fad86a64789b7d5d3e61a2cb)) +* **git:** remove --also-filter-submodules. Fixes [#86](https://github.com/folke/lazy.nvim/issues/86) [#83](https://github.com/folke/lazy.nvim/issues/83) ([488b487](https://github.com/folke/lazy.nvim/commit/488b48779c1ee6fb4a0d69e31a6c58784cceb403)) +* **install:** update lockfile also on install ([4cf176b](https://github.com/folke/lazy.nvim/commit/4cf176bdabbd1a18a20b3b4a608175fb1ba3250e)) +* removed spell again from site. not needed. can download in config/spell ([58f0876](https://github.com/folke/lazy.nvim/commit/58f0876e81881c487ea10e393fa828a1c45c74f4)) +* **rtp:** keep site in rtp ([94d0125](https://github.com/folke/lazy.nvim/commit/94d012511d19a4438c0098fff000a6d63198f2c8)) +* show mapleader warning with vim.schedule. Fixes [#91](https://github.com/folke/lazy.nvim/issues/91) ([28f1511](https://github.com/folke/lazy.nvim/commit/28f1511e0a19d41f9c5e53a64ece257449681b4d)) + ## [5.2.0](https://github.com/folke/lazy.nvim/compare/v5.1.0...v5.2.0) (2022-12-21) From 07b467738d3ca0863e957a2bca86825f6aff92df Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 13:49:00 +0100 Subject: [PATCH 0339/1610] feat(loader): automatically lazy-load colorschemes --- README.md | 4 ++++ lua/lazy/core/loader.lua | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/README.md b/README.md index 3fb6069..14a0403 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ - 🔎 Automatically check for updates - 📋 Commit, branch, tag, version, and full [Semver](https://devhints.io/semver) support - 📈 Statusline component to see the number of pending updates +- 🎨 Automatically lazy-loads colorschemes ## ⚡️ Requirements @@ -112,6 +113,9 @@ module of plugin `A`, then plugin `A` will be loaded on demand as expected. If you don't want this behavior for a certain plugin, you can specify that with `module=false`. You can then manually load the plugin with `:Lazy load foobar.nvim`. +Colorscheme plugins can be configured with `lazy=true`. The plugin will automagically load +when doing `colorscheme foobar`. + You can configure **lazy.nvim** to lazy-load all plugins by default with `config.defaults.lazy = true`. Additionally, you can also lazy-load on **events**, **commands**, diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c4b0df2..2e66930 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -37,6 +37,12 @@ function M.setup() M.disabled_rtp_plugins[file] = true end + vim.api.nvim_create_autocmd("ColorSchemePre", { + callback = function(event) + M.colorscheme(event.match) + end, + }) + -- autoload opt plugins table.insert(package.loaders, M.autoload) end @@ -191,6 +197,22 @@ function M.source(path) Util.track() end +function M.colorscheme(name) + if vim.tbl_contains(vim.fn.getcompletion("", "color"), name) then + return + end + for _, plugin in pairs(Config.plugins) do + if not plugin._.loaded then + for _, ext in ipairs({ "lua", "vim" }) do + local path = plugin.dir .. "/colors/" .. name .. "." .. ext + if vim.loop.fs_stat(path) then + return M.load(plugin, { colorscheme = name }) + end + end + end + end +end + -- This loader is added as the very last one. -- This only hits when the modname is not cached and -- even then only once per plugin. So pretty much never. From eb01b6dc0b651a57c61b3219bcf985fb1b6a54b4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Dec 2022 12:50:12 +0000 Subject: [PATCH 0340/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c763f12..e69c291 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -48,6 +48,7 @@ FEATURES *lazy.nvim-features* - 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* @@ -144,6 +145,9 @@ If you don’t want this behavior for a certain plugin, you can specify that with `module=false`. You can then manually load the plugin with `:Lazy load foobar.nvim`. +Colorscheme plugins can be configured with `lazy=true`. The plugin will +automagically load when doing `colorscheme foobar`. + You can configure **lazy.nvim** to lazy-load all plugins by default with `config.defaults.lazy = true`. From 4bf771a6b255fd91b2e16a21da20d55f7f274f05 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 16:36:07 +0100 Subject: [PATCH 0341/1610] feat(spec): allow using plugin names in dependencies --- lua/lazy/core/plugin.lua | 18 +++- tests/core/plugin_spec.lua | 166 ++++++++++++++++++++++++++++++++++++- 2 files changed, 179 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 1a6d439..fbd676d 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -50,6 +50,7 @@ local M = {} ---@class LazySpecLoader ---@field plugins table +---@field errors string[] local Spec = {} M.Spec = Spec @@ -57,6 +58,7 @@ M.Spec = Spec function Spec.new(spec) local self = setmetatable({}, { __index = Spec }) self.plugins = {} + self.errors = {} if spec then self:normalize(spec) end @@ -100,7 +102,7 @@ function Spec:add(plugin, is_dep) plugin.dir = Config.options.root .. "/" .. plugin.name end else - Util.error("Invalid plugin spec " .. vim.inspect(plugin)) + self:error("Invalid plugin spec " .. vim.inspect(plugin)) end plugin.event = type(plugin.event) == "string" and { plugin.event } or plugin.event @@ -116,13 +118,23 @@ function Spec:add(plugin, is_dep) return self.plugins[plugin.name] end +function Spec:error(error) + self.errors[#self.errors + 1] = error + Util.error(error) +end + ---@param spec LazySpec ---@param results? string[] ---@param is_dep? boolean function Spec:normalize(spec, results, is_dep) results = results or {} if type(spec) == "string" then - table.insert(results, self:add({ spec }, is_dep).name) + if is_dep and not spec:find("/", 1, true) then + -- spec is a plugin name + table.insert(results, spec) + else + table.insert(results, self:add({ spec }, is_dep).name) + end elseif #spec > 1 or Util.is_list(spec) then ---@cast spec LazySpec[] for _, s in ipairs(spec) do @@ -160,7 +172,7 @@ function Spec:merge(old, new) ---@diagnostic disable-next-line: no-unknown old[k] = values else - Util.error("Merging plugins is not supported for key `" .. k .. "`\n" .. vim.inspect({ old = old, new = new })) + self:error("Merging plugins is not supported for key `" .. k .. "`\n" .. vim.inspect({ old = old, new = new })) end else ---@diagnostic disable-next-line: no-unknown diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 7973414..132d096 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -26,6 +26,7 @@ describe("plugin spec url/name", function() end local spec = Plugin.Spec.new(test[1]) local plugins = vim.tbl_values(spec.plugins) + assert(#spec.errors == 0) assert.equal(1, #plugins) assert.same(test[2], plugins[1]) end) @@ -41,7 +42,8 @@ describe("plugin spec opt", function() { { { "foo/bar", dependencies = { { "foo/dep1" }, "foo/dep2" } } } }, } for _, test in ipairs(tests) do - local spec = Plugin.Spec.new(test) + local spec = Plugin.Spec.new(vim.deepcopy(test)) + assert(#spec.errors == 0) Config.plugins = spec.plugins Plugin.update_state() assert(vim.tbl_count(spec.plugins) == 3) @@ -52,12 +54,168 @@ describe("plugin spec opt", function() assert(spec.plugins.dep1.lazy == true) assert(spec.plugins.dep2._.dep == true) assert(spec.plugins.dep2.lazy == true) + spec = Plugin.Spec.new(test) + for _, plugin in pairs(spec.plugins) do + plugin.dir = nil + end + assert.same(spec.plugins, { + bar = { + "foo/bar", + _ = {}, + dependencies = { "dep1", "dep2" }, + name = "bar", + url = "https://github.com/foo/bar.git", + }, + dep1 = { + "foo/dep1", + _ = { + dep = true, + }, + name = "dep1", + url = "https://github.com/foo/dep1.git", + }, + dep2 = { + "foo/dep2", + _ = { + dep = true, + }, + name = "dep2", + url = "https://github.com/foo/dep2.git", + }, + }) end end) + describe("deps", function() + it("handles dep names", function() + Config.options.defaults.lazy = false + local tests = { + { { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } }, "foo/dep1" }, + { "foo/dep1", { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } } }, + } + for _, test in ipairs(tests) do + local spec = Plugin.Spec.new(vim.deepcopy(test)) + assert(#spec.errors == 0) + Config.plugins = spec.plugins + Plugin.update_state() + spec = Plugin.Spec.new(test) + for _, plugin in pairs(spec.plugins) do + plugin.dir = nil + end + assert.same(spec.plugins, { + bar = { + "foo/bar", + _ = {}, + dependencies = { "dep1", "dep2" }, + name = "bar", + url = "https://github.com/foo/bar.git", + }, + dep1 = { + "foo/dep1", + _ = {}, + name = "dep1", + url = "https://github.com/foo/dep1.git", + }, + dep2 = { + "foo/dep2", + _ = { + dep = true, + }, + name = "dep2", + url = "https://github.com/foo/dep2.git", + }, + }) + end + end) + + it("handles opt from dep", function() + Config.options.defaults.lazy = false + local spec = Plugin.Spec.new({ "foo/dep1", { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } } }) + assert(#spec.errors == 0) + Config.plugins = spec.plugins + Plugin.update_state() + assert.same(3, vim.tbl_count(spec.plugins)) + assert(spec.plugins.bar._.dep ~= true) + assert(spec.plugins.bar.lazy == false) + assert(spec.plugins.dep2._.dep == true) + assert(spec.plugins.dep2.lazy == true) + assert(spec.plugins.dep1._.dep ~= true) + assert(spec.plugins.dep1.lazy == false) + end) + + it("handles defaults opt", function() + do + Config.options.defaults.lazy = true + local spec = Plugin.Spec.new({ "foo/bar" }) + assert(#spec.errors == 0) + Config.plugins = spec.plugins + Plugin.update_state() + assert(spec.plugins.bar.lazy == true) + end + do + Config.options.defaults.lazy = false + local spec = Plugin.Spec.new({ "foo/bar" }) + Config.plugins = spec.plugins + Plugin.update_state() + assert(spec.plugins.bar.lazy == false) + end + end) + + it("handles opt from dep", function() + Config.options.defaults.lazy = false + local spec = Plugin.Spec.new({ "foo/bar", event = "foo" }) + assert(#spec.errors == 0) + Config.plugins = spec.plugins + Plugin.update_state() + assert.same(1, vim.tbl_count(spec.plugins)) + assert(spec.plugins.bar._.dep ~= true) + assert(spec.plugins.bar.lazy == true) + end) + + it("merges lazy loaders", function() + local tests = { + { { "foo/bar", event = "mod1" }, { "foo/bar", event = "mod2" } }, + { { "foo/bar", event = { "mod1" } }, { "foo/bar", event = { "mod2" } } }, + { { "foo/bar", event = "mod1" }, { "foo/bar", event = { "mod2" } } }, + } + for _, test in ipairs(tests) do + local spec = Plugin.Spec.new(test) + assert(#spec.errors == 0) + assert(vim.tbl_count(spec.plugins) == 1) + assert(type(spec.plugins.bar.event) == "table") + assert(#spec.plugins.bar.event == 2) + assert(vim.tbl_contains(spec.plugins.bar.event, "mod1")) + assert(vim.tbl_contains(spec.plugins.bar.event, "mod2")) + end + end) + + it("refuses to merge", function() + local spec = Plugin.Spec.new({ + { "foo/dep1", config = 1 }, + { + "foo/bar", + dependencies = { { "foo/dep1", config = 2 }, "foo/dep2" }, + }, + }) + assert(#spec.errors > 0) + end) + + -- it("recursive deps", function() + -- local spec = Plugin.Spec.new({ + -- "nvim-telescope/telescope.nvim", + -- dependencies = { + -- "nvim-lua/plenary.nvim", + -- { "nvim-telescope/telescope-fzf-native.nvim", build = "make" }, + -- { "nvim-telescope/telescope-frecency.nvim", dependencies = "kkharji/sqlite.lua" }, + -- }, + -- }) + -- end) + end) + it("handles opt from dep", function() Config.options.defaults.lazy = false local spec = Plugin.Spec.new({ "foo/dep1", { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } } }) + assert(#spec.errors == 0) Config.plugins = spec.plugins Plugin.update_state() assert.same(3, vim.tbl_count(spec.plugins)) @@ -73,6 +231,7 @@ describe("plugin spec opt", function() do Config.options.defaults.lazy = true local spec = Plugin.Spec.new({ "foo/bar" }) + assert(#spec.errors == 0) Config.plugins = spec.plugins Plugin.update_state() assert(spec.plugins.bar.lazy == true) @@ -89,6 +248,7 @@ describe("plugin spec opt", function() it("handles opt from dep", function() Config.options.defaults.lazy = false local spec = Plugin.Spec.new({ "foo/bar", event = "foo" }) + assert(#spec.errors == 0) Config.plugins = spec.plugins Plugin.update_state() assert.same(1, vim.tbl_count(spec.plugins)) @@ -104,6 +264,7 @@ describe("plugin spec opt", function() } for _, test in ipairs(tests) do local spec = Plugin.Spec.new(test) + assert(#spec.errors == 0) assert(vim.tbl_count(spec.plugins) == 1) assert(type(spec.plugins.bar.event) == "table") assert(#spec.plugins.bar.event == 2) @@ -113,13 +274,14 @@ describe("plugin spec opt", function() end) it("refuses to merge", function() - Plugin.Spec.new({ + local spec = Plugin.Spec.new({ { "foo/dep1", config = 1 }, { "foo/bar", dependencies = { { "foo/dep1", config = 2 }, "foo/dep2" }, }, }) + assert(#spec.errors > 0) end) -- it("recursive deps", function() From 42f5aa76e21ec34b3d7fc79218e5069610d7db2e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 17:24:58 +0100 Subject: [PATCH 0342/1610] fix: pass plugins instead of plugin names to command. Fixes #103 --- lua/lazy/view/commands.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 0005848..e6f1945 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -83,7 +83,9 @@ function M.setup() local opts = { wait = cmd.bang == true } local prefix, args = M.parse(cmd.args) if #args > 0 then - opts.plugins = args + opts.plugins = vim.tbl_map(function(plugin) + return Config.plugins[plugin] + end, args) end M.cmd(prefix, opts) end, { From 56890ce5f439e9bbf275ed5ec2573b4e29371bb5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 17:49:32 +0100 Subject: [PATCH 0343/1610] fix: remove lazy keymaps with the correct mode. Fixes #97 --- lua/lazy/core/handler/keys.lua | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index e65120d..3b6b431 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -28,7 +28,10 @@ end ---@param value string|LazyKeys function M.parse(value) - return (type(value) == "string" and { value } or value) --[[@as LazyKeys]] + local ret = vim.deepcopy(value) + ret = (type(ret) == "string" and { ret } or ret) --[[@as LazyKeys]] + ret.mode = ret.mode or "n" + return ret end function M.opts(keys) @@ -45,21 +48,24 @@ end function M:_add(value) local keys = M.parse(value) local lhs = keys[1] - vim.keymap.set(keys.mode or "n", lhs, function() + local opts = M.opts(keys) + opts.noremap = false + vim.keymap.set(keys.mode, lhs, function() Util.track({ keys = lhs }) self:_del(value) Loader.load(self.active[value], { keys = lhs }) M.retrigger(lhs) Util.track() - end, M.opts(keys)) + end, opts) end ---@param value string|LazyKeys function M:_del(value) local keys = M.parse(value) - pcall(vim.keymap.del, "n", keys[1]) + vim.pretty_print(keys) + pcall(vim.keymap.del, keys.mode, keys[1]) if keys[2] then - vim.keymap.set(keys.mode or "n", keys[1], keys[2], M.opts(keys)) + vim.keymap.set(keys.mode, keys[1], keys[2], M.opts(keys)) end end From 4b4ccdb16a6ec14825e40605cb820b3d2582bddf Mon Sep 17 00:00:00 2001 From: Wil Thomason Date: Thu, 22 Dec 2022 11:15:47 -0600 Subject: [PATCH 0344/1610] docs: Add migration for tag = '*' from packer (#105) * Add migration for tag = '*' from packer Adds a missing migration point from `packer` * Add note about disable vs enabled --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 14a0403..fca7a0c 100644 --- a/README.md +++ b/README.md @@ -568,6 +568,8 @@ For a real-life example, you can check my personal dots: - `opt` ➡️ `lazy` - `run` ➡️ `build` - `lock` ➡️ `pin` +- `disable = true` ➡️ `enabled = false` +- `tag = '*'`/other uses of SemVer ➡️ 'version` - `module` is auto-loaded. No need to specify ### [paq-nvim](https://github.com/savq/paq-nvim) From fb8287c73d9a169e7cdb5d41a43e38183ba285fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Dec 2022 17:16:41 +0000 Subject: [PATCH 0345/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e69c291..358c845 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -627,6 +627,8 @@ PACKER.NVIM ~ - `opt` `lazy` - `run` `build` - `lock` `pin` +- `disable = true` `enabled = false` +- `tag = ''`/other uses of SemVer ’version` - `module` is auto-loaded. No need to specify From 2756a6f756758d62eeb4cac64d8c5efbc8878cd1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 18:46:43 +0100 Subject: [PATCH 0346/1610] fix!: run `init()` before loading start plugins. Fixes #107 --- README.md | 8 +++--- lua/lazy/core/loader.lua | 60 ++++++++++++++++++++-------------------- lua/lazy/core/plugin.lua | 2 +- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index fca7a0c..a3da113 100644 --- a/README.md +++ b/README.md @@ -511,10 +511,10 @@ startup sequence for more flexibility and better performance. In practice this means that step 10 of [Neovim Initialization](https://neovim.io/doc/user/starting.html#initialization) is done by Lazy: -1. all plugins with `lazy=false` are loaded. This includes sourcing `/plugin` and `/ftdetect` files. (`/after` will not be sourced yet) -2. all files from `/plugin` and `/ftdetect` directories in you rtp are sourced (excluding `/after`) -3. all `/after/plugin` files are sourced (this inludes `/after` from plugins) -4. all the plugins' `init()` functions are executed +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 you rtp are sourced (excluding `/after`) +4. all `/after/plugin` files are sourced (this inludes `/after` from plugins) Files from runtime directories are always sourced in alphabetical order. diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 2e66930..2da7f97 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -58,36 +58,7 @@ function M.startup() -- backup original rtp local rtp = vim.opt.rtp:get() - -- 1. load start plugin - Util.track({ start = "start" }) - for _, plugin in pairs(Config.plugins) do - if plugin.lazy == false then - M.load(plugin, { start = "start" }) - end - end - Util.track() - - -- 2. load plugins from rtp, excluding after - Util.track({ start = "rtp plugins" }) - for _, path in ipairs(rtp) do - if not path:find("after/?$") then - M.packadd(path) - end - end - Util.track() - - -- 3. load after plugins - Util.track({ start = "after" }) - for _, path in ipairs(vim.opt.rtp:get()) do - if path:find("after/?$") then - M.source_runtime(path, "plugin") - end - end - Util.track() - - M.init_done = true - - -- 4. run plugin init + -- 1. run plugin init Util.track({ start = "init" }) for _, plugin in pairs(Config.plugins) do if plugin.init then @@ -98,6 +69,35 @@ function M.startup() end Util.track() + -- 2. load start plugin + Util.track({ start = "start" }) + for _, plugin in pairs(Config.plugins) do + if plugin.lazy == false and not plugin._.loaded then + M.load(plugin, { start = "start" }) + end + end + Util.track() + + -- 3. load plugins from rtp, excluding after + Util.track({ start = "rtp plugins" }) + for _, path in ipairs(rtp) do + if not path:find("after/?$") then + M.packadd(path) + end + end + Util.track() + + -- 4. load after plugins + Util.track({ start = "after" }) + for _, path in ipairs(vim.opt.rtp:get()) do + if path:find("after/?$") then + M.source_runtime(path, "plugin") + end + end + Util.track() + + M.init_done = true + Util.track() end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index fbd676d..844db73 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -18,7 +18,7 @@ local M = {} ---@class LazyPluginHooks ---@field init? fun(LazyPlugin) Will always be run ----@field config? fun(LazyPlugin) Will be executed when loading the plugin +---@field config? fun(LazyPlugin)|true|table Will be executed when loading the plugin ---@field build? string|fun(LazyPlugin) ---@class LazyPluginHandlers: table From 455a1f485bd0581663018c9d7795a002d791ddb9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Dec 2022 17:48:24 +0000 Subject: [PATCH 0347/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 358c845..905cccb 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -555,10 +555,10 @@ sequence for more flexibility and better performance. In practice this means that step 10 of |Neovim Initialization| is done by Lazy: -1. all plugins with `lazy=false` are loaded. This includes sourcing `/plugin` and `/ftdetect` files. (`/after` will not be sourced yet) -2. all files from `/plugin` and `/ftdetect` directories in you rtp are sourced (excluding `/after`) -3. all `/after/plugin` files are sourced (this inludes `/after` from plugins) -4. all the plugins’ `init()` functions are executed +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 you rtp are sourced (excluding `/after`) +4. all `/after/plugin` files are sourced (this inludes `/after` from plugins) Files from runtime directories are always sourced in alphabetical order. From 08d458c5ba595c3ae2801215abf2d5cc09aca211 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 18:50:27 +0100 Subject: [PATCH 0348/1610] fix: remove debug print --- lua/lazy/core/handler/keys.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 3b6b431..4684625 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -62,7 +62,6 @@ end ---@param value string|LazyKeys function M:_del(value) local keys = M.parse(value) - vim.pretty_print(keys) pcall(vim.keymap.del, keys.mode, keys[1]) if keys[2] then vim.keymap.set(keys.mode, keys[1], keys[2], M.opts(keys)) From 72b38999bc547a96c769d1de964a846570cfe5d1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 18:53:19 +0100 Subject: [PATCH 0349/1610] fix(keys): dont delete handlers manually. Let loader do that --- lua/lazy/core/handler/keys.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 4684625..4e01463 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -52,7 +52,6 @@ function M:_add(value) opts.noremap = false vim.keymap.set(keys.mode, lhs, function() Util.track({ keys = lhs }) - self:_del(value) Loader.load(self.active[value], { keys = lhs }) M.retrigger(lhs) Util.track() From 9e869a409c84771f506306baabb407683267f4db Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 21:02:49 +0100 Subject: [PATCH 0350/1610] docs: migration --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a3da113..a8201de 100644 --- a/README.md +++ b/README.md @@ -568,8 +568,8 @@ For a real-life example, you can check my personal dots: - `opt` ➡️ `lazy` - `run` ➡️ `build` - `lock` ➡️ `pin` -- `disable = true` ➡️ `enabled = false` -- `tag = '*'`/other uses of SemVer ➡️ 'version` +- `disable=true` ➡️ `enabled = false` +- `tag='*'` ➡️ `version="*"` - `module` is auto-loaded. No need to specify ### [paq-nvim](https://github.com/savq/paq-nvim) From b440b3ac2d6945fab62fbfc2f2dbe9db3d9d9fe2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 21:07:24 +0100 Subject: [PATCH 0351/1610] fix(keys): don't create with remap! --- lua/lazy/core/handler/keys.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 4e01463..840be87 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -49,7 +49,6 @@ function M:_add(value) local keys = M.parse(value) local lhs = keys[1] local opts = M.opts(keys) - opts.noremap = false vim.keymap.set(keys.mode, lhs, function() Util.track({ keys = lhs }) Loader.load(self.active[value], { keys = lhs }) From 037973c6cb78a46fdc0f2cb5555d632fb7321ea5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Dec 2022 20:08:10 +0000 Subject: [PATCH 0352/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 905cccb..6627324 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -627,8 +627,8 @@ PACKER.NVIM ~ - `opt` `lazy` - `run` `build` - `lock` `pin` -- `disable = true` `enabled = false` -- `tag = ''`/other uses of SemVer ’version` +- `disable=true` `enabled = false` +- `tag=''` `version=""` - `module` is auto-loaded. No need to specify From b5d6afc4fa4520a986db4898f6b22b267fc041f9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 21:47:58 +0100 Subject: [PATCH 0353/1610] fix(manage): do not reload pugins on clear --- lua/lazy/manage/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index ea03c54..9353467 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -159,7 +159,6 @@ function M.clean(opts) end function M.clear() - Plugin.load() for _, plugin in pairs(Config.plugins) do plugin._.has_updates = nil plugin._.updated = nil From 3f60f2dc13faf4d958fdaec16596436ade2ec23d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 21:58:01 +0100 Subject: [PATCH 0354/1610] fix(keys): key handlers were not working after reload --- lua/lazy/core/handler/init.lua | 21 ++++++++++++++------- lua/lazy/core/handler/keys.lua | 23 +++++++++++++++++++++-- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index 4cca808..99568f4 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -67,25 +67,32 @@ function M:_add(value) end ---@protected function M:_del(value) end +---@return string +function M:key(value) + return value +end + ---@param plugin LazyPlugin function M:add(plugin) for _, value in ipairs(plugin[self.type] or {}) do - if not self.active[value] then - self.active[value] = {} + local key = self:key(value) + if not self.active[key] then + self.active[key] = {} self:_add(value) end - self.active[value][plugin.name] = plugin.name + self.active[key][plugin.name] = plugin.name end end ---@param plugin LazyPlugin function M:del(plugin) for _, value in ipairs(plugin[self.type] or {}) do - if self.active[value] and self.active[value][plugin.name] then - self.active[value][plugin.name] = nil - if vim.tbl_isempty(self.active[value]) then + local key = self:key(value) + if self.active[key] and self.active[key][plugin.name] then + self.active[key][plugin.name] = nil + if vim.tbl_isempty(self.active[key]) then self:_del(value) - self.active[value] = nil + self.active[key] = nil end end end diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 840be87..a6eb9ee 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -29,7 +29,7 @@ end ---@param value string|LazyKeys function M.parse(value) local ret = vim.deepcopy(value) - ret = (type(ret) == "string" and { ret } or ret) --[[@as LazyKeys]] + ret = type(ret) == "string" and { ret } or ret --[[@as LazyKeys]] ret.mode = ret.mode or "n" return ret end @@ -44,14 +44,33 @@ function M.opts(keys) return opts end +---@return string +function M:key(value) + if type(value) == "string" then + return value + end + local mode = value.mode or { "n" } + if type(mode) == "string" then + mode = { mode } + end + ---@type string + local ret = value[1] + if #mode > 0 then + ret = table.concat(mode, ",") .. ": " .. ret + end + return ret +end + ---@param value string|LazyKeys function M:_add(value) local keys = M.parse(value) local lhs = keys[1] local opts = M.opts(keys) + opts.noremap = true vim.keymap.set(keys.mode, lhs, function() + pcall(vim.keymap.del, keys.mode, lhs) Util.track({ keys = lhs }) - Loader.load(self.active[value], { keys = lhs }) + Loader.load(self.active[self:key(value)], { keys = lhs }) M.retrigger(lhs) Util.track() end, opts) From 9e983898b131d4975680bbda023224bb90a32daf Mon Sep 17 00:00:00 2001 From: Sebastian Lyng Johansen Date: Thu, 22 Dec 2022 22:01:01 +0100 Subject: [PATCH 0355/1610] fix(ui): fix buffer being properly deleted (#112) --- lua/lazy/view/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index b2fcbb9..e82f644 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -102,12 +102,12 @@ function M.show(mode) M._buf = nil vim.diagnostic.reset(Config.ns, buf) vim.schedule(function() - if vim.api.nvim_buf_is_valid(buf) then - vim.api.nvim_buf_delete(buf, { force = true }) - end if vim.api.nvim_win_is_valid(win) then vim.api.nvim_win_close(win, true) end + if vim.api.nvim_buf_is_valid(buf) then + vim.api.nvim_buf_delete(buf, { force = true }) + end end) end From 2a7b0047dd25f543b147b692fe100e1b2d88ffb2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 22:41:44 +0100 Subject: [PATCH 0356/1610] feat(spec): `config` can be `true` or a `table` that will be passed to `require("plugin").setup(config)` --- README.md | 16 +++++++++++++++- lua/lazy/core/loader.lua | 36 +++++++++++++++++++++++++++++++++++- lua/lazy/core/util.lua | 5 +++++ lua/lazy/example.lua | 14 ++++++++++++++ 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a8201de..491b48b 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ require("lazy").setup({ | **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | | **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | | **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **config** | `fun(LazyPlugin)` | `config` is executed when the plugin loads | +| **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | | **build** | `fun(LazyPlugin)` | `build` is executed when a plugin is installed or updated | | **branch** | `string?` | Branch of the repository | | **tag** | `string?` | Tag of the repository | @@ -202,6 +202,20 @@ return { end, }, + -- the above could also be written as + { + "nvim-neorg/neorg", + ft = "norg", + config = true, -- run require("norg").setup() + }, + + -- or set custom config + { + "nvim-neorg/neorg", + ft = "norg", + config = { foo = "bar" }, -- run require("norg").setup({foo = "bar"}) + }, + { "dstein64/vim-startuptime", -- lazy-load on a command diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 2da7f97..481c02b 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -142,7 +142,7 @@ function M.load(plugins, reason) M.packadd(plugin.dir) if plugin.config then - Util.try(plugin.config, "Failed to run `config` for " .. plugin.name) + M.config(plugin) end plugin._.loaded.time = Util.track().time @@ -154,6 +154,40 @@ function M.load(plugins, reason) end end +--- runs plugin config +---@param plugin LazyPlugin +function M.config(plugin) + local fn + if type(plugin.config) == "function" then + fn = plugin.config + else + local normname = Util.normname(plugin.name) + ---@type table + local mods = {} + Util.ls(plugin.dir .. "/lua", function(_, modname) + modname = modname:gsub("%.lua$", "") + mods[modname] = modname + local modnorm = Util.normname(modname) + -- if we found an exact match, then use that + if modnorm == normname then + mods = { modname } + return false + end + end) + mods = vim.tbl_values(mods) + if #mods == 1 then + fn = function() + require(mods[1]).setup(plugin.config == true and {} or plugin.config) + end + else + return Util.error( + "Lua module not found for config of " .. plugin.name .. ". Please use a `config()` function instead" + ) + end + end + Util.try(fn, "Failed to run `config` for " .. plugin.name) +end + ---@param path string function M.packadd(path) M.source_runtime(path, "plugin") diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 4f79800..3fe7f91 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -27,6 +27,11 @@ function M.track(data, time) end end +---@param name string +function M.normname(name) + return name:lower():gsub("^n?vim%-", ""):gsub("%.n?vim$", ""):gsub("%.lua", ""):gsub("[^a-z]+", "") +end + function M.norm(path) if path:sub(1, 1) == "~" then local home = vim.loop.os_homedir() diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua index cd99e16..e9c2c74 100644 --- a/lua/lazy/example.lua +++ b/lua/lazy/example.lua @@ -16,6 +16,20 @@ return { end, }, + -- the above could also be written as + { + "nvim-neorg/neorg", + ft = "norg", + config = true, -- run require("norg").setup() + }, + + -- or set custom config + { + "nvim-neorg/neorg", + ft = "norg", + config = { foo = "bar" }, -- run require("norg").setup({foo = "bar"}) + }, + { "dstein64/vim-startuptime", -- lazy-load on a command From 6f9845e2f8dcbef4d50bb127a91d071c9be08820 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Dec 2022 21:50:05 +0000 Subject: [PATCH 0357/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6627324..d420356 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -120,7 +120,7 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**enabled** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be used │ │**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ │**init** │fun(LazyPlugin) │init functions are always executed during startup │ -│**config** │fun(LazyPlugin) │config is executed when the plugin loads │ +│**config** │fun(LazyPlugin) or true or table │config is executed when the plugin loads. You can also set to true or pass a table, that will be passed to require("plugin").setup(opts) │ │**build** │fun(LazyPlugin) │build is executed when a plugin is installed or updated │ │**branch** │string? │Branch of the repository │ │**tag** │string? │Tag of the repository │ @@ -242,6 +242,20 @@ EXAMPLES ~ end, }, + -- the above could also be written as + { + "nvim-neorg/neorg", + ft = "norg", + config = true, -- run require("norg").setup() + }, + + -- or set custom config + { + "nvim-neorg/neorg", + ft = "norg", + config = { foo = "bar" }, -- run require("norg").setup({foo = "bar"}) + }, + { "dstein64/vim-startuptime", -- lazy-load on a command From 81126403a89b78e6a75948ba5cea15d9499d2025 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 22 Dec 2022 23:08:06 +0100 Subject: [PATCH 0358/1610] feat!: `init()` no longer implies lazy-loading. Add `lazy=false` for affected plugins --- README.md | 2 -- lua/lazy/core/plugin.lua | 1 - 2 files changed, 3 deletions(-) diff --git a/README.md b/README.md index 491b48b..6406efa 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,6 @@ 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 -- it defines an `init` method - `config.defaults.lazy == true` #### ⌨️ Lazy Key Mappings @@ -244,7 +243,6 @@ return { { "cshuaimin/ssr.nvim", -- init is always executed during startup, but doesn't load the plugin yet. - -- init implies lazy loading init = function() vim.keymap.set({ "n", "x" }, "cR", function() -- this require will automatically load the plugin diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 844db73..90c687e 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -201,7 +201,6 @@ function M.update_state() or plugin.keys or plugin.ft or plugin.cmd - or plugin.init plugin.lazy = lazy and true or false end if plugin.dir:find(Config.options.root, 1, true) == 1 then From e5dcc871491eadc5ed98e633afc519670e71c4a1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Dec 2022 22:09:14 +0000 Subject: [PATCH 0359/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d420356..c15e84d 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -159,7 +159,6 @@ 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 -- it defines an `init` method - `config.defaults.lazy == true` @@ -284,7 +283,6 @@ EXAMPLES ~ { "cshuaimin/ssr.nvim", -- init is always executed during startup, but doesn't load the plugin yet. - -- init implies lazy loading init = function() vim.keymap.set({ "n", "x" }, "cR", function() -- this require will automatically load the plugin From 7b9b476a6238a53062c1c8e4331fcef054bb8761 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 07:35:44 +0100 Subject: [PATCH 0360/1610] fix(install): make sure to setup loaders before attempting install so colorscheme can load. Fixes #122 --- lua/lazy/core/loader.lua | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 481c02b..b749da2 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -11,23 +11,6 @@ M.init_done = false M.disabled_rtp_plugins = { packer_compiled = true } function M.setup() - -- install missing plugins - if Config.options.install.missing then - Util.track("install") - for _, plugin in pairs(Config.plugins) do - if not plugin._.installed then - for _, colorscheme in ipairs(Config.options.install.colorscheme) do - if pcall(vim.cmd.colorscheme, colorscheme) then - break - end - end - require("lazy.manage").install({ wait = true }) - break - end - end - Util.track() - end - -- setup handlers Util.track("handlers") Handler.setup() @@ -45,6 +28,23 @@ function M.setup() -- autoload opt plugins table.insert(package.loaders, M.autoload) + + -- install missing plugins + if Config.options.install.missing then + Util.track("install") + for _, plugin in pairs(Config.plugins) do + if not plugin._.installed then + for _, colorscheme in ipairs(Config.options.install.colorscheme) do + if pcall(vim.cmd.colorscheme, colorscheme) then + break + end + end + require("lazy.manage").install({ wait = true }) + break + end + end + Util.track() + end end -- Startup sequence From 8251c23c90c15ef5197638777f85ef69402a2725 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 07:43:58 +0100 Subject: [PATCH 0361/1610] fix(checker): dont report updates on install during startup --- lua/lazy/manage/checker.lua | 8 ++++++-- lua/lazy/manage/init.lua | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index ba2c359..e0e458f 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -14,7 +14,9 @@ function M.start() M.check() end -function M.fast_check() +---@param opts? {report:boolean} report defaults to true +function M.fast_check(opts) + opts = opts or {} for _, plugin in pairs(Config.plugins) do if not plugin.pin and plugin._.installed then plugin._.has_updates = nil @@ -25,7 +27,9 @@ function M.fast_check() end end end - M.report() + if opts.report ~= false then + M.report() + end end function M.check() diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 9353467..a87d982 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -43,7 +43,7 @@ function M.run(ropts, opts) runner:wait(function() vim.cmd([[do User LazyRender]]) Plugin.update_state() - require("lazy.manage.checker").fast_check() + require("lazy.manage.checker").fast_check({ report = false }) end) if opts.wait then From 004b11d5ad18c05c4f9d40f717c4742d8d95cdb8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 07:48:05 +0100 Subject: [PATCH 0362/1610] docs: improved docs on build. Fixes #119 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6406efa..a465bee 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ require("lazy").setup({ | **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | | **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | | **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | -| **build** | `fun(LazyPlugin)` | `build` is executed when a plugin is installed or updated | +| **build** | `fun(LazyPlugin)` or `string` | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. | | **branch** | `string?` | Branch of the repository | | **tag** | `string?` | Tag of the repository | | **commit** | `string?` | Commit of the repository | From cc6276e9b069b5c0c3bdef27dd029722b13bf17d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 07:48:40 +0100 Subject: [PATCH 0363/1610] refactor!: default lazy cache path is now under cache instead of state --- lua/lazy/core/cache.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 960f449..b2dee51 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -9,7 +9,7 @@ M.VERSION = "1" ---@class LazyCacheConfig M.config = { enabled = true, - path = vim.fn.stdpath("state") .. "/lazy/cache", + path = vim.fn.stdpath("cache") .. "/lazy/cache", -- Once one of the following events triggers, caching will be disabled. -- To cache all modules, set this to `{}`, but that is not recommended. -- The default is to disable on: From 8bd8e6c98a8e9edbfaacdb92ccaa57293987f086 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 23 Dec 2022 06:49:37 +0000 Subject: [PATCH 0364/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c15e84d..abe199e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 22 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 23 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -121,7 +121,7 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ │**init** │fun(LazyPlugin) │init functions are always executed during startup │ │**config** │fun(LazyPlugin) or true or table │config is executed when the plugin loads. You can also set to true or pass a table, that will be passed to require("plugin").setup(opts) │ -│**build** │fun(LazyPlugin) │build is executed when a plugin is installed or updated │ +│**build** │fun(LazyPlugin) or string │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. │ │**branch** │string? │Branch of the repository │ │**tag** │string? │Tag of the repository │ │**commit** │string? │Commit of the repository │ From c8da1c19e7429b9e6c5b0fd518939b47d29c0d2d Mon Sep 17 00:00:00 2001 From: Aaron <79121360+UnrealApex@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:51:03 -0800 Subject: [PATCH 0365/1610] docs: fixed typos and capitalization (#118) * Fix typos and capitialization * Update README.md Co-authored-by: Jonas Strittmatter <40792180+smjonas@users.noreply.github.com> Co-authored-by: Jonas Strittmatter <40792180+smjonas@users.noreply.github.com> --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a465bee..a839e6b 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ require("lazy").setup({ | **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` | -| **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 laz-loading handlers triggers | +| **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 | | **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | | **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | | **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | @@ -101,7 +101,7 @@ require("lazy").setup({ | **cmd** | `string?` or `string[]` | Lazy-load on command | | **ft** | `string?` or `string[]` | Lazy-load on filetype | | **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this lua module when it's required somewhere | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | ### Lazy Loading @@ -493,13 +493,13 @@ 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. -On the other machine, you can do `Lazy restore`, to update all your plugins to -the version from the lockfile +If you are on another machine, you can do `:Lazy restore`, to update all your plugins to +the version from the lockfile. ## ⚡ Performance 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, +During startup, all Lua files used before `VimEnter` or `BufReadPre` are byte-compiled and cached, similar to what [impatient.nvim](https://github.com/lewis6991/impatient.nvim) does. My config for example loads in about `11ms` with `93` plugins. I do a lot of lazy-loading though :) @@ -533,7 +533,7 @@ Files from runtime directories are always sourced in alphabetical order. ## 📂 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. +Instead of passing a spec table to `setup()`, you can use a Lua module. The specs from the **module** and any **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. From 040aeb68f16c1174ad435d3afe054e2e48d628f2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 23 Dec 2022 06:51:44 +0000 Subject: [PATCH 0366/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 52 +++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index abe199e..f8939bb 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -110,28 +110,28 @@ It is recommended to run `:checkhealth lazy` after installation PLUGIN SPEC *lazy.nvim-plugin-spec* -│ Property │ Type │ Description │ -│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ -│**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 │ -│**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 laz-loading handlers triggers │ -│**enabled** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be used │ -│**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ -│**init** │fun(LazyPlugin) │init functions are always executed during startup │ -│**config** │fun(LazyPlugin) or true or table │config is executed when the plugin loads. You can also set to true or pass a table, that will be passed to require("plugin").setup(opts) │ -│**build** │fun(LazyPlugin) or string │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. │ -│**branch** │string? │Branch of the repository │ -│**tag** │string? │Tag of the repository │ -│**commit** │string? │Commit of the repository │ -│**version** │string? │Version to use from the repository. Full Semver ranges are supported │ -│**pin** │boolean? │When true, this plugin will not be included in updates │ -│**event** │string? or string[] │Lazy-load on event │ -│**cmd** │string? or string[] │Lazy-load on command │ -│**ft** │string? or string[] │Lazy-load on filetype │ -│**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ -│**module** │false? │Do not automatically load this lua module when it’s required somewhere │ +│ Property │ Type │ Description │ +│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ +│**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 │ +│**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 │ +│**enabled** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be used │ +│**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ +│**init** │fun(LazyPlugin) │init functions are always executed during startup │ +│**config** │fun(LazyPlugin) or true or table │config is executed when the plugin loads. You can also set to true or pass a table, that will be passed to require("plugin").setup(opts) │ +│**build** │fun(LazyPlugin) or string │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. │ +│**branch** │string? │Branch of the repository │ +│**tag** │string? │Tag of the repository │ +│**commit** │string? │Commit of the repository │ +│**version** │string? │Version to use from the repository. Full Semver ranges are supported │ +│**pin** │boolean? │When true, this plugin will not be included in updates │ +│**event** │string? or string[] │Lazy-load on event │ +│**cmd** │string? or string[] │Lazy-load on command │ +│**ft** │string? or string[] │Lazy-load on filetype │ +│**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ +│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ LAZY LOADING ~ @@ -526,13 +526,13 @@ 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. -On the other machine, you can do `Lazy restore`, to update all your plugins to -the version from the lockfile +If you are on another machine, you can do `:Lazy restore`, to update all your +plugins to the version from the lockfile. PERFORMANCE *lazy.nvim-performance* 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 +as possible. During startup, all Lua files used before `VimEnter` or `BufReadPre` are byte-compiled and cached, similar to what impatient.nvim does. @@ -578,7 +578,7 @@ Files from runtime directories are always sourced in alphabetical order. STRUCTURING YOUR PLUGINS *lazy.nvim-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 +passing a spec table to `setup()`, you can use a Lua module. The specs from the **module** and any **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. From 65e903652bfac5e83d4df8246a29e45c07865c34 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 08:05:27 +0100 Subject: [PATCH 0367/1610] fix: added error message to debug failing extmarks #117 --- lua/lazy/view/text.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index 2d8567f..d756cca 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -1,4 +1,5 @@ local Config = require("lazy.core.config") +local Util = require("lazy.util") ---@alias TextSegment {str: string, hl?:string|Extmark} ---@alias Extmark {hl_group?:string, col?:number, end_col?:number} @@ -86,7 +87,13 @@ function Text:render(buf) local extmark_col = extmark.col or col extmark.col = nil - vim.api.nvim_buf_set_extmark(buf, Config.ns, l - 1, extmark_col, extmark) + local ok = pcall(vim.api.nvim_buf_set_extmark, buf, Config.ns, l - 1, extmark_col, extmark) + if not ok then + Util.error( + "Failed to set extmark. Please report a bug with this info:\n" + .. vim.inspect({ segment = segment, line = line }) + ) + end end col = col + width From e2bbf3deefc906b25de849c921a64061bdd600bd Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 08:34:55 +0100 Subject: [PATCH 0368/1610] refactor: better annotations to make sumneko faster --- lua/lazy/core/util.lua | 1 + lua/lazy/util.lua | 1 + lua/lazy/view/render.lua | 6 ++++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 3fe7f91..54b7148 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -1,3 +1,4 @@ +---@class LazyUtilCore local M = {} ---@alias LazyProfile {data: string|{[string]:string}, time: number, [number]:LazyProfile} diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 0dbe496..a16feb5 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -1,3 +1,4 @@ +---@class LazyUtil: LazyUtilCore local M = setmetatable({}, { __index = require("lazy.core.util") }) function M.file_exists(file) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 4e2f781..29003ed 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -17,10 +17,12 @@ local Text = require("lazy.view.text") ---@field _diagnostics LazyDiagnostic[] ---@field plugin_range table ---@field _details? string -local M = setmetatable({}, { __index = Text }) +local M = {} +---@return Render function M.new(buf, win, padding, wrap) - local self = setmetatable({}, { __index = M }) + ---@type Render + local self = setmetatable({}, { __index = setmetatable(M, { __index = Text }) }) self.buf = buf self.win = win self.padding = padding or 0 From cd023dc70937398d1888ea819af8eb191af79004 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 08:41:42 +0100 Subject: [PATCH 0369/1610] style: remove setting colors on startup --- lua/lazy/view/colors.lua | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index 01a6dfc..ed489c9 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -53,12 +53,6 @@ function M.setup() M.set_hl() end, }) - vim.api.nvim_create_autocmd("User", { - pattern = "VeryLazy", - callback = function() - M.set_hl() - end, - }) end return M From fde5feea6d8d98afabd8c44ccb0fa32cac0973cf Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 10:18:19 +0100 Subject: [PATCH 0370/1610] refactor: refactored ui code --- lua/lazy/core/util.lua | 5 +- lua/lazy/util.lua | 14 +- lua/lazy/view/init.lua | 353 ++++++++++++++++++++++----------------- lua/lazy/view/render.lua | 50 +++--- 4 files changed, 238 insertions(+), 184 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 54b7148..1c0facb 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -29,10 +29,13 @@ function M.track(data, time) end ---@param name string +---@return string function M.normname(name) - return 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 +---@return string function M.norm(path) if path:sub(1, 1) == "~" then local home = vim.loop.os_homedir() diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index a16feb5..772a8be 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -45,23 +45,29 @@ function M.write_file(file, contents) fd:close() end +---@generic F: fun() ---@param ms number ----@param fn fun() +---@param fn F +---@return F function M.throttle(ms, fn) local timer = vim.loop.new_timer() local running = false local first = true - return function() + return function(...) + local args = { ... } + local wrapped = function() + fn(unpack(args)) + end if not running then if first then - fn() + wrapped() first = false end timer:start(ms, 0, function() running = false - vim.schedule(fn) + vim.schedule(wrapped) end) running = true diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index e82f644..3d40df9 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -2,6 +2,16 @@ local Util = require("lazy.util") local Render = require("lazy.view.render") local Config = require("lazy.core.config") +---@class LazyViewState +---@field mode string +---@field plugin? string + +---@class LazyView +---@field buf number +---@field win number +---@field render LazyRender +---@field state LazyViewState +---@field win_opts LazyViewWinOpts local M = {} M.modes = { @@ -40,29 +50,159 @@ M.modes = { M.hover = "K" ----@type string? -M.mode = nil +---@type LazyView +M.view = nil +---@param mode? string function M.show(mode) if Config.headless then return end - M.mode = mode or M.mode or "home" + + M.view = M.view or M.create({ mode = mode }) + M.view:update(mode) +end + +---@param opts? {mode?:string} +function M.create(opts) require("lazy.view.colors").setup() + opts = opts or {} + local self = setmetatable({}, { __index = M }) - if M._buf and vim.api.nvim_buf_is_valid(M._buf) then - -- vim.api.nvim_win_set_cursor(M._win, { 1, 0 }) - vim.cmd([[do User LazyRender]]) - return + self.state = { mode = "home" } + + self:mount() + + self.render = Render.new(self) + self.update = Util.throttle(Config.options.ui.throttle, self.update) + + self:on_key("q", self.close) + + self:on({ "BufDelete", "BufLeave", "BufHidden" }, self.close, { once = true }) + + self:on("User LazyRender", function() + if not (self.buf and vim.api.nvim_buf_is_valid(self.buf)) then + return true + end + self:update() + end) + + -- plugin details + self:on_key("", function() + local plugin = self.render:get_plugin() + if plugin then + self.state.plugin = self.state.plugin ~= plugin.name and plugin.name or nil + self:update() + end + end) + + self:setup_hover() + self:setup_modes() + return self +end + +---@param events string|string[] +---@param fn fun(self?):boolean? +---@param opts? table +function M:on(events, fn, opts) + if type(events) == "string" then + events = { events } end + for _, e in ipairs(events) do + local event, pattern = e:match("(%w+) (%w+)") + event = event or e + vim.api.nvim_create_autocmd( + event, + vim.tbl_extend("force", { + pattern = pattern, + buffer = not pattern and self.buf or nil, + callback = function() + return fn(self) + end, + }, opts or {}) + ) + end +end - local buf = vim.api.nvim_create_buf(false, false) - M._buf = buf +---@param key string +---@param fn fun(self?) +function M:on_key(key, fn) + vim.keymap.set("n", key, function() + fn(self) + end, { + nowait = true, + buffer = self.buf, + }) +end + +---@param mode? string +function M:update(mode) + if mode then + self.state.mode = mode + end + if self.buf and vim.api.nvim_buf_is_valid(self.buf) then + vim.bo[self.buf].modifiable = true + self.render:update() + vim.bo[self.buf].modifiable = false + vim.cmd.redraw() + end +end + +function M:open_url(path) + local plugin = self.render:get_plugin() + if plugin then + if plugin.url then + local url = plugin.url:gsub("%.git$", "") + Util.open(url .. path) + else + Util.error("No url for " .. plugin.name) + end + end +end + +function M:close() + local buf = self.buf + local win = self.win + self.win = nil + self.buf = nil + M.view = nil + vim.diagnostic.reset(Config.ns, buf) + vim.schedule(function() + if win and vim.api.nvim_win_is_valid(win) then + vim.api.nvim_win_close(win, true) + end + if buf and vim.api.nvim_buf_is_valid(buf) then + vim.api.nvim_buf_delete(buf, { force = true }) + end + end) +end + +function M:focus() + vim.api.nvim_set_current_win(self.win) + + -- it seems that setting the current win doesn't work before VimEnter, + -- so do that then + if vim.v.vim_did_enter ~= 1 then + vim.api.nvim_create_autocmd("VimEnter", { + once = true, + callback = function() + if self.win and vim.api.nvim_win_is_valid(self.win) then + pcall(vim.api.nvim_set_current_win, self.win) + end + return true + end, + }) + end +end + +function M:mount() + self.buf = vim.api.nvim_create_buf(false, false) local function size(max, value) return value > 1 and math.min(value, max) or math.floor(max * value) end - local opts = { + ---@class LazyViewWinOpts + self.win_opts = { relative = "editor", style = "minimal", border = Config.options.ui.border, @@ -71,178 +211,87 @@ function M.show(mode) noautocmd = true, } - opts.row = (vim.o.lines - opts.height) / 2 - opts.col = (vim.o.columns - opts.width) / 2 - local win = vim.api.nvim_open_win(buf, true, opts) - M._win = win - vim.api.nvim_set_current_win(win) + self.win_opts.row = (vim.o.lines - self.win_opts.height) / 2 + self.win_opts.col = (vim.o.columns - self.win_opts.width) / 2 + self.win = vim.api.nvim_open_win(self.buf, true, self.win_opts) + self:focus() - -- it seems that setting the current win doesn't work before VimEnter, - -- so do that then - if vim.v.vim_did_enter ~= 1 then - vim.api.nvim_create_autocmd("VimEnter", { - once = true, - callback = function() - if win and vim.api.nvim_win_is_valid(win) then - pcall(vim.api.nvim_set_current_win, win) - end - end, - }) - end + vim.bo[self.buf].buftype = "nofile" + vim.bo[self.buf].filetype = "lazy" + vim.bo[self.buf].bufhidden = "wipe" + vim.wo[self.win].conceallevel = 3 + vim.wo[self.win].spell = false + vim.wo[self.win].wrap = true + vim.wo[self.win].winhighlight = "Normal:LazyNormal" +end - vim.bo[buf].buftype = "nofile" - vim.bo[buf].filetype = "lazy" - vim.bo[buf].bufhidden = "wipe" - vim.wo[win].conceallevel = 3 - vim.wo[win].spell = false - vim.wo[win].wrap = true - vim.wo[win].winhighlight = "Normal:LazyNormal" - - local function close() - M._buf = nil - vim.diagnostic.reset(Config.ns, buf) - vim.schedule(function() - if vim.api.nvim_win_is_valid(win) then - vim.api.nvim_win_close(win, true) - end - if vim.api.nvim_buf_is_valid(buf) then - vim.api.nvim_buf_delete(buf, { force = true }) - end - end) - end - - vim.keymap.set("n", "q", close, { - nowait = true, - buffer = buf, - }) - - vim.api.nvim_create_autocmd({ "BufDelete", "BufLeave", "BufHidden" }, { - once = true, - buffer = buf, - callback = close, - }) - - local render = Render.new(buf, win, 2, opts.width) - local update = Util.throttle(Config.options.ui.throttle, function() - if buf and vim.api.nvim_buf_is_valid(buf) then - vim.bo[buf].modifiable = true - render:update() - vim.bo[buf].modifiable = false - vim.cmd.redraw() - end - end) - - local function get_plugin() - local pos = vim.api.nvim_win_get_cursor(win) - return render:get_plugin(pos[1]) - end - - vim.keymap.set("n", "", function() - local plugin = get_plugin() - if plugin then - if render._details == plugin.name then - render._details = nil - else - render._details = plugin.name - end - update() - end - end, { - nowait = true, - buffer = buf, - }) - - local function open(path) - local plugin = get_plugin() - if plugin then - local url = plugin.url:gsub("%.git$", "") - if Util.file_exists(url) then - url = "https://github.com/" .. plugin[1] - end - Util.open(url .. path) - end - end - - M.keys(buf, { +function M:setup_hover() + local handlers = { ["%s(" .. string.rep("[a-z0-9]", 7) .. ")%s"] = function(hash) - open("/commit/" .. hash) + self:open_url("/commit/" .. hash) end, ["%s(" .. string.rep("[a-z0-9]", 7) .. ")$"] = function(hash) - open("/commit/" .. hash) + self:open_url("/commit/" .. hash) end, ["^(" .. string.rep("[a-z0-9]", 7) .. ")%s"] = function(hash) - open("/commit/" .. hash) + self:open_url("/commit/" .. hash) end, ["#(%d+)"] = function(issue) - open("/issues/" .. issue) + self:open_url("/issues/" .. issue) end, ["README.md"] = function() - local plugin = get_plugin() - Util.open(plugin.dir .. "/README.md") + local plugin = self.render:get_plugin() + if plugin then + Util.open(plugin.dir .. "/README.md") + end end, ["|(%S-)|"] = vim.cmd.help, -- vim help links ["(https?://%S+)"] = function(url) Util.open(url) end, - }) + } + self:on_key(M.hover, function() + local line = vim.api.nvim_get_current_line() + local pos = vim.api.nvim_win_get_cursor(0) + local col = pos[2] + 1 + + for pattern, handler in pairs(handlers) do + local from = 1 + local to, url + while from do + from, to, url = line:find(pattern, from) + if from and col >= from and col <= to then + return handler(url) + end + if from then + from = to + 1 + end + end + end + end) +end + +function M:setup_modes() for _, m in ipairs(M.modes) do if m.key then - vim.keymap.set("n", m.key, function() + self:on_key(m.key, function() local Commands = require("lazy.view.commands") if m.plugin then - local plugin = get_plugin() + local plugin = self.render:get_plugin() if plugin then Commands.cmd(m.name, { plugins = { plugin } }) end else - if M.mode == m.name and m.toggle then - M.mode = nil - return update() + if self.state.mode == m.name and m.toggle then + self.state.mode = "home" + return self:update() end Commands.cmd(m.name) end - end, { buffer = buf }) + end) end end - - vim.api.nvim_create_autocmd("User", { - pattern = "LazyRender", - callback = function() - if not vim.api.nvim_buf_is_valid(buf) then - return true - end - update() - end, - }) - update() -end - ----@param handlers table -function M.keys(buf, handlers) - local function map(lhs) - vim.keymap.set("n", lhs, function() - local line = vim.api.nvim_get_current_line() - local pos = vim.api.nvim_win_get_cursor(0) - local col = pos[2] + 1 - - for pattern, handler in pairs(handlers) do - local from = 1 - local to, url - while from do - from, to, url = line:find(pattern, from) - if from and col >= from and col <= to then - return handler(url) - end - if from then - from = to + 1 - end - end - end - end, { buffer = buf, silent = true }) - end - - map(M.hover) end return M diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 29003ed..ca69c42 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -9,24 +9,22 @@ local Text = require("lazy.view.text") ---@alias LazyDiagnostic {row: number, severity: number, message:string} ----@class Render:Text ----@field buf buffer ----@field win window +---@class LazyRender:Text +---@field view LazyView ---@field plugins LazyPlugin[] ---@field progress {total:number, done:number} ---@field _diagnostics LazyDiagnostic[] ---@field plugin_range table ----@field _details? string local M = {} ----@return Render -function M.new(buf, win, padding, wrap) - ---@type Render +---@return LazyRender +---@param view LazyView +function M.new(view) + ---@type LazyRender local self = setmetatable({}, { __index = setmetatable(M, { __index = Text }) }) - self.buf = buf - self.win = win - self.padding = padding or 0 - self.wrap = wrap + self.view = view + self.padding = 2 + self.wrap = view.win_opts.width return self end @@ -72,10 +70,10 @@ function M:update() end self:trim() - self:render(self.buf) + self:render(self.view.buf) vim.diagnostic.set( Config.ns, - self.buf, + self.view.buf, ---@param diag LazyDiagnostic vim.tbl_map(function(diag) diag.col = 0 @@ -86,9 +84,10 @@ function M:update() ) end ----@param row number +---@param row? number ---@return LazyPlugin? function M:get_plugin(row) + row = row or vim.api.nvim_win_get_cursor(self.view.win)[1] for name, range in pairs(self.plugin_range) do if row >= range.from and row <= range.to then return Config.plugins[name] @@ -98,20 +97,18 @@ end function M:title() self:nl():nl() - local View = require("lazy.view") - - for _, mode in ipairs(View.modes) do + for _, mode in ipairs(self.view.modes) do if not mode.hide and not mode.plugin then local title = " " .. mode.name:sub(1, 1):upper() .. mode.name:sub(2) .. " (" .. mode.key .. ") " if mode.name == "home" then - if View.mode == "home" then + if self.view.state.mode == "home" then title = " lazy.nvim 鈴 " else title = " lazy.nvim (H) " end end - if View.mode == mode.name then + if self.view.state.mode == mode.name then if mode.name == "home" then self:append(title, "LazyH1") else @@ -131,7 +128,7 @@ function M:title() end self:nl() - if View.mode ~= "help" and View.mode ~= "profile" and View.mode ~= "debug" then + if self.view.state.mode ~= "help" and self.view.state.mode ~= "profile" and self.view.state.mode ~= "debug" then if self.progress.done < self.progress.total then self:append("Tasks: ", "LazyH2") self:append(self.progress.done .. "/" .. self.progress.total, "LazyMuted") @@ -141,11 +138,10 @@ function M:title() end self:nl():nl() end - return View.mode + return self.view.state.mode end function M:help() - local View = require("lazy.view") self:append("Help", "LazyH2"):nl():nl() self:append("You can press "):append("", "LazySpecial"):append(" on a plugin to show its details."):nl() @@ -155,7 +151,7 @@ function M:help() self:append(" to open links, help files, readmes and git commits."):nl():nl() self:append("Keyboard Shortcuts", "LazyH2"):nl() - for _, mode in ipairs(View.modes) do + for _, mode in ipairs(self.view.modes) do local title = mode.name:sub(1, 1):upper() .. mode.name:sub(2) self:append("- ", "LazySpecial", { indent = 2 }) self:append(title, "Title") @@ -167,7 +163,7 @@ function M:help() end function M:progressbar() - local width = vim.api.nvim_win_get_width(self.win) - 2 * self.padding + local width = vim.api.nvim_win_get_width(self.view.win) - 2 * self.padding local done = math.floor((self.progress.done / self.progress.total) * width + 0.5) if self.progress.done == self.progress.total then done = 0 @@ -341,7 +337,7 @@ function M:plugin(plugin) self:diagnostics(plugin) self:nl() - if self._details == plugin.name then + if self.view.state.plugin == plugin.name then self:details(plugin) end self:tasks(plugin) @@ -351,14 +347,14 @@ end ---@param plugin LazyPlugin function M:tasks(plugin) for _, task in ipairs(plugin._.tasks or {}) do - if self._details == plugin.name then + if self.view.state.plugin == plugin.name then self:append("✔ [task] ", "Title", { indent = 4 }):append(task.name) self:append(" " .. math.floor((task:time()) * 100) / 100 .. "ms", "Bold") self:nl() end if task.name == "log" and not task.error then self:log(task) - elseif task.error or self._details == plugin.name then + elseif task.error or self.view.state.plugin == plugin.name then if task.error then self:append(vim.trim(task.error), "LazyError", { indent = 4, prefix = "│ " }) self:nl() From 7dfb9c1f5cb8dcad4133a93da68cbdb5c8001035 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 10:43:22 +0100 Subject: [PATCH 0371/1610] feat(ui): added options to sort/filter profiling data --- lua/lazy/view/init.lua | 36 +++++++++++++++++++++++++++++++- lua/lazy/view/render.lua | 44 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 3d40df9..5954361 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -5,6 +5,13 @@ local Config = require("lazy.core.config") ---@class LazyViewState ---@field mode string ---@field plugin? string +local default_state = { + mode = "home", + profile = { + threshold = 0, + sort_time_taken = true, + }, +} ---@class LazyView ---@field buf number @@ -69,7 +76,7 @@ function M.create(opts) opts = opts or {} local self = setmetatable({}, { __index = M }) - self.state = { mode = "home" } + self.state = vim.deepcopy(default_state) self:mount() @@ -96,6 +103,33 @@ function M.create(opts) end end) + self:on_key("", function() + if self.state.mode == "profile" then + self.state.profile.sort_time_taken = not self.state.profile.sort_time_taken + self:update() + end + end) + + self:on_key("", function() + if self.state.mode == "profile" then + vim.ui.input({ + prompt = "Enter time threshold in ms, like 0.5", + default = tostring(self.state.profile.threshold), + }, function(input) + if not input then + return + end + local num = input == "" and 0 or tonumber(input) + if not num then + Util.error("Please input a number") + else + self.state.profile.threshold = num + self:update() + end + end) + end + end) + self:setup_hover() self:setup_modes() return self diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index ca69c42..88c8a8e 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -144,6 +144,7 @@ end function M:help() self:append("Help", "LazyH2"):nl():nl() + self:append("You can press "):append("", "LazySpecial"):append(" on a plugin to show its details."):nl() self:append("You can press "):append("", "LazySpecial"):append(" on a plugin to show its details."):nl() self:append("Most properties can be hovered with ") @@ -459,6 +460,18 @@ end function M:profile() self:append("Profile", "LazyH2"):nl():nl() + self + :append("You can press ") + :append("", "LazySpecial") + :append(" to change sorting between chronological order & time taken.") + :nl() + self + :append("Press ") + :append("", "LazySpecial") + :append(" to filter profiling entries that took more time than a given threshold") + :nl() + + self:nl() local symbols = { "●", "➜", @@ -466,21 +479,44 @@ function M:profile() "‒", } + ---@param a LazyProfile + ---@param b LazyProfile + local function sort(a, b) + return a.time > b.time + end + + ---@param entry LazyProfile + local function get_children(entry) + ---@type LazyProfile[] + local children = entry + + if self.view.state.profile.sort_time_taken then + children = {} + for _, child in ipairs(entry) do + children[#children + 1] = child + end + table.sort(children, sort) + end + return children + end + ---@param entry LazyProfile local function _profile(entry, depth) + if entry.time / 1e6 < self.view.state.profile.threshold then + return + end local data = type(entry.data) == "string" and { source = entry.data } or entry.data data.time = entry.time local symbol = symbols[depth] or symbols[#symbols] - self:append((" "):rep(depth)):append(" " .. symbol, "LazySpecial"):append(" ") + self:append((" "):rep(depth)):append(symbol, "LazySpecial"):append(" ") self:reason(data, { time_right = true }) self:nl() - - for _, child in ipairs(entry) do + for _, child in ipairs(get_children(entry)) do _profile(child, depth + 1) end end - for _, entry in ipairs(Util._profiles[1]) do + for _, entry in ipairs(get_children(Util._profiles[1])) do _profile(entry, 1) end end From 3594bfd47db2f1fe3b3861e55b9aef26c5c242ca Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 10:43:30 +0100 Subject: [PATCH 0372/1610] docs: todo --- TODO.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TODO.md b/TODO.md index 5fe44a4..9b51293 100644 --- a/TODO.md +++ b/TODO.md @@ -44,6 +44,9 @@ - default semver merging strategy: if no version matches all, then use highest version? - [ ] package meta index (package.lua cache for all packages) +- [ ] document highlight groups +- [ ] document user events + - [x] check in cache if rtp files match - [x] I think the installation section, specifically the loading part, could use an extra sentence or two. I was confused on what `config.plugins` was initially. From e973323e95d9cd9ebf41583c94a8c7433d5ae19c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 11:18:32 +0100 Subject: [PATCH 0373/1610] fix(ui): fixed extmarks while wrapping. Fixes #124 --- lua/lazy/view/text.lua | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index d756cca..00c081a 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -39,7 +39,7 @@ function Text:append(str, hl, opts) if l > 1 then self:nl() end - if self:col() > 0 and self:col() + vim.fn.strwidth(line) + self.padding > self.wrap then + if str ~= "" and self:col() > 0 and self:col() + vim.fn.strwidth(line) + self.padding > self.wrap then self:nl() end table.insert(self._lines[#self._lines], { @@ -132,27 +132,7 @@ function Text:highlight(patterns) end end -function Text:center() - local last = self._lines[#self._lines] - if not last then - return - end - local width = 0 - for _, segment in ipairs(last) do - width = width + vim.fn.strwidth(segment.str) - end - width = vim.api.nvim_win_get_width(self.win) - 2 * self.padding - width - table.insert(last, 1, { - str = string.rep(" ", math.floor(width / 2 + 0.5)), - }) - return self -end - function Text:trim() - -- while #self._lines > 0 and #self._lines[1] == 0 do - -- table.remove(self._lines, 1) - -- end - while #self._lines > 0 and #self._lines[#self._lines] == 0 do table.remove(self._lines) end From 50e3b917675b8bd693548089aeda7e9cbe881001 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 11:47:05 +0100 Subject: [PATCH 0374/1610] fix(ui): sort profiling chronological by default --- lua/lazy/view/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 5954361..946f908 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -9,7 +9,7 @@ local default_state = { mode = "home", profile = { threshold = 0, - sort_time_taken = true, + sort_time_taken = false, }, } From 7f10386e2335d1a479e77a4060fff3aac3097599 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Dec 2022 11:48:54 +0100 Subject: [PATCH 0375/1610] chore(main): release 7.0.0 (#96) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 163c173..9d913b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,45 @@ # Changelog +## [7.0.0](https://github.com/folke/lazy.nvim/compare/v6.0.0...v7.0.0) (2022-12-23) + + +### ⚠ BREAKING CHANGES + +* default lazy cache path is now under cache instead of state +* `init()` no longer implies lazy-loading. Add `lazy=false` for affected plugins +* run `init()` before loading start plugins. Fixes #107 + +### Features + +* `init()` no longer implies lazy-loading. Add `lazy=false` for affected plugins ([8112640](https://github.com/folke/lazy.nvim/commit/81126403a89b78e6a75948ba5cea15d9499d2025)) +* **loader:** automatically lazy-load colorschemes ([07b4677](https://github.com/folke/lazy.nvim/commit/07b467738d3ca0863e957a2bca86825f6aff92df)) +* **spec:** `config` can be `true` or a `table` that will be passed to `require("plugin").setup(config)` ([2a7b004](https://github.com/folke/lazy.nvim/commit/2a7b0047dd25f543b147b692fe100e1b2d88ffb2)) +* **spec:** allow using plugin names in dependencies ([4bf771a](https://github.com/folke/lazy.nvim/commit/4bf771a6b255fd91b2e16a21da20d55f7f274f05)) +* **ui:** added options to sort/filter profiling data ([7dfb9c1](https://github.com/folke/lazy.nvim/commit/7dfb9c1f5cb8dcad4133a93da68cbdb5c8001035)) + + +### Bug Fixes + +* added error message to debug failing extmarks [#117](https://github.com/folke/lazy.nvim/issues/117) ([65e9036](https://github.com/folke/lazy.nvim/commit/65e903652bfac5e83d4df8246a29e45c07865c34)) +* **checker:** dont report updates on install during startup ([8251c23](https://github.com/folke/lazy.nvim/commit/8251c23c90c15ef5197638777f85ef69402a2725)) +* **install:** make sure to setup loaders before attempting install so colorscheme can load. Fixes [#122](https://github.com/folke/lazy.nvim/issues/122) ([7b9b476](https://github.com/folke/lazy.nvim/commit/7b9b476a6238a53062c1c8e4331fcef054bb8761)) +* **keys:** don't create with remap! ([b440b3a](https://github.com/folke/lazy.nvim/commit/b440b3ac2d6945fab62fbfc2f2dbe9db3d9d9fe2)) +* **keys:** dont delete handlers manually. Let loader do that ([72b3899](https://github.com/folke/lazy.nvim/commit/72b38999bc547a96c769d1de964a846570cfe5d1)) +* **keys:** key handlers were not working after reload ([3f60f2d](https://github.com/folke/lazy.nvim/commit/3f60f2dc13faf4d958fdaec16596436ade2ec23d)) +* **manage:** do not reload pugins on clear ([b5d6afc](https://github.com/folke/lazy.nvim/commit/b5d6afc4fa4520a986db4898f6b22b267fc041f9)) +* pass plugins instead of plugin names to command. Fixes [#103](https://github.com/folke/lazy.nvim/issues/103) ([42f5aa7](https://github.com/folke/lazy.nvim/commit/42f5aa76e21ec34b3d7fc79218e5069610d7db2e)) +* remove debug print ([08d458c](https://github.com/folke/lazy.nvim/commit/08d458c5ba595c3ae2801215abf2d5cc09aca211)) +* remove lazy keymaps with the correct mode. Fixes [#97](https://github.com/folke/lazy.nvim/issues/97) ([56890ce](https://github.com/folke/lazy.nvim/commit/56890ce5f439e9bbf275ed5ec2573b4e29371bb5)) +* run `init()` before loading start plugins. Fixes [#107](https://github.com/folke/lazy.nvim/issues/107) ([2756a6f](https://github.com/folke/lazy.nvim/commit/2756a6f756758d62eeb4cac64d8c5efbc8878cd1)) +* **ui:** fix buffer being properly deleted ([#112](https://github.com/folke/lazy.nvim/issues/112)) ([9e98389](https://github.com/folke/lazy.nvim/commit/9e983898b131d4975680bbda023224bb90a32daf)) +* **ui:** fixed extmarks while wrapping. Fixes [#124](https://github.com/folke/lazy.nvim/issues/124) ([e973323](https://github.com/folke/lazy.nvim/commit/e973323e95d9cd9ebf41583c94a8c7433d5ae19c)) +* **ui:** sort profiling chronological by default ([50e3b91](https://github.com/folke/lazy.nvim/commit/50e3b917675b8bd693548089aeda7e9cbe881001)) + + +### Code Refactoring + +* default lazy cache path is now under cache instead of state ([cc6276e](https://github.com/folke/lazy.nvim/commit/cc6276e9b069b5c0c3bdef27dd029722b13bf17d)) + ## [6.0.0](https://github.com/folke/lazy.nvim/compare/v5.2.0...v6.0.0) (2022-12-22) From d6304f0b42425217f062ddb4e6bb3b62ba695eac Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 12:26:19 +0100 Subject: [PATCH 0376/1610] docs: added `keys` to packer migration --- README.md | 47 ++++++++++++++++++++++---------------------- lua/lazy/example.lua | 1 - 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index a839e6b..861c496 100644 --- a/README.md +++ b/README.md @@ -79,29 +79,29 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | +| Property | Type | Description | +| ---------------- | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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` | | **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 | -| **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | -| **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | -| **build** | `fun(LazyPlugin)` or `string` | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | -| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | -| **event** | `string?` or `string[]` | Lazy-load on event | -| **cmd** | `string?` or `string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | +| **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | +| **build** | `fun(LazyPlugin)` or `string` | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | +| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | +| **event** | `string?` or `string[]` | Lazy-load on event | +| **cmd** | `string?` or `string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | ### Lazy Loading @@ -342,7 +342,7 @@ return { performance = { cache = { enabled = true, - path = vim.fn.stdpath("state") .. "/lazy/cache", + path = vim.fn.stdpath("cache") .. "/lazy/cache", -- Once one of the following events triggers, caching will be disabled. -- To cache all modules, set this to `{}`, but that is not recommended. -- The default is to disable on: @@ -583,6 +583,7 @@ For a real-life example, you can check my personal dots: - `disable=true` ➡️ `enabled = false` - `tag='*'` ➡️ `version="*"` - `module` is auto-loaded. No need to specify +- `keys` spec is [different](#%EF%B8%8F-lazy-key-mappings) ### [paq-nvim](https://github.com/savq/paq-nvim) diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua index e9c2c74..0a9518a 100644 --- a/lua/lazy/example.lua +++ b/lua/lazy/example.lua @@ -58,7 +58,6 @@ return { { "cshuaimin/ssr.nvim", -- init is always executed during startup, but doesn't load the plugin yet. - -- init implies lazy loading init = function() vim.keymap.set({ "n", "x" }, "cR", function() -- this require will automatically load the plugin From 4cf1f7b26e500faf98f1f2b05039c000a565955a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 23 Dec 2022 11:27:29 +0000 Subject: [PATCH 0377/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f8939bb..9d4bb84 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -379,7 +379,7 @@ CONFIGURATION *lazy.nvim-configuration* performance = { cache = { enabled = true, - path = vim.fn.stdpath("state") .. "/lazy/cache", + path = vim.fn.stdpath("cache") .. "/lazy/cache", -- Once one of the following events triggers, caching will be disabled. -- To cache all modules, set this to `{}`, but that is not recommended. -- The default is to disable on: @@ -642,6 +642,7 @@ PACKER.NVIM ~ - `disable=true` `enabled = false` - `tag=''` `version=""` - `module` is auto-loaded. No need to specify +- `keys` spec is |lazy.nvim-different| PAQ-NVIM ~ From f360e336a5e2b57e1ee0232c9c89a4ceb3617798 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 13:13:28 +0100 Subject: [PATCH 0378/1610] fix(help): make sure we always generate lazy helptags --- lua/lazy/help.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index d13174b..d2eba65 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -29,6 +29,7 @@ function M.index(plugin) end function M.update() + vim.cmd.helptags(Config.plugins["lazy.nvim"].dir .. "/doc") local docs = Config.options.readme.root .. "/doc" vim.fn.mkdir(docs, "p") From 6a6d6f73ee9dcefeb5b81121db7c0bf06918bd01 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 23 Dec 2022 13:53:52 +0100 Subject: [PATCH 0379/1610] ci: new issue template --- .github/ISSUE_TEMPLATE/bug_report.md | 82 --------------------------- .github/ISSUE_TEMPLATE/bug_report.yml | 81 ++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 82 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 9232dc7..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: bug -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**Which version of Neovim are you using?** -Gui(specify which GUI client you are using)? Nightly? Version? - -**To Reproduce** -Make sure to read https://github.com/folke/lazy.nvim/wiki/Minimal-%60init.lua%60-to-Reproduce-an-Issue - -Steps to reproduce the behavior: - -1. -2. -3. - -**Expected Behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -
-repro.lua - -```lua -local root = vim.fn.fnamemodify("./.repro", ":p") - --- 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", - "--single-branch", - "https://github.com/folke/lazy.nvim.git", - lazypath, - }) -end -vim.opt.runtimepath:prepend(lazypath) - --- install plugins -local plugins = { - -- do not remove the colorscheme! - "folke/tokyonight.nvim", - -- add any other pugins here -} -require("lazy").setup(plugins, { - root = root .. "/plugins", -}) - --- add anything else here -vim.opt.termguicolors = true --- do not remove the colorscheme! -vim.cmd([[colorscheme tokyonight]]) -``` - -
- -**Log** -Please include any related errors from the Noice log file. (open with `:Lazy log`) - -
-Lazy log -
-paste log here
-
-
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..bb4a319 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,81 @@ +name: 🐞 Bug +description: File a bug/issue +title: "[bug]: " +labels: [bug] +body: + - type: checkboxes + attributes: + label: Did you check docs and existing issues? + description: Make sure you checked all of the below before submitting an issue + options: + - label: I have read all the lazy documentation + required: true + - label: I have searched the existing issues of lazy + required: true + - label: I have searched the exsiting issues of the plugin I have a problem with + required: true + - type: textarea + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. Please include any related errors you see in Neovim. + render: Markdown + validations: + required: true + - type: textarea + attributes: + label: Steps To Reproduce + description: Steps to reproduce the behavior. + placeholder: | + 1. + 2. + 3. + render: Markdown + validations: + required: true + - type: textarea + attributes: + label: Expected Behavior + description: A concise description of what you expected to happen. + validations: + required: true + - type: textarea + attributes: + label: Repro + description: Minimal init.lua to reproduce this issue + value: | + -- DO NOT change the paths and don't remove the colorscheme + local root = vim.fn.fnamemodify("./.repro", ":p") + + -- 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", + "--single-branch", + "https://github.com/folke/lazy.nvim.git", + lazypath, + }) + end + vim.opt.runtimepath:prepend(lazypath) + + -- install plugins + local plugins = { + "folke/tokyonight.nvim", + -- add any other pugins here + } + require("lazy").setup(plugins, { + root = root .. "/plugins", + }) + + vim.cmd.colorscheme("tokyonight") + -- add anything else here + render: Lua + validations: + required: false From a5d402abedc0b377d9db2c19bf074015de8d6df2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 14:03:07 +0100 Subject: [PATCH 0380/1610] ci: better issue template --- .github/ISSUE_TEMPLATE/bug_report.yml | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index bb4a319..b0cedf5 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,24 +1,40 @@ name: 🐞 Bug description: File a bug/issue -title: "[bug]: <title>" +title: "bug: " labels: [bug] body: + - type: markdown + attributes: + value: | + _Before reporting:_ search [existing issues](https://github.com/folke/lazy.nvim/issues). + Usage questions such as "How do I...?" belong on the [Discussions](https://github.com/folke/lazy.nvim/discussions) and will be closed. - type: checkboxes attributes: label: Did you check docs and existing issues? description: Make sure you checked all of the below before submitting an issue options: - - label: I have read all the lazy documentation + - label: I have read all the lazy docs required: true - label: I have searched the existing issues of lazy required: true - label: I have searched the exsiting issues of the plugin I have a problem with required: true + - type: input + attributes: + label: "Neovim version (nvim -v)" + placeholder: "0.8.0 commit db1b0ee3b30f" + validations: + required: true + - type: input + attributes: + label: "Operating system/version" + placeholder: "MacOS 11.5" + validations: + required: true - type: textarea attributes: label: Describe the bug description: A clear and concise description of what the bug is. Please include any related errors you see in Neovim. - render: Markdown validations: required: true - type: textarea @@ -29,7 +45,6 @@ body: 1. 2. 3. - render: Markdown validations: required: true - type: textarea From 5ef7ce80a34dc4cbf52b6bb3aa7ce0c40b44f587 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 14:06:51 +0100 Subject: [PATCH 0381/1610] ci: even better issue template --- .github/ISSUE_TEMPLATE/bug_report.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index b0cedf5..a1ce863 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -6,8 +6,8 @@ body: - type: markdown attributes: value: | - _Before reporting:_ search [existing issues](https://github.com/folke/lazy.nvim/issues). - Usage questions such as "How do I...?" belong on the [Discussions](https://github.com/folke/lazy.nvim/discussions) and will be closed. + **Before** reporting an issue, make sure to 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? @@ -56,7 +56,7 @@ body: - type: textarea attributes: label: Repro - description: Minimal init.lua to reproduce this issue + 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") From 451de7e19e954251255c5533b48a9e11063a9f5f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 14:15:27 +0100 Subject: [PATCH 0382/1610] ci: added new feature request template --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yml | 36 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index a1ce863..e0da724 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,4 +1,4 @@ -name: 🐞 Bug +name: Bug Report description: File a bug/issue title: "bug: " labels: [bug] diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..7bfd88b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,36 @@ +name: Feature Request +description: Suggest a new feature +title: "feature: " +labels: [enhancement] +body: + - type: checkboxes + attributes: + label: Did you check docs the docs? + description: Make sure you read all the docs before subimtting a feature request + options: + - label: I have read all the lazy docs + required: true + - type: textarea + validations: + required: true + attributes: + label: Is your feature request related to a problem? Please describe. + description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + - type: textarea + validations: + required: true + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + - type: textarea + validations: + required: true + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. + - type: textarea + validations: + required: false + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. From 68db6337bf312fcff1d22a2e69422627febb4e7d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 14:16:04 +0100 Subject: [PATCH 0383/1610] ci: deleted old feature request template --- .github/ISSUE_TEMPLATE/feature_request.md | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 11fc491..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: enhancement -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. From 60fdea7aed6d727e543f48d60d4f72a95cb369ee Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 14:29:38 +0100 Subject: [PATCH 0384/1610] ci: added link to docs to issue template for the very lazy people --- .github/ISSUE_TEMPLATE/bug_report.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e0da724..a95857a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -6,7 +6,9 @@ body: - type: markdown attributes: value: | - **Before** reporting an issue, make sure to search [existing issues](https://github.com/folke/lazy.nvim/issues). + **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: From 2bd563ce99bc5dd2aa64e705c5dbdc0d693df09d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 14:30:05 +0100 Subject: [PATCH 0385/1610] ci: formatting of issue template --- .github/ISSUE_TEMPLATE/bug_report.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index a95857a..097dbb1 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -6,9 +6,7 @@ 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). + **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: From a062641c85a4ba5507022304bee05c5eef731bc0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 14:30:25 +0100 Subject: [PATCH 0386/1610] ci: more formatting --- .github/ISSUE_TEMPLATE/bug_report.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 097dbb1..83324d3 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -6,8 +6,7 @@ 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? From 5a1812a6335e44d5599962081e7778ce8dcbaaf5 Mon Sep 17 00:00:00 2001 From: Aaron <79121360+UnrealApex@users.noreply.github.com> Date: Fri, 23 Dec 2022 05:58:11 -0800 Subject: [PATCH 0387/1610] Better terminology (#132) --- lua/lazy/view/sections.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index 5352c00..59f3a1b 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -90,6 +90,6 @@ return { filter = function(plugin) return plugin._.installed end, - title = "Installed", + title = "Not Loaded", }, } From 74b076e030ef48f54e4c68dcbaefac532c3c8f0f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 19:03:30 +0100 Subject: [PATCH 0388/1610] docs: added after/wants to migration guide and added an example that sets a key mode --- README.md | 5 ++++- TODO.md | 4 ++-- lua/lazy/example.lua | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 861c496..e2328c1 100644 --- a/README.md +++ b/README.md @@ -254,7 +254,8 @@ return { { "monaqa/dial.nvim", -- lazy-load on keys - keys = { "<C-a>", "<C-x>" }, + -- mode is `n` by default. For more advanced options, check the section on key mappings + keys = { "<C-a>", { "<C-x>", mode = "n" } }, }, -- local plugins need to be explicitly configured with dir @@ -582,6 +583,8 @@ For a real-life example, you can check my personal dots: - `lock` ➡️ `pin` - `disable=true` ➡️ `enabled = false` - `tag='*'` ➡️ `version="*"` +- `after` ℹ️ **_not needed_** for most use-cases. Use `dependencies` otherwise. +- `wants` ℹ️ **_not needed_** for most use-cases. Use `dependencies` otherwise. - `module` is auto-loaded. No need to specify - `keys` spec is [different](#%EF%B8%8F-lazy-key-mappings) diff --git a/TODO.md b/TODO.md index 9b51293..dc33bc0 100644 --- a/TODO.md +++ b/TODO.md @@ -63,5 +63,5 @@ - [x] Most emojis in "Configuration" aren't shown for me. - [x] add section on how to uninstall - [x] add `:Packadd` command or something similar -- [ ] headless install -- [ ] better keys handling +- [x] headless install +- [x] better keys handling diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua index 0a9518a..870ad02 100644 --- a/lua/lazy/example.lua +++ b/lua/lazy/example.lua @@ -69,7 +69,8 @@ return { { "monaqa/dial.nvim", -- lazy-load on keys - keys = { "<C-a>", "<C-x>" }, + -- mode is `n` by default. For more advanced options, check the section on key mappings + keys = { "<C-a>", { "<C-x>", mode = "n" } }, }, -- local plugins need to be explicitly configured with dir From aec3baa555a6833b4447c9768bf5dd1f8b1cba12 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Dec 2022 18:04:19 +0000 Subject: [PATCH 0389/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9d4bb84..846b536 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -294,7 +294,8 @@ EXAMPLES ~ { "monaqa/dial.nvim", -- lazy-load on keys - keys = { "<C-a>", "<C-x>" }, + -- mode is `n` by default. For more advanced options, check the section on key mappings + keys = { "<C-a>", { "<C-x>", mode = "n" } }, }, -- local plugins need to be explicitly configured with dir @@ -641,6 +642,8 @@ PACKER.NVIM <HTTPS://GITHUB.COM/WBTHOMASON/PACKER.NVIM> ~ - `lock` `pin` - `disable=true` `enabled = false` - `tag=''` `version=""` +- `after` **_not needed_** for most use-cases. Use `dependencies` otherwise. +- `wants` **_not needed_** for most use-cases. Use `dependencies` otherwise. - `module` is auto-loaded. No need to specify - `keys` spec is |lazy.nvim-different| From 3991cf56f86adacb308e99fd23bcec8f6953c06c Mon Sep 17 00:00:00 2001 From: max397574 <81827001+max397574@users.noreply.github.com> Date: Fri, 23 Dec 2022 19:51:35 +0100 Subject: [PATCH 0390/1610] docs(readme): added explanation for dependencies (#137) --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index e2328c1..28924ee 100644 --- a/README.md +++ b/README.md @@ -588,6 +588,12 @@ For a real-life example, you can check my personal dots: - `module` is auto-loaded. No need to specify - `keys` spec is [different](#%EF%B8%8F-lazy-key-mappings) +With packer `wants`, `requires` and `after` can be used to manage dependencies. +With most of the lua dependencies this isn't necessary. 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](https://github.com/savq/paq-nvim) - `as` ➡️ `name` From f822a2c12bb5b9db789c58b75f2e4e9b5a03ac1d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Dec 2022 18:52:21 +0000 Subject: [PATCH 0391/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 846b536..09805da 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -648,6 +648,13 @@ PACKER.NVIM <HTTPS://GITHUB.COM/WBTHOMASON/PACKER.NVIM> ~ - `keys` spec is |lazy.nvim-different| +With packer `wants`, `requires` and `after` can be used to manage dependencies. +With most of the lua dependencies this isn’t necessary. 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 <HTTPS://GITHUB.COM/SAVQ/PAQ-NVIM> ~ From 011125ccc2b19c43cdfbe428ca227551fbdc7901 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 19:52:49 +0100 Subject: [PATCH 0392/1610] docs: cleanup --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 28924ee..0f28dd7 100644 --- a/README.md +++ b/README.md @@ -589,11 +589,11 @@ For a real-life example, you can check my personal dots: - `keys` spec is [different](#%EF%B8%8F-lazy-key-mappings) With packer `wants`, `requires` and `after` can be used to manage dependencies. -With most of the lua dependencies this isn't necessary. They can be installed just like normal plugins (even with `lazy=true`) and will be loaded when other plugins need them. +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](https://github.com/savq/paq-nvim) - `as` ➡️ `name` From c1f39f997d8ca19c99be828bc1bda2d9617b199f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Dec 2022 18:53:40 +0000 Subject: [PATCH 0393/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 09805da..198ea50 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -649,11 +649,12 @@ PACKER.NVIM <HTTPS://GITHUB.COM/WBTHOMASON/PACKER.NVIM> ~ With packer `wants`, `requires` and `after` can be used to manage dependencies. -With most of the lua dependencies this isn’t necessary. 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. +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 <HTTPS://GITHUB.COM/SAVQ/PAQ-NVIM> ~ From 83270cc5e5aa62f35e4be57f3472cbdbc25da7b0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 20:55:49 +0100 Subject: [PATCH 0394/1610] refactor(commands): move ui/commands config to separate file --- README.md | 4 +- lua/lazy/docs.lua | 14 +--- lua/lazy/view/commands.lua | 13 ++-- lua/lazy/view/config.lua | 138 +++++++++++++++++++++++++++++++++++++ lua/lazy/view/init.lua | 79 +++++++-------------- lua/lazy/view/render.lua | 33 ++++++--- 6 files changed, 195 insertions(+), 86 deletions(-) create mode 100644 lua/lazy/view/config.lua diff --git a/README.md b/README.md index 0f28dd7..4e18864 100644 --- a/README.md +++ b/README.md @@ -434,11 +434,11 @@ Any operation can be started from the UI, with a sub command or an API function: | `: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` | -| `:Lazy log [plugins]` | `require("lazy").log(opts?)` | Show recent updates for all plugins | +| `:Lazy log [plugins]` | `require("lazy").log(opts?)` | Show recent updates | | `:Lazy profile` | `require("lazy").profile()` | Show detailed profiling | | `:Lazy restore [plugins]` | `require("lazy").restore(opts?)` | Updates all plugins to the state in the lockfile | | `:Lazy sync [plugins]` | `require("lazy").sync(opts?)` | Run install, clean and update | -| `:Lazy update [plugins]` | `require("lazy").update(opts?)` | Update all plugins. This will also update the lockfile | +| `:Lazy update [plugins]` | `require("lazy").update(opts?)` | Update plugins. This will also update the lockfile | <!-- commands:end --> diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 755892b..e662495 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -75,15 +75,7 @@ end function M.commands() local commands = require("lazy.view.commands").commands - ---@type table<string,{desc:string, plugin:boolean, opts:boolean}> - local modes = {} - for _, mode in ipairs(require("lazy.view").modes) do - modes[mode.name] = modes[mode.name] or {} - modes[mode.name].plugin = modes[mode.name].plugin or mode.plugin - if not modes[mode.name].desc or not mode.plugin then - modes[mode.name].desc = mode.desc - end - end + local modes = require("lazy.view.config").commands modes.load.opts = true local lines = { { "Command", "Lua", "Description" }, @@ -91,13 +83,13 @@ function M.commands() } Util.foreach(modes, function(name, mode) if commands[name] then - if mode.opts then + if mode.plugins_required then lines[#lines + 1] = { ("`:Lazy %s {plugins}`"):format(name), ([[`require("lazy").%s(opts)`]]):format(name), mode.desc, } - elseif mode.plugin then + elseif mode.plugins then lines[#lines + 1] = { ("`:Lazy %s [plugins]`"):format(name), ([[`require("lazy").%s(opts?)`]]):format(name), diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index e6f1945..9d02a3b 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -2,6 +2,7 @@ local View = require("lazy.view") local Manage = require("lazy.manage") local Util = require("lazy.util") local Config = require("lazy.core.config") +local ViewConfig = require("lazy.view.config") local M = {} @@ -9,7 +10,7 @@ local M = {} ---@param opts? ManagerOpts function M.cmd(cmd, opts) cmd = cmd == "" and "home" or cmd - local command = M.commands[cmd] + local command = M.commands[cmd] --[[@as fun(opts)]] if command == nil then Util.error("Invalid lazy command '" .. cmd .. "'") else @@ -55,15 +56,10 @@ M.commands = { } function M.complete(cmd, prefix) - local with_plugins = false - for _, mode in ipairs(View.modes) do - if mode.name == cmd and mode.plugin then - with_plugins = true - end - end - if not with_plugins then + if not ViewConfig.commands[cmd].plugins then return end + ---@type string[] local plugins = {} for name, plugin in pairs(Config.plugins) do if cmd ~= "load" or not plugin._.loaded then @@ -83,6 +79,7 @@ function M.setup() local opts = { wait = cmd.bang == true } local prefix, args = M.parse(cmd.args) if #args > 0 then + ---@param plugin string opts.plugins = vim.tbl_map(function(plugin) return Config.plugins[plugin] end, args) diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua new file mode 100644 index 0000000..65bcffa --- /dev/null +++ b/lua/lazy/view/config.lua @@ -0,0 +1,138 @@ +local M = {} + +---@class LazyViewCommand +---@field id number +---@field plugins? boolean +---@field plugins_required? boolean +---@field button? boolean +---@field desc? string +---@field desc_plugin? string +---@field key? string +---@field key_plugin? string +---@field toggle? boolean + +function M.get_commands() + ---@type (LazyViewCommand|{name:string})[] + local ret = {} + for k, v in pairs(M.commands) do + v.name = k + ret[#ret + 1] = v + end + table.sort(ret, function(a, b) + return a.id < b.id + end) + return ret +end + +M.keys = { + hover = "K", + close = "q", + details = "<cr>", + profile_sort = "<C-s>", + profile_filter = "<C-f>", +} + +---@type table<string,LazyViewCommand> +M.commands = { + home = { + button = true, + desc = "Go back to plugin list", + id = 1, + key = "H", + }, + install = { + button = true, + desc = "Install missing plugins", + desc_plugin = "Install a plugin", + id = 2, + key = "I", + key_plugin = "i", + plugins = true, + }, + update = { + button = true, + desc = "Update plugins. This will also update the lockfile", + desc_plugin = "Update a plugin. This will also update the lockfile", + id = 3, + key = "U", + key_plugin = "u", + plugins = true, + }, + sync = { + button = true, + desc = "Run install, clean and update", + desc_plugin = "Run install, clean and update", + id = 4, + key = "S", + plugins = true, + }, + clean = { + button = true, + desc = "Clean plugins that are no longer needed", + desc_plugin = "Delete a plugin. WARNING: this will delete the plugin even if it should be installed!", + id = 5, + key = "X", + key_plugin = "x", + plugins = true, + }, + check = { + button = true, + desc = "Check for updates and show the log (git fetch)", + desc_plugin = "Check for updates and show the log (git fetch)", + id = 6, + key = "C", + key_plugin = "c", + plugins = true, + }, + log = { + button = true, + desc = "Show recent updates", + desc_plugin = "Show recent updates", + id = 7, + key = "L", + key_plugin = "gl", + plugins = true, + }, + restore = { + button = true, + desc = "Updates all plugins to the state in the lockfile", + desc_plugin = "Restore a plugin to the state in the lockfile", + id = 8, + key = "R", + key_plugin = "r", + plugins = true, + }, + profile = { + button = true, + desc = "Show detailed profiling", + id = 9, + key = "P", + toggle = true, + }, + debug = { + button = true, + desc = "Show debug information", + id = 10, + key = "D", + toggle = true, + }, + help = { + button = true, + desc = "Toggle this help page", + id = 11, + key = "?", + toggle = true, + }, + clear = { + desc = "Clear finished tasks", + id = 12, + }, + load = { + desc = "Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim`", + id = 13, + plugins = true, + plugins_required = true, + }, +} + +return M diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 946f908..e57c0b8 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -1,6 +1,7 @@ local Util = require("lazy.util") local Render = require("lazy.view.render") local Config = require("lazy.core.config") +local ViewConfig = require("lazy.view.config") ---@class LazyViewState ---@field mode string @@ -21,42 +22,6 @@ local default_state = { ---@field win_opts LazyViewWinOpts local M = {} -M.modes = { - { name = "home", key = "H", desc = "Go back to plugin list" }, - { name = "install", key = "I", desc = "Install missing plugins" }, - { name = "update", key = "U", desc = "Update all plugins. This will also update the lockfile" }, - { name = "sync", key = "S", desc = "Run install, clean and update" }, - { name = "clean", key = "X", desc = "Clean plugins that are no longer needed" }, - { name = "check", key = "C", desc = "Check for updates and show the log (git fetch)" }, - { name = "log", key = "L", desc = "Show recent updates for all plugins" }, - { name = "restore", key = "R", desc = "Updates all plugins to the state in the lockfile" }, - { name = "profile", key = "P", desc = "Show detailed profiling", toggle = true }, - { name = "debug", key = "D", desc = "Show debug information", toggle = true }, - { name = "help", key = "?", desc = "Toggle this help page", toggle = true }, - { name = "clear", desc = "Clear finished tasks", hide = true }, - { - name = "load", - desc = "Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim`", - hide = true, - plugin = true, - }, - { name = "sync", desc = "Run install, clean and update", hide = true, plugin = true }, - - { plugin = true, name = "update", key = "u", desc = "Update this plugin. This will also update the lockfile" }, - { - plugin = true, - name = "clean", - key = "x", - desc = "Delete this plugin. WARNING: this will delete the plugin even if it should be installed!", - }, - { plugin = true, name = "check", key = "c", desc = "Check for updates for this plugin and show the log (git fetch)" }, - { plugin = true, name = "install", key = "i", desc = "Install this plugin" }, - { plugin = true, name = "log", key = "gl", desc = "Show recent updates for this plugin" }, - { plugin = true, name = "restore", key = "r", desc = "Restore this plugin to the state in the lockfile" }, -} - -M.hover = "K" - ---@type LazyView M.view = nil @@ -83,7 +48,7 @@ function M.create(opts) self.render = Render.new(self) self.update = Util.throttle(Config.options.ui.throttle, self.update) - self:on_key("q", self.close) + self:on_key(ViewConfig.keys.close, self.close) self:on({ "BufDelete", "BufLeave", "BufHidden" }, self.close, { once = true }) @@ -95,7 +60,7 @@ function M.create(opts) end) -- plugin details - self:on_key("<cr>", function() + self:on_key(ViewConfig.keys.details, function() local plugin = self.render:get_plugin() if plugin then self.state.plugin = self.state.plugin ~= plugin.name and plugin.name or nil @@ -103,14 +68,14 @@ function M.create(opts) end end) - self:on_key("<C-s>", function() + 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) - self:on_key("<C-f>", function() + self:on_key(ViewConfig.keys.profile_filter, function() if self.state.mode == "profile" then vim.ui.input({ prompt = "Enter time threshold in ms, like 0.5", @@ -160,12 +125,14 @@ end ---@param key string ---@param fn fun(self?) -function M:on_key(key, fn) +---@param desc? string +function M:on_key(key, fn, desc) vim.keymap.set("n", key, function() fn(self) end, { nowait = true, buffer = self.buf, + desc = desc, }) end @@ -285,7 +252,7 @@ function M:setup_hover() end, } - self:on_key(M.hover, function() + self:on_key(ViewConfig.keys.hover, function() local line = vim.api.nvim_get_current_line() local pos = vim.api.nvim_win_get_cursor(0) local col = pos[2] + 1 @@ -307,23 +274,23 @@ function M:setup_hover() end function M:setup_modes() - for _, m in ipairs(M.modes) do + local Commands = require("lazy.view.commands") + for name, m in pairs(ViewConfig.commands) do if m.key then self:on_key(m.key, function() - local Commands = require("lazy.view.commands") - if m.plugin then - local plugin = self.render:get_plugin() - if plugin then - Commands.cmd(m.name, { plugins = { plugin } }) - end - else - if self.state.mode == m.name and m.toggle then - self.state.mode = "home" - return self:update() - end - Commands.cmd(m.name) + if self.state.mode == name and m.toggle then + return self:update("home") end - end) + Commands.cmd(name) + end, m.desc) + end + if m.key_plugin then + self:on_key(m.key_plugin, function() + local plugin = self.render:get_plugin() + if plugin then + Commands.cmd(name, { plugins = { plugin } }) + end + end, m.desc_plugin) end end end diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 88c8a8e..3ae4672 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -4,6 +4,7 @@ local Sections = require("lazy.view.sections") local Handler = require("lazy.core.handler") local Git = require("lazy.manage.git") local Plugin = require("lazy.core.plugin") +local ViewConfig = require("lazy.view.config") local Text = require("lazy.view.text") @@ -97,8 +98,8 @@ end function M:title() self:nl():nl() - for _, mode in ipairs(self.view.modes) do - if not mode.hide and not mode.plugin then + for _, mode in ipairs(ViewConfig.get_commands()) do + if mode.button then local title = " " .. mode.name:sub(1, 1):upper() .. mode.name:sub(2) .. " (" .. mode.key .. ") " if mode.name == "home" then if self.view.state.mode == "home" then @@ -144,7 +145,6 @@ end function M:help() self:append("Help", "LazyH2"):nl():nl() - self:append("You can press "):append("<CR>", "LazySpecial"):append(" on a plugin to show its details."):nl() self:append("You can press "):append("<CR>", "LazySpecial"):append(" on a plugin to show its details."):nl() self:append("Most properties can be hovered with ") @@ -152,14 +152,29 @@ function M:help() self:append(" to open links, help files, readmes and git commits."):nl():nl() self:append("Keyboard Shortcuts", "LazyH2"):nl() - for _, mode in ipairs(self.view.modes) do - local title = mode.name:sub(1, 1):upper() .. mode.name:sub(2) - self:append("- ", "LazySpecial", { indent = 2 }) - self:append(title, "Title") + for _, mode in ipairs(ViewConfig.get_commands()) do if mode.key then - self:append(" <" .. mode.key .. ">", "LazyKey") + local title = mode.name:sub(1, 1):upper() .. mode.name:sub(2) + self:append("- ", "LazySpecial", { indent = 2 }) + self:append(title, "Title") + if mode.key then + self:append(" <" .. mode.key .. ">", "LazyKey") + end + self:append(" " .. (mode.desc or "")):nl() + end + end + + self:nl():append("Keyboard Shortcuts for Plugins", "LazyH2"):nl() + for _, mode in ipairs(ViewConfig.get_commands()) do + if mode.key_plugin then + local title = mode.name:sub(1, 1):upper() .. mode.name:sub(2) + self:append("- ", "LazySpecial", { indent = 2 }) + self:append(title, "Title") + if mode.key_plugin then + self:append(" <" .. mode.key_plugin .. ">", "LazyKey") + end + self:append(" " .. (mode.desc_plugin or mode.desc)):nl() end - self:append(" " .. (mode.desc or "")):nl() end end From a973c2edc2167012d4721a784a0da46906cf005c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Dec 2022 19:56:43 +0000 Subject: [PATCH 0395/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 198ea50..95842cd 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -466,11 +466,11 @@ function: │: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 │ -│:Lazy log [plugins] │require("lazy").log(opts?) │Show recent updates for all plugins │ +│:Lazy log [plugins] │require("lazy").log(opts?) │Show recent updates │ │:Lazy profile │require("lazy").profile() │Show detailed profiling │ │:Lazy restore [plugins] │require("lazy").restore(opts?) │Updates all plugins to the state in the lockfile │ │:Lazy sync [plugins] │require("lazy").sync(opts?) │Run install, clean and update │ -│:Lazy update [plugins] │require("lazy").update(opts?) │Update all plugins. This will also update the lockfile │ +│: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 From 593d6e400b3bb529c507092bf107b6cc4364fb5b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 23 Dec 2022 22:39:16 +0100 Subject: [PATCH 0396/1610] feat(ui): you can now hover over a plugin to open a diff of updates or the plugin homepage --- lua/lazy/view/init.lua | 74 ++++++++++++++++++++++++++++++++-------- lua/lazy/view/render.lua | 4 ++- 2 files changed, 63 insertions(+), 15 deletions(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index e57c0b8..e2ca164 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -2,6 +2,7 @@ local Util = require("lazy.util") local Render = require("lazy.view.render") local Config = require("lazy.core.config") local ViewConfig = require("lazy.view.config") +local Git = require("lazy.manage.git") ---@class LazyViewState ---@field mode string @@ -95,7 +96,7 @@ function M.create(opts) end end) - self:setup_hover() + self:setup_patterns() self:setup_modes() return self end @@ -226,16 +227,10 @@ function M:mount() vim.wo[self.win].winhighlight = "Normal:LazyNormal" end -function M:setup_hover() - local handlers = { - ["%s(" .. string.rep("[a-z0-9]", 7) .. ")%s"] = function(hash) - self:open_url("/commit/" .. hash) - end, - ["%s(" .. string.rep("[a-z0-9]", 7) .. ")$"] = function(hash) - self:open_url("/commit/" .. hash) - end, - ["^(" .. string.rep("[a-z0-9]", 7) .. ")%s"] = function(hash) - self:open_url("/commit/" .. hash) +function M:setup_patterns() + self:on_pattern(ViewConfig.keys.hover, { + ["%f[a-z0-9](" .. string.rep("[a-z0-9]", 7) .. ")%f[^a-z0-9]"] = function(hash) + self:diff({ commit = hash, browser = true }) end, ["#(%d+)"] = function(issue) self:open_url("/issues/" .. issue) @@ -250,14 +245,62 @@ function M:setup_hover() ["(https?://%S+)"] = function(url) Util.open(url) end, - } + }, self.hover) +function M:hover() + if self:diff({ browser = true }) then + return + end + self:open_url("") +end - self:on_key(ViewConfig.keys.hover, function() +---@alias LazyDiff string|{from:string, to:string} + +---@param opts? {commit?:string, browser:boolean} +function M:diff(opts) + opts = opts or {} + local plugin = self.render:get_plugin() + if plugin then + local diff + if opts.commit then + diff = opts.commit + elseif plugin._.updated then + diff = plugin._.updated + else + local info = assert(Git.info(plugin.dir)) + local target = assert(Git.get_target(plugin)) + diff = { from = info.commit, to = target.commit } + end + + if not diff then + return + end + + if opts.browser then + if plugin.url then + local url = plugin.url:gsub("%.git$", "") + if type(diff) == "string" then + Util.open(url .. "/commit/" .. diff) + else + Util.open(url .. "/compare/" .. diff.from .. ".." .. diff.to) + end + else + Util.error("No url for " .. plugin.name) + end + end + end +end + +--- will create a key mapping that can be used on certain patterns +---@param key string +---@param patterns table<string, fun(str:string)> +---@param fallback? fun(self) +function M:on_pattern(key, patterns, fallback) + self:on_key(key, function() local line = vim.api.nvim_get_current_line() local pos = vim.api.nvim_win_get_cursor(0) local col = pos[2] + 1 - for pattern, handler in pairs(handlers) do + for pattern, handler in pairs(patterns) do local from = 1 local to, url while from do @@ -270,6 +313,9 @@ function M:setup_hover() end end end + if fallback then + fallback(self) + end end) end diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 3ae4672..d95c66e 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -149,7 +149,9 @@ function M:help() self:append("Most properties can be hovered with ") self:append("<K>", "LazySpecial") - self:append(" to open links, help files, readmes and git commits."):nl():nl() + self:append(" to open links, help files, readmes and git commits."):nl() + self:append("When hovering on a plugin anywhere else, a diff will be opened if there are updates"):nl() + self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl():nl() self:append("Keyboard Shortcuts", "LazyH2"):nl() for _, mode in ipairs(ViewConfig.get_commands()) do From 9110371120db2888647123d7dea7c68a574ae310 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 09:17:29 +0100 Subject: [PATCH 0397/1610] feat(build): build can now be a list to execute multiple build commands. Fixes #143 --- README.md | 46 ++++++++++++++++----------------- lua/lazy/core/plugin.lua | 2 +- lua/lazy/manage/task/plugin.lua | 36 +++++++++++++------------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 4e18864..ad512e3 100644 --- a/README.md +++ b/README.md @@ -79,29 +79,29 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | -| **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 | -| **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | -| **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | -| **build** | `fun(LazyPlugin)` or `string` | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | -| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | -| **event** | `string?` or `string[]` | Lazy-load on event | -| **cmd** | `string?` or `string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| Property | Type | Description | +| ---------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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` | +| **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 | +| **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | +| **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | +| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | +| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | +| **event** | `string?` or `string[]` | Lazy-load on event | +| **cmd** | `string?` or `string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | ### Lazy Loading diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 90c687e..c69f048 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -19,7 +19,7 @@ local M = {} ---@class LazyPluginHooks ---@field init? fun(LazyPlugin) Will always be run ---@field config? fun(LazyPlugin)|true|table Will be executed when loading the plugin ----@field build? string|fun(LazyPlugin) +---@field build? string|fun(LazyPlugin)|(string|fun(LazyPlugin))[] ---@class LazyPluginHandlers: table<LazyHandlerTypes, string|string[]> ---@field event? string[] diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 7bb9f33..a7d0cee 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -11,25 +11,25 @@ M.build = { run = function(self) Loader.load(self.plugin, { task = "build" }) - -- we need to source its plugin files before startup, - -- to make sure the build command has everything available - Loader.source_runtime(self.plugin.dir, "plugin") + local builders = self.plugin.build + if builders then + builders = type(builders) == "table" and builders or { builders } + ---@cast builders (string|fun(LazyPlugin))[] + for _, build in ipairs(builders) do + if type(build) == "string" and build:sub(1, 1) == ":" then + local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) + self.output = vim.api.nvim_cmd(cmd, { output = true }) + elseif type(build) == "function" then + build() + else + local shell = vim.env.SHELL or vim.o.shell + local shell_args = shell:find("cmd.exe", 1, true) and "/c" or "-c" - local build = self.plugin.build - if build then - if type(build) == "string" and build:sub(1, 1) == ":" then - local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) - self.output = vim.api.nvim_cmd(cmd, { output = true }) - elseif type(build) == "function" then - build() - else - local shell = vim.env.SHELL or vim.o.shell - local shell_args = shell:find("cmd.exe", 1, true) and "/c" or "-c" - - return self:spawn(shell, { - args = { shell_args, build }, - cwd = self.plugin.dir, - }) + self:spawn(shell, { + args = { shell_args, build }, + cwd = self.plugin.dir, + }) + end end end end, From 86f2c67aa80b3c64d131ba47189c42ca5a37ac14 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 09:22:46 +0100 Subject: [PATCH 0398/1610] fix(checker): update updated after every manage operation. Fixes #141 --- lua/lazy/manage/checker.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index e0e458f..2b7a62a 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -27,9 +27,7 @@ function M.fast_check(opts) end end end - if opts.report ~= false then - M.report() - end + M.report(opts.report ~= false) end function M.check() @@ -42,7 +40,8 @@ function M.check() end) end -function M.report() +---@param notify? boolean +function M.report(notify) local lines = {} M.updated = {} for _, plugin in pairs(Config.plugins) do @@ -54,7 +53,7 @@ function M.report() end end end - if #lines > 0 and Config.options.checker.notify then + if #lines > 0 and notify and Config.options.checker.notify then table.insert(lines, 1, "# Plugin Updates") Util.info(lines) end From 74d8b8e4e180c40d2ade750940f3c64761fb7930 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 11:15:57 +0100 Subject: [PATCH 0399/1610] fix: plugin list can be string[]. Fixes #145 --- lua/lazy/manage/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index a87d982..aefd6ae 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -9,7 +9,7 @@ local M = {} ---@field clear? boolean ---@field show? boolean ---@field mode? string ----@field plugins? LazyPlugin[] +---@field plugins? (LazyPlugin|string)[] ---@field concurrency? number ---@param ropts RunnerOpts @@ -18,6 +18,10 @@ function M.run(ropts, opts) opts = opts or {} if opts.plugins then + ---@param plugin string|LazyPlugin + opts.plugins = vim.tbl_map(function(plugin) + return type(plugin) == "string" and Config.plugins[plugin] or plugin + end, vim.tbl_values(opts.plugins)) ropts.plugins = opts.plugins end From fc182f7c5d5df9ba877ab619f6fa545e20ad52f0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 11:16:24 +0100 Subject: [PATCH 0400/1610] fix(manage): only clear plugins for the op instead of all --- lua/lazy/manage/init.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index aefd6ae..64430ff 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -28,7 +28,7 @@ function M.run(ropts, opts) ropts.concurrency = ropts.concurrency or opts.concurrency or Config.options.concurrency if opts.clear then - M.clear() + M.clear(opts.plugins) end if opts.show ~= false then @@ -162,8 +162,9 @@ function M.clean(opts) end) end -function M.clear() - for _, plugin in pairs(Config.plugins) do +---@param plugins? LazyPlugin[] +function M.clear(plugins) + for _, plugin in pairs(plugins or Config.plugins) do plugin._.has_updates = nil plugin._.updated = nil plugin._.cloned = nil From b34e25873ac88715fe70f85837e7ade9ee63a9a9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 11:26:09 +0100 Subject: [PATCH 0401/1610] refactor: float is now a separate module --- lua/lazy/view/float.lua | 191 ++++++++++++++++++++++++++++++++++++++++ lua/lazy/view/init.lua | 177 +++++++++---------------------------- 2 files changed, 233 insertions(+), 135 deletions(-) create mode 100644 lua/lazy/view/float.lua diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua new file mode 100644 index 0000000..0a92dbd --- /dev/null +++ b/lua/lazy/view/float.lua @@ -0,0 +1,191 @@ +local Config = require("lazy.core.config") +local ViewConfig = require("lazy.view.config") + +---@class LazyViewOptions +---@field buf? number +---@field file? string +---@field margin? {top?:number, right?:number, bottom?:number, left?:number} +---@field win_opts LazyViewWinOpts +local defaults = { + win_opts = {}, +} + +---@class LazyFloat +---@field buf number +---@field win number +---@field opts LazyViewOptions +---@overload fun(opts?:LazyViewOptions):LazyFloat +local M = {} + +setmetatable(M, { + __call = function(_, ...) + return M.new(...) + end, +}) + +---@param opts? LazyViewOptions +function M.new(opts) + local self = setmetatable({}, { __index = M }) + return self:init(opts) +end + +---@param opts? LazyViewOptions +function M:init(opts) + self.opts = vim.tbl_deep_extend("force", defaults, opts or {}) + self:mount() + self:on_key(ViewConfig.keys.close, self.close) + self:on({ "BufDelete", "BufLeave", "BufHidden" }, self.close, { once = true }) + return self +end + +function M:layout() + local function size(max, value) + return value > 1 and math.min(value, max) or math.floor(max * value) + end + self.opts.win_opts.width = size(vim.o.columns, Config.options.ui.size.width) + self.opts.win_opts.height = size(vim.o.lines, Config.options.ui.size.height) + self.opts.win_opts.row = math.floor((vim.o.lines - self.opts.win_opts.height) / 2) + self.opts.win_opts.col = math.floor((vim.o.columns - self.opts.win_opts.width) / 2) + + if self.opts.margin then + if self.opts.margin.top then + self.opts.win_opts.height = self.opts.win_opts.height - self.opts.margin.top + self.opts.win_opts.row = self.opts.win_opts.row + self.opts.margin.top + end + if self.opts.margin.right then + self.opts.win_opts.width = self.opts.win_opts.width - self.opts.margin.right + end + if self.opts.margin.bottom then + self.opts.win_opts.height = self.opts.win_opts.height - self.opts.margin.bottom + end + if self.opts.margin.left then + self.opts.win_opts.width = self.opts.win_opts.width - self.opts.margin.left + self.opts.win_opts.col = self.opts.win_opts.col + self.opts.margin.left + end + end +end + +function M:mount() + if self.opts.file then + self.buf = vim.fn.bufadd(self.opts.file) + vim.fn.bufload(self.buf) + vim.bo[self.buf].modifiable = false + elseif self.opts.buf then + self.buf = self.opts.buf + else + self.buf = vim.api.nvim_create_buf(false, false) + end + + ---@class LazyViewWinOpts + local win_opts = { + relative = "editor", + style = "minimal", + border = Config.options.ui.border, + noautocmd = true, + zindex = 50, + } + self.opts.win_opts = vim.tbl_extend("force", win_opts, self.opts.win_opts) + if self.opts.win_opts.style == "" then + self.opts.win_opts.style = nil + end + + self:layout() + self.win = vim.api.nvim_open_win(self.buf, true, self.opts.win_opts) + self:focus() + + vim.bo[self.buf].buftype = "nofile" + if vim.bo[self.buf].filetype == "" then + vim.bo[self.buf].filetype = "lazy" + end + vim.bo[self.buf].bufhidden = "wipe" + vim.wo[self.win].conceallevel = 3 + vim.wo[self.win].spell = false + vim.wo[self.win].wrap = true + vim.wo[self.win].winhighlight = "Normal:LazyNormal" + + vim.api.nvim_create_autocmd("VimResized", { + callback = function() + if not self.win then + return true + end + self:layout() + local config = {} + for _, key in ipairs({ "relative", "width", "height", "col", "row" }) do + config[key] = self.opts.win_opts[key] + end + vim.api.nvim_win_set_config(self.win, config) + end, + }) +end + +---@param events string|string[] +---@param fn fun(self?):boolean? +---@param opts? table +function M:on(events, fn, opts) + if type(events) == "string" then + events = { events } + end + for _, e in ipairs(events) do + local event, pattern = e:match("(%w+) (%w+)") + event = event or e + vim.api.nvim_create_autocmd( + event, + vim.tbl_extend("force", { + pattern = pattern, + buffer = (not pattern) and self.buf or nil, + callback = function() + return fn(self) + end, + }, opts or {}) + ) + end +end + +---@param key string +---@param fn fun(self?) +---@param desc? string +function M:on_key(key, fn, desc) + vim.keymap.set("n", key, function() + fn(self) + end, { + nowait = true, + buffer = self.buf, + desc = desc, + }) +end + +function M:close() + local buf = self.buf + local win = self.win + self.win = nil + self.buf = nil + vim.diagnostic.reset(Config.ns, buf) + vim.schedule(function() + if win and vim.api.nvim_win_is_valid(win) then + vim.api.nvim_win_close(win, true) + end + if buf and vim.api.nvim_buf_is_valid(buf) then + vim.api.nvim_buf_delete(buf, { force = true }) + end + end) +end + +function M:focus() + vim.api.nvim_set_current_win(self.win) + + -- it seems that setting the current win doesn't work before VimEnter, + -- so do that then + if vim.v.vim_did_enter ~= 1 then + vim.api.nvim_create_autocmd("VimEnter", { + once = true, + callback = function() + if self.win and vim.api.nvim_win_is_valid(self.win) then + pcall(vim.api.nvim_set_current_win, self.win) + end + return true + end, + }) + end +end + +return M diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index e2ca164..73a3091 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -3,6 +3,8 @@ local Render = require("lazy.view.render") local Config = require("lazy.core.config") local ViewConfig = require("lazy.view.config") local Git = require("lazy.manage.git") +local Diff = require("lazy.view.diff") +local Float = require("lazy.view.float") ---@class LazyViewState ---@field mode string @@ -15,12 +17,9 @@ local default_state = { }, } ----@class LazyView ----@field buf number ----@field win number +---@class LazyView: LazyFloat ---@field render LazyRender ---@field state LazyViewState ----@field win_opts LazyViewWinOpts local M = {} ---@type LazyView @@ -32,27 +31,27 @@ function M.show(mode) return end - M.view = M.view or M.create({ mode = mode }) - M.view:update(mode) + M.view = (M.view and M.view.win) and M.view or M.create({ mode = mode }) + if mode then + M.view.state.mode = mode + end + M.view:update() end ---@param opts? {mode?:string} function M.create(opts) + local self = setmetatable({}, { __index = setmetatable(M, { __index = Float }) }) + ---@cast self LazyView + Float.init(self) + require("lazy.view.colors").setup() opts = opts or {} - local self = setmetatable({}, { __index = M }) self.state = vim.deepcopy(default_state) - self:mount() - self.render = Render.new(self) self.update = Util.throttle(Config.options.ui.throttle, self.update) - self:on_key(ViewConfig.keys.close, self.close) - - self:on({ "BufDelete", "BufLeave", "BufHidden" }, self.close, { once = true }) - self:on("User LazyRender", function() if not (self.buf and vim.api.nvim_buf_is_valid(self.buf)) then return true @@ -96,52 +95,21 @@ function M.create(opts) end end) + for key, handler in pairs(Config.options.ui.custom_keys) do + self:on_key(key, function() + local plugin = self.render:get_plugin() + if plugin then + handler(plugin) + end + end) + end + self:setup_patterns() self:setup_modes() return self end ----@param events string|string[] ----@param fn fun(self?):boolean? ----@param opts? table -function M:on(events, fn, opts) - if type(events) == "string" then - events = { events } - end - for _, e in ipairs(events) do - local event, pattern = e:match("(%w+) (%w+)") - event = event or e - vim.api.nvim_create_autocmd( - event, - vim.tbl_extend("force", { - pattern = pattern, - buffer = not pattern and self.buf or nil, - callback = function() - return fn(self) - end, - }, opts or {}) - ) - end -end - ----@param key string ----@param fn fun(self?) ----@param desc? string -function M:on_key(key, fn, desc) - vim.keymap.set("n", key, function() - fn(self) - end, { - nowait = true, - buffer = self.buf, - desc = desc, - }) -end - ----@param mode? string -function M:update(mode) - if mode then - self.state.mode = mode - end +function M:update() if self.buf and vim.api.nvim_buf_is_valid(self.buf) then vim.bo[self.buf].modifiable = true self.render:update() @@ -162,74 +130,10 @@ function M:open_url(path) end end -function M:close() - local buf = self.buf - local win = self.win - self.win = nil - self.buf = nil - M.view = nil - vim.diagnostic.reset(Config.ns, buf) - vim.schedule(function() - if win and vim.api.nvim_win_is_valid(win) then - vim.api.nvim_win_close(win, true) - end - if buf and vim.api.nvim_buf_is_valid(buf) then - vim.api.nvim_buf_delete(buf, { force = true }) - end - end) -end - -function M:focus() - vim.api.nvim_set_current_win(self.win) - - -- it seems that setting the current win doesn't work before VimEnter, - -- so do that then - if vim.v.vim_did_enter ~= 1 then - vim.api.nvim_create_autocmd("VimEnter", { - once = true, - callback = function() - if self.win and vim.api.nvim_win_is_valid(self.win) then - pcall(vim.api.nvim_set_current_win, self.win) - end - return true - end, - }) - end -end - -function M:mount() - self.buf = vim.api.nvim_create_buf(false, false) - - local function size(max, value) - return value > 1 and math.min(value, max) or math.floor(max * value) - end - ---@class LazyViewWinOpts - self.win_opts = { - relative = "editor", - style = "minimal", - border = Config.options.ui.border, - width = size(vim.o.columns, Config.options.ui.size.width), - height = size(vim.o.lines, Config.options.ui.size.height), - noautocmd = true, - } - - self.win_opts.row = (vim.o.lines - self.win_opts.height) / 2 - self.win_opts.col = (vim.o.columns - self.win_opts.width) / 2 - self.win = vim.api.nvim_open_win(self.buf, true, self.win_opts) - self:focus() - - vim.bo[self.buf].buftype = "nofile" - vim.bo[self.buf].filetype = "lazy" - vim.bo[self.buf].bufhidden = "wipe" - vim.wo[self.win].conceallevel = 3 - vim.wo[self.win].spell = false - vim.wo[self.win].wrap = true - vim.wo[self.win].winhighlight = "Normal:LazyNormal" -end - function M:setup_patterns() + local commit_pattern = "%f[%w](" .. string.rep("%w", 7) .. ")%f[%W]" self:on_pattern(ViewConfig.keys.hover, { - ["%f[a-z0-9](" .. string.rep("[a-z0-9]", 7) .. ")%f[^a-z0-9]"] = function(hash) + [commit_pattern] = function(hash) self:diff({ commit = hash, browser = true }) end, ["#(%d+)"] = function(issue) @@ -246,6 +150,13 @@ function M:setup_patterns() Util.open(url) end, }, self.hover) + self:on_pattern(ViewConfig.keys.diff, { + [commit_pattern] = function(hash) + self:diff({ commit = hash }) + end, + }, self.diff) +end + function M:hover() if self:diff({ browser = true }) then return @@ -253,8 +164,6 @@ function M:hover() self:open_url("") end ----@alias LazyDiff string|{from:string, to:string} - ---@param opts? {commit?:string, browser:boolean} function M:diff(opts) opts = opts or {} @@ -262,9 +171,9 @@ function M:diff(opts) if plugin then local diff if opts.commit then - diff = opts.commit + diff = { commit = opts.commit } elseif plugin._.updated then - diff = plugin._.updated + diff = vim.deepcopy(plugin._.updated) else local info = assert(Git.info(plugin.dir)) local target = assert(Git.get_target(plugin)) @@ -275,17 +184,14 @@ function M:diff(opts) return end + for k, v in pairs(diff) do + diff[k] = v:sub(1, 7) + end + if opts.browser then - if plugin.url then - local url = plugin.url:gsub("%.git$", "") - if type(diff) == "string" then - Util.open(url .. "/commit/" .. diff) - else - Util.open(url .. "/compare/" .. diff.from .. ".." .. diff.to) - end - else - Util.error("No url for " .. plugin.name) - end + Diff.handlers.browser(plugin, diff) + else + Diff.handlers[Config.options.diff.cmd](plugin, diff) end end end @@ -325,7 +231,8 @@ function M:setup_modes() if m.key then self:on_key(m.key, function() if self.state.mode == name and m.toggle then - return self:update("home") + self.state.mode = "home" + return self:update() end Commands.cmd(name) end, m.desc) From 7c2eb1544416646db09b410d07492555fcf44778 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 11:26:29 +0100 Subject: [PATCH 0402/1610] feat: util method to open a float --- lua/lazy/util.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 772a8be..c8a9765 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -5,6 +5,15 @@ function M.file_exists(file) return vim.loop.fs_stat(file) ~= nil end +---@param opts? LazyViewOptions +function M.float(opts) + opts = vim.tbl_deep_extend("force", { + win_opts = { zindex = 60, border = "none" }, + margin = { top = 3, left = 2, right = 2 }, + }, opts or {}) + return require("lazy.view.float")(opts) +end + function M.open(uri) if M.file_exists(uri) then vim.cmd.split() From 8ad05feef19d6b8d4c5f686e0269ac10659f511b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 11:26:53 +0100 Subject: [PATCH 0403/1610] feat(util): open terminal commands in a float --- lua/lazy/util.lua | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index c8a9765..a50ec7e 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -16,8 +16,7 @@ end function M.open(uri) if M.file_exists(uri) then - vim.cmd.split() - return vim.cmd.view(uri) + return M.float({ win_opts = { style = "" }, file = uri }) end local cmd if vim.fn.has("win32") == 1 then @@ -84,6 +83,38 @@ function M.throttle(ms, fn) end end +---@param cmd string[] +---@param opts? {cwd:string, filetype:string, terminal?:boolean, close_on_exit?:boolean, enter?:boolean} +function M.open_cmd(cmd, opts) + opts = opts or {} + local float = M.float() + + if opts.filetype then + vim.bo[float.buf].filetype = opts.filetype + end + if opts.terminal then + opts.terminal = nil + vim.fn.termopen(cmd, opts) + if opts.enter then + vim.cmd.startinsert() + end + if opts.close_on_exit then + vim.api.nvim_create_autocmd("TermClose", { + once = true, + buffer = float.buf, + callback = function() + float:close() + end, + }) + end + else + local Process = require("lazy.manage.process") + local lines = Process.exec(cmd, { cwd = opts.cwd }) + vim.api.nvim_buf_set_lines(float.buf, 0, -1, false, lines) + vim.bo[float.buf].modifiable = false + end +end + ---@return string? function M.head(file) local f = io.open(file) From 7d02da2ff0216ef6ba9097d8ae5a48f54ddc7c4a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 11:27:29 +0100 Subject: [PATCH 0404/1610] feat(ui): added multiple options for diff command --- README.md | 8 +++++ lua/lazy/core/config.lua | 8 +++++ lua/lazy/manage/process.lua | 3 +- lua/lazy/view/config.lua | 1 + lua/lazy/view/diff.lua | 58 +++++++++++++++++++++++++++++++++++++ lua/lazy/view/render.lua | 10 ++++--- 6 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 lua/lazy/view/diff.lua diff --git a/README.md b/README.md index ad512e3..25cace6 100644 --- a/README.md +++ b/README.md @@ -327,6 +327,14 @@ return { task = "✔ ", }, throttle = 20, -- how frequently should the ui process render events + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index bd89f95..c061ea9 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -50,6 +50,14 @@ M.defaults = { task = "✔ ", }, throttle = 20, -- how frequently should the ui process render events + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 8b11674..7ac6514 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -109,7 +109,7 @@ function M.spawn(cmd, opts) end ---@param cmd string[] ----@param opts? {cwd:string} +---@param opts? {cwd:string, env:table} function M.exec(cmd, opts) opts = opts or {} ---@type string[] @@ -117,6 +117,7 @@ function M.exec(cmd, opts) local job = vim.fn.jobstart(cmd, { cwd = opts.cwd, pty = false, + env = opts.env, stdout_buffered = true, on_stdout = function(_, _lines) lines = _lines diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index 65bcffa..84bd294 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -26,6 +26,7 @@ end M.keys = { hover = "K", + diff = "d", close = "q", details = "<cr>", profile_sort = "<C-s>", diff --git a/lua/lazy/view/diff.lua b/lua/lazy/view/diff.lua new file mode 100644 index 0000000..adff761 --- /dev/null +++ b/lua/lazy/view/diff.lua @@ -0,0 +1,58 @@ +local Util = require("lazy.util") + +local M = {} + +---@alias LazyDiff {commit:string} | {from:string, to:string} +---@alias LazyDiffFun fun(plugin:LazyPlugin, diff:LazyDiff) + +M.handlers = { + + ---@type LazyDiffFun + browser = function(plugin, diff) + if plugin.url then + local url = plugin.url:gsub("%.git$", "") + if diff.commit then + Util.open(url .. "/commit/" .. diff.commit) + else + Util.open(url .. "/compare/" .. diff.from .. ".." .. diff.to) + end + else + Util.error("No url for " .. plugin.name) + end + end, + + ---@type LazyDiffFun + ["diffview.nvim"] = function(plugin, diff) + if diff.commit then + vim.cmd.DiffviewOpen(("-C=%s"):format(plugin.dir) .. " " .. diff.commit) + else + vim.cmd.DiffviewOpen(("-C=%s"):format(plugin.dir) .. " " .. diff.from .. ".." .. diff.to) + end + end, + + ---@type LazyDiffFun + git = function(plugin, diff) + local cmd = { "git", "diff" } + if diff.commit then + cmd[#cmd + 1] = diff.commit + else + cmd[#cmd + 1] = diff.from + cmd[#cmd + 1] = diff.to + end + Util.open_cmd(cmd, { cwd = plugin.dir, filetype = "git" }) + end, + + ---@type LazyDiffFun + terminal_git = function(plugin, diff) + local cmd = { "git", "diff" } + if diff.commit then + cmd[#cmd + 1] = diff.commit + else + cmd[#cmd + 1] = diff.from + cmd[#cmd + 1] = diff.to + end + Util.open_cmd(cmd, { cwd = plugin.dir, terminal = true, env = { PAGER = "cat" } }) + end, +} + +return M diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index d95c66e..ba242b1 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -25,7 +25,7 @@ function M.new(view) local self = setmetatable({}, { __index = setmetatable(M, { __index = Text }) }) self.view = view self.padding = 2 - self.wrap = view.win_opts.width + self.wrap = view.opts.win_opts.width return self end @@ -56,8 +56,9 @@ function M:update() end end - local mode = self:title() + self:title() + local mode = self.view.state.mode if mode == "help" then self:help() elseif mode == "profile" then @@ -139,7 +140,6 @@ function M:title() end self:nl():nl() end - return self.view.state.mode end function M:help() @@ -395,12 +395,14 @@ function M:log(task) if msg:find("^%S+!:") then self:diagnostic({ message = "Breaking Changes", severity = vim.diagnostic.severity.WARN }) end - self:append(ref .. " ", "LazyCommit", { indent = 6 }) + self:append(ref:sub(1, 7) .. " ", "LazyCommit", { indent = 6 }) self:append(vim.trim(msg)):highlight({ ["#%d+"] = "Number", ["^%S+:"] = "Title", ["^%S+(%(.*%)):"] = "Italic", ["`.-`"] = "@text.literal.markdown_inline", + ["%*.-%*"] = "Italic", + ["%*%*.-%*%*"] = "Bold", }) -- string.gsub self:append(" " .. time, "Comment") From be3909c54420c734e32cb045a387990a6fb51bd4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 11:28:19 +0100 Subject: [PATCH 0405/1610] feat(ui): added custom commands for lazygit and opening a terminal for a plugin --- README.md | 25 +++++++++++++++++++++++++ TODO.md | 4 +++- lua/lazy/core/config.lua | 25 +++++++++++++++++++++++++ lua/lazy/view/init.lua | 14 ++++++++------ 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 25cace6..8ac8921 100644 --- a/README.md +++ b/README.md @@ -327,6 +327,31 @@ return { task = "✔ ", }, throttle = 20, -- how frequently should the ui process render events + custom_keys = { + -- you can define custom key maps here. + -- To disable one of the defaults, set it to false + + -- open lazygit log + ["<localleader>l"] = function(plugin) + require("lazy.util").open_cmd({ "lazygit", "log" }, { + cwd = plugin.dir, + terminal = true, + close_on_exit = true, + enter = true, + }) + end, + + -- open a terminal for the plugin dir + ["<localleader>t"] = function(plugin) + require("lazy.util").open_cmd({ vim.go.shell }, { + cwd = plugin.dir, + terminal = true, + close_on_exit = true, + enter = true, + }) + end, + }, + }, diff = { -- diff command <d> can be one of: -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, diff --git a/TODO.md b/TODO.md index dc33bc0..a0b7600 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,4 @@ -## ✅ TODO +# ✅ TODO - [x] fancy UI to manage all your Neovim plugins - [x] auto lazy-loading of lua modules @@ -46,6 +46,8 @@ - [ ] document highlight groups - [ ] document user events +- [ ] document API, like lazy.plugins() +- [ ] icons - [x] check in cache if rtp files match - [x] I think the installation section, specifically the loading part, could use an diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c061ea9..1cb90dc 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -50,6 +50,31 @@ M.defaults = { task = "✔ ", }, throttle = 20, -- how frequently should the ui process render events + custom_keys = { + -- you can define custom key maps here. + -- To disable one of the defaults, set it to false + + -- open lazygit log + ["<localleader>l"] = function(plugin) + require("lazy.util").open_cmd({ "lazygit", "log" }, { + cwd = plugin.dir, + terminal = true, + close_on_exit = true, + enter = true, + }) + end, + + -- open a terminal for the plugin dir + ["<localleader>t"] = function(plugin) + require("lazy.util").open_cmd({ vim.go.shell }, { + cwd = plugin.dir, + terminal = true, + close_on_exit = true, + enter = true, + }) + end, + }, + }, diff = { -- diff command <d> can be one of: -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 73a3091..e2d39c0 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -96,12 +96,14 @@ function M.create(opts) end) for key, handler in pairs(Config.options.ui.custom_keys) do - self:on_key(key, function() - local plugin = self.render:get_plugin() - if plugin then - handler(plugin) - end - end) + if handler then + self:on_key(key, function() + local plugin = self.render:get_plugin() + if plugin then + handler(plugin) + end + end) + end end self:setup_patterns() From b40ec94523c08cb83ea20d0f014704cb64bbbbc6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 24 Dec 2022 10:31:06 +0000 Subject: [PATCH 0406/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 79 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 23 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 95842cd..24971f2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 23 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 24 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -110,28 +110,28 @@ It is recommended to run `:checkhealth lazy` after installation PLUGIN SPEC *lazy.nvim-plugin-spec* -│ Property │ Type │ Description │ -│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ -│**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 │ -│**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 │ -│**enabled** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be used │ -│**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ -│**init** │fun(LazyPlugin) │init functions are always executed during startup │ -│**config** │fun(LazyPlugin) or true or table │config is executed when the plugin loads. You can also set to true or pass a table, that will be passed to require("plugin").setup(opts) │ -│**build** │fun(LazyPlugin) or string │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. │ -│**branch** │string? │Branch of the repository │ -│**tag** │string? │Tag of the repository │ -│**commit** │string? │Commit of the repository │ -│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ -│**pin** │boolean? │When true, this plugin will not be included in updates │ -│**event** │string? or string[] │Lazy-load on event │ -│**cmd** │string? or string[] │Lazy-load on command │ -│**ft** │string? or string[] │Lazy-load on filetype │ -│**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ -│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ +│ Property │ Type │ Description │ +│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ +│**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 │ +│**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 │ +│**enabled** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be used │ +│**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ +│**init** │fun(LazyPlugin) │init functions are always executed during startup │ +│**config** │fun(LazyPlugin) or true or table │config is executed when the plugin loads. You can also set to true or pass a table, that will be passed to require("plugin").setup(opts) │ +│**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ +│**branch** │string? │Branch of the repository │ +│**tag** │string? │Tag of the repository │ +│**commit** │string? │Commit of the repository │ +│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ +│**pin** │boolean? │When true, this plugin will not be included in updates │ +│**event** │string? or string[] │Lazy-load on event │ +│**cmd** │string? or string[] │Lazy-load on command │ +│**ft** │string? or string[] │Lazy-load on filetype │ +│**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ +│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ LAZY LOADING ~ @@ -364,6 +364,39 @@ CONFIGURATION *lazy.nvim-configuration* task = " ", }, throttle = 20, -- how frequently should the ui process render events + custom_keys = { + -- you can define custom key maps here. + -- To disable one of the defaults, set it to false + + -- open lazygit log + ["<localleader>l"] = function(plugin) + require("lazy.util").open_cmd({ "lazygit", "log" }, { + cwd = plugin.dir, + terminal = true, + close_on_exit = true, + enter = true, + }) + end, + + -- open a terminal for the plugin dir + ["<localleader>t"] = function(plugin) + require("lazy.util").open_cmd({ vim.go.shell }, { + cwd = plugin.dir, + terminal = true, + close_on_exit = true, + enter = true, + }) + end, + }, + }, + diff = { + -- diff command <d> can be one of: + -- browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- 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 From 3352fc62652cc7609b23002982bac3f830002679 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 11:41:01 +0100 Subject: [PATCH 0407/1610] docs: added diff keybindings to help page --- lua/lazy/view/render.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index ba242b1..934a8c2 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -150,8 +150,14 @@ function M:help() self:append("Most properties can be hovered with ") self:append("<K>", "LazySpecial") self:append(" to open links, help files, readmes and git commits."):nl() - self:append("When hovering on a plugin anywhere else, a diff will be opened if there are updates"):nl() - self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl():nl() + self + :append("When hovering with ") + :append("<K>", "LazySpecial") + :append(" on a plugin anywhere else, a diff will be opened if there are updates") + :nl() + self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl() + self:append("Use "):append("<d>", "LazySpecial"):append(" on a commit or plugin to open the diff view"):nl() + self:nl() self:append("Keyboard Shortcuts", "LazyH2"):nl() for _, mode in ipairs(ViewConfig.get_commands()) do From a36d50639358bc00b8ac2d42a8a0a6c0f9c08310 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 11:55:42 +0100 Subject: [PATCH 0408/1610] feat(manage): added user events when operations finish. Fixes #135 --- README.md | 12 ++++++++++++ TODO.md | 2 +- lua/lazy/manage/init.lua | 25 +++++++++++++++++++++---- lua/lazy/manage/runner.lua | 6 +++++- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8ac8921..2afda4d 100644 --- a/README.md +++ b/README.md @@ -519,6 +519,18 @@ require("lualine").setup({ </details> +### 📆 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 + ## 🔒 Lockfile `lazy-lock.json` After every **update**, the local lockfile is updated with the installed revisions. diff --git a/TODO.md b/TODO.md index a0b7600..e291cbc 100644 --- a/TODO.md +++ b/TODO.md @@ -45,7 +45,7 @@ - [ ] package meta index (package.lua cache for all packages) - [ ] document highlight groups -- [ ] document user events +- [x] document user events - [ ] document API, like lazy.plugins() - [ ] icons diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 64430ff..df30970 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -48,6 +48,10 @@ function M.run(ropts, opts) vim.cmd([[do User LazyRender]]) Plugin.update_state() require("lazy.manage.checker").fast_check({ report = false }) + local mode = opts.mode + if mode then + vim.cmd("do User Lazy" .. mode:sub(1, 1):upper() .. mode:sub(2)) + end end) if opts.wait then @@ -141,14 +145,27 @@ end ---@param opts? ManagerOpts function M.sync(opts) - opts = M.opts(opts, { mode = "sync" }) + opts = M.opts(opts) if opts.clear then M.clear() opts.clear = false end - M.clean(opts) - M.install(opts) - M.update(opts) + if opts.show ~= false then + vim.schedule(function() + require("lazy.view").show("sync") + end) + opts.show = false + end + local clean = M.clean(opts) + local install = M.install(opts) + local update = M.update(opts) + clean:wait(function() + install:wait(function() + update:wait(function() + vim.cmd([[do User LazySync]]) + end) + end) + end) end ---@param opts? ManagerOpts diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 125e7ce..7e556f2 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -139,7 +139,10 @@ end ---@param cb? fun() function Runner:wait(cb) if #self._running == 0 then - return cb and cb() + if cb then + cb() + end + return self end if cb then @@ -150,6 +153,7 @@ function Runner:wait(cb) vim.wait(10) end end + return self end return Runner From 9f2fb24b10277b55ebeb4da21455201cfe2d3e54 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 24 Dec 2022 10:56:27 +0000 Subject: [PATCH 0409/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 24971f2..dee0f28 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -552,6 +552,20 @@ Example of configuring <a href="https://github.com/nvim-lualine/lualine.nvim">lu < +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 + + LOCKFILE `LAZY-LOCK.JSON` *lazy.nvim-lockfile-`lazy-lock.json`* After every **update**, the local lockfile is updated with the installed From f22dfd4a44ee63502e9e539f19a9c61d3da488c5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 24 Dec 2022 12:23:46 +0100 Subject: [PATCH 0410/1610] chore(main): release 7.1.0 (#129) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d913b7..5ccb133 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## [7.1.0](https://github.com/folke/lazy.nvim/compare/v7.0.0...v7.1.0) (2022-12-24) + + +### Features + +* **build:** build can now be a list to execute multiple build commands. Fixes [#143](https://github.com/folke/lazy.nvim/issues/143) ([9110371](https://github.com/folke/lazy.nvim/commit/9110371120db2888647123d7dea7c68a574ae310)) +* **manage:** added user events when operations finish. Fixes [#135](https://github.com/folke/lazy.nvim/issues/135) ([a36d506](https://github.com/folke/lazy.nvim/commit/a36d50639358bc00b8ac2d42a8a0a6c0f9c08310)) +* **ui:** added custom commands for lazygit and opening a terminal for a plugin ([be3909c](https://github.com/folke/lazy.nvim/commit/be3909c54420c734e32cb045a387990a6fb51bd4)) +* **ui:** added multiple options for diff command ([7d02da2](https://github.com/folke/lazy.nvim/commit/7d02da2ff0216ef6ba9097d8ae5a48f54ddc7c4a)) +* **ui:** you can now hover over a plugin to open a diff of updates or the plugin homepage ([593d6e4](https://github.com/folke/lazy.nvim/commit/593d6e400b3bb529c507092bf107b6cc4364fb5b)) +* util method to open a float ([7c2eb15](https://github.com/folke/lazy.nvim/commit/7c2eb1544416646db09b410d07492555fcf44778)) +* **util:** open terminal commands in a float ([8ad05fe](https://github.com/folke/lazy.nvim/commit/8ad05feef19d6b8d4c5f686e0269ac10659f511b)) + + +### Bug Fixes + +* **checker:** update updated after every manage operation. Fixes [#141](https://github.com/folke/lazy.nvim/issues/141) ([86f2c67](https://github.com/folke/lazy.nvim/commit/86f2c67aa80b3c64d131ba47189c42ca5a37ac14)) +* **help:** make sure we always generate lazy helptags ([f360e33](https://github.com/folke/lazy.nvim/commit/f360e336a5e2b57e1ee0232c9c89a4ceb3617798)) +* **manage:** only clear plugins for the op instead of all ([fc182f7](https://github.com/folke/lazy.nvim/commit/fc182f7c5d5df9ba877ab619f6fa545e20ad52f0)) +* plugin list can be string[]. Fixes [#145](https://github.com/folke/lazy.nvim/issues/145) ([74d8b8e](https://github.com/folke/lazy.nvim/commit/74d8b8e4e180c40d2ade750940f3c64761fb7930)) + ## [7.0.0](https://github.com/folke/lazy.nvim/compare/v6.0.0...v7.0.0) (2022-12-23) From 2fabc0958d9f744db7f208ba5c28f387790c03a0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 24 Dec 2022 12:57:08 +0100 Subject: [PATCH 0411/1610] docs: added `VeryLazy` to docs --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2afda4d..22a38ae 100644 --- a/README.md +++ b/README.md @@ -530,6 +530,7 @@ The following user events will be triggered: - **LazyClean**: after a clean - **LazyCheck**: after checking for updates - **LazyLog**: after running log +- **VeryLazy**: triggered after `LazyDone` and processing `VimEnter` auto commands ## 🔒 Lockfile `lazy-lock.json` From 434b7d3edd3f9dd485a97edb5b8411e4e7109aea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 24 Dec 2022 11:57:51 +0000 Subject: [PATCH 0412/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index dee0f28..6858098 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -564,6 +564,7 @@ The following user events will be triggered: - **LazyClean**: after a clean - **LazyCheck**: after checking for updates - **LazyLog**: after running log +- **VeryLazy**: triggered after `LazyDone` and processing `VimEnter` auto commands LOCKFILE `LAZY-LOCK.JSON` *lazy.nvim-lockfile-`lazy-lock.json`* From 8ea9d8b0241f2b09b65355039ec89446bde94564 Mon Sep 17 00:00:00 2001 From: max397574 <81827001+max397574@users.noreply.github.com> Date: Sun, 25 Dec 2022 13:41:33 +0100 Subject: [PATCH 0413/1610] feat(ui): make lazy icon configurable (#163) * feat(ui): make lazy icon configurable * docs: add lazy icon config option --- README.md | 1 + doc/lazy.nvim.txt | 1 + lua/lazy/core/config.lua | 1 + lua/lazy/view/render.lua | 2 +- 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 22a38ae..9cf9f69 100644 --- a/README.md +++ b/README.md @@ -325,6 +325,7 @@ return { source = " ", start = "", task = "✔ ", + lazy = "鈴 ", }, throttle = 20, -- how frequently should the ui process render events custom_keys = { diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6858098..0dd63ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -362,6 +362,7 @@ CONFIGURATION *lazy.nvim-configuration* source = " ", start = "", task = " ", + lazy = " ", }, throttle = 20, -- how frequently should the ui process render events custom_keys = { diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1cb90dc..e002a71 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -48,6 +48,7 @@ M.defaults = { source = " ", start = "", task = "✔ ", + lazy = "鈴 ", }, throttle = 20, -- how frequently should the ui process render events custom_keys = { diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 934a8c2..c7b5e8f 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -104,7 +104,7 @@ function M:title() local title = " " .. mode.name:sub(1, 1):upper() .. mode.name:sub(2) .. " (" .. mode.key .. ") " if mode.name == "home" then if self.view.state.mode == "home" then - title = " lazy.nvim 鈴 " + title = " lazy.nvim " .. Config.options.ui.icons.lazy else title = " lazy.nvim (H) " end From db14d4b2a10ae5108e8e0d498ef44204d645d7da Mon Sep 17 00:00:00 2001 From: Jeremy Goh <30731072+thatlittleboy@users.noreply.github.com> Date: Sun, 25 Dec 2022 20:42:26 +0800 Subject: [PATCH 0414/1610] ci: fix minor typos in the github template (#159) * chore: fix minor typos in the github template * fix typo in repro.lua --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 83324d3..e6b2b68 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -82,7 +82,7 @@ body: -- install plugins local plugins = { "folke/tokyonight.nvim", - -- add any other pugins here + -- add any other plugins here } require("lazy").setup(plugins, { root = root .. "/plugins", diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 7bfd88b..ad7f1a1 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -5,8 +5,8 @@ labels: [enhancement] body: - type: checkboxes attributes: - label: Did you check docs the docs? - description: Make sure you read all the docs before subimtting a feature request + label: Did you check the docs? + description: Make sure you read all the docs before submitting a feature request options: - label: I have read all the lazy docs required: true From ed8259b7c18eb4789d15c40d720cb7c016a99b5f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 25 Dec 2022 12:43:16 +0000 Subject: [PATCH 0415/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0dd63ae..94a2464 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 24 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 25 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -362,7 +362,7 @@ CONFIGURATION *lazy.nvim-configuration* source = " ", start = "", task = " ", - lazy = " ", + lazy = " ", }, throttle = 20, -- how frequently should the ui process render events custom_keys = { From 037f2424303118b1a8312ed31081f518735823d5 Mon Sep 17 00:00:00 2001 From: jdrouhard <john@drouhard.dev> Date: Sun, 25 Dec 2022 06:45:56 -0600 Subject: [PATCH 0416/1610] fix(diff): use git show when only displaying one commit (#155) --- lua/lazy/view/diff.lua | 8 ++++++-- lua/lazy/view/init.lua | 4 +--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lua/lazy/view/diff.lua b/lua/lazy/view/diff.lua index adff761..03c47c4 100644 --- a/lua/lazy/view/diff.lua +++ b/lua/lazy/view/diff.lua @@ -32,10 +32,12 @@ M.handlers = { ---@type LazyDiffFun git = function(plugin, diff) - local cmd = { "git", "diff" } + local cmd = { "git" } if diff.commit then + cmd[#cmd + 1] = "show" cmd[#cmd + 1] = diff.commit else + cmd[#cmd + 1] = "diff" cmd[#cmd + 1] = diff.from cmd[#cmd + 1] = diff.to end @@ -44,10 +46,12 @@ M.handlers = { ---@type LazyDiffFun terminal_git = function(plugin, diff) - local cmd = { "git", "diff" } + local cmd = { "git" } if diff.commit then + cmd[#cmd + 1] = "show" cmd[#cmd + 1] = diff.commit else + cmd[#cmd + 1] = "diff" cmd[#cmd + 1] = diff.from cmd[#cmd + 1] = diff.to end diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index e2d39c0..1f6266b 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -38,14 +38,12 @@ function M.show(mode) M.view:update() end ----@param opts? {mode?:string} -function M.create(opts) +function M.create() local self = setmetatable({}, { __index = setmetatable(M, { __index = Float }) }) ---@cast self LazyView Float.init(self) require("lazy.view.colors").setup() - opts = opts or {} self.state = vim.deepcopy(default_state) From e632eb4ae095d49f8eaf1d7131f9816c0c27d1ab Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 25 Dec 2022 13:46:42 +0100 Subject: [PATCH 0417/1610] style: mode no longer needed as param for view --- lua/lazy/view/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 1f6266b..3013377 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -31,7 +31,7 @@ function M.show(mode) return end - M.view = (M.view and M.view.win) and M.view or M.create({ mode = mode }) + M.view = (M.view and M.view.win) and M.view or M.create() if mode then M.view.state.mode = mode end From 90952239d24a9c3496bc2ecf7da1624e6e05d37e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 25 Dec 2022 14:06:41 +0100 Subject: [PATCH 0418/1610] fix(loader): add proper error message when trying to load a plugin that doesn't exist. Fixes #160 --- lua/lazy/core/loader.lua | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index b749da2..3c443d5 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -110,10 +110,20 @@ function M.load(plugins, reason) ---@cast plugins (string|LazyPlugin)[] for _, plugin in pairs(plugins) do - plugin = type(plugin) == "string" and Config.plugins[plugin] or plugin + local try_load = true + + if type(plugin) == "string" then + if not Config.plugins[plugin] then + Util.error("Plugin " .. plugin .. " not found") + try_load = false + else + plugin = Config.plugins[plugin] + end + end + ---@cast plugin LazyPlugin - if not plugin._.loaded then + if try_load and not plugin._.loaded then ---@diagnostic disable-next-line: assign-type-mismatch plugin._.loaded = {} for k, v in pairs(reason) do @@ -137,7 +147,9 @@ function M.load(plugins, reason) end if plugin.dependencies then - M.load(plugin.dependencies, {}) + Util.try(function() + M.load(plugin.dependencies, {}) + end, "Failed to load deps for " .. plugin.name) end M.packadd(plugin.dir) From 3efb849d733daf10ff6ce5af3e2a91812c97691b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 25 Dec 2022 14:30:41 +0100 Subject: [PATCH 0419/1610] docs: clarified that only top-level submodules are merged in the final spec. #139 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9cf9f69..078b426 100644 --- a/README.md +++ b/README.md @@ -582,7 +582,7 @@ Files from runtime directories are always sourced in alphabetical order. 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 **sub-modules** will be merged together in the final spec, +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: From bdd7f0585af060127cb4e99f400df33d7aa3b741 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 25 Dec 2022 13:31:44 +0000 Subject: [PATCH 0420/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 94a2464..f719100 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -629,9 +629,9 @@ STRUCTURING YOUR PLUGINS *lazy.nvim-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 **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. +**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: From 1dca6edd89613b98937c2999dd86457439e8da08 Mon Sep 17 00:00:00 2001 From: NEX <97107165+NEX-S@users.noreply.github.com> Date: Sun, 25 Dec 2022 21:41:01 +0800 Subject: [PATCH 0421/1610] docs: Fix README.md wrong indent (#165) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 078b426..a8b081f 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ When `[2]` is `nil`, then the real mapping has to be created by the `config()` f }, config = function() require("neo-tree").setup() - end, + end, } ``` From 7421e70c08f5810c52e85df95029c10891840d72 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 25 Dec 2022 13:41:45 +0000 Subject: [PATCH 0422/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f719100..216352c 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -192,7 +192,7 @@ function. }, config = function() require("neo-tree").setup() - end, + end, } < From 9837d5be7e5fe3aed173401f469d371f26c334c7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 25 Dec 2022 16:17:36 +0100 Subject: [PATCH 0423/1610] fix(keys): only delete key handler mappings once --- lua/lazy/core/handler/keys.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index a6eb9ee..7311791 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -68,9 +68,15 @@ function M:_add(value) local opts = M.opts(keys) opts.noremap = true vim.keymap.set(keys.mode, lhs, function() - pcall(vim.keymap.del, keys.mode, lhs) + local key = self:key(value) + local plugins = self.active[key] + + -- always delete the mapping immediately to prevent recursive mappings + self:_del(value) + self.active[key] = nil + Util.track({ keys = lhs }) - Loader.load(self.active[self:key(value)], { keys = lhs }) + Loader.load(plugins, { keys = lhs }) M.retrigger(lhs) Util.track() end, opts) From 4aa362e8dc9ddf1e745085dc242c814569fcce37 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 25 Dec 2022 16:26:17 +0100 Subject: [PATCH 0424/1610] feat(cache): make ttl configurable --- README.md | 1 + lua/lazy/core/cache.lua | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a8b081f..c919872 100644 --- a/README.md +++ b/README.md @@ -384,6 +384,7 @@ return { -- * VimEnter: not useful to cache anything else beyond startup -- * BufReadPre: this will be triggered early when opening a file from the command line directly disable_events = { "VimEnter", "BufReadPre" }, + ttl = 3600 * 24 * 5, -- keep unused modules for up to 5 days }, reset_packpath = true, -- reset the package path to improve startup time rtp = { diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index b2dee51..ccb42ff 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -16,6 +16,7 @@ M.config = { -- * VimEnter: not useful to cache anything else beyond startup -- * BufReadPre: this will be triggered early when opening a file from the command line directly disable_events = { "VimEnter", "BufReadPre" }, + ttl = 3600 * 24 * 5, -- keep unused modules for up to 5 days } M.debug = false @@ -27,7 +28,6 @@ local cache_hash ---@type table<string,CacheEntry?> M.cache = {} M.enabled = true -M.ttl = 3600 * 24 * 5 -- keep unused modules for up to 5 days ---@type string[] M.rtp = nil -- selene:allow(global_usage) @@ -238,7 +238,7 @@ function M.save_cache() uv.fs_write(f, M.VERSION) uv.fs_write(f, "\0") for modname, entry in pairs(M.cache) do - if entry.used > os.time() - M.ttl then + if entry.used > os.time() - M.config.ttl then entry.modname = modname local header = { entry.hash.size, From 6c5af82589f846a773ac2e8ed44f7479fb28a870 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 25 Dec 2022 15:27:12 +0000 Subject: [PATCH 0425/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 216352c..13cedc0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -421,6 +421,7 @@ CONFIGURATION *lazy.nvim-configuration* -- VimEnter: not useful to cache anything else beyond startup -- BufReadPre: this will be triggered early when opening a file from the command line directly disable_events = { "VimEnter", "BufReadPre" }, + ttl = 3600 24 5, -- keep unused modules for up to 5 days }, reset_packpath = true, -- reset the package path to improve startup time rtp = { From 2f5c1be5255a318d610e0a86abe0a38bf18af4ad Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 25 Dec 2022 21:07:30 +0100 Subject: [PATCH 0426/1610] fix(ui): get plugin details from the correct plugin in case it was deleted --- lua/lazy/core/plugin.lua | 4 ++++ lua/lazy/view/init.lua | 13 +++++++++++-- lua/lazy/view/render.lua | 25 +++++++++++++++++-------- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index c69f048..de365d9 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -5,6 +5,8 @@ local Cache = require("lazy.core.cache") local M = {} +---@alias LazyPluginKind "normal"|"clean" + ---@class LazyPluginState ---@field loaded? {[string]:string}|{time:number} ---@field installed boolean @@ -14,6 +16,7 @@ local M = {} ---@field is_local boolean ---@field has_updates? boolean ---@field cloned? boolean +---@field kind? LazyPluginKind ---@field dep? boolean True if this plugin is only in the spec as a dependency ---@class LazyPluginHooks @@ -218,6 +221,7 @@ function M.update_state() name = pack, dir = Config.options.root .. "/" .. pack, _ = { + kind = "clean", installed = true, is_symlink = dir_type == "link", is_local = dir_type == "link", diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 3013377..8cf6ec6 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -8,7 +8,7 @@ local Float = require("lazy.view.float") ---@class LazyViewState ---@field mode string ----@field plugin? string +---@field plugin? {name:string, kind?: LazyPluginKind} local default_state = { mode = "home", profile = { @@ -38,6 +38,11 @@ function M.show(mode) M.view:update() end +---@param plugin LazyPlugin +function M:is_selected(plugin) + return vim.deep_equal(self.state.plugin, { name = plugin.name, kind = plugin._.kind }) +end + function M.create() local self = setmetatable({}, { __index = setmetatable(M, { __index = Float }) }) ---@cast self LazyView @@ -61,7 +66,11 @@ function M.create() self:on_key(ViewConfig.keys.details, function() local plugin = self.render:get_plugin() if plugin then - self.state.plugin = self.state.plugin ~= plugin.name and plugin.name or nil + local selected = { + name = plugin.name, + kind = plugin._.kind, + } + self.state.plugin = not vim.deep_equal(self.state.plugin, selected) and selected or nil self:update() end end) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index c7b5e8f..8342a8e 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -15,7 +15,7 @@ local Text = require("lazy.view.text") ---@field plugins LazyPlugin[] ---@field progress {total:number, done:number} ---@field _diagnostics LazyDiagnostic[] ----@field plugin_range table<string, {from: number, to: number}> +---@field locations {name:string, from: number, to: number, kind?: LazyPluginKind}[] local M = {} ---@return LazyRender @@ -32,7 +32,7 @@ end function M:update() self._lines = {} self._diagnostics = {} - self.plugin_range = {} + self.locations = {} self.plugins = vim.tbl_values(Config.plugins) vim.list_extend(self.plugins, vim.tbl_values(Config.to_clean)) @@ -90,9 +90,17 @@ end ---@return LazyPlugin? function M:get_plugin(row) row = row or vim.api.nvim_win_get_cursor(self.view.win)[1] - for name, range in pairs(self.plugin_range) do - if row >= range.from and row <= range.to then - return Config.plugins[name] + for _, loc in ipairs(self.locations) do + if row >= loc.from and row <= loc.to then + if loc.kind == "clean" then + for _, plugin in ipairs(Config.to_clean) do + if plugin.name == loc.name then + return plugin + end + end + else + return Config.plugins[loc.name] + end end end end @@ -361,11 +369,12 @@ function M:plugin(plugin) self:diagnostics(plugin) self:nl() - if self.view.state.plugin == plugin.name then + if self.view:is_selected(plugin) then self:details(plugin) end self:tasks(plugin) - self.plugin_range[plugin.name] = { from = plugin_start, to = self:row() - 1 } + self.locations[#self.locations + 1] = + { name = plugin.name, from = plugin_start, to = self:row() - 1, kind = plugin._.kind } end ---@param plugin LazyPlugin @@ -378,7 +387,7 @@ function M:tasks(plugin) end if task.name == "log" and not task.error then self:log(task) - elseif task.error or self.view.state.plugin == plugin.name then + elseif task.error or self.view:is_selected(plugin) then if task.error then self:append(vim.trim(task.error), "LazyError", { indent = 4, prefix = "│ " }) self:nl() From aed842ae1e39aa227069a7f46ef0e141efbd021b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 09:35:19 +0100 Subject: [PATCH 0427/1610] feat(plugin): added `Plugin.cond`. Fixes #89, #168 --- README.md | 3 ++- lua/lazy/core/loader.lua | 5 +++++ lua/lazy/core/plugin.lua | 2 ++ lua/lazy/view/colors.lua | 1 + lua/lazy/view/render.lua | 2 ++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c919872..0901eec 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,8 @@ require("lazy").setup({ | **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` | | **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 | -| **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | +| **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 `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | | **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | | **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | | **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 3c443d5..60e6a84 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -121,6 +121,11 @@ function M.load(plugins, reason) end end + if try_load and plugin.cond then + try_load = plugin.cond == true or (type(plugin.cond) == "function" and plugin.cond()) or false + plugin._.cond = try_load + end + ---@cast plugin LazyPlugin if try_load and not plugin._.loaded then diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index de365d9..54509e5 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -18,6 +18,7 @@ local M = {} ---@field cloned? boolean ---@field kind? LazyPluginKind ---@field dep? boolean True if this plugin is only in the spec as a dependency +---@field cond? boolean ---@class LazyPluginHooks ---@field init? fun(LazyPlugin) Will always be run @@ -44,6 +45,7 @@ local M = {} ---@field url string? ---@field dir string ---@field enabled? boolean|(fun():boolean) +---@field cond? boolean|(fun():boolean) ---@field lazy? boolean ---@field dev? boolean If set, then link to the respective folder under your ~/projects ---@field dependencies? string[] diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index ed489c9..f03b402 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -15,6 +15,7 @@ M.colors = { fg = "#ff007c", }, ProgressTodo = "LineNr", + NoCond = "DiagnosticError", Special = "@punctuation.special", HandlerRuntime = "@macro", HandlerPlugin = "Special", diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 8342a8e..c4e15bb 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -359,6 +359,8 @@ end function M:plugin(plugin) if plugin._.loaded then self:append(" ● ", "LazySpecial"):append(plugin.name) + elseif plugin._.cond == false then + self:append(" ○ ", "LazyNoCond"):append(plugin.name) else self:append(" ○ ", "LazySpecial"):append(plugin.name) end From 5f017bf65565f08f2c3430cce8adc3dd8efbcaef Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 09:37:26 +0100 Subject: [PATCH 0428/1610] docs: document highlight groups --- README.md | 33 ++++++++++++++++++++++++++ lua/lazy/docs.lua | 50 ++++++++++++++++++++++------------------ lua/lazy/view/colors.lua | 21 +++++++---------- 3 files changed, 69 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 0901eec..5fe37f7 100644 --- a/README.md +++ b/README.md @@ -659,6 +659,39 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori > paths can differ if you changed `XDG` environment variables. +## 🌈 Highlight Groups + +<details> +<summary>Click to see all highlight groups</summary> + +<!-- colors:start --> + +| Highlight Group | Default Group | Description | +| ---------------------- | -------------------------- | ----------------- | +| **LazyButton** | **_CursorLine_** | | +| **LazyButtonActive** | **_Visual_** | | +| **LazyCommit** | **_@variable.builtin_** | | +| **LazyError** | **_ErrorMsg_** | task errors | +| **LazyH1** | **_IncSearch_** | | +| **LazyH2** | **_Bold_** | | +| **LazyHandlerCmd** | **_Operator_** | | +| **LazyHandlerEvent** | **_Constant_** | | +| **LazyHandlerFt** | **_Character_** | | +| **LazyHandlerKeys** | **_Statement_** | | +| **LazyHandlerPlugin** | **_Special_** | | +| **LazyHandlerRuntime** | **_@macro_** | | +| **LazyHandlerSource** | **_Character_** | | +| **LazyHandlerStart** | **_@field_** | | +| **LazyKey** | **_Conceal_** | | +| **LazyMuted** | **_Comment_** | | +| **LazyNormal** | **_NormalFloat_** | | +| **LazyProgressDone** | **_Constant_** | progress bar done | +| **LazyProgressTodo** | **_LineNr_** | progress bar todo | +| **LazySpecial** | **_@punctuation.special_** | | +| **LazyValue** | **_@string_** | | + +<!-- colors:end --> + ## 📦 Other Neovim Plugin Managers in Lua - [packer.nvim](https://github.com/wbthomason/packer.nvim) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index e662495..142b517 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -10,26 +10,6 @@ function M.indent(str, indent) return table.concat(lines, "\n") end -function M.toc(md) - local toc = {} - local lines = vim.split(md, "\n") - local toc_found = false - for _, line in ipairs(lines) do - local hash, title = line:match("^(#+)%s*(.*)") - if hash then - if toc_found then - local anchor = string.gsub(title:lower(), "[^\32-\126]", "") - anchor = string.gsub(anchor, " ", "-") - toc[#toc + 1] = string.rep(" ", #hash - 1) .. "- [" .. title .. "](#" .. anchor .. ")" - end - if title:find("Table of Contents") then - toc_found = true - end - end - end - return M.fix_indent(table.concat(toc, "\n")) -end - ---@param str string function M.fix_indent(str) local lines = vim.split(str, "\n") @@ -48,7 +28,6 @@ end ---@param contents table<string, string> function M.save(contents) local readme = Util.read_file("README.md") - -- contents.toc = M.toc(readme) for tag, content in pairs(contents) do content = M.fix_indent(content) content = content:gsub("%%", "%%%%") @@ -57,7 +36,7 @@ function M.save(contents) if not readme:find(pattern) then error("tag " .. tag .. " not found") end - if tag == "toc" or tag == "commands" then + if tag == "commands" or tag == "colors" then readme = readme:gsub(pattern, "%1\n\n" .. content .. "\n\n%2") else readme = readme:gsub(pattern, "%1\n\n```lua\n" .. content .. "\n```\n\n%2") @@ -104,6 +83,12 @@ function M.commands() end end end) + return M.table(lines) +end + +---@param lines string[][] +function M.table(lines) + ---@type string[] local ret = {} for _, line in ipairs(lines) do ret[#ret + 1] = "| " .. table.concat(line, " | ") .. " |" @@ -111,6 +96,26 @@ function M.commands() return table.concat(ret, "\n") end +function M.colors() + local str = M.extract("lua/lazy/view/colors.lua", "\nM%.colors = ({.-\n})") + ---@type table<string,string> + local comments = {} + for _, line in ipairs(vim.split(str, "\n")) do + local group, desc = line:match("^ (%w+) = .* -- (.*)") + if group then + comments[group] = desc + end + end + local lines = { + { "Highlight Group", "Default Group", "Description" }, + { "---", "---", "---" }, + } + Util.foreach(require("lazy.view.colors").colors, function(group, link) + lines[#lines + 1] = { "**Lazy" .. group .. "**", "***" .. link .. "***", comments[group] or "" } + end) + return M.table(lines) +end + function M.update() local cache_config = M.extract("lua/lazy/core/cache.lua", "\nM%.config = ({.-\n})") local config = M.extract("lua/lazy/core/config.lua", "\nM%.defaults = ({.-\n})") @@ -124,6 +129,7 @@ function M.update() config = config, spec = Util.read_file("lua/lazy/example.lua"), commands = M.commands(), + colors = M.colors(), }) vim.cmd.checktime() end diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index f03b402..23d9429 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -1,7 +1,7 @@ local M = {} M.colors = { - Error = "ErrorMsg", + Error = "ErrorMsg", -- task errors H1 = "IncSearch", H2 = "Bold", Muted = "Comment", @@ -9,13 +9,9 @@ M.colors = { Commit = "@variable.builtin", Key = "Conceal", Value = "@string", - ProgressDone = { - bold = true, - default = true, - fg = "#ff007c", - }, - ProgressTodo = "LineNr", NoCond = "DiagnosticError", + ProgressDone = "Constant", -- progress bar done + ProgressTodo = "LineNr", -- progress bar todo Special = "@punctuation.special", HandlerRuntime = "@macro", HandlerPlugin = "Special", @@ -32,12 +28,11 @@ M.colors = { M.did_setup = false function M.set_hl() - for hl_group, opts in pairs(M.colors) do - if type(opts) == "string" then - opts = { link = opts } - end - opts.default = true - vim.api.nvim_set_hl(0, "Lazy" .. hl_group, opts) + for hl_group, link in pairs(M.colors) do + vim.api.nvim_set_hl(0, "Lazy" .. hl_group, { + link = link, + default = true, + }) end end From 3d22c496da6c3a3dfb9e91bb8d9111ed8adec663 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Dec 2022 08:38:12 +0000 Subject: [PATCH 0429/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 13cedc0..363c122 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 25 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 26 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -17,6 +17,7 @@ Table of Contents *lazy.nvim-table-of-contents* - Structuring Your Plugins |lazy.nvim-structuring-your-plugins| - Migration Guide |lazy.nvim-migration-guide| - Uninstalling |lazy.nvim-uninstalling| + - Highlight Groups |lazy.nvim-highlight-groups| - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| ============================================================================== @@ -117,7 +118,8 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**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 │ │**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 │ -│**enabled** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be used │ +│**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 fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ │**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ │**init** │fun(LazyPlugin) │init functions are always executed during startup │ │**config** │fun(LazyPlugin) or true or table │config is executed when the plugin loads. You can also set to true or pass a table, that will be passed to require("plugin").setup(opts) │ @@ -729,6 +731,34 @@ directories: paths can differ if you changed `XDG` environment variables. +HIGHLIGHT GROUPS *lazy.nvim-highlight-groups* + +Click to see all highlight groups + +│ Highlight Group │ Default Group │ Description │ +│**LazyButton** │**_CursorLine_** │ │ +│**LazyButtonActive** │**_Visual_** │ │ +│**LazyCommit** │_variable.builtin │ │ +│**LazyError** │**_ErrorMsg_** │taskerrors │ +│**LazyH1** │**_IncSearch_** │ │ +│**LazyH2** │**_Bold_** │ │ +│**LazyHandlerCmd** │**_Operator_** │ │ +│**LazyHandlerEvent** │**_Constant_** │ │ +│**LazyHandlerFt** │**_Character_** │ │ +│**LazyHandlerKeys** │**_Statement_** │ │ +│**LazyHandlerPlugin** │**_Special_** │ │ +│**LazyHandlerRuntime**│_macro │ │ +│**LazyHandlerSource** │**_Character_** │ │ +│**LazyHandlerStart** │_field │ │ +│**LazyKey** │**_Conceal_** │ │ +│**LazyMuted** │**_Comment_** │ │ +│**LazyNormal** │**_NormalFloat_** │ │ +│**LazyProgressDone** │**_Constant_** │progressbar done │ +│**LazyProgressTodo** │**_LineNr_** │progress bar todo│ +│**LazySpecial** │_punctuation.special│ │ +│**LazyValue** │_string │ │ + + OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-other-neovim-plugin-managers-in-lua* From 0ea771bd70feaba8002e129ef16f65b1dff7c392 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 10:24:47 +0100 Subject: [PATCH 0430/1610] feat(ui): made all highlight groups and icons configurable --- README.md | 61 ++++++++++++++++++++------------- lua/lazy/core/config.lua | 8 +++++ lua/lazy/view/colors.lua | 38 ++++++++++++--------- lua/lazy/view/float.lua | 5 +++ lua/lazy/view/render.lua | 74 +++++++++++++++++++--------------------- 5 files changed, 108 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index 5fe37f7..7a679f4 100644 --- a/README.md +++ b/README.md @@ -315,6 +315,8 @@ return { -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { + loaded = "●", + not_loaded = "○", cmd = " ", config = "", event = "", @@ -327,6 +329,12 @@ return { start = "", task = "✔ ", lazy = "鈴 ", + list = { + "●", + "➜", + "★", + "‒", + }, }, throttle = 20, -- how frequently should the ui process render events custom_keys = { @@ -666,29 +674,36 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori <!-- colors:start --> -| Highlight Group | Default Group | Description | -| ---------------------- | -------------------------- | ----------------- | -| **LazyButton** | **_CursorLine_** | | -| **LazyButtonActive** | **_Visual_** | | -| **LazyCommit** | **_@variable.builtin_** | | -| **LazyError** | **_ErrorMsg_** | task errors | -| **LazyH1** | **_IncSearch_** | | -| **LazyH2** | **_Bold_** | | -| **LazyHandlerCmd** | **_Operator_** | | -| **LazyHandlerEvent** | **_Constant_** | | -| **LazyHandlerFt** | **_Character_** | | -| **LazyHandlerKeys** | **_Statement_** | | -| **LazyHandlerPlugin** | **_Special_** | | -| **LazyHandlerRuntime** | **_@macro_** | | -| **LazyHandlerSource** | **_Character_** | | -| **LazyHandlerStart** | **_@field_** | | -| **LazyKey** | **_Conceal_** | | -| **LazyMuted** | **_Comment_** | | -| **LazyNormal** | **_NormalFloat_** | | -| **LazyProgressDone** | **_Constant_** | progress bar done | -| **LazyProgressTodo** | **_LineNr_** | progress bar todo | -| **LazySpecial** | **_@punctuation.special_** | | -| **LazyValue** | **_@string_** | | +| Highlight Group | Default Group | Description | +| --------------------- | -------------------------- | --------------------------------------------------- | +| **LazyButton** | **_CursorLine_** | | +| **LazyButtonActive** | **_Visual_** | | +| **LazyComment** | **_Comment_** | | +| **LazyCommit** | **_@variable.builtin_** | commit ref | +| **LazyCommitIssue** | **_Number_** | | +| **LazyCommitScope** | **_Italic_** | conventional commit scope | +| **LazyCommitType** | **_Title_** | conventional commit type | +| **LazyDir** | **_@text.reference_** | directory | +| **LazyH1** | **_IncSearch_** | home button | +| **LazyH2** | **_Bold_** | titles | +| **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_** | | +| **LazyReasonKeys** | **_Statement_** | | +| **LazyReasonPlugin** | **_Special_** | | +| **LazyReasonRuntime** | **_@macro_** | | +| **LazyReasonSource** | **_Character_** | | +| **LazyReasonStart** | **_@field_** | | +| **LazySpecial** | **_@punctuation.special_** | | +| **LazyTaskError** | **_ErrorMsg_** | task errors | +| **LazyTaskOutput** | **_MsgArea_** | task output | +| **LazyUrl** | **_@text.reference_** | url | +| **LazyValue** | **_@string_** | value of a property | <!-- colors:end --> diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index e002a71..1da607b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -37,6 +37,8 @@ M.defaults = { -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { + loaded = "●", + not_loaded = "○", cmd = " ", config = "", event = "", @@ -49,6 +51,12 @@ M.defaults = { start = "", task = "✔ ", lazy = "鈴 ", + list = { + "●", + "➜", + "★", + "‒", + }, }, throttle = 20, -- how frequently should the ui process render events custom_keys = { diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index 23d9429..0ec8b2b 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -1,28 +1,34 @@ local M = {} M.colors = { - Error = "ErrorMsg", -- task errors - H1 = "IncSearch", - H2 = "Bold", - Muted = "Comment", + H1 = "IncSearch", -- home button + H2 = "Bold", -- titles + Comment = "Comment", Normal = "NormalFloat", - Commit = "@variable.builtin", - Key = "Conceal", - Value = "@string", - NoCond = "DiagnosticError", + Commit = "@variable.builtin", -- commit ref + CommitIssue = "Number", + CommitType = "Title", -- conventional commit type + CommitScope = "Italic", -- conventional commit scope + Prop = "Conceal", -- property + Value = "@string", -- value of a property + NoCond = "DiagnosticWarn", -- unloaded icon for a plugin where `cond()` was false ProgressDone = "Constant", -- progress bar done ProgressTodo = "LineNr", -- progress bar todo Special = "@punctuation.special", - HandlerRuntime = "@macro", - HandlerPlugin = "Special", - HandlerEvent = "Constant", - HandlerKeys = "Statement", - HandlerStart = "@field", - HandlerSource = "Character", - HandlerFt = "Character", - HandlerCmd = "Operator", + ReasonRuntime = "@macro", + ReasonPlugin = "Special", + ReasonEvent = "Constant", + ReasonKeys = "Statement", + ReasonStart = "@field", + ReasonSource = "Character", + ReasonFt = "Character", + ReasonCmd = "Operator", Button = "CursorLine", ButtonActive = "Visual", + TaskOutput = "MsgArea", -- task output + TaskError = "ErrorMsg", -- task errors + Dir = "@text.reference", -- directory + Url = "@text.reference", -- url } M.did_setup = false diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 0a92dbd..3dfec98 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -77,6 +77,10 @@ function M:mount() end ---@class LazyViewWinOpts + ---@field width number + ---@field height number + ---@field row number + ---@field col number local win_opts = { relative = "editor", style = "minimal", @@ -111,6 +115,7 @@ function M:mount() self:layout() local config = {} for _, key in ipairs({ "relative", "width", "height", "col", "row" }) do + ---@diagnostic disable-next-line: no-unknown config[key] = self.opts.win_opts[key] end vim.api.nvim_win_set_config(self.win, config) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index c4e15bb..34e4aaa 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -141,10 +141,10 @@ function M:title() if self.view.state.mode ~= "help" and self.view.state.mode ~= "profile" and self.view.state.mode ~= "debug" then if self.progress.done < self.progress.total then self:append("Tasks: ", "LazyH2") - self:append(self.progress.done .. "/" .. self.progress.total, "LazyMuted") + self:append(self.progress.done .. "/" .. self.progress.total, "LazyComment") else self:append("Total: ", "LazyH2") - self:append(#self.plugins .. " plugins", "LazyMuted") + self:append(#self.plugins .. " plugins", "LazyComment") end self:nl():nl() end @@ -174,7 +174,7 @@ function M:help() self:append("- ", "LazySpecial", { indent = 2 }) self:append(title, "Title") if mode.key then - self:append(" <" .. mode.key .. ">", "LazyKey") + self:append(" <" .. mode.key .. ">", "LazyProp") end self:append(" " .. (mode.desc or "")):nl() end @@ -187,7 +187,7 @@ function M:help() self:append("- ", "LazySpecial", { indent = 2 }) self:append(title, "Title") if mode.key_plugin then - self:append(" <" .. mode.key_plugin .. ">", "LazyKey") + self:append(" <" .. mode.key_plugin .. ">", "LazyProp") end self:append(" " .. (mode.desc_plugin or mode.desc)):nl() end @@ -225,7 +225,7 @@ function M:section(section) local count = #section_plugins if count > 0 then - self:append(section.title, "LazyH2"):append(" (" .. count .. ")", "LazyMuted"):nl() + self:append(section.title, "LazyH2"):append(" (" .. count .. ")", "LazyComment"):nl() for _, plugin in ipairs(section_plugins) do self:plugin(plugin) end @@ -306,13 +306,13 @@ function M:reason(reason, opts) if key == "keys" then value = type(value) == "string" and value or value[1] end - local hl = "LazyHandler" .. key:sub(1, 1):upper() .. key:sub(2) + local hl = "LazyReason" .. key:sub(1, 1):upper() .. key:sub(2) local icon = Config.options.ui.icons[key] if icon then self:append(icon .. " ", hl) self:append(value, hl) else - self:append(key .. " ", "@field") + self:append(key .. " ", hl) self:append(value, hl) end end @@ -320,7 +320,6 @@ function M:reason(reason, opts) if time and opts.time_right then self:append(time, "Bold") end - -- self:append(")", "Conceal") end ---@param plugin LazyPlugin @@ -358,11 +357,11 @@ end ---@param plugin LazyPlugin function M:plugin(plugin) if plugin._.loaded then - self:append(" ● ", "LazySpecial"):append(plugin.name) + self:append(" " .. Config.options.ui.icons.loaded .. " ", "LazySpecial"):append(plugin.name) elseif plugin._.cond == false then - self:append(" ○ ", "LazyNoCond"):append(plugin.name) + self:append(" " .. Config.options.ui.icons.not_loaded .. " ", "LazyNoCond"):append(plugin.name) else - self:append(" ○ ", "LazySpecial"):append(plugin.name) + self:append(" " .. Config.options.ui.icons.not_loaded .. " ", "LazySpecial"):append(plugin.name) end local plugin_start = self:row() if plugin._.loaded then @@ -382,22 +381,19 @@ end ---@param plugin LazyPlugin function M:tasks(plugin) for _, task in ipairs(plugin._.tasks or {}) do - if self.view.state.plugin == plugin.name then - self:append("✔ [task] ", "Title", { indent = 4 }):append(task.name) + if self.view:is_selected(plugin) then + self:append(Config.options.ui.icons.task .. "[task] ", "Title", { indent = 4 }):append(task.name) self:append(" " .. math.floor((task:time()) * 100) / 100 .. "ms", "Bold") self:nl() end - if task.name == "log" and not task.error then + if task.error then + self:append(vim.trim(task.error), "LazyTaskError", { indent = 6 }) + self:nl() + elseif task.name == "log" then self:log(task) - elseif task.error or self.view:is_selected(plugin) then - if task.error then - self:append(vim.trim(task.error), "LazyError", { indent = 4, prefix = "│ " }) - self:nl() - end - if task.output ~= "" and task.output ~= task.error then - self:append(vim.trim(task.output), "MsgArea", { indent = 4, prefix = "│ " }) - self:nl() - end + elseif self.view:is_selected(plugin) and task.output ~= "" and task.output ~= task.error then + self:append(vim.trim(task.output), "LazyTaskOutput", { indent = 6 }) + self:nl() end end end @@ -414,15 +410,15 @@ function M:log(task) end self:append(ref:sub(1, 7) .. " ", "LazyCommit", { indent = 6 }) self:append(vim.trim(msg)):highlight({ - ["#%d+"] = "Number", - ["^%S+:"] = "Title", - ["^%S+(%(.*%)):"] = "Italic", + ["#%d+"] = "LazyCommitIssue", + ["^%S+:"] = "LazyCommitType", + ["^%S+(%(.*%)):"] = "LazyCommitScope", ["`.-`"] = "@text.literal.markdown_inline", ["%*.-%*"] = "Italic", ["%*%*.-%*%*"] = "Bold", }) -- string.gsub - self:append(" " .. time, "Comment") + self:append(" " .. time, "LazyComment") self:nl() end self:nl() @@ -433,9 +429,9 @@ end function M:details(plugin) ---@type string[][] local props = {} - table.insert(props, { "dir", plugin.dir, "@text.reference" }) + table.insert(props, { "dir", plugin.dir, "LazyDir" }) if plugin.url then - table.insert(props, { "url", (plugin.url:gsub("%.git$", "")), "@text.reference" }) + table.insert(props, { "url", (plugin.url:gsub("%.git$", "")), "LazyUrl" }) end local git = Git.info(plugin.dir, true) if git then @@ -483,7 +479,7 @@ function M:details(plugin) width = math.max(width, #prop[1]) end for _, prop in ipairs(props) do - self:append(prop[1] .. string.rep(" ", width - #prop[1] + 1), "LazyKey", { indent = 6 }) + self:append(prop[1] .. string.rep(" ", width - #prop[1] + 1), "LazyProp", { indent = 6 }) if type(prop[2]) == "function" then prop[2]() else @@ -508,12 +504,6 @@ function M:profile() :nl() self:nl() - local symbols = { - "●", - "➜", - "★", - "‒", - } ---@param a LazyProfile ---@param b LazyProfile @@ -543,7 +533,7 @@ function M:profile() end local data = type(entry.data) == "string" and { source = entry.data } or entry.data data.time = entry.time - local symbol = symbols[depth] or symbols[#symbols] + local symbol = M.list_icon(depth) self:append((" "):rep(depth)):append(symbol, "LazySpecial"):append(" ") self:reason(data, { time_right = true }) self:nl() @@ -557,12 +547,17 @@ function M:profile() end end +function M.list_icon(depth) + local symbols = Config.options.ui.icons.list + return symbols[(depth - 1) % #symbols + 1] +end + function M:debug() self:append("Active Handlers", "LazyH2"):nl() self :append( "This shows only the lazy handlers that are still active. When a plugin loads, its handlers are removed", - "Comment", + "LazyComment", { indent = 2 } ) :nl() @@ -571,6 +566,7 @@ function M:debug() Util.foreach(handler.active, function(value, plugins) value = type(value) == "table" and value[1] or value if not vim.tbl_isempty(plugins) then + ---@type string[] plugins = vim.tbl_values(plugins) table.sort(plugins) self:append("● ", "LazySpecial", { indent = 2 }) @@ -590,7 +586,7 @@ function M:debug() local kb = math.floor(#entry.chunk / 10.24) / 100 self:append("● ", "LazySpecial", { indent = 2 }):append(modname):append(" " .. kb .. "Kb", "Bold") if entry.modpath ~= modname then - self:append(" " .. vim.fn.fnamemodify(entry.modpath, ":p:~:."), "Comment") + self:append(" " .. vim.fn.fnamemodify(entry.modpath, ":p:~:."), "LazyComment") end self:nl() end) From e6de63bc9cc7f07821cc392c39361ccbfd7770e2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Dec 2022 09:25:34 +0000 Subject: [PATCH 0431/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 59 +++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 363c122..5cf7ca8 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -353,6 +353,8 @@ CONFIGURATION *lazy.nvim-configuration* -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { + loaded = "", + not_loaded = "", cmd = " ", config = "", event = "", @@ -365,6 +367,12 @@ CONFIGURATION *lazy.nvim-configuration* start = "", task = " ", lazy = " ", + list = { + "", + "", + "", + "‒", + }, }, throttle = 20, -- how frequently should the ui process render events custom_keys = { @@ -735,28 +743,35 @@ HIGHLIGHT GROUPS *lazy.nvim-highlight-groups* Click to see all highlight groups -│ Highlight Group │ Default Group │ Description │ -│**LazyButton** │**_CursorLine_** │ │ -│**LazyButtonActive** │**_Visual_** │ │ -│**LazyCommit** │_variable.builtin │ │ -│**LazyError** │**_ErrorMsg_** │taskerrors │ -│**LazyH1** │**_IncSearch_** │ │ -│**LazyH2** │**_Bold_** │ │ -│**LazyHandlerCmd** │**_Operator_** │ │ -│**LazyHandlerEvent** │**_Constant_** │ │ -│**LazyHandlerFt** │**_Character_** │ │ -│**LazyHandlerKeys** │**_Statement_** │ │ -│**LazyHandlerPlugin** │**_Special_** │ │ -│**LazyHandlerRuntime**│_macro │ │ -│**LazyHandlerSource** │**_Character_** │ │ -│**LazyHandlerStart** │_field │ │ -│**LazyKey** │**_Conceal_** │ │ -│**LazyMuted** │**_Comment_** │ │ -│**LazyNormal** │**_NormalFloat_** │ │ -│**LazyProgressDone** │**_Constant_** │progressbar done │ -│**LazyProgressTodo** │**_LineNr_** │progress bar todo│ -│**LazySpecial** │_punctuation.special│ │ -│**LazyValue** │_string │ │ +│ Highlight Group │ Default Group │ Description │ +│**LazyButton** │**_CursorLine_** │ │ +│**LazyButtonActive** │**_Visual_** │ │ +│**LazyComment** │**_Comment_** │ │ +│**LazyCommit** │_variable.builtin │commitref │ +│**LazyCommitIssue** │**_Number_** │ │ +│**LazyCommitScope** │**_Italic_** │conventional commit scope │ +│**LazyCommitType** │**_Title_** │conventional commit type │ +│**LazyDir** │_text.reference │directory │ +│**LazyH1** │**_IncSearch_** │homebutton │ +│**LazyH2** │**_Bold_** │titles │ +│**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_** │ │ +│**LazyReasonKeys** │**_Statement_** │ │ +│**LazyReasonPlugin** │**_Special_** │ │ +│**LazyReasonRuntime**│_macro │ │ +│**LazyReasonSource** │**_Character_** │ │ +│**LazyReasonStart** │_field │ │ +│**LazySpecial** │_punctuation.special│ │ +│**LazyTaskError** │**_ErrorMsg_** │taskerrors │ +│**LazyTaskOutput** │**_MsgArea_** │task output │ +│**LazyUrl** │_text.reference │url │ +│**LazyValue** │_string │valueof a property │ OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-other-neovim-plugin-managers-in-lua* From 1d3da277da31ced9db941d215854b3217ee566c4 Mon Sep 17 00:00:00 2001 From: max397574 <81827001+max397574@users.noreply.github.com> Date: Mon, 26 Dec 2022 11:20:40 +0100 Subject: [PATCH 0432/1610] docs: don't fold other plugin managers with colors (#169) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7a679f4..2914dea 100644 --- a/README.md +++ b/README.md @@ -707,6 +707,8 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori <!-- colors:end --> +</details> + ## 📦 Other Neovim Plugin Managers in Lua - [packer.nvim](https://github.com/wbthomason/packer.nvim) From 9a2ecc875003a4cbcfba2eeaea0fbd794d270449 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 14:19:33 +0100 Subject: [PATCH 0433/1610] feat(ui): re-render after resize. Fixes #174 --- lua/lazy/view/float.lua | 1 + lua/lazy/view/init.lua | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 3dfec98..0675fd0 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -119,6 +119,7 @@ function M:mount() config[key] = self.opts.win_opts[key] end vim.api.nvim_win_set_config(self.win, config) + vim.cmd([[do User LazyFloatResized]]) end, }) end diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 8cf6ec6..e058674 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -55,7 +55,7 @@ function M.create() self.render = Render.new(self) self.update = Util.throttle(Config.options.ui.throttle, self.update) - self:on("User LazyRender", function() + self:on({ "User LazyRender", "User LazyFloatResized" }, function() if not (self.buf and vim.api.nvim_buf_is_valid(self.buf)) then return true end From 46280a191bd1b6b30607f0d97e1c6d1bcbab1a93 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 15:55:40 +0100 Subject: [PATCH 0434/1610] fix(keys): don't escape pendig keys twice and only convert when number --- lua/lazy/core/handler/keys.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 7311791..9c156d7 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -16,13 +16,15 @@ local M = {} function M.retrigger(keys) local pending = "" while true do + ---@type number|string local c = vim.fn.getchar(0) if c == 0 then break end - pending = pending .. vim.fn.nr2char(c) + c = type(c) == "number" and vim.fn.nr2char(c) or c + pending = pending .. c end - local feed = vim.api.nvim_replace_termcodes(keys .. pending, true, true, true) + local feed = vim.api.nvim_replace_termcodes(keys, true, false, true) .. pending vim.api.nvim_feedkeys(feed, "m", false) end From 5697098e9763c204cfc75506d3fbbd187bc5d672 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Dec 2022 16:12:23 +0100 Subject: [PATCH 0435/1610] chore(main): release 7.2.0 (#166) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ccb133..1510921 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## [7.2.0](https://github.com/folke/lazy.nvim/compare/v7.1.0...v7.2.0) (2022-12-26) + + +### Features + +* **cache:** make ttl configurable ([4aa362e](https://github.com/folke/lazy.nvim/commit/4aa362e8dc9ddf1e745085dc242c814569fcce37)) +* **plugin:** added `Plugin.cond`. Fixes [#89](https://github.com/folke/lazy.nvim/issues/89), [#168](https://github.com/folke/lazy.nvim/issues/168) ([aed842a](https://github.com/folke/lazy.nvim/commit/aed842ae1e39aa227069a7f46ef0e141efbd021b)) +* **ui:** made all highlight groups and icons configurable ([0ea771b](https://github.com/folke/lazy.nvim/commit/0ea771bd70feaba8002e129ef16f65b1dff7c392)) +* **ui:** make lazy icon configurable ([#163](https://github.com/folke/lazy.nvim/issues/163)) ([8ea9d8b](https://github.com/folke/lazy.nvim/commit/8ea9d8b0241f2b09b65355039ec89446bde94564)) +* **ui:** re-render after resize. Fixes [#174](https://github.com/folke/lazy.nvim/issues/174) ([9a2ecc8](https://github.com/folke/lazy.nvim/commit/9a2ecc875003a4cbcfba2eeaea0fbd794d270449)) + + +### Bug Fixes + +* **diff:** use git show when only displaying one commit ([#155](https://github.com/folke/lazy.nvim/issues/155)) ([037f242](https://github.com/folke/lazy.nvim/commit/037f2424303118b1a8312ed31081f518735823d5)) +* **keys:** don't escape pendig keys twice and only convert when number ([46280a1](https://github.com/folke/lazy.nvim/commit/46280a191bd1b6b30607f0d97e1c6d1bcbab1a93)) +* **keys:** only delete key handler mappings once ([9837d5b](https://github.com/folke/lazy.nvim/commit/9837d5be7e5fe3aed173401f469d371f26c334c7)) +* **loader:** add proper error message when trying to load a plugin that doesn't exist. Fixes [#160](https://github.com/folke/lazy.nvim/issues/160) ([9095223](https://github.com/folke/lazy.nvim/commit/90952239d24a9c3496bc2ecf7da1624e6e05d37e)) +* **ui:** get plugin details from the correct plugin in case it was deleted ([2f5c1be](https://github.com/folke/lazy.nvim/commit/2f5c1be5255a318d610e0a86abe0a38bf18af4ad)) + ## [7.1.0](https://github.com/folke/lazy.nvim/compare/v7.0.0...v7.1.0) (2022-12-24) From bb53b8473cd065dc467853222ee3462739ab16fa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 18:35:02 +0100 Subject: [PATCH 0436/1610] fix(cache): never use packer paths from cache --- lua/lazy/core/cache.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index ccb42ff..e49cc27 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -35,6 +35,11 @@ M._loadfile = _G.loadfile -- checks whether the cached modpath is still valid function M.check_path(modname, modpath) + -- HACK: never return packer paths + if modpath:find("/site/pack/packer/", 1, true) then + return false + end + -- check rtp excluding plugins. This is a very small list, so should be fast for _, path in ipairs(M.get_rtp()) do if modpath:find(path, 1, true) == 1 then From 4e4493b21d6b55742b00babd166dc1c1acbfa4ba Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 19:00:11 +0100 Subject: [PATCH 0437/1610] feat(reloader): trigger LazyReload when changes were detected and after reload. Fixes #178 --- lua/lazy/manage/reloader.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index 23c8863..9b3e1f1 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -82,6 +82,7 @@ function M.check(start) end Plugin.load() vim.cmd([[do User LazyRender]]) + vim.cmd([[do User LazyReload]]) end) end end From 7ffbead6749bfdaddbcf347eff90f6e009eb9eee Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 19:01:28 +0100 Subject: [PATCH 0438/1610] docs: added LazyReload --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2914dea..1f27533 100644 --- a/README.md +++ b/README.md @@ -541,6 +541,7 @@ The following user events will be triggered: - **LazyClean**: after a clean - **LazyCheck**: after checking for updates - **LazyLog**: after running log +- **LazyReload**: triggered by change detection after reloading plugin specs - **VeryLazy**: triggered after `LazyDone` and processing `VimEnter` auto commands ## 🔒 Lockfile `lazy-lock.json` From 511524ebff27ed8dea9e8d2eadb26ef19fb322c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Dec 2022 18:02:16 +0000 Subject: [PATCH 0439/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5cf7ca8..39893d6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -576,6 +576,7 @@ The following user events will be triggered: - **LazyClean**: after a clean - **LazyCheck**: after checking for updates - **LazyLog**: after running log +- **LazyReload**: triggered by change detection after reloading plugin specs - **VeryLazy**: triggered after `LazyDone` and processing `VimEnter` auto commands From c4d924aceea13cfab5cf23d0765c5d206deff341 Mon Sep 17 00:00:00 2001 From: Tsakiris Tryfon <tr.tsakiris@gmail.com> Date: Mon, 26 Dec 2022 20:42:42 +0200 Subject: [PATCH 0440/1610] fix(reloader): remove extra trailing separator (#180) --- lua/lazy/manage/reloader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index 9b3e1f1..3e233d0 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -19,7 +19,7 @@ function M.enable() end if type(Config.spec) == "string" then M.timer = vim.loop.new_timer() - M.root = vim.fn.stdpath("config") .. "/lua/" + M.root = vim.fn.stdpath("config") .. "/lua" M.check(true) M.timer:start(2000, 2000, M.check) end From 3c24c506cecc5aae999d080f3f48fd23cc566840 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 20:45:06 +0100 Subject: [PATCH 0441/1610] docs: update config.plugins link. Fixes #182 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1f27533..f448575 100644 --- a/README.md +++ b/README.md @@ -626,7 +626,7 @@ For a real-life example, you can check my personal dots: - [init.lua](https://github.com/folke/dot/blob/master/config/nvim/init.lua) where I require `config.lazy` - [config.lazy](https://github.com/folke/dot/blob/master/config/nvim/lua/config/lazy.lua) where I bootstrap and setup **lazy.nvim** -- [config.plugins](https://github.com/folke/dot/blob/master/config/nvim/lua/config/plugins.lua) is my main plugin config module +- [config.plugins](https://github.com/folke/dot/blob/master/config/nvim/lua/config/plugins/init.lua) is my main plugin config module - Any submodule of [config.plugins (submodules)](https://github.com/folke/dot/tree/master/config/nvim/lua/config/plugins) will be automatically loaded as well. ## 📦 Migration Guide From 3a67d2ad25695c2bf16c26ebcd9b1ec1e9e96adc Mon Sep 17 00:00:00 2001 From: Moshe Avni <mavni@netapp.com> Date: Mon, 26 Dec 2022 21:45:46 +0200 Subject: [PATCH 0442/1610] docs: fix plugin setup example (#175) --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f448575..3f8892c 100644 --- a/README.md +++ b/README.md @@ -202,18 +202,18 @@ return { end, }, - -- the above could also be written as + -- the above could also be written as: { "nvim-neorg/neorg", ft = "norg", - config = true, -- run require("norg").setup() + config = true, -- run require("neorg").setup() }, -- or set custom config { "nvim-neorg/neorg", ft = "norg", - config = { foo = "bar" }, -- run require("norg").setup({foo = "bar"}) + config = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) }, { From de383740a24cdbb4a8df48e2415ab79770df200c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Dec 2022 19:46:34 +0000 Subject: [PATCH 0443/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 39893d6..08de56d 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -243,18 +243,18 @@ EXAMPLES ~ end, }, - -- the above could also be written as + -- the above could also be written as: { "nvim-neorg/neorg", ft = "norg", - config = true, -- run require("norg").setup() + config = true, -- run require("neorg").setup() }, -- or set custom config { "nvim-neorg/neorg", ft = "norg", - config = { foo = "bar" }, -- run require("norg").setup({foo = "bar"}) + config = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) }, { @@ -686,7 +686,7 @@ For a real-life example, you can check my personal dots: - init.lua <https://github.com/folke/dot/blob/master/config/nvim/init.lua> where I require `config.lazy` - config.lazy <https://github.com/folke/dot/blob/master/config/nvim/lua/config/lazy.lua> where I bootstrap and setup **lazy.nvim** -- config.plugins <https://github.com/folke/dot/blob/master/config/nvim/lua/config/plugins.lua> is my main plugin config module +- config.plugins <https://github.com/folke/dot/blob/master/config/nvim/lua/config/plugins/init.lua> is my main plugin config module - Any submodule of config.plugins (submodules) <https://github.com/folke/dot/tree/master/config/nvim/lua/config/plugins> will be automatically loaded as well. From b6ebed5888309dd5d9eda145c403627826fd6a35 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 22:59:02 +0100 Subject: [PATCH 0444/1610] fix(plugin): pass plugin as arg to config/init/build --- lua/lazy/core/loader.lua | 8 ++++++-- lua/lazy/manage/task/plugin.lua | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 60e6a84..ea63931 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -63,7 +63,9 @@ function M.startup() for _, plugin in pairs(Config.plugins) do if plugin.init then Util.track({ plugin = plugin.name, init = "init" }) - Util.try(plugin.init, "Failed to run `init` for **" .. plugin.name .. "**") + Util.try(function() + plugin.init(plugin) + end, "Failed to run `init` for **" .. plugin.name .. "**") Util.track() end end @@ -176,7 +178,9 @@ end function M.config(plugin) local fn if type(plugin.config) == "function" then - fn = plugin.config + fn = function() + plugin.config(plugin) + end else local normname = Util.normname(plugin.name) ---@type table<string, string> diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index a7d0cee..05424b8 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -20,7 +20,7 @@ M.build = { local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) self.output = vim.api.nvim_cmd(cmd, { output = true }) elseif type(build) == "function" then - build() + build(self.plugin) else local shell = vim.env.SHELL or vim.o.shell local shell_args = shell:find("cmd.exe", 1, true) and "/c" or "-c" From 96e82986eeae3d4c5f96c927aae4a17acf0a3081 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 23:19:37 +0100 Subject: [PATCH 0445/1610] docs: updated docs --- README.md | 2 +- lua/lazy/example.lua | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3f8892c..3d4e54c 100644 --- a/README.md +++ b/README.md @@ -209,7 +209,7 @@ return { config = true, -- run require("neorg").setup() }, - -- or set custom config + -- or set a custom config: { "nvim-neorg/neorg", ft = "norg", diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua index 870ad02..b50e985 100644 --- a/lua/lazy/example.lua +++ b/lua/lazy/example.lua @@ -16,18 +16,18 @@ return { end, }, - -- the above could also be written as + -- the above could also be written as: { "nvim-neorg/neorg", ft = "norg", - config = true, -- run require("norg").setup() + config = true, -- run require("neorg").setup() }, - -- or set custom config + -- or set a custom config: { "nvim-neorg/neorg", ft = "norg", - config = { foo = "bar" }, -- run require("norg").setup({foo = "bar"}) + config = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) }, { From b5b2ab6b6c3e721a528e46045db3e40a4e12b3c5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Dec 2022 22:20:42 +0000 Subject: [PATCH 0446/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 08de56d..df8876f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -250,7 +250,7 @@ EXAMPLES ~ config = true, -- run require("neorg").setup() }, - -- or set custom config + -- or set a custom config: { "nvim-neorg/neorg", ft = "norg", From 8a3152de9357cf751546da5a17b9fd52868344f1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 26 Dec 2022 23:41:19 +0100 Subject: [PATCH 0447/1610] fix(plugin): find plugins with `/lua/` instead of `/lua` --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 54509e5..fff2b53 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -280,7 +280,7 @@ end -- Finds the plugin that has this path ---@param path string function M.find(path) - local lua = path:find("/lua", 1, true) + local lua = path:find("/lua/", 1, true) if lua then local name = path:sub(1, lua - 1) local slash = name:reverse():find("/", 1, true) From 38a9541939d6255937f3960c380edaa996d0c23e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 27 Dec 2022 08:30:28 +0100 Subject: [PATCH 0448/1610] style(plugin): improved types a bit, but sumneko still can't handle them since they're recursive --- lua/lazy/core/plugin.lua | 48 -------------------------------- lua/lazy/types.lua | 60 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 48 deletions(-) create mode 100644 lua/lazy/types.lua diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index fff2b53..96c0b6c 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -5,54 +5,6 @@ local Cache = require("lazy.core.cache") local M = {} ----@alias LazyPluginKind "normal"|"clean" - ----@class LazyPluginState ----@field loaded? {[string]:string}|{time:number} ----@field installed boolean ----@field tasks? LazyTask[] ----@field dirty? boolean ----@field updated? {from:string, to:string} ----@field is_local boolean ----@field has_updates? boolean ----@field cloned? boolean ----@field kind? LazyPluginKind ----@field dep? boolean True if this plugin is only in the spec as a dependency ----@field cond? boolean - ----@class LazyPluginHooks ----@field init? fun(LazyPlugin) Will always be run ----@field config? fun(LazyPlugin)|true|table Will be executed when loading the plugin ----@field build? string|fun(LazyPlugin)|(string|fun(LazyPlugin))[] - ----@class LazyPluginHandlers: table<LazyHandlerTypes, string|string[]> ----@field event? string[] ----@field cmd? string[] ----@field ft? string[] ----@field keys? string[] ----@field module? false - ----@class LazyPluginRef ----@field branch? string ----@field tag? string ----@field commit? string ----@field version? string ----@field pin? boolean - ----@class LazyPlugin: LazyPluginHandlers,LazyPluginHooks,LazyPluginRef ----@field [1] string? ----@field name string display name and name used for plugin config files ----@field url string? ----@field dir string ----@field enabled? boolean|(fun():boolean) ----@field cond? boolean|(fun():boolean) ----@field lazy? boolean ----@field dev? boolean If set, then link to the respective folder under your ~/projects ----@field dependencies? string[] ----@field _ LazyPluginState - ----@alias LazySpec string|LazyPlugin|LazyPlugin[]|{dependencies:LazySpec} - ---@class LazySpecLoader ---@field plugins table<string, LazyPlugin> ---@field errors string[] diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua new file mode 100644 index 0000000..32feaad --- /dev/null +++ b/lua/lazy/types.lua @@ -0,0 +1,60 @@ + +---@alias LazyPluginKind "normal"|"clean" + +---@class LazyPluginState +---@field loaded? {[string]:string}|{time:number} +---@field installed boolean +---@field tasks? LazyTask[] +---@field dirty? boolean +---@field updated? {from:string, to:string} +---@field is_local boolean +---@field has_updates? boolean +---@field cloned? boolean +---@field kind? LazyPluginKind +---@field dep? boolean True if this plugin is only in the spec as a dependency +---@field cond? boolean + +---@class LazyPluginHooks +---@field init? fun(LazyPlugin) Will always be run +---@field config? fun(LazyPlugin)|true|table Will be executed when loading the plugin +---@field build? string|fun(LazyPlugin)|(string|fun(LazyPlugin))[] + +---@class LazyPluginHandlers +---@field event? string[] +---@field cmd? string[] +---@field ft? string[] +---@field keys? string[] +---@field module? false + +---@class LazyPluginRef +---@field branch? string +---@field tag? string +---@field commit? string +---@field version? string +---@field pin? boolean + +---@class LazyPluginBase +---@field [1] string? +---@field name string display name and name used for plugin config files +---@field url string? +---@field dir string +---@field enabled? boolean|(fun():boolean) +---@field cond? boolean|(fun():boolean) +---@field lazy? boolean +---@field dev? boolean If set, then link to the respective folder under your ~/projects + +---@class LazyPlugin: LazyPluginBase,LazyPluginHandlers,LazyPluginHooks,LazyPluginRef +---@field dependencies? string[] +---@field _ LazyPluginState + +---@class LazyPluginSpecHandlers +---@field event? string[]|string +---@field cmd? string[]|string +---@field ft? string[]|string +---@field keys? string|string[]|LazyKeys[] +---@field module? false + +---@class LazyPluginSpec: LazyPluginBase,LazyPluginSpecHandlers,LazyPluginHooks,LazyPluginRef +---@field dependencies? string|string[]|LazyPluginSpec[] + +---@alias LazySpec string|string[]|LazyPluginSpec[]|LazyPluginSpec[][] From 0f3782c06657cb33c031bf92ae6692d8b47d83f2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 27 Dec 2022 07:31:21 +0000 Subject: [PATCH 0449/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index df8876f..e9d349e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 26 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 27 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From b1e1b337a66ebaf540e7137278047b93abdfd03b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 27 Dec 2022 08:36:09 +0100 Subject: [PATCH 0450/1610] docs: clarified dependencies plugin names --- README.md | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 3d4e54c..60ab7df 100644 --- a/README.md +++ b/README.md @@ -79,30 +79,30 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | -| **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 | -| **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 `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | -| **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | -| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | -| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | -| **event** | `string?` or `string[]` | Lazy-load on event | -| **cmd** | `string?` or `string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| Property | Type | Description | +| ---------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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` | +| **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 | +| **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 `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | +| **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. | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | +| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | +| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | +| **event** | `string?` or `string[]` | Lazy-load on event | +| **cmd** | `string?` or `string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | ### Lazy Loading From 5618076a451232184b3ed2572ec85573896f48d4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 27 Dec 2022 08:57:43 +0100 Subject: [PATCH 0451/1610] fix(ft): always trigger FileType when lazy-loading on ft --- lua/lazy/core/handler/event.lua | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 7e38afa..6bdaf10 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -11,6 +11,7 @@ M.trigger_events = { BufRead = { "BufReadPre", "BufRead" }, BufReadPost = { "BufReadPre", "BufRead", "BufReadPost" }, } +M.trigger_always = { "FileType" } M.group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) ---@param value string @@ -31,8 +32,12 @@ function M:_add(value) local groups = M.get_augroups(event, pattern) -- load the plugins Loader.load(self.active[value], { [self.type] = value }) - -- check if any plugin created an event handler for this event and fire the group - M.trigger(event, pattern, groups) + if vim.tbl_contains(M.trigger_always, event) then + vim.cmd("do " .. event) + else + -- check if any plugin created an event handler for this event and fire the group + M.trigger(event, pattern, groups) + end Util.track() end, }) From e183601763efbacc0604a549081cc0afd0fccd41 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 27 Dec 2022 07:58:39 +0000 Subject: [PATCH 0452/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e9d349e..be04680 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -111,29 +111,29 @@ It is recommended to run `:checkhealth lazy` after installation PLUGIN SPEC *lazy.nvim-plugin-spec* -│ Property │ Type │ Description │ -│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ -│**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 │ -│**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 │ -│**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 fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ -│**dependencies**│LazySpec[] │A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise │ -│**init** │fun(LazyPlugin) │init functions are always executed during startup │ -│**config** │fun(LazyPlugin) or true or table │config is executed when the plugin loads. You can also set to true or pass a table, that will be passed to require("plugin").setup(opts) │ -│**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ -│**branch** │string? │Branch of the repository │ -│**tag** │string? │Tag of the repository │ -│**commit** │string? │Commit of the repository │ -│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ -│**pin** │boolean? │When true, this plugin will not be included in updates │ -│**event** │string? or string[] │Lazy-load on event │ -│**cmd** │string? or string[] │Lazy-load on command │ -│**ft** │string? or string[] │Lazy-load on filetype │ -│**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ -│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ +│ Property │ Type │ Description │ +│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ +│**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 │ +│**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 │ +│**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 fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ +│**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.│ +│**init** │fun(LazyPlugin) │init functions are always executed during startup │ +│**config** │fun(LazyPlugin) or true or table │config is executed when the plugin loads. You can also set to true or pass a table, that will be passed to require("plugin").setup(opts) │ +│**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ +│**branch** │string? │Branch of the repository │ +│**tag** │string? │Tag of the repository │ +│**commit** │string? │Commit of the repository │ +│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ +│**pin** │boolean? │When true, this plugin will not be included in updates │ +│**event** │string? or string[] │Lazy-load on event │ +│**cmd** │string? or string[] │Lazy-load on command │ +│**ft** │string? or string[] │Lazy-load on filetype │ +│**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ +│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ LAZY LOADING ~ From d1739cb7e1791e90d015610ef4aad30803babddb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 27 Dec 2022 12:35:02 +0100 Subject: [PATCH 0453/1610] feat(util): use treesitter to highlight notify messages when available --- lua/lazy/core/util.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 1c0facb..973d005 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -210,7 +210,9 @@ function M.notify(msg, level) vim.wo[win].concealcursor = "" vim.wo[win].spell = false local buf = vim.api.nvim_win_get_buf(win) - vim.bo[buf].filetype = "markdown" + if not pcall(vim.treesitter.start, buf, "markdown") then + vim.bo[buf].filetype = "markdown" + end end, title = "lazy.nvim", }) From a2fdf369f2d503ebe44b421b821c9430c8d5cbe1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 27 Dec 2022 13:34:07 +0100 Subject: [PATCH 0454/1610] feat(profile): added accurate startuptime to ui/stats/docs --- README.md | 20 +++++++++++--- lua/lazy/core/config.lua | 6 +++++ lua/lazy/docs.lua | 1 + lua/lazy/init.lua | 11 +++----- lua/lazy/stats.lua | 56 ++++++++++++++++++++++++++++++++++++++++ lua/lazy/view/render.lua | 20 ++++++++++++++ 6 files changed, 103 insertions(+), 11 deletions(-) create mode 100644 lua/lazy/stats.lua diff --git a/README.md b/README.md index 60ab7df..cf2c26c 100644 --- a/README.md +++ b/README.md @@ -500,13 +500,25 @@ $ nvim --headless "+Lazy! sync" +qa - **plugins**: a list of plugin names to run the operation on - **concurrency**: limit the `number` of concurrently running tasks -If you want to display the number of plugins on your dashboard, you can use -this simple API: +Stats API (`require("lazy").stats()`): + +<!-- stats:start --> ```lua -local plugins = require("lazy").stats().count +{ + -- 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. + startuptime_cputime = false, + count = 0, -- total number of plugins + loaded = 0, -- number of loaded plugins +} ``` +<!-- stats:end --> + **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. @@ -543,6 +555,8 @@ The following user events will be triggered: - **LazyLog**: after 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. ## 🔒 Lockfile `lazy-lock.json` diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1da607b..41a6f65 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -200,6 +200,12 @@ function M.setup(spec, opts) if M.headless then require("lazy.view.commands").setup() else + vim.api.nvim_create_autocmd("UIEnter", { + callback = function() + require("lazy.stats").on_ui_enter() + end, + }) + vim.api.nvim_create_autocmd("User", { pattern = "VeryLazy", once = true, diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 142b517..08a4b71 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -126,6 +126,7 @@ function M.update() config = config:gsub("%s*debug = false.\n", "\n") M.save({ bootstrap = M.extract("lua/lazy/init.lua", "function M%.bootstrap%(%)\n(.-)\nend"), + stats = M.extract("lua/lazy/stats.lua", "\nM%._stats = ({.-\n})"), config = config, spec = Util.read_file("lua/lazy/example.lua"), commands = M.commands(), diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index ae4309b..b1b6025 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -1,9 +1,11 @@ ---@type LazyCommands local M = {} +M._start = 0 ---@param spec LazySpec Should be a module name to load, or a plugin spec ---@param opts? LazyConfig function M.setup(spec, opts) + M._start = M._start == 0 and vim.loop.hrtime() or M._start if vim.g.lazy_did_setup then return vim.notify( "Re-sourcing your config is not supported with lazy.nvim", @@ -62,14 +64,7 @@ function M.setup(spec, opts) end function M.stats() - local ret = { count = 0, loaded = 0 } - for _, plugin in pairs(require("lazy.core.config").plugins) do - ret.count = ret.count + 1 - if plugin._.loaded then - ret.loaded = ret.loaded + 1 - end - end - return ret + return require("lazy.stats").stats() end function M.bootstrap() diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua new file mode 100644 index 0000000..285b4e6 --- /dev/null +++ b/lua/lazy/stats.lua @@ -0,0 +1,56 @@ +local M = {} + +---@class LazyStats +M._stats = { + -- 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. + startuptime_cputime = false, + count = 0, -- total number of plugins + loaded = 0, -- number of loaded plugins +} + +function M.on_ui_enter() + if not M.C then + pcall(function() end) + end + + local ok = pcall(function() + local ffi = require("ffi") + ffi.cdef([[ + typedef long time_t; + typedef int clockid_t; + + typedef struct timespec { + time_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ + } nanotime; + int clock_gettime(clockid_t clk_id, struct timespec *tp); + ]]) + local pnano = assert(ffi.new("nanotime[?]", 1)) + local CLOCK_PROCESS_CPUTIME_ID = jit.os == "OSX" and 12 or 2 + ffi.C.clock_gettime(CLOCK_PROCESS_CPUTIME_ID, pnano) + M._stats.startuptime = tonumber(pnano[0].tv_sec) / 1e6 + tonumber(pnano[0].tv_nsec) / 1e6 + M._stats.startuptime_cputime = true + end) + if not ok then + M._stats.startuptime = (vim.loop.hrtime() - require("lazy")._start) / 1e6 + end + vim.cmd([[do User LazyVimStarted]]) +end + +function M.stats() + M._stats.count = 0 + M._stats.loaded = 0 + for _, plugin in pairs(require("lazy.core.config").plugins) do + M._stats.count = M._stats.count + 1 + if plugin._.loaded then + M._stats.loaded = M._stats.loaded + 1 + end + end + return M._stats +end + +return M diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 34e4aaa..d3610e1 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -491,6 +491,24 @@ function M:details(plugin) end function M:profile() + local stats = require("lazy.stats").stats() + local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100) + self:append("Startuptime: ", "LazyH2"):append(ms .. "ms", "Number"):nl():nl() + if stats.startuptime_cputime then + self:append("Based on the actual CPU time of the Neovim process till "):append("UIEnter", "LazySpecial") + self:append("."):nl() + self:append("This is more accurate than ") + self:append("`nvim --startuptime`", "@text.literal.markdown_inline") + self:append(".") + else + self:append("An accurate startuptime based on the actual CPU time of the Neovim process is not available."):nl() + self + :append("Startuptime is instead based on a delta with a timestamp when lazy started till ") + :append("UIEnter", "LazySpecial") + self:append(".") + end + self:nl():nl() + self:append("Profile", "LazyH2"):nl():nl() self :append("You can press ") @@ -505,6 +523,8 @@ function M:profile() self:nl() + self:nl():nl() + ---@param a LazyProfile ---@param b LazyProfile local function sort(a, b) From 5a5487b015743c69d6a275156a90af35c2905c47 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 27 Dec 2022 12:35:05 +0000 Subject: [PATCH 0455/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index be04680..e2f2589 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -535,11 +535,19 @@ example, if you want to sync lazy from the cmdline, you can use: - **concurrency**: limit the `number` of concurrently running tasks -If you want to display the number of plugins on your dashboard, you can use -this simple API: +Stats API (`require("lazy").stats()`): >lua - local plugins = require("lazy").stats().count + { + -- 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. + startuptime_cputime = false, + count = 0, -- total number of plugins + loaded = 0, -- number of loaded plugins + } < @@ -578,6 +586,8 @@ The following user events will be triggered: - **LazyLog**: after 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. LOCKFILE `LAZY-LOCK.JSON` *lazy.nvim-lockfile-`lazy-lock.json`* From 81943f32d9f4810ae4c1a09b3446cc493f0682ca Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 27 Dec 2022 16:45:30 +0100 Subject: [PATCH 0456/1610] docs: documented event patterns. Fixes #191 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf2c26c..18f7518 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ require("lazy").setup({ | **commit** | `string?` | Commit of the repository | | **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | | **pin** | `boolean?` | When `true`, this plugin will not be included in updates | -| **event** | `string?` or `string[]` | Lazy-load on event | +| **event** | `string?` or `string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | | **cmd** | `string?` or `string[]` | Lazy-load on command | | **ft** | `string?` or `string[]` | Lazy-load on filetype | | **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | From eec0485d45bd3a1f1db1064a92321f042fed9792 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 27 Dec 2022 15:46:41 +0000 Subject: [PATCH 0457/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e2f2589..c398dc6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -129,7 +129,7 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**commit** │string? │Commit of the repository │ │**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ │**pin** │boolean? │When true, this plugin will not be included in updates │ -│**event** │string? or string[] │Lazy-load on event │ +│**event** │string? or string[] │Lazy-load on event. Events can be specified as BufEnter or with a pattern like BufEnter .lua │ │**cmd** │string? or string[] │Lazy-load on command │ │**ft** │string? or string[] │Lazy-load on filetype │ │**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ From edf8310288197d4f7c2983a4fa32c09921f00a22 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 27 Dec 2022 17:24:40 +0100 Subject: [PATCH 0458/1610] feat(plugin): added `Plugin.priority` for start plugins --- README.md | 23 +++++++++++++++++++---- lua/lazy/core/loader.lua | 23 +++++++++++++++++++++-- lua/lazy/example.lua | 10 +++++++++- lua/lazy/types.lua | 1 + 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 18f7518..5896d61 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,7 @@ require("lazy").setup({ | **ft** | `string?` or `string[]` | Lazy-load on filetype | | **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | | **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| **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. | ### Lazy Loading @@ -114,9 +115,6 @@ module of plugin `A`, then plugin `A` will be loaded on demand as expected. If you don't want this behavior for a certain plugin, you can specify that with `module=false`. You can then manually load the plugin with `:Lazy load foobar.nvim`. -Colorscheme plugins can be configured with `lazy=true`. The plugin will automagically load -when doing `colorscheme foobar`. - You can configure **lazy.nvim** to lazy-load all plugins by default with `config.defaults.lazy = true`. Additionally, you can also lazy-load on **events**, **commands**, @@ -128,6 +126,15 @@ Plugins will be lazy-loaded when one of the following is `true`: - 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`. + +> **NOTE:** since **start** plugins can possibly change existing highlight groups, +> it's important to make sure that your main **colorscheme** is loaded first. +> To ensure this you can use the `priority=1000` field. **_(see the examples)_** + #### ⌨️ Lazy Key Mappings The `keys` property can be a `string` or `string[]` for simple normal-mode mappings, or it @@ -186,7 +193,15 @@ version of plugins that support Semver. ```lua return { -- the colorscheme should be available when starting Neovim - "folke/tokyonight.nvim", + { + "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 diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index ea63931..fa132d2 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -4,6 +4,8 @@ local Handler = require("lazy.core.handler") local M = {} +local DEFAULT_PRIORITY = 50 + ---@type LazyPlugin[] M.loading = {} M.init_done = false @@ -73,8 +75,9 @@ function M.startup() -- 2. load start plugin Util.track({ start = "start" }) - for _, plugin in pairs(Config.plugins) do - if plugin.lazy == false and not plugin._.loaded then + for _, plugin in ipairs(M.get_start_plugins()) do + -- plugin may be loaded by another plugin in the meantime + if not plugin._.loaded then M.load(plugin, { start = "start" }) end end @@ -103,6 +106,22 @@ function M.startup() Util.track() end +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 + start[#start + 1] = plugin + end + end + table.sort(start, function(a, b) + local ap = a.priority or DEFAULT_PRIORITY + local bp = b.priority or DEFAULT_PRIORITY + return ap > bp + end) + return start +end + ---@class Loader ---@param plugins string|LazyPlugin|string[]|LazyPlugin[] ---@param reason {[string]:string} diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua index b50e985..93f87d4 100644 --- a/lua/lazy/example.lua +++ b/lua/lazy/example.lua @@ -1,6 +1,14 @@ return { -- the colorscheme should be available when starting Neovim - "folke/tokyonight.nvim", + { + "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 diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 32feaad..053961f 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -41,6 +41,7 @@ ---@field enabled? boolean|(fun():boolean) ---@field cond? boolean|(fun():boolean) ---@field lazy? boolean +---@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 ---@class LazyPlugin: LazyPluginBase,LazyPluginHandlers,LazyPluginHooks,LazyPluginRef From 7d20364dbadcdea15cedfe43356d8d532b2ef36d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 27 Dec 2022 16:25:37 +0000 Subject: [PATCH 0459/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c398dc6..c781786 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -134,6 +134,7 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**ft** │string? or string[] │Lazy-load on filetype │ │**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ │**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ +│**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. │ LAZY LOADING ~ @@ -147,9 +148,6 @@ If you don’t want this behavior for a certain plugin, you can specify that with `module=false`. You can then manually load the plugin with `:Lazy load foobar.nvim`. -Colorscheme plugins can be configured with `lazy=true`. The plugin will -automagically load when doing `colorscheme foobar`. - You can configure **lazy.nvim** to lazy-load all plugins by default with `config.defaults.lazy = true`. @@ -164,6 +162,21 @@ Plugins will be lazy-loaded when one of the following is `true`: - `config.defaults.lazy == true` + *lazy.nvim-Colorschemes* + +Colorschemes Colorscheme plugins can be configured + with `lazy=true`. The plugin will + automagically load when doing + `colorscheme foobar`. + + + + **NOTE:** since **start** plugins can possibly change existing highlight + groups, it’s important to make sure that your main **colorscheme** is loaded + first. To ensure this you can use the `priority=1000` field. **_(see the + examples)_** + + *lazy.nvim-Lazy-Key-Mappings* Lazy Key Mappings The `keys` property can be a `string` or @@ -227,7 +240,15 @@ EXAMPLES ~ >lua return { -- the colorscheme should be available when starting Neovim - "folke/tokyonight.nvim", + { + "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 From 3b46160c01c4b205aa6665096b263663bd433acd Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 27 Dec 2022 19:35:18 +0100 Subject: [PATCH 0460/1610] feat(ui): added new section specifically for updates --- lua/lazy/view/sections.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index 59f3a1b..c5c168c 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -60,6 +60,13 @@ return { end, title = "Installed", }, + { + ---@param plugin LazyPlugin + filter = function(plugin) + return plugin._.has_updates + end, + title = "Updates", + }, { filter = function(plugin) return has_task(plugin, function(task) From 0d0d11acb2547ea65e0eba4fb6855f0954ed0239 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 27 Dec 2022 19:50:11 +0100 Subject: [PATCH 0461/1610] fix(ui): removed newlines from profile tab --- TODO.md | 8 ++++---- lua/lazy/view/render.lua | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/TODO.md b/TODO.md index e291cbc..5ad36cb 100644 --- a/TODO.md +++ b/TODO.md @@ -44,10 +44,10 @@ - default semver merging strategy: if no version matches all, then use highest version? - [ ] package meta index (package.lua cache for all packages) -- [ ] document highlight groups +- [x] document highlight groups - [x] document user events -- [ ] document API, like lazy.plugins() -- [ ] icons +- [x] document API, like lazy.plugins() +- [x] icons - [x] check in cache if rtp files match - [x] I think the installation section, specifically the loading part, could use an @@ -57,7 +57,7 @@ remove most question marks I think. - [x] When autoinstalling the plugins the cursor isn't focused on the floating window, but on the non-floating window in the background. -- [ ] Doing `:Lazy clean` doesn't show which plugins were removed. +- [x] Doing `:Lazy clean` doesn't show which plugins were removed. - [x] Shouldn't the "Versioning" section be in the "Lockfile" chapter? - [x] Why are personal dotfiles used as examples? Dotfiles change all the time, there's no guarantee this will be relevant or even exist in two years. diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index d3610e1..f13a3a2 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -523,8 +523,6 @@ function M:profile() self:nl() - self:nl():nl() - ---@param a LazyProfile ---@param b LazyProfile local function sort(a, b) From 9ab61b3479391694a00435c581f9e404802af120 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 27 Dec 2022 22:38:28 +0100 Subject: [PATCH 0462/1610] chore(main): release 7.3.0 (#177) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1510921..83c33eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## [7.3.0](https://github.com/folke/lazy.nvim/compare/v7.2.0...v7.3.0) (2022-12-27) + + +### Features + +* **plugin:** added `Plugin.priority` for start plugins ([edf8310](https://github.com/folke/lazy.nvim/commit/edf8310288197d4f7c2983a4fa32c09921f00a22)) +* **profile:** added accurate startuptime to ui/stats/docs ([a2fdf36](https://github.com/folke/lazy.nvim/commit/a2fdf369f2d503ebe44b421b821c9430c8d5cbe1)) +* **reloader:** trigger LazyReload when changes were detected and after reload. Fixes [#178](https://github.com/folke/lazy.nvim/issues/178) ([4e4493b](https://github.com/folke/lazy.nvim/commit/4e4493b21d6b55742b00babd166dc1c1acbfa4ba)) +* **ui:** added new section specifically for updates ([3b46160](https://github.com/folke/lazy.nvim/commit/3b46160c01c4b205aa6665096b263663bd433acd)) +* **util:** use treesitter to highlight notify messages when available ([d1739cb](https://github.com/folke/lazy.nvim/commit/d1739cb7e1791e90d015610ef4aad30803babddb)) + + +### Bug Fixes + +* **cache:** never use packer paths from cache ([bb53b84](https://github.com/folke/lazy.nvim/commit/bb53b8473cd065dc467853222ee3462739ab16fa)) +* **ft:** always trigger FileType when lazy-loading on ft ([5618076](https://github.com/folke/lazy.nvim/commit/5618076a451232184b3ed2572ec85573896f48d4)) +* **plugin:** find plugins with `/lua/` instead of `/lua` ([8a3152d](https://github.com/folke/lazy.nvim/commit/8a3152de9357cf751546da5a17b9fd52868344f1)) +* **plugin:** pass plugin as arg to config/init/build ([b6ebed5](https://github.com/folke/lazy.nvim/commit/b6ebed5888309dd5d9eda145c403627826fd6a35)) +* **reloader:** remove extra trailing separator ([#180](https://github.com/folke/lazy.nvim/issues/180)) ([c4d924a](https://github.com/folke/lazy.nvim/commit/c4d924aceea13cfab5cf23d0765c5d206deff341)) +* **ui:** removed newlines from profile tab ([0d0d11a](https://github.com/folke/lazy.nvim/commit/0d0d11acb2547ea65e0eba4fb6855f0954ed0239)) + ## [7.2.0](https://github.com/folke/lazy.nvim/compare/v7.1.0...v7.2.0) (2022-12-26) From dc03fa1ae57c3949874c9cae50074a83232c4eed Mon Sep 17 00:00:00 2001 From: Darkhan <darkhanu@gmail.com> Date: Tue, 27 Dec 2022 23:03:09 +0000 Subject: [PATCH 0463/1610] fix(health): add new key `priority` to `:checkhealth lazy` (#196) --- lua/lazy/health.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 88d5b23..643f127 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -44,6 +44,7 @@ function M.check() "keys", "ft", "dir", + "priority", "_", } for _, plugin in pairs(Config.plugins) do From ff8f3783fa5dabdb086c5731c46d1a4cf79917af Mon Sep 17 00:00:00 2001 From: "Dr. David A. Kunz" <david.kunz@sap.com> Date: Wed, 28 Dec 2022 17:38:08 +0100 Subject: [PATCH 0464/1610] feat(profile): nicer threshold prompt (#210) --- lua/lazy/view/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index e058674..46a0235 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -85,7 +85,7 @@ function M.create() self:on_key(ViewConfig.keys.profile_filter, function() if self.state.mode == "profile" then vim.ui.input({ - prompt = "Enter time threshold in ms, like 0.5", + prompt = "Enter time threshold in ms: ", default = tostring(self.state.profile.threshold), }, function(input) if not input then From 0b1e0839376325c54b61bb7de7600af778808982 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 28 Dec 2022 16:38:51 +0000 Subject: [PATCH 0465/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c781786..d752cb7 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 27 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 28 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From acd6697d8810e501d3861bba2ac45d5f4555c43a Mon Sep 17 00:00:00 2001 From: tzachar <Nir.tzachar@gmail.com> Date: Wed, 28 Dec 2022 18:39:31 +0200 Subject: [PATCH 0466/1610] fix(commands): E5108 in getcompletions (#207) --- lua/lazy/view/commands.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 9d02a3b..7a026c4 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -56,7 +56,7 @@ M.commands = { } function M.complete(cmd, prefix) - if not ViewConfig.commands[cmd].plugins then + if not (ViewConfig.commands[cmd] or {}).plugins then return end ---@type string[] From b813fae61cebbc5b45e7ea3bfbe214b0d5769696 Mon Sep 17 00:00:00 2001 From: max397574 <81827001+max397574@users.noreply.github.com> Date: Wed, 28 Dec 2022 17:39:51 +0100 Subject: [PATCH 0467/1610] fix(health): add `cond` key (#203) --- lua/lazy/health.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 643f127..894d57e 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -45,6 +45,7 @@ function M.check() "ft", "dir", "priority", + "cond", "_", } for _, plugin in pairs(Config.plugins) do From 021e54655f8ba9c594b2035f044e5a2a1b13a893 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 28 Dec 2022 09:00:39 +0100 Subject: [PATCH 0468/1610] feat(cache): update package.loaded on require --- lua/lazy/core/cache.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index e49cc27..3027e02 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -158,7 +158,9 @@ function M.load(modkey, modpath) end function M.require(modname) - return M.loader(modname)() + local mod = M.loader(modname)() + package.loaded[modname] = mod + return mod end ---@param modname string From 5f423b29c65f536a9c41a34a8328372baa444da5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 28 Dec 2022 17:43:14 +0100 Subject: [PATCH 0469/1610] fix(loader): when `config=true`, pass `nil` to `setup()`. Fixes #208 --- lua/lazy/core/loader.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index fa132d2..2d5d493 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -217,7 +217,11 @@ function M.config(plugin) mods = vim.tbl_values(mods) if #mods == 1 then fn = function() - require(mods[1]).setup(plugin.config == true and {} or plugin.config) + local opts = plugin.config + if opts == true then + opts = nil + end + require(mods[1]).setup(opts) end else return Util.error( From 956164d27dc02b8d3c21c9ef7cc9028d854b0978 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 28 Dec 2022 17:56:20 +0100 Subject: [PATCH 0470/1610] fix(loader): show proper error message when trying to load a plugin that is not installed. Fixes #201. Fixes #202 --- lua/lazy/core/loader.lua | 113 +++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 53 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 2d5d493..eab29c2 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -131,67 +131,74 @@ function M.load(plugins, reason) ---@cast plugins (string|LazyPlugin)[] for _, plugin in pairs(plugins) do - local try_load = true - if type(plugin) == "string" then - if not Config.plugins[plugin] then - Util.error("Plugin " .. plugin .. " not found") - try_load = false - else + if Config.plugins[plugin] then plugin = Config.plugins[plugin] + else + Util.error("Plugin " .. plugin .. " not found") + plugin = nil end end - - if try_load and plugin.cond then - try_load = plugin.cond == true or (type(plugin.cond) == "function" and plugin.cond()) or false - plugin._.cond = try_load - end - - ---@cast plugin LazyPlugin - - if try_load and not plugin._.loaded then - ---@diagnostic disable-next-line: assign-type-mismatch - plugin._.loaded = {} - for k, v in pairs(reason) do - plugin._.loaded[k] = v - end - if #M.loading > 0 then - plugin._.loaded.plugin = M.loading[#M.loading].name - elseif reason.require then - plugin._.loaded.source = Util.get_source() - end - - table.insert(M.loading, plugin) - - Util.track({ plugin = plugin.name, start = reason.start }) - Handler.disable(plugin) - - vim.opt.runtimepath:prepend(plugin.dir) - local after = plugin.dir .. "/after" - if vim.loop.fs_stat(after) then - vim.opt.runtimepath:append(after) - end - - if plugin.dependencies then - Util.try(function() - M.load(plugin.dependencies, {}) - end, "Failed to load deps for " .. plugin.name) - end - - M.packadd(plugin.dir) - if plugin.config then - M.config(plugin) - end - - plugin._.loaded.time = Util.track().time - table.remove(M.loading) - vim.schedule(function() - vim.cmd("do User LazyRender") - end) + if plugin and not plugin._.loaded then + M._load(plugin, reason) end end end +---@param plugin LazyPlugin +---@param reason {[string]:string} +function M._load(plugin, reason) + if not plugin._.installed then + return Util.error("Plugin " .. plugin.name .. " is not installed") + end + + if plugin.cond ~= nil then + if plugin.cond == false or (type(plugin.cond) == "function" and not plugin.cond()) then + plugin._.cond = false + return + end + end + + ---@diagnostic disable-next-line: assign-type-mismatch + plugin._.loaded = {} + for k, v in pairs(reason) do + plugin._.loaded[k] = v + end + if #M.loading > 0 then + plugin._.loaded.plugin = M.loading[#M.loading].name + elseif reason.require then + plugin._.loaded.source = Util.get_source() + end + + table.insert(M.loading, plugin) + + Util.track({ plugin = plugin.name, start = reason.start }) + Handler.disable(plugin) + + vim.opt.runtimepath:prepend(plugin.dir) + local after = plugin.dir .. "/after" + if vim.loop.fs_stat(after) then + vim.opt.runtimepath:append(after) + end + + if plugin.dependencies then + Util.try(function() + M.load(plugin.dependencies, {}) + end, "Failed to load deps for " .. plugin.name) + end + + M.packadd(plugin.dir) + if plugin.config then + M.config(plugin) + end + + plugin._.loaded.time = Util.track().time + table.remove(M.loading) + vim.schedule(function() + vim.cmd("do User LazyRender") + end) +end + --- runs plugin config ---@param plugin LazyPlugin function M.config(plugin) From 34977c2b80db3ce5054f3925057b6b8ccbd7ce7e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 28 Dec 2022 17:57:59 +0100 Subject: [PATCH 0471/1610] perf: move autoloader to cache and always use lazy's modname path resolver which is much faster --- lua/lazy/core/cache.lua | 143 +++++++++++++++++++++++++++++++++------ lua/lazy/core/config.lua | 1 + lua/lazy/core/loader.lua | 31 --------- lua/lazy/core/plugin.lua | 1 + lua/lazy/init.lua | 6 +- 5 files changed, 128 insertions(+), 54 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 3027e02..2c5ba2e 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -30,6 +30,16 @@ M.cache = {} M.enabled = true ---@type string[] M.rtp = nil +M.stats = { + find = { total = 0, time = 0, rtp = 0, unloaded = 0, index = 0, stat = 0, not_found = 0 }, + autoload = { total = 0, time = 0 }, +} +---@type table<string, table<string,string>> +M.topmods = {} +---@type table<string, true> +M.indexed = {} +M.indexed_rtp = false +M.indexed_unloaded = false -- selene:allow(global_usage) M._loadfile = _G.loadfile @@ -53,11 +63,21 @@ function M.check_path(modname, modpath) return false end + return M.check_autoload(modname, modpath) +end + +function M.check_autoload(modname, modpath) + local start = uv.hrtime() + M.stats.autoload.total = M.stats.autoload.total + 1 -- check plugins. Again fast, since we check the plugin name from the path. -- only needed when the plugin mod has been loaded - if package.loaded["lazy.core.plugin"] then - local plugin = require("lazy.core.plugin").find(modpath) + ---@type LazyCorePlugin + local Plugin = package.loaded["lazy.core.plugin"] + if Plugin then + local plugin = Plugin.find(modpath) if plugin and modpath:find(plugin.dir, 1, true) == 1 then + -- we're not interested in loader time, so calculate delta here + M.stats.autoload.time = M.stats.autoload.time + uv.hrtime() - start if not plugin._.loaded then if plugin.module == false then error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") @@ -67,6 +87,7 @@ function M.check_path(modname, modpath) return true end end + M.stats.autoload.time = M.stats.autoload.time + uv.hrtime() - start return false end @@ -76,13 +97,6 @@ function M.disable() end -- selene:allow(global_usage) _G.loadfile = M._loadfile - ---@diagnostic disable-next-line: no-unknown - for i, loader in ipairs(package.loaders) do - if loader == M.loader then - table.remove(package.loaders, i) - break - end - end M.enabled = false end @@ -93,6 +107,7 @@ function M.loader(modname) local chunk, err if entry and M.check_path(modname, entry.modpath) then + M.stats.find.total = M.stats.find.total + 1 local mod = package.loaded[modname] if type(mod) == "table" then return function() @@ -105,7 +120,12 @@ function M.loader(modname) -- find the modpath and load the module local modpath = M.find(modname) if modpath then - chunk, err = M.load(modname, modpath) + M.check_autoload(modname, modpath) + if M.enabled then + chunk, err = M.load(modname, modpath) + else + chunk, err = M._loadfile(modpath) + end end end return chunk or (err and error(err)) or "not found in lazy cache" @@ -163,12 +183,90 @@ function M.require(modname) return mod end +-- index the top-level lua modules for this path +function M._index(path) + if not M.indexed[path] and path:sub(-6, -1) ~= "/after" then + M.stats.find.index = M.stats.find.index + 1 + ---@type LazyUtilCore + local Util = package.loaded["lazy.core.util"] + if not Util then + return + end + M.indexed[path] = true + Util.ls(path .. "/lua", function(_, name, t) + local topname + if t == "directory" then + topname = name + elseif name:sub(-4) == ".lua" then + topname = name:sub(1, -5) + end + if topname then + M.topmods[topname] = M.topmods[topname] or {} + M.topmods[topname][path] = path + end + end) + end +end + ---@param modname string ---@return string? function M.find(modname) + M.stats.find.total = M.stats.find.total + 1 + local start = uv.hrtime() local basename = modname:gsub("%.", "/") - local paths = { "lua/" .. basename .. ".lua", "lua/" .. basename .. "/init.lua" } - return vim.api.nvim__get_runtime(paths, false, { is_lua = true })[1] + local idx = modname:find(".", 1, true) + local topmod = idx and modname:sub(1, idx - 1) or modname + + -- search for a directory first when topmod == modname + local patterns = topmod == modname and { "/init.lua", ".lua" } or { ".lua", "/init.lua" } + + -- check top-level mods to find the module + local function _find() + for _, toppath in pairs(M.topmods[topmod] or {}) do + for _, pattern in ipairs(patterns) do + local path = toppath .. "/lua/" .. basename .. pattern + M.stats.find.stat = M.stats.find.stat + 1 + if uv.fs_stat(path) then + return path + end + end + end + end + + local modpath = _find() + if not modpath then + -- update rtp + if not M.indexed_rtp then + for _, path in ipairs(vim.api.nvim_list_runtime_paths()) do + M._index(path) + end + M.indexed_rtp = true + modpath = _find() + end + + -- update unloaded + if not modpath and not M.indexed_unloaded then + ---@type LazyCoreConfig + local Config = package.loaded["lazy.core.config"] + if Config then + for _, plugin in pairs(Config.plugins) do + if not (M.indexed[plugin.dir] or plugin._.loaded or plugin.module == false) then + M._index(plugin.dir) + end + end + end + M.indexed_unloaded = true + modpath = _find() + end + + -- module not found + if not modpath then + M.stats.find.not_found = M.stats.find.not_found + 1 + end + end + + M.stats.find.time = M.stats.find.time + uv.hrtime() - start + return modpath end -- returns the cached RTP excluding plugin dirs @@ -207,23 +305,30 @@ function M.setup(opts) end end M.debug = opts and opts.debug - - M.load_cache() - table.insert(package.loaders, 2, M.loader) - -- selene:allow(global_usage) - _G.loadfile = M.loadfile + M.enabled = M.config.enabled -- reset rtp when it changes vim.api.nvim_create_autocmd("OptionSet", { pattern = "runtimepath", callback = function() M.rtp = nil + M.indexed_rtp = false end, }) - if #M.config.disable_events > 0 then - vim.api.nvim_create_autocmd(M.config.disable_events, { once = true, callback = M.disable }) + if M.enabled then + table.insert(package.loaders, 2, M.loader) + M.load_cache() + -- selene:allow(global_usage) + _G.loadfile = M.loadfile + if #M.config.disable_events > 0 then + vim.api.nvim_create_autocmd(M.config.disable_events, { once = true, callback = M.disable }) + end + else + -- we need to always add the loader since this will autoload unloaded modules + table.insert(package.loaders, M.loader) end + return M end diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 41a6f65..12610cf 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -1,5 +1,6 @@ local Util = require("lazy.core.util") +---@class LazyCoreConfig local M = {} ---@class LazyConfig diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index eab29c2..3594114 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -28,9 +28,6 @@ function M.setup() end, }) - -- autoload opt plugins - table.insert(package.loaders, M.autoload) - -- install missing plugins if Config.options.install.missing then Util.track("install") @@ -298,32 +295,4 @@ function M.colorscheme(name) end end --- This loader is added as the very last one. --- This only hits when the modname is not cached and --- even then only once per plugin. So pretty much never. ----@param modname string -function M.autoload(modname) - -- check if a lazy plugin should be loaded - for _, plugin in pairs(Config.plugins) do - if not (plugin._.loaded or plugin.module == false) then - for _, pattern in ipairs({ ".lua", "/init.lua" }) do - local path = plugin.dir .. "/lua/" .. modname:gsub("%.", "/") .. pattern - if vim.loop.fs_stat(path) then - M.load(plugin, { require = modname }) - -- check if the module has been loaded in the meantime - if type(package.loaded[modname]) == "table" then - local mod = package.loaded[modname] - return function() - return mod - end - end - local chunk, err = loadfile(path) - return chunk or error(err) - end - end - end - end - return modname .. " not found in lazy plugins" -end - return M diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 96c0b6c..c20bd9a 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -3,6 +3,7 @@ local Util = require("lazy.core.util") local Handler = require("lazy.core.handler") local Cache = require("lazy.core.cache") +---@class LazyCorePlugin local M = {} ---@class LazySpecLoader diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index b1b6025..ff9f51b 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -25,10 +25,8 @@ function M.setup(spec, opts) end local start = vim.loop.hrtime() - if not (opts and opts.performance and opts.performance.cache and opts.performance.cache.enabled == false) then - -- load module cache before anything else - require("lazy.core.cache").setup(opts) - end + -- load module cache before anything else + require("lazy.core.cache").setup(opts) local Util = require("lazy.core.util") local Config = require("lazy.core.config") From c2f7e2d0981ec5f06a73923296cfbe52c69ab5da Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 28 Dec 2022 17:58:16 +0100 Subject: [PATCH 0472/1610] feat(ui): added extra cache stats to the debug tab --- lua/lazy/view/render.lua | 44 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index f13a3a2..2cc97e0 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -5,6 +5,7 @@ local Handler = require("lazy.core.handler") local Git = require("lazy.manage.git") local Plugin = require("lazy.core.plugin") local ViewConfig = require("lazy.view.config") +local Cache = require("lazy.core.cache") local Text = require("lazy.view.text") @@ -240,6 +241,13 @@ function M:diagnostic(diag) table.insert(self._diagnostics, diag) end +---@param precision? number +function M:ms(nsec, precision) + precision = precision or 2 + local e = math.pow(10, precision) + return math.floor(nsec / 1e6 * e + 0.5) / e .. "ms" +end + ---@param reason? {[string]:string, time:number} ---@param opts? {time_right?:boolean} function M:reason(reason, opts) @@ -275,7 +283,7 @@ function M:reason(reason, opts) reason.runtime = reason.runtime:gsub(".*/([^/]+/ftdetect/.*)", "%1") reason.runtime = reason.runtime:gsub(".*/(runtime/.*)", "%1") end - local time = reason.time and (" " .. math.floor(reason.time / 1e6 * 100) / 100 .. "ms") + local time = reason.time and (" " .. self:ms(reason.time)) if time and not opts.time_right then self:append(time, "Bold") self:append(" ") @@ -473,21 +481,29 @@ function M:details(plugin) }) end end + self:props(props, { indent = 6 }) + self:nl() +end + +---@alias LazyProps {[1]:string, [2]:string|fun(), [3]?:string}[] +---@param props LazyProps +---@param opts? {indent: number} +function M:props(props, opts) + opts = opts or {} local width = 0 for _, prop in ipairs(props) do width = math.max(width, #prop[1]) end for _, prop in ipairs(props) do - self:append(prop[1] .. string.rep(" ", width - #prop[1] + 1), "LazyProp", { indent = 6 }) + self:append(prop[1] .. string.rep(" ", width - #prop[1] + 1), "LazyProp", { indent = opts.indent or 0 }) if type(prop[2]) == "function" then prop[2]() else - self:append(prop[2], prop[3] or "LazyValue") + self:append(tostring(prop[2]), prop[3] or "LazyValue") end self:nl() end - self:nl() end function M:profile() @@ -598,6 +614,26 @@ function M:debug() end) end) self:nl() + + self:append("Cache.find()", "LazyH2"):nl() + self:props({ + { "total", Cache.stats.find.total, "Number" }, + { "time", self:ms(Cache.stats.find.time, 3), "Bold" }, + { "avg time", self:ms(Cache.stats.find.time / Cache.stats.find.total, 3), "Bold" }, + { "index", Cache.stats.find.index, "Number" }, + { "fs_stat", Cache.stats.find.stat, "Number" }, + { "not found", Cache.stats.find.not_found, "Number" }, + }, { indent = 2 }) + self:nl() + + self:append("Cache.autoload()", "LazyH2"):nl() + self:props({ + { "total", Cache.stats.autoload.total, "Number" }, + { "time", self:ms(Cache.stats.autoload.time, 3), "Bold" }, + { "avg time", self:ms(Cache.stats.autoload.time / Cache.stats.autoload.total, 3), "Bold" }, + }, { indent = 2 }) + self:nl() + self:append("Cache", "LazyH2"):nl() local Cache = require("lazy.core.cache") Util.foreach(Cache.cache, function(modname, entry) From 370b1b982e95c004512604eb87f0facd03340095 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 28 Dec 2022 23:50:25 +0100 Subject: [PATCH 0473/1610] fix(cache): make it work again... #fixup --- lua/lazy/core/cache.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 2c5ba2e..f61236a 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -34,10 +34,12 @@ M.stats = { find = { total = 0, time = 0, rtp = 0, unloaded = 0, index = 0, stat = 0, not_found = 0 }, autoload = { total = 0, time = 0 }, } +M.me = debug.getinfo(1, "S").source:sub(2) +M.me = vim.fn.fnamemodify(M.me, ":p:h:h:h:h"):gsub("\\", "/") ---@type table<string, table<string,string>> -M.topmods = {} +M.topmods = { lazy = { [M.me] = M.me } } ---@type table<string, true> -M.indexed = {} +M.indexed = { [M.me] = true } M.indexed_rtp = false M.indexed_unloaded = false -- selene:allow(global_usage) From 9997523841bd39c90d785807411b6babc529f366 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 00:48:59 +0100 Subject: [PATCH 0474/1610] fix(cache): OptionSet is not triggered during startup, so use #rtp instead to see if it changed --- lua/lazy/core/cache.lua | 51 ++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index f61236a..7602a0d 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -30,6 +30,7 @@ M.cache = {} M.enabled = true ---@type string[] M.rtp = nil +M.rtp_total = 0 M.stats = { find = { total = 0, time = 0, rtp = 0, unloaded = 0, index = 0, stat = 0, not_found = 0 }, autoload = { total = 0, time = 0 }, @@ -40,8 +41,8 @@ M.me = vim.fn.fnamemodify(M.me, ":p:h:h:h:h"):gsub("\\", "/") M.topmods = { lazy = { [M.me] = M.me } } ---@type table<string, true> M.indexed = { [M.me] = true } -M.indexed_rtp = false M.indexed_unloaded = false +M.indexed_rtp = 0 -- selene:allow(global_usage) M._loadfile = _G.loadfile @@ -165,7 +166,7 @@ function M.load(modkey, modpath) end entry.hash = hash - if M.debug then + if M.debug and M.enabled then vim.schedule(function() vim.notify("[cache:load] " .. modpath) end) @@ -192,7 +193,7 @@ function M._index(path) ---@type LazyUtilCore local Util = package.loaded["lazy.core.util"] if not Util then - return + return false end M.indexed[path] = true Util.ls(path .. "/lua", function(_, name, t) @@ -207,7 +208,9 @@ function M._index(path) M.topmods[topname][path] = path end end) + return true end + return false end ---@param modname string @@ -238,27 +241,34 @@ function M.find(modname) local modpath = _find() if not modpath then -- update rtp - if not M.indexed_rtp then - for _, path in ipairs(vim.api.nvim_list_runtime_paths()) do - M._index(path) + local rtp = vim.api.nvim_list_runtime_paths() + if #rtp ~= M.indexed_rtp then + M.indexed_rtp = #rtp + local updated = false + for _, path in ipairs(rtp) do + updated = M._index(path) or updated + end + if updated then + modpath = _find() end - M.indexed_rtp = true - modpath = _find() end -- update unloaded if not modpath and not M.indexed_unloaded then + M.indexed_unloaded = true + local updated = false ---@type LazyCoreConfig local Config = package.loaded["lazy.core.config"] if Config then for _, plugin in pairs(Config.plugins) do if not (M.indexed[plugin.dir] or plugin._.loaded or plugin.module == false) then - M._index(plugin.dir) + updated = M._index(plugin.dir) or updated end end end - M.indexed_unloaded = true - modpath = _find() + if updated then + modpath = _find() + end end -- module not found @@ -273,13 +283,16 @@ end -- returns the cached RTP excluding plugin dirs function M.get_rtp() - if not M.rtp then + local rtp = vim.api.nvim_list_runtime_paths() + if not M.rtp or #rtp ~= M.rtp_total then + M.rtp_total = #rtp M.rtp = {} ---@type table<string,true> local skip = {} -- only skip plugins once Config has been setup - if package.loaded["lazy.core.config"] then - local Config = require("lazy.core.config") + ---@type LazyCoreConfig + local Config = package.loaded["lazy.core.config"] + if Config then for _, plugin in pairs(Config.plugins) do if plugin.name ~= "lazy.nvim" then skip[plugin.dir] = true @@ -287,6 +300,7 @@ function M.get_rtp() end end for _, path in ipairs(vim.api.nvim_list_runtime_paths()) do + ---@type string path = path:gsub("\\", "/") if not skip[path] and not path:find("after/?$") then M.rtp[#M.rtp + 1] = path @@ -309,15 +323,6 @@ function M.setup(opts) M.debug = opts and opts.debug M.enabled = M.config.enabled - -- reset rtp when it changes - vim.api.nvim_create_autocmd("OptionSet", { - pattern = "runtimepath", - callback = function() - M.rtp = nil - M.indexed_rtp = false - end, - }) - if M.enabled then table.insert(package.loaders, 2, M.loader) M.load_cache() From c8553ca44fefb934ebedb1fabba3ca492848fccc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 00:49:38 +0100 Subject: [PATCH 0475/1610] feat(plugin): allow some `lazy.nvim` spec props to be set by the user --- lua/lazy/core/plugin.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index c20bd9a..d81070f 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -212,8 +212,15 @@ function M.load() local spec = M.spec() -- add ourselves - spec.plugins["lazy.nvim"] = nil - spec:add({ "folke/lazy.nvim", lazy = true, dir = Config.me }) + spec:add({ "folke/lazy.nvim" }) + -- override some lazy props + local lazy = spec.plugins["lazy.nvim"] + lazy.lazy = true + lazy.dir = Config.me + lazy.config = function() + error("lazy config should not be called") + end + lazy._.loaded = {} local existing = Config.plugins Config.plugins = spec.plugins @@ -228,6 +235,7 @@ function M.load() Util.track("state") M.update_state() Util.track() + require("lazy.core.cache").indexed_unloaded = false end -- Finds the plugin that has this path From 6c0b8039990b08b46b5d0c69392256e9f3a2f8d8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 01:02:05 +0100 Subject: [PATCH 0476/1610] fix(git): add --no-show-signature. Fixes #218 --- lua/lazy/manage/process.lua | 4 ++++ lua/lazy/manage/task/git.lua | 1 + 2 files changed, 5 insertions(+) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 7ac6514..d08f7c0 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -11,6 +11,7 @@ local uv = vim.loop ---@field on_line? fun(string) ---@field on_exit? fun(ok:boolean, output:string) ---@field timeout? number +---@field env? string[] ---@param opts? ProcessOpts function M.spawn(cmd, opts) @@ -21,6 +22,9 @@ function M.spawn(cmd, opts) "GIT_TERMINAL_PROMPT=0", "GIT_SSH_COMMAND=ssh -oBatchMode=yes", } + if opts.env then + vim.list_extend(env, opts.env) + end for key, value in pairs(uv.os_environ() --[[@as string[] ]]) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 278d19b..2107d24 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -26,6 +26,7 @@ M.log = { "--decorate", "--date=short", "--color=never", + "--no-show-signature", } if opts.updated then From 4b75d06c076745379fb1688d2bd00eeabeaa4a4b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 01:04:39 +0100 Subject: [PATCH 0477/1610] fix(cache): dont update rtp in fast events --- lua/lazy/core/cache.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 7602a0d..e0144c4 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -283,6 +283,9 @@ end -- returns the cached RTP excluding plugin dirs function M.get_rtp() + if vim.in_fast_event() then + return M.rtp or {} + end local rtp = vim.api.nvim_list_runtime_paths() if not M.rtp or #rtp ~= M.rtp_total then M.rtp_total = #rtp @@ -299,7 +302,7 @@ function M.get_rtp() end end end - for _, path in ipairs(vim.api.nvim_list_runtime_paths()) do + for _, path in ipairs(rtp) do ---@type string path = path:gsub("\\", "/") if not skip[path] and not path:find("after/?$") then From 55335138ceb9857d08d1e9fd6cc46ed91aed3929 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 29 Dec 2022 00:05:27 +0000 Subject: [PATCH 0478/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d752cb7..46e1ed5 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 28 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 29 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 95b9cf743c4d6aab879c2259b79346c6f306dab8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 01:25:05 +0100 Subject: [PATCH 0479/1610] fix(cache): properly get rtp during fast events --- lua/lazy/core/cache.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index e0144c4..db57317 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -241,7 +241,7 @@ function M.find(modname) local modpath = _find() if not modpath then -- update rtp - local rtp = vim.api.nvim_list_runtime_paths() + local rtp = M.list_rtp() if #rtp ~= M.indexed_rtp then M.indexed_rtp = #rtp local updated = false @@ -283,10 +283,7 @@ end -- returns the cached RTP excluding plugin dirs function M.get_rtp() - if vim.in_fast_event() then - return M.rtp or {} - end - local rtp = vim.api.nvim_list_runtime_paths() + local rtp = M.list_rtp() if not M.rtp or #rtp ~= M.rtp_total then M.rtp_total = #rtp M.rtp = {} @@ -313,6 +310,10 @@ function M.get_rtp() return M.rtp end +function M.list_rtp() + return vim.api.nvim_get_runtime_file("", true) +end + ---@param opts? LazyConfig function M.setup(opts) -- no fancy deep extend here. just set the options From e3ffcff7cce1206a2e41b413b0923a3aafeb9306 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 08:01:05 +0100 Subject: [PATCH 0480/1610] fix(cache): ad jit.verion to cache version string. Fixes #225 --- lua/lazy/core/cache.lua | 2 +- lua/lazy/init.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index db57317..f2daeee 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -4,7 +4,7 @@ local uv = vim.loop local M = {} M.dirty = false -M.VERSION = "1" +M.VERSION = "1" .. jit.version ---@class LazyCacheConfig M.config = { diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index ff9f51b..bfb475e 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -20,7 +20,7 @@ function M.setup(spec, opts) if vim.fn.has("nvim-0.8.0") ~= 1 then return vim.notify("lazy.nvim requires Neovim >= 0.8.0", vim.log.levels.ERROR, { title = "lazy.nvim" }) end - if not pcall(require, "ffi") then + if not (pcall(require, "ffi") and jit and jit.version) then return vim.notify("lazy.nvim requires Neovim built with LuaJIT", vim.log.levels.ERROR, { title = "lazy.nvim" }) end local start = vim.loop.hrtime() From 15b5b9442281f7e17ec2fb7bb81f124267097a97 Mon Sep 17 00:00:00 2001 From: XXiaoA <62557596+XXiaoA@users.noreply.github.com> Date: Thu, 29 Dec 2022 15:02:46 +0800 Subject: [PATCH 0481/1610] docs: Add migration for config from packer (#227) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5896d61..1932126 100644 --- a/README.md +++ b/README.md @@ -672,6 +672,7 @@ For a real-life example, you can check my personal dots: - `tag='*'` ➡️ `version="*"` - `after` ℹ️ **_not needed_** for most use-cases. Use `dependencies` otherwise. - `wants` ℹ️ **_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 [different](#%EF%B8%8F-lazy-key-mappings) From 72ab3e29331321e7e52498760cd935b4b0583857 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 29 Dec 2022 07:03:28 +0000 Subject: [PATCH 0482/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 46e1ed5..59b7ebf 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -736,6 +736,7 @@ PACKER.NVIM <HTTPS://GITHUB.COM/WBTHOMASON/PACKER.NVIM> ~ - `tag=''` `version=""` - `after` **_not needed_** for most use-cases. Use `dependencies` otherwise. - `wants` **_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| From 4e3a973f85bd2393009d495ecfd6c058345309d4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 08:21:22 +0100 Subject: [PATCH 0483/1610] fix(rtp): correct order of adding to rtp. Fixes #226 --- lua/lazy/core/config.lua | 2 +- lua/lazy/core/loader.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 12610cf..f85e5c1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -183,9 +183,9 @@ function M.setup(spec, opts) if M.options.performance.rtp.reset then vim.opt.rtp = { M.me, + vim.fn.stdpath("config"), vim.env.VIMRUNTIME, vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib/nvim", - vim.fn.stdpath("config"), vim.fn.stdpath("config") .. "/after", } end diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 3594114..b17eac0 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -172,7 +172,7 @@ function M._load(plugin, reason) Util.track({ plugin = plugin.name, start = reason.start }) Handler.disable(plugin) - vim.opt.runtimepath:prepend(plugin.dir) + vim.opt.runtimepath:append(plugin.dir) local after = plugin.dir .. "/after" if vim.loop.fs_stat(after) then vim.opt.runtimepath:append(after) From b8c5ab5dae0b826e576a9a99f92a7e63fb20fb01 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 08:25:24 +0100 Subject: [PATCH 0484/1610] fix(cache): reload file if compiled code is incompatible. Fixes #225 --- lua/lazy/core/cache.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index f2daeee..b5075c0 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -158,7 +158,10 @@ function M.load(modkey, modpath) entry.used = os.time() if M.eq(entry.hash, hash) then -- found in cache and up to date - return loadstring(entry.chunk --[[@as string]], "@" .. entry.modpath) + local chunk, err = loadstring(entry.chunk --[[@as string]], "@" .. entry.modpath) + if not (err and err:find("cannot load incompatible bytecode", 1, true)) then + return chunk, err + end end else entry = { hash = hash, modpath = modpath, used = os.time() } From 044e28bf8bb454335c63998ef6f21bc34b3e6124 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 09:06:23 +0100 Subject: [PATCH 0485/1610] fix(cache): check package.loaded after auto-load and return existing module if present. Fixes #224 --- lua/lazy/core/cache.lua | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index b5075c0..6876edd 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -103,6 +103,16 @@ function M.disable() M.enabled = false end +function M.check_loaded(modname) + ---@diagnostic disable-next-line: no-unknown + local mod = package.loaded[modname] + if type(mod) == "table" then + return function() + return mod + end + end +end + ---@param modname string ---@return any function M.loader(modname) @@ -111,12 +121,6 @@ function M.loader(modname) local chunk, err if entry and M.check_path(modname, entry.modpath) then M.stats.find.total = M.stats.find.total + 1 - local mod = package.loaded[modname] - if type(mod) == "table" then - return function() - return mod - end - end chunk, err = M.load(modname, entry.modpath) end if not chunk then @@ -127,7 +131,10 @@ function M.loader(modname) if M.enabled then chunk, err = M.load(modname, modpath) else - chunk, err = M._loadfile(modpath) + chunk = M.check_loaded(modname) + if not chunk then + chunk, err = M._loadfile(modpath) + end end end end @@ -145,6 +152,11 @@ end ---@param modpath string ---@return function?, string? error_message function M.load(modkey, modpath) + local chunk, err + chunk = M.check_loaded(modkey) + if chunk then + return chunk + end modpath = modpath:gsub("\\", "/") local hash = M.hash(modpath) if not hash then @@ -158,7 +170,7 @@ function M.load(modkey, modpath) entry.used = os.time() if M.eq(entry.hash, hash) then -- found in cache and up to date - local chunk, err = loadstring(entry.chunk --[[@as string]], "@" .. entry.modpath) + chunk, err = loadstring(entry.chunk --[[@as string]], "@" .. entry.modpath) if not (err and err:find("cannot load incompatible bytecode", 1, true)) then return chunk, err end @@ -175,7 +187,7 @@ function M.load(modkey, modpath) end) end - local chunk, err = M._loadfile(entry.modpath) + chunk, err = M._loadfile(entry.modpath) if chunk then M.dirty = true entry.chunk = string.dump(chunk) @@ -184,7 +196,9 @@ function M.load(modkey, modpath) end function M.require(modname) + ---@diagnostic disable-next-line: no-unknown local mod = M.loader(modname)() + ---@diagnostic disable-next-line: no-unknown package.loaded[modname] = mod return mod end From c7122d64cdf16766433588486adcee67571de6d0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 10:51:25 +0100 Subject: [PATCH 0486/1610] fix(loader): temporary fix for Vimtex and others. See #230 --- lua/lazy/core/loader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index b17eac0..3594114 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -172,7 +172,7 @@ function M._load(plugin, reason) Util.track({ plugin = plugin.name, start = reason.start }) Handler.disable(plugin) - vim.opt.runtimepath:append(plugin.dir) + vim.opt.runtimepath:prepend(plugin.dir) local after = plugin.dir .. "/after" if vim.loop.fs_stat(after) then vim.opt.runtimepath:append(after) From 3a1a10cd75b47f2aae1f843286cc17d8a780dff1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 16:03:23 +0100 Subject: [PATCH 0487/1610] fix(loader): implemented correct adding to rtp. fix #230, fix #226 --- lua/lazy/core/config.lua | 2 +- lua/lazy/core/loader.lua | 38 ++++++++++++++++++++++++++++++++------ lua/lazy/init.lua | 2 +- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f85e5c1..508ed22 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -182,8 +182,8 @@ function M.setup(spec, opts) M.me = Util.norm(vim.fn.fnamemodify(M.me, ":p:h:h:h:h")) if M.options.performance.rtp.reset then vim.opt.rtp = { - M.me, vim.fn.stdpath("config"), + M.me, vim.env.VIMRUNTIME, vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib/nvim", vim.fn.stdpath("config") .. "/after", diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 3594114..61e55da 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -80,7 +80,7 @@ function M.startup() end Util.track() - -- 3. load plugins from rtp, excluding after + -- 3. load plugins from the original rtp, excluding after Util.track({ start = "rtp plugins" }) for _, path in ipairs(rtp) do if not path:find("after/?$") then @@ -172,11 +172,7 @@ function M._load(plugin, reason) Util.track({ plugin = plugin.name, start = reason.start }) Handler.disable(plugin) - vim.opt.runtimepath:prepend(plugin.dir) - local after = plugin.dir .. "/after" - if vim.loop.fs_stat(after) then - vim.opt.runtimepath:append(after) - end + M.add_to_rtp(plugin) if plugin.dependencies then Util.try(function() @@ -271,6 +267,36 @@ function M.source_runtime(...) end end +-- This does the same as runtime.c:add_pack_dir_to_rtp +-- * find first after +-- * find lazy pack path +-- * insert right after lazy pack path or right before first after or at the end +-- * insert after dir right before first after or append to the end +---@param plugin LazyPlugin +function M.add_to_rtp(plugin) + local rtp = vim.api.nvim_get_runtime_file("", true) + local idx_dir, idx_after + + for i, path in ipairs(rtp) do + if path == Config.me then + idx_dir = i + 1 + elseif not idx_after and path:sub(-6, -1) == "/after" then + idx_after = i + 1 -- +1 to offset the insert of the plugin dir + idx_dir = idx_dir or i + break + end + end + + table.insert(rtp, idx_dir or (#rtp + 1), plugin.dir) + + local after = plugin.dir .. "/after" + if vim.loop.fs_stat(after) then + table.insert(rtp, idx_after or (#rtp + 1), after) + end + + vim.opt.rtp = rtp +end + function M.source(path) Util.track({ runtime = path }) Util.try(function() diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index bfb475e..5ea6528 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -77,7 +77,7 @@ function M.bootstrap() lazypath, }) end - vim.opt.runtimepath:prepend(lazypath) + vim.opt.rtp:prepend(lazypath) end ---@return LazyPlugin[] From db043da829899239399ef04e917a95c4ceb9b8e6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 16:04:45 +0100 Subject: [PATCH 0488/1610] fix(config): reset packpath to include VIMRUNTIME only. Fixes #214 --- lua/lazy/core/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 508ed22..281086f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -175,7 +175,7 @@ function M.setup(spec, opts) M.options.readme.root = Util.norm(M.options.readme.root) if M.options.performance.reset_packpath then - vim.go.packpath = "" + vim.go.packpath = vim.env.VIMRUNTIME end M.me = debug.getinfo(1, "S").source:sub(2) From 7de662d037a96fccc3e3d784468b01794288a7b6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 17:26:38 +0100 Subject: [PATCH 0489/1610] fix(ft): only trigger filetypepluing and filetypeindent for ft handler. Fixes #228 --- lua/lazy/core/handler/event.lua | 13 ++++--------- lua/lazy/core/handler/ft.lua | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 6bdaf10..6ccd769 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -11,7 +11,6 @@ M.trigger_events = { BufRead = { "BufReadPre", "BufRead" }, BufReadPost = { "BufReadPre", "BufRead", "BufReadPost" }, } -M.trigger_always = { "FileType" } M.group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) ---@param value string @@ -32,12 +31,8 @@ function M:_add(value) local groups = M.get_augroups(event, pattern) -- load the plugins Loader.load(self.active[value], { [self.type] = value }) - if vim.tbl_contains(M.trigger_always, event) then - vim.cmd("do " .. event) - else - -- check if any plugin created an event handler for this event and fire the group - M.trigger(event, pattern, groups) - end + -- check if any plugin created an event handler for this event and fire the group + self:trigger(event, pattern, groups) Util.track() end, }) @@ -66,7 +61,7 @@ end ---@param event string|string[] ---@param pattern? string ---@param groups table<string,true> -function M.trigger(event, pattern, groups) +function M:trigger(event, pattern, groups) local events = M.trigger_events[event] or { event } ---@cast events string[] for _, e in ipairs(events) do @@ -77,7 +72,7 @@ function M.trigger(event, pattern, groups) "# Firing Events", " - **group:** `" .. autocmd.group_name .. "`", " - **event:** " .. autocmd.event, - pattern and "- **pattern:** ", + pattern and (" - **pattern:** " .. pattern), }) end Util.try(function() diff --git a/lua/lazy/core/handler/ft.lua b/lua/lazy/core/handler/ft.lua index f0947c6..22f6171 100644 --- a/lua/lazy/core/handler/ft.lua +++ b/lua/lazy/core/handler/ft.lua @@ -1,4 +1,5 @@ local Event = require("lazy.core.handler.event") +local Util = require("lazy.core.util") local Loader = require("lazy.core.loader") ---@class LazyFiletypeHandler:LazyEventHandler @@ -18,4 +19,19 @@ function M:add(plugin) end end +---@param pattern? string +function M:trigger(_, pattern, _) + for _, group in ipairs({ "filetypeplugin", "filetypeindent" }) do + Util.try(function() + Util.info({ + "# Firing Events", + " - **group:** `" .. group .. "`", + " - **event:** FileType", + pattern and (" - **pattern:** " .. pattern), + }) + vim.api.nvim_exec_autocmds("FileType", { group = group, modeline = false, pattern = pattern }) + end) + end +end + return M From e2925748df2e09a434170382fd1521d062fe8c34 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 17:30:29 +0100 Subject: [PATCH 0490/1610] build: added jit to selene --- vim.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vim.toml b/vim.toml index 576760a..4206f6c 100644 --- a/vim.toml +++ b/vim.toml @@ -5,6 +5,9 @@ name = "vim" [vim] any = true +[jit] +any = true + [[describe.args]] type = "string" [[describe.args]] From a2eac685754252c903094aefa40ab6d747d103aa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 17:32:54 +0100 Subject: [PATCH 0491/1610] fix(cmd): fixed signature of cmd._del. Fixes #229 --- .gitignore | 3 ++- lua/lazy/core/handler/cmd.lua | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 58426cf..e62ab00 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ -tt.lua +tt.* .tests doc/tags debug .repro +foo.* diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index d10bd4b..a4913e0 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -36,9 +36,8 @@ function M:_add(cmd) }) end ----@param _plugin LazyPlugin ---@param value string -function M:_del(_plugin, value) +function M:_del(value) pcall(vim.api.nvim_del_user_command, value) end From c7c1295c3e429d4a95e36b5c5b2dfcbeca61f42d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 18:06:40 +0100 Subject: [PATCH 0492/1610] fix: only show fired ft events in debug obvioulsy. Fixes #232 --- lua/lazy/core/handler/ft.lua | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/handler/ft.lua b/lua/lazy/core/handler/ft.lua index 22f6171..66fd13a 100644 --- a/lua/lazy/core/handler/ft.lua +++ b/lua/lazy/core/handler/ft.lua @@ -1,6 +1,7 @@ local Event = require("lazy.core.handler.event") local Util = require("lazy.core.util") local Loader = require("lazy.core.loader") +local Config = require("lazy.core.config") ---@class LazyFiletypeHandler:LazyEventHandler local M = {} @@ -23,12 +24,14 @@ end function M:trigger(_, pattern, _) for _, group in ipairs({ "filetypeplugin", "filetypeindent" }) do Util.try(function() - Util.info({ - "# Firing Events", - " - **group:** `" .. group .. "`", - " - **event:** FileType", - pattern and (" - **pattern:** " .. pattern), - }) + if Config.options.debug then + Util.info({ + "# Firing Events", + " - **group:** `" .. group .. "`", + " - **event:** FileType", + pattern and (" - **pattern:** " .. pattern), + }) + end vim.api.nvim_exec_autocmds("FileType", { group = group, modeline = false, pattern = pattern }) end) end From 8544c389ab54dd21c562b2763829670c71266caa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 18:26:39 +0100 Subject: [PATCH 0493/1610] fix(cache): always normalize modname separators --- lua/lazy/core/cache.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 6876edd..109405f 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -116,6 +116,7 @@ end ---@param modname string ---@return any function M.loader(modname) + modname = modname:gsub("/", ".") local entry = M.cache[modname] local chunk, err From 853d4d58381870a4804ee7d822d3331d3cc5924d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 18:40:28 +0100 Subject: [PATCH 0494/1610] fix(cache): added support for top level lua linked directories. Fixes #233 --- lua/lazy/core/cache.lua | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 109405f..b2c7c8e 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -114,7 +114,7 @@ function M.check_loaded(modname) end ---@param modname string ----@return any +---@return fun()|string function M.loader(modname) modname = modname:gsub("/", ".") local entry = M.cache[modname] @@ -139,7 +139,7 @@ function M.loader(modname) end end end - return chunk or (err and error(err)) or "not found in lazy cache" + return chunk or err or ("module " .. modname .. " not found") end ---@param modpath string @@ -197,8 +197,12 @@ function M.load(modkey, modpath) end function M.require(modname) + local chunk = M.loader(modname) + if type(chunk) == "string" then + error(chunk) + end ---@diagnostic disable-next-line: no-unknown - local mod = M.loader(modname)() + local mod = chunk() ---@diagnostic disable-next-line: no-unknown package.loaded[modname] = mod return mod @@ -216,10 +220,10 @@ function M._index(path) M.indexed[path] = true Util.ls(path .. "/lua", function(_, name, t) local topname - if t == "directory" then - topname = name - elseif name:sub(-4) == ".lua" then + if name:sub(-4) == ".lua" then topname = name:sub(1, -5) + elseif t == "link" or t == "directory" then + topname = name end if topname then M.topmods[topname] = M.topmods[topname] or {} From 717cd2f3d683e186888f1e238a19af9c7646a539 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 29 Dec 2022 18:42:54 +0100 Subject: [PATCH 0495/1610] chore(main): release 7.4.0 (#197) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83c33eb..ecf774c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,46 @@ # Changelog +## [7.4.0](https://github.com/folke/lazy.nvim/compare/v7.3.0...v7.4.0) (2022-12-29) + + +### Features + +* **cache:** update package.loaded on require ([021e546](https://github.com/folke/lazy.nvim/commit/021e54655f8ba9c594b2035f044e5a2a1b13a893)) +* **plugin:** allow some `lazy.nvim` spec props to be set by the user ([c8553ca](https://github.com/folke/lazy.nvim/commit/c8553ca44fefb934ebedb1fabba3ca492848fccc)) +* **profile:** nicer threshold prompt ([#210](https://github.com/folke/lazy.nvim/issues/210)) ([ff8f378](https://github.com/folke/lazy.nvim/commit/ff8f3783fa5dabdb086c5731c46d1a4cf79917af)) +* **ui:** added extra cache stats to the debug tab ([c2f7e2d](https://github.com/folke/lazy.nvim/commit/c2f7e2d0981ec5f06a73923296cfbe52c69ab5da)) + + +### Bug Fixes + +* **cache:** ad jit.verion to cache version string. Fixes [#225](https://github.com/folke/lazy.nvim/issues/225) ([e3ffcff](https://github.com/folke/lazy.nvim/commit/e3ffcff7cce1206a2e41b413b0923a3aafeb9306)) +* **cache:** added support for top level lua linked directories. Fixes [#233](https://github.com/folke/lazy.nvim/issues/233) ([853d4d5](https://github.com/folke/lazy.nvim/commit/853d4d58381870a4804ee7d822d3331d3cc5924d)) +* **cache:** always normalize modname separators ([8544c38](https://github.com/folke/lazy.nvim/commit/8544c389ab54dd21c562b2763829670c71266caa)) +* **cache:** check package.loaded after auto-load and return existing module if present. Fixes [#224](https://github.com/folke/lazy.nvim/issues/224) ([044e28b](https://github.com/folke/lazy.nvim/commit/044e28bf8bb454335c63998ef6f21bc34b3e6124)) +* **cache:** dont update rtp in fast events ([4b75d06](https://github.com/folke/lazy.nvim/commit/4b75d06c076745379fb1688d2bd00eeabeaa4a4b)) +* **cache:** make it work again... #fixup ([370b1b9](https://github.com/folke/lazy.nvim/commit/370b1b982e95c004512604eb87f0facd03340095)) +* **cache:** OptionSet is not triggered during startup, so use #rtp instead to see if it changed ([9997523](https://github.com/folke/lazy.nvim/commit/9997523841bd39c90d785807411b6babc529f366)) +* **cache:** properly get rtp during fast events ([95b9cf7](https://github.com/folke/lazy.nvim/commit/95b9cf743c4d6aab879c2259b79346c6f306dab8)) +* **cache:** reload file if compiled code is incompatible. Fixes [#225](https://github.com/folke/lazy.nvim/issues/225) ([b8c5ab5](https://github.com/folke/lazy.nvim/commit/b8c5ab5dae0b826e576a9a99f92a7e63fb20fb01)) +* **cmd:** fixed signature of cmd._del. Fixes [#229](https://github.com/folke/lazy.nvim/issues/229) ([a2eac68](https://github.com/folke/lazy.nvim/commit/a2eac685754252c903094aefa40ab6d747d103aa)) +* **commands:** E5108 in getcompletions ([#207](https://github.com/folke/lazy.nvim/issues/207)) ([acd6697](https://github.com/folke/lazy.nvim/commit/acd6697d8810e501d3861bba2ac45d5f4555c43a)) +* **config:** reset packpath to include VIMRUNTIME only. Fixes [#214](https://github.com/folke/lazy.nvim/issues/214) ([db043da](https://github.com/folke/lazy.nvim/commit/db043da829899239399ef04e917a95c4ceb9b8e6)) +* **ft:** only trigger filetypepluing and filetypeindent for ft handler. Fixes [#228](https://github.com/folke/lazy.nvim/issues/228) ([7de662d](https://github.com/folke/lazy.nvim/commit/7de662d037a96fccc3e3d784468b01794288a7b6)) +* **git:** add --no-show-signature. Fixes [#218](https://github.com/folke/lazy.nvim/issues/218) ([6c0b803](https://github.com/folke/lazy.nvim/commit/6c0b8039990b08b46b5d0c69392256e9f3a2f8d8)) +* **health:** add `cond` key ([#203](https://github.com/folke/lazy.nvim/issues/203)) ([b813fae](https://github.com/folke/lazy.nvim/commit/b813fae61cebbc5b45e7ea3bfbe214b0d5769696)) +* **health:** add new key `priority` to `:checkhealth lazy` ([#196](https://github.com/folke/lazy.nvim/issues/196)) ([dc03fa1](https://github.com/folke/lazy.nvim/commit/dc03fa1ae57c3949874c9cae50074a83232c4eed)) +* **loader:** implemented correct adding to rtp. fix [#230](https://github.com/folke/lazy.nvim/issues/230), fix [#226](https://github.com/folke/lazy.nvim/issues/226) ([3a1a10c](https://github.com/folke/lazy.nvim/commit/3a1a10cd75b47f2aae1f843286cc17d8a780dff1)) +* **loader:** show proper error message when trying to load a plugin that is not installed. Fixes [#201](https://github.com/folke/lazy.nvim/issues/201). Fixes [#202](https://github.com/folke/lazy.nvim/issues/202) ([956164d](https://github.com/folke/lazy.nvim/commit/956164d27dc02b8d3c21c9ef7cc9028d854b0978)) +* **loader:** temporary fix for Vimtex and others. See [#230](https://github.com/folke/lazy.nvim/issues/230) ([c7122d6](https://github.com/folke/lazy.nvim/commit/c7122d64cdf16766433588486adcee67571de6d0)) +* **loader:** when `config=true`, pass `nil` to `setup()`. Fixes [#208](https://github.com/folke/lazy.nvim/issues/208) ([5f423b2](https://github.com/folke/lazy.nvim/commit/5f423b29c65f536a9c41a34a8328372baa444da5)) +* only show fired ft events in debug obvioulsy. Fixes [#232](https://github.com/folke/lazy.nvim/issues/232) ([c7c1295](https://github.com/folke/lazy.nvim/commit/c7c1295c3e429d4a95e36b5c5b2dfcbeca61f42d)) +* **rtp:** correct order of adding to rtp. Fixes [#226](https://github.com/folke/lazy.nvim/issues/226) ([4e3a973](https://github.com/folke/lazy.nvim/commit/4e3a973f85bd2393009d495ecfd6c058345309d4)) + + +### Performance Improvements + +* move autoloader to cache and always use lazy's modname path resolver which is much faster ([34977c2](https://github.com/folke/lazy.nvim/commit/34977c2b80db3ce5054f3925057b6b8ccbd7ce7e)) + ## [7.3.0](https://github.com/folke/lazy.nvim/compare/v7.2.0...v7.3.0) (2022-12-27) From 9f3fb3840228a4d812197f7c6dbd08a9c60d85af Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 22:40:15 +0100 Subject: [PATCH 0496/1610] fix(ftdetect): source ftdetect files only once. Fixes #235 --- lua/lazy/core/loader.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 61e55da..c350582 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -11,6 +11,8 @@ M.loading = {} M.init_done = false ---@type table<string,true> M.disabled_rtp_plugins = { packer_compiled = true } +---@type table<string,string> +M.did_ftdetect = {} function M.setup() -- setup handlers @@ -243,9 +245,12 @@ end ---@param path string function M.ftdetect(path) - vim.cmd("augroup filetypedetect") - M.source_runtime(path, "ftdetect") - vim.cmd("augroup END") + if not M.did_ftdetect[path] then + M.did_ftdetect[path] = path + vim.cmd("augroup filetypedetect") + M.source_runtime(path, "ftdetect") + vim.cmd("augroup END") + end end ---@param ... string From 0c386bbea292ca38b3bcb04e0a7d65308291954d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 22:58:10 +0100 Subject: [PATCH 0497/1610] ci: added stable tag that gets moved with every release --- .github/workflows/ci.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b1982d..c089490 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,3 +59,13 @@ jobs: with: release-type: simple package-name: lazy.nvim + - name: tag stable versions + if: ${{ steps.release.outputs.release_created }} + run: | + git config user.name github-actions[bot] + git config user.email github-actions[bot]@users.noreply.github.com + git remote add gh-token "https://${{ secrets.GITHUB_TOKEN }}@github.com/google-github-actions/release-please-action.git" + git tag -d stable || true + git push origin :stable || true + git tag -a stable -m "Last Stable Release" + git push origin stable From 68ee0cbe2dded8377f0e642e0d3a03b07aacdd59 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 29 Dec 2022 23:00:02 +0100 Subject: [PATCH 0498/1610] chore(main): release 7.4.1 (#238) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ecf774c..6006a79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [7.4.1](https://github.com/folke/lazy.nvim/compare/v7.4.0...v7.4.1) (2022-12-29) + + +### Bug Fixes + +* **ftdetect:** source ftdetect files only once. Fixes [#235](https://github.com/folke/lazy.nvim/issues/235) ([9f3fb38](https://github.com/folke/lazy.nvim/commit/9f3fb3840228a4d812197f7c6dbd08a9c60d85af)) + ## [7.4.0](https://github.com/folke/lazy.nvim/compare/v7.3.0...v7.4.0) (2022-12-29) From a4bd4dc4a7b688b6f68f483bd04b85bb83a96bd8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 23:06:37 +0100 Subject: [PATCH 0499/1610] fix(loader): normalize rtp paths on windows #230 --- lua/lazy/core/loader.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c350582..f08a70c 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -282,7 +282,12 @@ function M.add_to_rtp(plugin) local rtp = vim.api.nvim_get_runtime_file("", true) local idx_dir, idx_after + local is_win = jit.os:find("Windows") + for i, path in ipairs(rtp) do + if is_win then + path = Util.norm(path) + end if path == Config.me then idx_dir = i + 1 elseif not idx_after and path:sub(-6, -1) == "/after" then From e6c24914e85aa2b837cb82d9bda726e3e19805e2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 23:12:38 +0100 Subject: [PATCH 0500/1610] test: fixed selene issues for tests --- tests/manage/task_spec.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index e886484..76c91e5 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -1,3 +1,4 @@ +--# selene:allow(incorrect_standard_library_use) local Task = require("lazy.manage.task") describe("task", function() From 563519eee7fab6f05d3611885ada9891df82fd0b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 23:15:39 +0100 Subject: [PATCH 0501/1610] ci: fixed release-please stable tag --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c089490..cceac64 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,7 +60,7 @@ jobs: release-type: simple package-name: lazy.nvim - name: tag stable versions - if: ${{ steps.release.outputs.release_created }} + if: ${{ steps.release.outputs.releases_created }} run: | git config user.name github-actions[bot] git config user.email github-actions[bot]@users.noreply.github.com From 67cb4e74c8fdbaac3420029d770b0dfeb06ff497 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 29 Dec 2022 23:17:03 +0100 Subject: [PATCH 0502/1610] chore(main): release 7.4.2 (#239) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6006a79..2d1d6d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [7.4.2](https://github.com/folke/lazy.nvim/compare/v7.4.1...v7.4.2) (2022-12-29) + + +### Bug Fixes + +* **loader:** normalize rtp paths on windows [#230](https://github.com/folke/lazy.nvim/issues/230) ([a4bd4dc](https://github.com/folke/lazy.nvim/commit/a4bd4dc4a7b688b6f68f483bd04b85bb83a96bd8)) + ## [7.4.1](https://github.com/folke/lazy.nvim/compare/v7.4.0...v7.4.1) (2022-12-29) From 5d9c528771b7bf564c8e69fc184cf1671cad2096 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 23:26:27 +0100 Subject: [PATCH 0503/1610] ci: fixed stable tag for release-please (again) --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cceac64..f8dc63d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -56,11 +56,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: google-github-actions/release-please-action@v3 + id: release with: release-type: simple package-name: lazy.nvim + - uses: actions/checkout@v2 - name: tag stable versions - if: ${{ steps.release.outputs.releases_created }} + if: ${{ steps.release.outputs.release_created }} run: | git config user.name github-actions[bot] git config user.email github-actions[bot]@users.noreply.github.com From 1682edc505533245b922a9d2b4fc5f7434c5989f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 23:27:02 +0100 Subject: [PATCH 0504/1610] test: annotations for tests --- tests/manage/task_spec.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index 76c91e5..e172100 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -5,7 +5,8 @@ describe("task", function() local plugin = { name = "test", _ = {} } local done = false - local error = nil + ---@type string? + local error local opts = { on_done = function(task) From 929198bc4feca8089ff265a977854501e3f25c66 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 23:32:02 +0100 Subject: [PATCH 0505/1610] feat(bootstrap): bootstrap with last lazy stable release --- lua/lazy/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 5ea6528..ae245eb 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -73,6 +73,7 @@ function M.bootstrap() "clone", "--filter=blob:none", "--single-branch", + "--branch=stable", -- remove this if you want to bootstrap to HEAD "https://github.com/folke/lazy.nvim.git", lazypath, }) From 5a78451c309b245aa5d02c11fa2651a95fe2f9e1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 29 Dec 2022 23:33:51 +0100 Subject: [PATCH 0506/1610] chore(main): release 7.5.0 (#240) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d1d6d6..7b46e8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [7.5.0](https://github.com/folke/lazy.nvim/compare/v7.4.2...v7.5.0) (2022-12-29) + + +### Features + +* **bootstrap:** bootstrap with last lazy stable release ([929198b](https://github.com/folke/lazy.nvim/commit/929198bc4feca8089ff265a977854501e3f25c66)) + ## [7.4.2](https://github.com/folke/lazy.nvim/compare/v7.4.1...v7.4.2) (2022-12-29) From c30c89bc09737b089635d95dcf2a24955ff06950 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 29 Dec 2022 23:36:26 +0100 Subject: [PATCH 0507/1610] docs: bootstrap code will now bootstrap with latest stable lazy release. Fixes #236 --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1932126..f1afd45 100644 --- a/README.md +++ b/README.md @@ -44,11 +44,12 @@ if not vim.loop.fs_stat(lazypath) then "clone", "--filter=blob:none", "--single-branch", + "--branch=stable", -- remove this if you want to bootstrap to HEAD "https://github.com/folke/lazy.nvim.git", lazypath, }) end -vim.opt.runtimepath:prepend(lazypath) +vim.opt.rtp:prepend(lazypath) ``` <!-- bootstrap:end --> From 0063e439a3230f3821f46496395a22134e63cbc1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 29 Dec 2022 22:37:17 +0000 Subject: [PATCH 0508/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 59b7ebf..0fd46b4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -73,11 +73,12 @@ You can add the following Lua code to your `init.lua` to bootstrap "clone", "--filter=blob:none", "--single-branch", + "--branch=stable", -- remove this if you want to bootstrap to HEAD "https://github.com/folke/lazy.nvim.git", lazypath, }) end - vim.opt.runtimepath:prepend(lazypath) + vim.opt.rtp:prepend(lazypath) < From 291dd6a74b8471f6785e5366ce50c85c3b08f165 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 01:01:13 +0100 Subject: [PATCH 0509/1610] docs: updated bootstrap code to exclude single-branch --- README.md | 1 - lua/lazy/init.lua | 1 - 2 files changed, 2 deletions(-) diff --git a/README.md b/README.md index f1afd45..1425166 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,6 @@ if not vim.loop.fs_stat(lazypath) then "git", "clone", "--filter=blob:none", - "--single-branch", "--branch=stable", -- remove this if you want to bootstrap to HEAD "https://github.com/folke/lazy.nvim.git", lazypath, diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index ae245eb..ce21dfc 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -72,7 +72,6 @@ function M.bootstrap() "git", "clone", "--filter=blob:none", - "--single-branch", "--branch=stable", -- remove this if you want to bootstrap to HEAD "https://github.com/folke/lazy.nvim.git", lazypath, From 60ccfe3e277d976c44adfeadbebf6e5d4cc200c1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 00:02:25 +0000 Subject: [PATCH 0510/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0fd46b4..04a5d2c 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 29 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 30 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -72,7 +72,6 @@ You can add the following Lua code to your `init.lua` to bootstrap "git", "clone", "--filter=blob:none", - "--single-branch", "--branch=stable", -- remove this if you want to bootstrap to HEAD "https://github.com/folke/lazy.nvim.git", lazypath, From 4b29f7e3d50e5cf07f44b3558a96c4c943de9c84 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 08:39:18 +0100 Subject: [PATCH 0511/1610] ci: added support for code block lang --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f8dc63d..0012797 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,8 +38,7 @@ jobs: vimdoc: lazy.nvim version: "Neovim >= 0.8.0" demojify: true - - name: Code Blocks - run: sed -i 's/^>$/>lua/' doc/lazy.nvim.txt + treesitter: true - name: Push changes uses: stefanzweifel/git-auto-commit-action@v4 with: From 1283c2b28826c37cb12e5e28d0988f9b8848293e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 09:08:21 +0100 Subject: [PATCH 0512/1610] feat(restore): you can now restore a plugin to a certain commit. Fixes #234 --- README.md | 30 +++++++++++++++--------------- lua/lazy/view/config.lua | 4 ++-- lua/lazy/view/init.lua | 21 ++++++++++++++++++++- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 1425166..b23ad08 100644 --- a/README.md +++ b/README.md @@ -483,21 +483,21 @@ Any operation can be started from the UI, with a sub command or an API function: <!-- commands:start --> -| Command | Lua | Description | -| ------------------------- | -------------------------------- | --------------------------------------------------------------------------------------------- | -| `: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 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` | -| `:Lazy log [plugins]` | `require("lazy").log(opts?)` | Show recent updates | -| `:Lazy profile` | `require("lazy").profile()` | Show detailed profiling | -| `:Lazy restore [plugins]` | `require("lazy").restore(opts?)` | Updates all plugins to the state in the lockfile | -| `: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 | +| Command | Lua | Description | +| ------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| `: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 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` | +| `:Lazy log [plugins]` | `require("lazy").log(opts?)` | Show recent updates | +| `:Lazy profile` | `require("lazy").profile()` | Show detailed profiling | +| `: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 | <!-- commands:end --> diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index 84bd294..1d0243a 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -96,8 +96,8 @@ M.commands = { }, restore = { button = true, - desc = "Updates all plugins to the state in the lockfile", - desc_plugin = "Restore a plugin to the state in the lockfile", + desc = "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", + desc_plugin = "Restore a plugin to the state in the lockfile or to a given commit under the cursor", id = 8, key = "R", key_plugin = "r", diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 46a0235..e3007ec 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -164,6 +164,25 @@ function M:setup_patterns() self:diff({ commit = hash }) end, }, self.diff) + self:on_pattern(ViewConfig.commands.restore.key_plugin, { + [commit_pattern] = function(hash) + self:restore({ commit = hash }) + end, + }, self.restore) +end + +---@param opts? {commit:string} +function M:restore(opts) + opts = opts or {} + local Lockfile = require("lazy.manage.lock") + local Commands = require("lazy.view.commands") + local plugin = self.render:get_plugin() + if plugin then + if opts.commit then + Lockfile.get(plugin).commit = opts.commit + end + Commands.cmd("restore", { plugins = { plugin } }) + end end function M:hover() @@ -246,7 +265,7 @@ function M:setup_modes() Commands.cmd(name) end, m.desc) end - if m.key_plugin then + if m.key_plugin and name ~= "restore" then self:on_key(m.key_plugin, function() local plugin = self.render:get_plugin() if plugin then From 81ee02b8f69be2eabd670b8bcc423dba590821de Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 09:17:46 +0100 Subject: [PATCH 0513/1610] feat(startup): missing plugins will now install the versions in the lockfile if available. Fixes #138 --- lua/lazy/core/loader.lua | 2 +- lua/lazy/manage/init.lua | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index f08a70c..70fc5a0 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -40,7 +40,7 @@ function M.setup() break end end - require("lazy.manage").install({ wait = true }) + require("lazy.manage").install({ wait = true, lockfile = true }) break end end diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index df30970..9b8c8ac 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -11,6 +11,7 @@ local M = {} ---@field mode? string ---@field plugins? (LazyPlugin|string)[] ---@field concurrency? number +---@field lockfile? boolean ---@param ropts RunnerOpts ---@param opts? ManagerOpts @@ -74,7 +75,7 @@ function M.install(opts) return M.run({ pipeline = { "git.clone", - "git.checkout", + { "git.checkout", lockfile = opts.lockfile }, "plugin.docs", "wait", "plugin.build", @@ -88,7 +89,7 @@ function M.install(opts) end) end ----@param opts? ManagerOpts|{lockfile?:boolean} +---@param opts? ManagerOpts function M.update(opts) opts = M.opts(opts, { mode = "update" }) return M.run({ From 8baedf2cd2fabd6f983b396e238cbbc6e1d5bddd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 08:18:51 +0000 Subject: [PATCH 0514/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 04a5d2c..bd0d60d 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -523,26 +523,26 @@ 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 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 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 │ -│:Lazy log [plugins] │require("lazy").log(opts?) │Show recent updates │ -│:Lazy profile │require("lazy").profile() │Show detailed profiling │ -│:Lazy restore [plugins] │require("lazy").restore(opts?) │Updates all plugins to the state in the lockfile │ -│: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 │ +│ Command │ Lua │ Description │ +│: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 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 │ +│:Lazy log [plugins] │require("lazy").log(opts?) │Show recent updates │ +│:Lazy profile │require("lazy").profile() │Show detailed profiling │ +│: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: ->lua +>shell $ nvim --headless "+Lazy! sync" +qa < From d205cd45d0e88083e6abddc98d4fd99a455606a0 Mon Sep 17 00:00:00 2001 From: Bojan Stipic <bojanstipic@gmail.com> Date: Fri, 30 Dec 2022 10:43:37 +0100 Subject: [PATCH 0515/1610] docs: Add lazy Unicode symbol (#246) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b23ad08..cd7309a 100644 --- a/README.md +++ b/README.md @@ -460,6 +460,7 @@ return { source = "📄", start = "🚀", task = "📌", + lazy = "💤 ", }, }, } From 2a617a7024d2ed99ff9b51e36600b9c56d928bfc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 10:23:12 +0100 Subject: [PATCH 0516/1610] feat(api): allow passing options to float so it can be used outside of lazy --- lua/lazy/util.lua | 4 ++-- lua/lazy/view/float.lua | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index a50ec7e..fa74b3c 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -84,10 +84,10 @@ function M.throttle(ms, fn) end ---@param cmd string[] ----@param opts? {cwd:string, filetype:string, terminal?:boolean, close_on_exit?:boolean, enter?:boolean} +---@param opts? {cwd:string, filetype:string, terminal?:boolean, close_on_exit?:boolean, enter?:boolean, float?:LazyViewOptions} function M.open_cmd(cmd, opts) opts = opts or {} - local float = M.float() + local float = M.float(opts.float) if opts.filetype then vim.bo[float.buf].filetype = opts.filetype diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 0675fd0..5539f35 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -6,6 +6,7 @@ local ViewConfig = require("lazy.view.config") ---@field file? string ---@field margin? {top?:number, right?:number, bottom?:number, left?:number} ---@field win_opts LazyViewWinOpts +---@field size? {width:number, height:number} local defaults = { win_opts = {}, } @@ -32,6 +33,7 @@ end ---@param opts? LazyViewOptions function M:init(opts) self.opts = vim.tbl_deep_extend("force", defaults, opts or {}) + self.opts.size = vim.tbl_extend("keep", self.opts.size or {}, Config.options.ui.size) self:mount() self:on_key(ViewConfig.keys.close, self.close) self:on({ "BufDelete", "BufLeave", "BufHidden" }, self.close, { once = true }) @@ -42,8 +44,8 @@ function M:layout() local function size(max, value) return value > 1 and math.min(value, max) or math.floor(max * value) end - self.opts.win_opts.width = size(vim.o.columns, Config.options.ui.size.width) - self.opts.win_opts.height = size(vim.o.lines, Config.options.ui.size.height) + self.opts.win_opts.width = size(vim.o.columns, self.opts.size.width) + self.opts.win_opts.height = size(vim.o.lines, self.opts.size.height) self.opts.win_opts.row = math.floor((vim.o.lines - self.opts.win_opts.height) / 2) self.opts.win_opts.col = math.floor((vim.o.columns - self.opts.win_opts.width) / 2) From 716b6cc2b58e71c504c5bb550f7088b9a59eca43 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 09:44:26 +0000 Subject: [PATCH 0517/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index bd0d60d..0eced9e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -502,6 +502,7 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s source = "", start = "", task = "", + lazy = " ", }, }, } From 86dff1b59a978c9db8768e88f07c0532f65f3c8d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 11:29:17 +0100 Subject: [PATCH 0518/1610] feat(commands): added health command to run `:checkhealth lazy` --- README.md | 1 + lua/lazy/view/commands.lua | 3 +++ lua/lazy/view/config.lua | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/README.md b/README.md index cd7309a..8137755 100644 --- a/README.md +++ b/README.md @@ -490,6 +490,7 @@ Any operation can be started from the UI, with a sub command or an API function: | `: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 | diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 7a026c4..d5515b8 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -24,6 +24,9 @@ M.commands = { Manage.clear() View.show() end, + health = function() + vim.cmd.checkhealth("lazy") + end, home = function() View.show("home") end, diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index 1d0243a..8581eb7 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -134,6 +134,10 @@ M.commands = { plugins = true, plugins_required = true, }, + health = { + desc = "Run `:checkhealth lazy`", + id = 14, + }, } return M From d50eab2164284dc739b45814cebc1f683467b7ab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 10:30:22 +0000 Subject: [PATCH 0519/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0eced9e..29d2cb0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -529,6 +529,7 @@ function: │: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 │ From def5cc58166e914bce0a20ed60e0c8be99e76eb4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 11:35:09 +0100 Subject: [PATCH 0520/1610] fix(cache): clear cached entry on errors --- lua/lazy/core/cache.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index b2c7c8e..0589454 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -189,9 +189,11 @@ function M.load(modkey, modpath) end chunk, err = M._loadfile(entry.modpath) + M.dirty = true if chunk then - M.dirty = true entry.chunk = string.dump(chunk) + else + M.cache[modkey] = nil end return chunk, err end From 32511a121407aab44a839c68592860856c691f9f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 11:52:09 +0100 Subject: [PATCH 0521/1610] feat(health): added spec parsing errors to `:checkhealth` --- lua/lazy/core/plugin.lua | 23 ++++++++++++++++++----- lua/lazy/core/util.lua | 15 +++++++++++---- lua/lazy/health.lua | 13 ++++++++++++- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index d81070f..e6e1fec 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -9,12 +9,17 @@ local M = {} ---@class LazySpecLoader ---@field plugins table<string, LazyPlugin> ---@field errors string[] +---@field opts LazySpecOptions local Spec = {} M.Spec = Spec +---@alias LazySpecOptions {show_errors: boolean} + ---@param spec? LazySpec -function Spec.new(spec) +---@param opts? LazySpecOptions +function Spec.new(spec, opts) local self = setmetatable({}, { __index = Spec }) + self.opts = opts or {} self.plugins = {} self.errors = {} if spec then @@ -78,7 +83,9 @@ end function Spec:error(error) self.errors[#self.errors + 1] = error - Util.error(error) + if self.opts.show_errors ~= false then + Util.error(error) + end end ---@param spec LazySpec @@ -185,8 +192,9 @@ function M.update_state() end end -function M.spec() - local spec = Spec.new() +---@param opts? LazySpecOptions +function M.spec(opts) + local spec = Spec.new(nil, opts) if type(Config.spec) == "string" then -- spec is a module @@ -196,7 +204,12 @@ function M.spec() package.loaded[modname] = nil Util.try(function() spec:normalize(Cache.require(modname)) - end, "Failed to load **" .. modname .. "**") + end, { + msg = "Failed to load `" .. modname .. "`", + on_error = function(msg) + spec:error(msg) + end, + }) end Util.lsmod(Config.spec --[[@as string]], _load) else diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 973d005..c207e5d 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -48,7 +48,10 @@ function M.norm(path) return path:sub(-1) == "/" and path:sub(1, -2) or path end -function M.try(fn, msg) +---@param opts? string|{msg:string, on_error:fun(msg)} +function M.try(fn, opts) + opts = type(opts) == "string" and { msg = opts } or opts or {} + local msg = opts.msg -- error handler local error_handler = function(err) local Config = require("lazy.core.config") @@ -77,9 +80,13 @@ function M.try(fn, msg) if #trace > 0 then msg = msg .. "\n\n# stacktrace:\n" .. table.concat(trace, "\n") end - vim.schedule(function() - M.error(msg) - end) + if opts.on_error then + opts.on_error(msg) + else + vim.schedule(function() + M.error(msg) + end) + end return err end diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 894d57e..57c24f6 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -1,5 +1,6 @@ local Util = require("lazy.util") local Config = require("lazy.core.config") +local Plugin = require("lazy.core.plugin") local M = {} @@ -48,7 +49,8 @@ function M.check() "cond", "_", } - for _, plugin in pairs(Config.plugins) do + local spec = Plugin.spec({ show_errors = false }) + for _, plugin in pairs(spec.plugins) do for key in pairs(plugin) do if not vim.tbl_contains(valid, key) then if key ~= "module" or type(plugin.module) ~= "boolean" then @@ -57,6 +59,15 @@ function M.check() end end end + if #spec.errors > 0 then + vim.health.report_error("Errors were reported when loading your specs:") + for _, error in ipairs(spec.errors) do + local lines = vim.split(error, "\n") + for _, line in ipairs(lines) do + vim.health.report_error(line) + end + end + end end return M From a2f5c515deda2e5af6b17e00990e47485daed34d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 11:57:31 +0100 Subject: [PATCH 0522/1610] chore(main): release 7.6.0 (#244) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b46e8a..b048195 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [7.6.0](https://github.com/folke/lazy.nvim/compare/v7.5.0...v7.6.0) (2022-12-30) + + +### Features + +* **api:** allow passing options to float so it can be used outside of lazy ([2a617a7](https://github.com/folke/lazy.nvim/commit/2a617a7024d2ed99ff9b51e36600b9c56d928bfc)) +* **commands:** added health command to run `:checkhealth lazy` ([86dff1b](https://github.com/folke/lazy.nvim/commit/86dff1b59a978c9db8768e88f07c0532f65f3c8d)) +* **health:** added spec parsing errors to `:checkhealth` ([32511a1](https://github.com/folke/lazy.nvim/commit/32511a121407aab44a839c68592860856c691f9f)) +* **restore:** you can now restore a plugin to a certain commit. Fixes [#234](https://github.com/folke/lazy.nvim/issues/234) ([1283c2b](https://github.com/folke/lazy.nvim/commit/1283c2b28826c37cb12e5e28d0988f9b8848293e)) +* **startup:** missing plugins will now install the versions in the lockfile if available. Fixes [#138](https://github.com/folke/lazy.nvim/issues/138) ([81ee02b](https://github.com/folke/lazy.nvim/commit/81ee02b8f69be2eabd670b8bcc423dba590821de)) + + +### Bug Fixes + +* **cache:** clear cached entry on errors ([def5cc5](https://github.com/folke/lazy.nvim/commit/def5cc58166e914bce0a20ed60e0c8be99e76eb4)) + ## [7.5.0](https://github.com/folke/lazy.nvim/compare/v7.4.2...v7.5.0) (2022-12-29) From de82a991971d20cfaaeb0d86802283e2ac4a4574 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 14:46:18 +0100 Subject: [PATCH 0523/1610] fix(bootstrap): fixed bootstrap script --- README.md | 12 ++++-------- lua/lazy/init.lua | 12 ++++-------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 8137755..7cce47d 100644 --- a/README.md +++ b/README.md @@ -39,14 +39,10 @@ You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim** ```lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "--branch=stable", -- remove this if you want to bootstrap to HEAD - "https://github.com/folke/lazy.nvim.git", - lazypath, - }) + if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) + vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release + end end vim.opt.rtp:prepend(lazypath) ``` diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index ce21dfc..62783cc 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -68,14 +68,10 @@ end function M.bootstrap() local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "--branch=stable", -- remove this if you want to bootstrap to HEAD - "https://github.com/folke/lazy.nvim.git", - lazypath, - }) + if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) + vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release + end end vim.opt.rtp:prepend(lazypath) end From 8d452e37bbf16cfd8841cca4286c2b0f7c8db669 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 13:47:17 +0000 Subject: [PATCH 0524/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 29d2cb0..44fcd09 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -68,14 +68,10 @@ You can add the following Lua code to your `init.lua` to bootstrap >lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "--branch=stable", -- remove this if you want to bootstrap to HEAD - "https://github.com/folke/lazy.nvim.git", - lazypath, - }) + if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) + vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release + end end vim.opt.rtp:prepend(lazypath) < From 51fb95e4a89743670eb2ba710bcdb0e91834c3d4 Mon Sep 17 00:00:00 2001 From: WilliamHsieh <wh31110@gmail.com> Date: Sat, 31 Dec 2022 01:55:36 +0800 Subject: [PATCH 0525/1610] fix: duplicate state check in bootstrap (#255) --- README.md | 6 ++---- lua/lazy/init.lua | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7cce47d..f25fcfe 100644 --- a/README.md +++ b/README.md @@ -39,10 +39,8 @@ You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim** ```lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then - if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) - vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release - end + vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) + vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release end vim.opt.rtp:prepend(lazypath) ``` diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 62783cc..cc6d2b3 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -68,10 +68,8 @@ end function M.bootstrap() local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then - if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) - vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release - end + vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) + vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release end vim.opt.rtp:prepend(lazypath) end From 887c6029577152d8a7b0b343ba8d318aee2fe1f0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 17:56:17 +0000 Subject: [PATCH 0526/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 44fcd09..0ef0893 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -68,10 +68,8 @@ You can add the following Lua code to your `init.lua` to bootstrap >lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then - if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) - vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release - end + vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) + vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release end vim.opt.rtp:prepend(lazypath) < From 730bb84364afee156ad1dde03fc30de3d96af63a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 20:14:46 +0100 Subject: [PATCH 0527/1610] perf(loader): re-use topmod cache to find `setup()` module --- lua/lazy/core/cache.lua | 12 +++++++++--- lua/lazy/core/loader.lua | 13 ++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 0589454..4bb80b9 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -39,8 +39,8 @@ M.me = debug.getinfo(1, "S").source:sub(2) M.me = vim.fn.fnamemodify(M.me, ":p:h:h:h:h"):gsub("\\", "/") ---@type table<string, table<string,string>> M.topmods = { lazy = { [M.me] = M.me } } ----@type table<string, true> -M.indexed = { [M.me] = true } +---@type table<string, string[]> +M.indexed = { [M.me] = { "lazy" } } M.indexed_unloaded = false M.indexed_rtp = 0 -- selene:allow(global_usage) @@ -219,7 +219,7 @@ function M._index(path) if not Util then return false end - M.indexed[path] = true + M.indexed[path] = {} Util.ls(path .. "/lua", function(_, name, t) local topname if name:sub(-4) == ".lua" then @@ -230,6 +230,7 @@ function M._index(path) if topname then M.topmods[topname] = M.topmods[topname] or {} M.topmods[topname][path] = path + table.insert(M.indexed[path], topname) end end) return true @@ -237,6 +238,11 @@ function M._index(path) return false end +function M.get_topmods(path) + M._index(path) + return M.indexed[path] or {} +end + ---@param modname string ---@return string? function M.find(modname) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 70fc5a0..899df1b 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -1,6 +1,7 @@ local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Handler = require("lazy.core.handler") +local Cache = require("lazy.core.cache") local M = {} @@ -204,19 +205,17 @@ function M.config(plugin) end else local normname = Util.normname(plugin.name) - ---@type table<string, string> + ---@type string[] local mods = {} - Util.ls(plugin.dir .. "/lua", function(_, modname) - modname = modname:gsub("%.lua$", "") - mods[modname] = modname + for _, modname in ipairs(Cache.get_topmods(plugin.dir)) do + mods[#mods + 1] = modname local modnorm = Util.normname(modname) -- if we found an exact match, then use that if modnorm == normname then mods = { modname } - return false + break end - end) - mods = vim.tbl_values(mods) + end if #mods == 1 then fn = function() local opts = plugin.config From 679d85c9ffb6bd49d27267b3a282eeb73e063cde Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 20:41:23 +0100 Subject: [PATCH 0528/1610] feat(ui): make brower configurable. Fixes #248 --- README.md | 3 +++ lua/lazy/core/config.lua | 3 +++ lua/lazy/util.lua | 12 +++++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f25fcfe..deed95a 100644 --- a/README.md +++ b/README.md @@ -345,6 +345,9 @@ return { "‒", }, }, + -- 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 = 20, -- how frequently should the ui process render events custom_keys = { -- you can define custom key maps here. diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 281086f..87e9c98 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -59,6 +59,9 @@ M.defaults = { "‒", }, }, + -- 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 = 20, -- how frequently should the ui process render events custom_keys = { -- you can define custom key maps here. diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index fa74b3c..938ede4 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -18,14 +18,20 @@ function M.open(uri) if M.file_exists(uri) then return M.float({ win_opts = { style = "" }, file = uri }) end + local Config = require("lazy.core.config") local cmd - if vim.fn.has("win32") == 1 then + if Config.options.ui.browser then + cmd = { Config.options.ui.browser, uri } + elseif vim.fn.has("win32") == 1 then cmd = { "explorer", uri } - -- cmd = { 'cmd.exe', '/c', 'start', '""', uri } elseif vim.fn.has("macunix") == 1 then cmd = { "open", uri } else - cmd = { "xdg-open", uri } + if vim.fn.executable("xdg-open") then + cmd = { "xdg-open", uri } + else + cmd = { "open", uri } + end end local ret = vim.fn.jobstart(cmd, { detach = true }) From a59cd089dc01724b8cab3831b26de188a7f08e6a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 19:42:08 +0000 Subject: [PATCH 0529/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0ef0893..44d17e4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -389,6 +389,9 @@ CONFIGURATION *lazy.nvim-configuration* "‒", }, }, + -- 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 = 20, -- how frequently should the ui process render events custom_keys = { -- you can define custom key maps here. From a834b30c70581e505d8dd62d9c6f9de6a6eba868 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 20:51:13 +0100 Subject: [PATCH 0530/1610] fix(keys): forward `count` to keymaps. Fixes #252 --- lua/lazy/core/handler/keys.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 9c156d7..9597aa7 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -25,6 +25,9 @@ function M.retrigger(keys) pending = pending .. c end local feed = vim.api.nvim_replace_termcodes(keys, true, false, true) .. pending + if vim.v.count ~= 0 then + feed = vim.v.count .. feed + end vim.api.nvim_feedkeys(feed, "m", false) end From 45d669f61c8fc239712e794e1e2c5af1f737ee0a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 21:23:12 +0100 Subject: [PATCH 0531/1610] fix(ui): only show plugins to clean under clean --- lua/lazy/view/sections.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index c5c168c..213c446 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -77,7 +77,7 @@ return { }, { filter = function(plugin) - return plugin._.installed and not plugin.url + return plugin._.kind == "clean" and plugin._.installed end, title = "Clean", }, From fb46cb586242392081f908b23470e5096a8406c3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Dec 2022 23:58:01 +0100 Subject: [PATCH 0532/1610] build: utility method to create plugin list in markdown --- lua/lazy/docs.lua | 13 +++++++++++-- lua/lazy/util.lua | 4 +++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 08a4b71..d274a57 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -36,7 +36,7 @@ function M.save(contents) if not readme:find(pattern) then error("tag " .. tag .. " not found") end - if tag == "commands" or tag == "colors" then + if tag == "commands" or tag == "colors" or tag == "plugins" then readme = readme:gsub(pattern, "%1\n\n" .. content .. "\n\n%2") else readme = readme:gsub(pattern, "%1\n\n```lua\n" .. content .. "\n```\n\n%2") @@ -135,6 +135,15 @@ function M.update() vim.cmd.checktime() end -M.update() +function M.plugins() + local Config = require("lazy.core.config") + local lines = { "## Plugins", "" } + Util.foreach(Config.plugins, function(name, plugin) + if plugin.url then + lines[#lines + 1] = "- [" .. name .. "](" .. plugin.url:gsub("%.git$", "") .. ")" + end + end) + M.save({ plugins = table.concat(lines, "\n") }) +end return M diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 938ede4..d24794f 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -209,7 +209,9 @@ end function M.foreach(t, fn) ---@type string[] local keys = vim.tbl_keys(t) - pcall(table.sort, keys) + pcall(table.sort, keys, function(a, b) + return a:lower() < b:lower() + end) for _, key in ipairs(keys) do fn(key, t[key]) end From 2c632e849fd7944d463df5baa237d3784379deeb Mon Sep 17 00:00:00 2001 From: Alexandre Desjardins <alexandre.bd@tutanota.com> Date: Fri, 30 Dec 2022 18:13:54 -0500 Subject: [PATCH 0533/1610] docs: add how to accomplish packer's rtp (#259) --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index deed95a..8dd429b 100644 --- a/README.md +++ b/README.md @@ -674,6 +674,12 @@ For a real-life example, you can check my personal dots: - `config` don't support string type, use `fun(LazyPlugin)` instead. - `module` is auto-loaded. No need to specify - `keys` spec is [different](#%EF%B8%8F-lazy-key-mappings) +- `rtp` can be accomplished with: + ```lua + config = function(plugin) + vim.opt.rtp:append(plugin.dir .. "/rtpPath") + 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 From 1de5c3d0592f55aa26584787b3642c4e4732c29d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 23:14:42 +0000 Subject: [PATCH 0534/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 44d17e4..0333955 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -738,6 +738,8 @@ PACKER.NVIM <HTTPS://GITHUB.COM/WBTHOMASON/PACKER.NVIM> ~ - `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 .. "/rtpPath") end` With packer `wants`, `requires` and `after` can be used to manage dependencies. From d1ed91d8c7f6148e56794a7d8238a5e346f9ec06 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 31 Dec 2022 00:32:19 +0100 Subject: [PATCH 0535/1610] docs: fixed code block --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8dd429b..7621ea2 100644 --- a/README.md +++ b/README.md @@ -675,11 +675,12 @@ For a real-life example, you can check my personal dots: - `module` is auto-loaded. No need to specify - `keys` spec is [different](#%EF%B8%8F-lazy-key-mappings) - `rtp` can be accomplished with: - ```lua - config = function(plugin) - vim.opt.rtp:append(plugin.dir .. "/rtpPath") - end - ``` + +```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 From d02a10d832f84997d1e750db4a4841698b5e071c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Dec 2022 23:33:10 +0000 Subject: [PATCH 0536/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0333955..67781b6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -739,7 +739,13 @@ PACKER.NVIM <HTTPS://GITHUB.COM/WBTHOMASON/PACKER.NVIM> ~ - `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 .. "/rtpPath") end` + + +>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. From 5575d2b2a9eb7e104d85f4f68754ef3734c7a4a1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 31 Dec 2022 08:41:34 +0100 Subject: [PATCH 0537/1610] feat(ui): show when plugin would be loaded for unloaded plugins. Fixes #261 --- lua/lazy/view/render.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 2cc97e0..0c62436 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -374,6 +374,22 @@ function M:plugin(plugin) local plugin_start = self:row() if plugin._.loaded then self:reason(plugin._.loaded) + else + self:append(" ") + local reason = {} + for handler in pairs(Handler.types) do + if plugin[handler] then + for _, value in ipairs(plugin[handler]) do + reason[handler] = value + end + end + end + for _, other in pairs(Config.plugins) do + if vim.tbl_contains(other.dependencies or {}, plugin.name) then + reason.plugin = other.name + end + end + self:reason(reason) end self:diagnostics(plugin) self:nl() From f656706de01fcc20e9bf081569e63c0bed2b678a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 31 Dec 2022 07:51:48 +0000 Subject: [PATCH 0538/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 67781b6..c6c3d3f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 30 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 31 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 865ff414c70d20648000d1b9d754dba64dbf4a62 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 31 Dec 2022 09:32:35 +0100 Subject: [PATCH 0539/1610] feat(git): added support for packed-refs. Fixes #260 --- lua/lazy/manage/git.lua | 52 +++++++++++++++++++++++++++++------- lua/lazy/manage/task/git.lua | 1 - 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 22f8cde..96fe208 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -11,13 +11,13 @@ local M = {} ---@param details? boolean Fetching details is slow! Don't loop over a plugin to fetch all details! ---@return GitInfo? function M.info(repo, details) - local line = Util.head(repo .. "/.git/HEAD") + local line = M.head(repo) if line then ---@type string, string - local ref, branch = line:match("ref: (refs/heads/(.*))") + local ref, branch = line:match("ref: refs/(heads/(.*))") local ret = ref and { branch = branch, - commit = Util.head(repo .. "/.git/" .. ref), + commit = M.ref(repo, ref), } or { commit = line } if details then @@ -33,6 +33,10 @@ function M.info(repo, details) end end +function M.head(repo) + return Util.head(repo .. "/.git/HEAD") +end + ---@class TaggedSemver: Semver ---@field tag string @@ -41,17 +45,32 @@ function M.get_versions(repo, spec) local range = Semver.range(spec or "*") ---@type TaggedSemver[] local versions = {} - Util.ls(repo .. "/.git/refs/tags", function(_, name) - local v = Semver.version(name) + for _, tag in ipairs(M.get_tags(repo)) do + local v = Semver.version(tag) ---@cast v TaggedSemver if v and range:matches(v) then - v.tag = name + v.tag = tag table.insert(versions, v) end - end) + end return versions end +function M.get_tags(repo) + ---@type string[] + local ret = {} + Util.ls(repo .. "/.git/refs/tags", function(_, name) + ret[#ret + 1] = name + end) + for name in pairs(M.packed_refs(repo)) do + local tag = name:match("^tags/(.*)") + if tag then + ret[#ret + 1] = tag + end + end + return ret +end + ---@param plugin LazyPlugin ---@return string? function M.get_branch(plugin) @@ -69,7 +88,7 @@ function M.get_branch(plugin) end -- fallback to local HEAD - main = assert(Util.head(plugin.dir .. "/.git/HEAD")) + main = assert(M.head(plugin.dir)) return main and main:match("ref: refs/heads/(.*)") end end @@ -133,7 +152,22 @@ function M.ref(repo, ...) end -- otherwise just get the ref - return Util.head(repo .. "/.git/refs/" .. ref) + return Util.head(repo .. "/.git/refs/" .. ref) or M.packed_refs(repo)[ref] +end + +function M.packed_refs(repo) + local ok, refs = pcall(Util.read_file, repo .. "/.git/packed-refs") + ---@type table<string,string> + local ret = {} + if ok then + for _, line in ipairs(vim.split(refs, "\n")) do + local ref, name = line:match("^(.*) refs/(.*)$") + if ref then + ret[name] = ref + end + end + end + return ret end -- this is slow, so don't use on a loop over all plugins! diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 2107d24..ee6ceb6 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -58,7 +58,6 @@ M.clone = { self.plugin.url, "--filter=blob:none", "--recurse-submodules", - "--single-branch", "--progress", } From cb29427926121922eb6cc669d22897f7bc9687f1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 31 Dec 2022 09:36:08 +0100 Subject: [PATCH 0540/1610] fix(git): always get both tag and version --- lua/lazy/manage/git.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 96fe208..54f14b4 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -24,8 +24,7 @@ function M.info(repo, details) for tag, tag_ref in pairs(M.get_tag_refs(repo)) do if tag_ref == ret.commit then ret.tag = tag - ret.version = Semver.version(tag) - break + ret.version = ret.version or Semver.version(tag) end end end From cba99de3eb73437754984fcad02b3a0e05917e56 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 31 Dec 2022 09:39:47 +0100 Subject: [PATCH 0541/1610] chore(main): release 7.7.0 (#251) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b048195..21b76b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## [7.7.0](https://github.com/folke/lazy.nvim/compare/v7.6.0...v7.7.0) (2022-12-31) + + +### Features + +* **git:** added support for packed-refs. Fixes [#260](https://github.com/folke/lazy.nvim/issues/260) ([865ff41](https://github.com/folke/lazy.nvim/commit/865ff414c70d20648000d1b9d754dba64dbf4a62)) +* **ui:** make brower configurable. Fixes [#248](https://github.com/folke/lazy.nvim/issues/248) ([679d85c](https://github.com/folke/lazy.nvim/commit/679d85c9ffb6bd49d27267b3a282eeb73e063cde)) +* **ui:** show when plugin would be loaded for unloaded plugins. Fixes [#261](https://github.com/folke/lazy.nvim/issues/261) ([5575d2b](https://github.com/folke/lazy.nvim/commit/5575d2b2a9eb7e104d85f4f68754ef3734c7a4a1)) + + +### Bug Fixes + +* **bootstrap:** fixed bootstrap script ([de82a99](https://github.com/folke/lazy.nvim/commit/de82a991971d20cfaaeb0d86802283e2ac4a4574)) +* duplicate state check in bootstrap ([#255](https://github.com/folke/lazy.nvim/issues/255)) ([51fb95e](https://github.com/folke/lazy.nvim/commit/51fb95e4a89743670eb2ba710bcdb0e91834c3d4)) +* **git:** always get both tag and version ([cb29427](https://github.com/folke/lazy.nvim/commit/cb29427926121922eb6cc669d22897f7bc9687f1)) +* **keys:** forward `count` to keymaps. Fixes [#252](https://github.com/folke/lazy.nvim/issues/252) ([a834b30](https://github.com/folke/lazy.nvim/commit/a834b30c70581e505d8dd62d9c6f9de6a6eba868)) +* **ui:** only show plugins to clean under clean ([45d669f](https://github.com/folke/lazy.nvim/commit/45d669f61c8fc239712e794e1e2c5af1f737ee0a)) + + +### Performance Improvements + +* **loader:** re-use topmod cache to find `setup()` module ([730bb84](https://github.com/folke/lazy.nvim/commit/730bb84364afee156ad1dde03fc30de3d96af63a)) + ## [7.6.0](https://github.com/folke/lazy.nvim/compare/v7.5.0...v7.6.0) (2022-12-30) From b4edbd09f5a5de2f9260c2e6a54e8bf00d3070d1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 31 Dec 2022 09:44:17 +0100 Subject: [PATCH 0542/1610] docs: updated bootstrap code to stable branch --- README.md | 10 ++++++++-- lua/lazy/init.lua | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7621ea2..ea93722 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,14 @@ You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim** ```lua local lazypath = vim.fn.stdpath("data") .. "/lazy/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 }) - vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) end vim.opt.rtp:prepend(lazypath) ``` diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index cc6d2b3..b08b5b5 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -68,8 +68,14 @@ end function M.bootstrap() local lazypath = vim.fn.stdpath("data") .. "/lazy/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 }) - vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) end vim.opt.rtp:prepend(lazypath) end From 3da6c74ed3b865cfdcc3b389321dbc56ee0524d0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 31 Dec 2022 08:45:05 +0000 Subject: [PATCH 0543/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c6c3d3f..e2e2108 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -68,8 +68,14 @@ You can add the following Lua code to your `init.lua` to bootstrap >lua local lazypath = vim.fn.stdpath("data") .. "/lazy/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 }) - vim.fn.system({ "git", "-C", lazypath, "checkout", "tags/stable" }) -- last stable release + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) end vim.opt.rtp:prepend(lazypath) < From ed0583e82b2797944889aa2c08bb440e6da9f16b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 31 Dec 2022 09:55:50 +0100 Subject: [PATCH 0544/1610] fix(util): remove double forward slashes --- lua/lazy/core/util.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index c207e5d..123f762 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -44,7 +44,7 @@ function M.norm(path) end path = home .. path:sub(2) end - path = path:gsub("\\", "/") + path = path:gsub("\\", "/"):gsub("/+", "/") return path:sub(-1) == "/" and path:sub(1, -2) or path end From d6b5d6e756a596304fd4acbc46f9fa553ea880a2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 31 Dec 2022 10:38:03 +0100 Subject: [PATCH 0545/1610] feat(ui): press `<c-c>` to abort any running tasks. Fixes #258 --- lua/lazy/manage/process.lua | 60 +++++++++++++++++++++++++++++++++++-- lua/lazy/view/config.lua | 1 + lua/lazy/view/init.lua | 5 ++++ lua/lazy/view/render.lua | 7 +++-- 4 files changed, 69 insertions(+), 4 deletions(-) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index d08f7c0..79279a0 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -2,6 +2,44 @@ local Config = require("lazy.core.config") local M = {} +---@type table<vim.loop.Process, true> +M.running = {} + +M.signals = { + "HUP", + "INT", + "QUIT", + "ILL", + "TRAP", + "ABRT", + "BUS", + "FPE", + "KILL", + "USR1", + "SEGV", + "USR2", + "PIPE", + "ALRM", + "TERM", + "CHLD", + "CONT", + "STOP", + "TSTP", + "TTIN", + "TTOU", + "URG", + "XCPU", + "XFSZ", + "VTALRM", + "PROF", + "WINCH", + "IO", + "PWR", + "EMT", + "SYS", + "INFO", +} + ---@diagnostic disable-next-line: no-unknown local uv = vim.loop @@ -14,6 +52,7 @@ local uv = vim.loop ---@field env? string[] ---@param opts? ProcessOpts +---@param cmd string function M.spawn(cmd, opts) opts = opts or {} opts.timeout = opts.timeout or (Config.options.git and Config.options.git.timeout * 1000) @@ -44,9 +83,8 @@ function M.spawn(cmd, opts) if opts.timeout then timeout = uv.new_timer() timeout:start(opts.timeout, 0, function() - if handle and not handle:is_closing() then + if M.kill(handle) then killed = true - uv.process_kill(handle, "sigint") end end) end @@ -57,6 +95,7 @@ function M.spawn(cmd, opts) cwd = opts.cwd, env = env, }, function(exit_code, signal) + M.running[handle] = nil if timeout then timeout:stop() timeout:close() @@ -74,6 +113,8 @@ function M.spawn(cmd, opts) output = output:gsub("[^\r\n]+\r", "") if killed then output = output .. "\n" .. "Process was killed because it reached the timeout" + elseif signal ~= 0 then + output = output .. "\n" .. "Process was killed with SIG" .. M.signals[signal] end vim.schedule(function() @@ -89,6 +130,7 @@ function M.spawn(cmd, opts) end return end + M.running[handle] = true ---@param data? string local function on_output(err, data) @@ -112,6 +154,20 @@ function M.spawn(cmd, opts) return handle end +function M.kill(handle) + if handle and not handle:is_closing() then + M.running[handle] = nil + uv.process_kill(handle, "sigint") + return true + end +end + +function M.abort() + for handle in pairs(M.running) do + M.kill(handle) + end +end + ---@param cmd string[] ---@param opts? {cwd:string, env:table} function M.exec(cmd, opts) diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index 8581eb7..b6f5bc2 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -31,6 +31,7 @@ M.keys = { details = "<cr>", profile_sort = "<C-s>", profile_filter = "<C-f>", + abort = "<C-c>", } ---@type table<string,LazyViewCommand> diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index e3007ec..7a3c595 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -62,6 +62,11 @@ function M.create() self:update() end) + vim.keymap.set("n", ViewConfig.keys.abort, function() + require("lazy.manage.process").abort() + return "<c-c>" + end, { silent = true, buffer = self.buf, expr = true }) + -- plugin details self:on_key(ViewConfig.keys.details, function() local plugin = self.render:get_plugin() diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 0c62436..20c0f16 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -154,7 +154,9 @@ end function M:help() self:append("Help", "LazyH2"):nl():nl() - self:append("You can press "):append("<CR>", "LazySpecial"):append(" on a plugin to show its details."):nl() + self:append("Use "):append("<C-c>", "LazySpecial"):append(" to abort all running tasks."):nl():nl() + + self:append("You can press "):append("<CR>", "LazySpecial"):append(" on a plugin to show its details."):nl():nl() self:append("Most properties can be hovered with ") self:append("<K>", "LazySpecial") @@ -164,7 +166,8 @@ function M:help() :append("<K>", "LazySpecial") :append(" on a plugin anywhere else, a diff will be opened if there are updates") :nl() - self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl() + self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl():nl() + self:append("Use "):append("<d>", "LazySpecial"):append(" on a commit or plugin to open the diff view"):nl() self:nl() From 371117616405c9d319f260b43f114cd4b8bfcc9f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 31 Dec 2022 15:40:45 +0100 Subject: [PATCH 0546/1610] chore(main): release 7.8.0 (#263) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21b76b4..cf11e46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [7.8.0](https://github.com/folke/lazy.nvim/compare/v7.7.0...v7.8.0) (2022-12-31) + + +### Features + +* **ui:** press `<c-c>` to abort any running tasks. Fixes [#258](https://github.com/folke/lazy.nvim/issues/258) ([d6b5d6e](https://github.com/folke/lazy.nvim/commit/d6b5d6e756a596304fd4acbc46f9fa553ea880a2)) + + +### Bug Fixes + +* **util:** remove double forward slashes ([ed0583e](https://github.com/folke/lazy.nvim/commit/ed0583e82b2797944889aa2c08bb440e6da9f16b)) + ## [7.7.0](https://github.com/folke/lazy.nvim/compare/v7.6.0...v7.7.0) (2022-12-31) From a9de5910f22faf9036a8297c8fd4e3d47eb8baa6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 31 Dec 2022 15:55:06 +0100 Subject: [PATCH 0547/1610] fix(fetch): always fetch latest origin tags. Fixes #264 --- lua/lazy/manage/task/git.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index ee6ceb6..20b965b 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -115,6 +115,8 @@ M.fetch = { local args = { "fetch", "--recurse-submodules", + "--tags", -- also fetch remote tags + "--force", -- overwrite existing tags if needed "--progress", } From 34e2c78e0690a93196b5e59bbc9e050dfd6f3986 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 31 Dec 2022 16:01:59 +0100 Subject: [PATCH 0548/1610] feat(ui): show new version that is available instead of general message --- lua/lazy/manage/checker.lua | 6 +++--- lua/lazy/manage/init.lua | 2 +- lua/lazy/manage/task/git.lua | 4 +++- lua/lazy/types.lua | 2 +- lua/lazy/view/render.lua | 15 +++++++++++---- lua/lazy/view/sections.lua | 2 +- 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 2b7a62a..f86e55e 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -19,11 +19,11 @@ function M.fast_check(opts) opts = opts or {} for _, plugin in pairs(Config.plugins) do if not plugin.pin and plugin._.installed then - plugin._.has_updates = nil + plugin._.updates = nil local info = Git.info(plugin.dir) local ok, target = pcall(Git.get_target, plugin) if ok and info and target and info.commit ~= target.commit then - plugin._.has_updates = true + plugin._.updates = { from = info, to = target } end end end @@ -45,7 +45,7 @@ function M.report(notify) local lines = {} M.updated = {} for _, plugin in pairs(Config.plugins) do - if plugin._.has_updates then + if plugin._.updates then table.insert(M.updated, plugin.name) if not vim.tbl_contains(M.reported, plugin.name) then table.insert(lines, "- **" .. plugin.name .. "**") diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 9b8c8ac..83dd18c 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -183,7 +183,7 @@ end ---@param plugins? LazyPlugin[] function M.clear(plugins) for _, plugin in pairs(plugins or Config.plugins) do - plugin._.has_updates = nil + plugin._.updates = nil plugin._.updated = nil plugin._.cloned = nil plugin._.dirty = nil diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 20b965b..376245d 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -35,7 +35,9 @@ M.log = { local info = assert(Git.info(self.plugin.dir)) local target = assert(Git.get_target(self.plugin)) assert(target.commit, self.plugin.name .. " " .. target.branch) - self.plugin._.has_updates = target.commit ~= info.commit + if target.commit ~= info.commit then + self.plugin._.updates = { from = info, to = target } + end table.insert(args, info.commit .. ".." .. target.commit) else vim.list_extend(args, opts.args or Config.options.git.log) diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 053961f..c68cdf9 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -8,7 +8,7 @@ ---@field dirty? boolean ---@field updated? {from:string, to:string} ---@field is_local boolean ----@field has_updates? boolean +---@field updates? {from:GitInfo, to:GitInfo} ---@field cloned? boolean ---@field kind? LazyPluginKind ---@field dep? boolean True if this plugin is only in the spec as a dependency diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 20c0f16..d57e504 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -345,10 +345,17 @@ function M:diagnostics(plugin) message = "updated from " .. plugin._.updated.from:sub(1, 7) .. " to " .. plugin._.updated.to:sub(1, 7), }) end - elseif plugin._.has_updates then - self:diagnostic({ - message = "updates available", - }) + elseif plugin._.updates then + local version = plugin._.updates.to.version + if version then + self:diagnostic({ + message = "version " .. tostring(version) .. " is available", + }) + else + self:diagnostic({ + message = "updates available", + }) + end end for _, task in ipairs(plugin._.tasks or {}) do if task:is_running() then diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index 213c446..d23cefd 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -63,7 +63,7 @@ return { { ---@param plugin LazyPlugin filter = function(plugin) - return plugin._.has_updates + return plugin._.updates end, title = "Updates", }, From 0fadb5e1cec709de839ecd6937b338b9201734ad Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 31 Dec 2022 16:08:01 +0100 Subject: [PATCH 0549/1610] feat(ui): when updating to a new version, show the version instead of the commit refs --- lua/lazy/view/render.lua | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index d57e504..c9824ab 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -341,9 +341,16 @@ function M:diagnostics(plugin) message = "already up to date", }) else - self:diagnostic({ - message = "updated from " .. plugin._.updated.from:sub(1, 7) .. " to " .. plugin._.updated.to:sub(1, 7), - }) + local version = Git.info(plugin.dir, true).version + if version then + self:diagnostic({ + message = "updated to " .. tostring(version), + }) + else + self:diagnostic({ + message = "updated from " .. plugin._.updated.from:sub(1, 7) .. " to " .. plugin._.updated.to:sub(1, 7), + }) + end end elseif plugin._.updates then local version = plugin._.updates.to.version From 205ce42cdc93bc62b1c2ae1c754180c5a23be8de Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 1 Jan 2023 09:40:51 +0100 Subject: [PATCH 0550/1610] fix(commands): fixed plugin completion for commands --- lua/lazy/view/commands.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index d5515b8..c6ee5f3 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -72,7 +72,7 @@ function M.complete(cmd, prefix) table.sort(plugins) ---@param key string return vim.tbl_filter(function(key) - return key:find(prefix) == 1 + return key:find(prefix, 1, true) == 1 end, plugins) end From 23c0587791607bf77f7148c04722977f72537314 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 1 Jan 2023 09:41:43 +0100 Subject: [PATCH 0551/1610] feat(commands): added build command to force rebuild of a plugin --- README.md | 1 + lua/lazy/manage/init.lua | 11 +++++++++++ lua/lazy/manage/task/plugin.lua | 6 +++++- lua/lazy/view/commands.lua | 10 +++++++--- lua/lazy/view/config.lua | 7 +++++++ 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ea93722..fb04ca6 100644 --- a/README.md +++ b/README.md @@ -489,6 +489,7 @@ 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 | diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 83dd18c..375f445 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -144,6 +144,17 @@ function M.log(opts) }, opts) end +---@param opts? ManagerOpts +function M.build(opts) + opts = M.opts(opts, { mode = "build" }) + return M.run({ + pipeline = { { "plugin.build", force = true } }, + plugins = function() + return false + end, + }, opts) +end + ---@param opts? ManagerOpts function M.sync(opts) opts = M.opts(opts) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 05424b8..9b32b51 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -5,7 +5,11 @@ local Loader = require("lazy.core.loader") local M = {} M.build = { - skip = function(plugin) + ---@param opts? {force:boolean} + skip = function(plugin, opts) + if opts and opts.force then + return false + end return not (plugin._.dirty and plugin.build) end, run = function(self) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index c6ee5f3..39bd3f8 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -13,6 +13,12 @@ function M.cmd(cmd, opts) local command = M.commands[cmd] --[[@as fun(opts)]] if command == nil then Util.error("Invalid lazy command '" .. cmd .. "'") + elseif + ViewConfig.commands[cmd] + and ViewConfig.commands[cmd].plugins_required + and not (opts and vim.tbl_count(opts.plugins or {}) > 0) + then + return Util.error("`Lazy " .. cmd .. "` requires at least one plugin") else command(opts) end @@ -44,12 +50,10 @@ M.commands = { end, ---@param opts ManagerOpts load = function(opts) - if not (opts and opts.plugins and #opts.plugins > 0) then - return Util.error("`Lazy load` requires at least one plugin name to load") - end require("lazy.core.loader").load(opts.plugins, { cmd = "LazyLoad" }) end, log = Manage.log, + build = Manage.build, clean = Manage.clean, install = Manage.install, sync = Manage.sync, diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index b6f5bc2..e229352 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -139,6 +139,13 @@ M.commands = { desc = "Run `:checkhealth lazy`", id = 14, }, + build = { + desc = "Rebuild a plugin", + id = 13, + plugins = true, + plugins_required = true, + key_plugin = "b", + }, } return M From 0a0f1b95e9d0248a8c8ba91fce932e3d682a7eda Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 1 Jan 2023 08:42:34 +0000 Subject: [PATCH 0552/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e2e2108..e627385 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2022 December 31 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 01 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -528,6 +528,7 @@ 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 │ From 1edd1b8945ee91cdfd61654af96c427dce285a9d Mon Sep 17 00:00:00 2001 From: Munif Tanjim <hello@muniftanjim.dev> Date: Sun, 1 Jan 2023 15:56:18 +0600 Subject: [PATCH 0553/1610] fix(help): properly escape helptags search pattern (#268) --- lua/lazy/help.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index d2eba65..a41602f 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -18,6 +18,7 @@ function M.index(plugin) if title then local tag = plugin.name .. "-" .. title:lower():gsub("%W+", "-") tag = tag:gsub("%-+", "-"):gsub("%-$", "") + line = line:gsub("([%[%]/])", "\\%1") tags[tag] = { tag = tag, line = line, file = plugin.name .. ".md" } end end From b23a5dc8d5d873e3c53283a376c9d9b5ee33697f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 1 Jan 2023 18:45:20 +0100 Subject: [PATCH 0554/1610] fix(loader): setup handlers after installing missing plugins. Fixes #272 --- lua/lazy/core/loader.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 899df1b..5a666a9 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -16,11 +16,6 @@ M.disabled_rtp_plugins = { packer_compiled = true } M.did_ftdetect = {} function M.setup() - -- setup handlers - Util.track("handlers") - Handler.setup() - Util.track() - for _, file in ipairs(Config.options.performance.rtp.disabled_plugins) do M.disabled_rtp_plugins[file] = true end @@ -47,6 +42,11 @@ function M.setup() end Util.track() end + + -- setup handlers + Util.track("handlers") + Handler.setup() + Util.track() end -- Startup sequence From 11eee43c7ee63a71b08009769437e8a10814a48c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 1 Jan 2023 18:52:07 +0100 Subject: [PATCH 0555/1610] fix(cache): keep ordering of topmods the same as in rtp --- lua/lazy/core/cache.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 4bb80b9..df0c315 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -37,8 +37,8 @@ M.stats = { } M.me = debug.getinfo(1, "S").source:sub(2) M.me = vim.fn.fnamemodify(M.me, ":p:h:h:h:h"):gsub("\\", "/") ----@type table<string, table<string,string>> -M.topmods = { lazy = { [M.me] = M.me } } +---@type table<string, string[]> +M.topmods = { lazy = { M.me } } ---@type table<string, string[]> M.indexed = { [M.me] = { "lazy" } } M.indexed_unloaded = false @@ -229,7 +229,9 @@ function M._index(path) end if topname then M.topmods[topname] = M.topmods[topname] or {} - M.topmods[topname][path] = path + if not vim.tbl_contains(M.topmods[topname], path) then + table.insert(M.topmods[topname], path) + end table.insert(M.indexed[path], topname) end end) @@ -257,7 +259,7 @@ function M.find(modname) -- check top-level mods to find the module local function _find() - for _, toppath in pairs(M.topmods[topmod] or {}) do + for _, toppath in ipairs(M.topmods[topmod] or {}) do for _, pattern in ipairs(patterns) do local path = toppath .. "/lua/" .. basename .. pattern M.stats.find.stat = M.stats.find.stat + 1 From d521a25cfc8608057eade67bfe7991f1ce1ed1b9 Mon Sep 17 00:00:00 2001 From: Munif Tanjim <hello@muniftanjim.dev> Date: Mon, 2 Jan 2023 01:23:41 +0600 Subject: [PATCH 0556/1610] feat(help): accept patterns for readme (#269) --- README.md | 2 +- lua/lazy/core/config.lua | 2 +- lua/lazy/help.lua | 15 ++++++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index fb04ca6..61f95da 100644 --- a/README.md +++ b/README.md @@ -436,7 +436,7 @@ return { -- when the readme opens with :help it will be correctly displayed as markdown readme = { root = vim.fn.stdpath("state") .. "/lazy/readme", - files = { "README.md" }, + files = { "README.md", "lua/**/README.md" }, -- only generate markdown helptags for plugins that dont have docs skip_if_doc_exists = true, }, diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 87e9c98..563e809 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -135,7 +135,7 @@ M.defaults = { -- when the readme opens with :help it will be correctly displayed as markdown readme = { root = vim.fn.stdpath("state") .. "/lazy/readme", - files = { "README.md" }, + files = { "README.md", "lua/**/README.md" }, -- only generate markdown helptags for plugins that dont have docs skip_if_doc_exists = true, }, diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index a41602f..f9e6637 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -7,23 +7,28 @@ function M.index(plugin) if Config.options.readme.skip_if_doc_exists and vim.loop.fs_stat(plugin.dir .. "/doc") then return {} end + local files = vim.tbl_flatten(vim.tbl_map(function(file) + return vim.fn.expand(plugin.dir .. "/" .. file, false, true) + end, Config.options.readme.files)) ---@type table<string,{file:string, tag:string, line:string}> local tags = {} - for _, file in ipairs(Config.options.readme.files) do - file = plugin.dir .. "/" .. file + for _, file in ipairs(files) do + file = Util.norm(file) if vim.loop.fs_stat(file) then + local rel_file = file:sub(#plugin.dir + 1) + local tag_filename = string.gsub(plugin.name .. vim.fn.fnamemodify(rel_file, ":h:gs?/?-?"), "-$", "") local lines = vim.split(Util.read_file(file), "\n") for _, line in ipairs(lines) do local title = line:match("^#+%s*(.*)") if title then - local tag = plugin.name .. "-" .. title:lower():gsub("%W+", "-") + local tag = tag_filename .. "-" .. title:lower():gsub("%W+", "-") tag = tag:gsub("%-+", "-"):gsub("%-$", "") line = line:gsub("([%[%]/])", "\\%1") - tags[tag] = { tag = tag, line = line, file = plugin.name .. ".md" } + tags[tag] = { tag = tag, line = line, file = tag_filename .. ".md" } end end table.insert(lines, [[<!-- vim: set ft=markdown: -->]]) - Util.write_file(Config.options.readme.root .. "/doc/" .. plugin.name .. ".md", table.concat(lines, "\n")) + Util.write_file(Config.options.readme.root .. "/doc/" .. tag_filename .. ".md", table.concat(lines, "\n")) end end return tags From 963e6f72a7d24feb175999eec484d648802b9ee3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 1 Jan 2023 19:24:31 +0000 Subject: [PATCH 0557/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e627385..1f8cd82 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -480,7 +480,7 @@ CONFIGURATION *lazy.nvim-configuration* -- when the readme opens with :help it will be correctly displayed as markdown readme = { root = vim.fn.stdpath("state") .. "/lazy/readme", - files = { "README.md" }, + files = { "README.md", "lua//README.md" }, -- only generate markdown helptags for plugins that dont have docs skip_if_doc_exists = true, }, From 51c23b661e695d3998893bfd71de2646a6190ad4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 1 Jan 2023 20:19:09 +0100 Subject: [PATCH 0558/1610] fix(spec): allow a spec module to be on the rtp and not only in config --- lua/lazy/core/cache.lua | 45 +++++++++++++++++++++++++++++++++--- lua/lazy/core/util.lua | 26 +++++++++------------ lua/lazy/manage/reloader.lua | 2 +- tests/core/util_spec.lua | 40 ++++++++++++++++++++++++++++++++ tests/helpers.lua | 37 +++++++++++++++++++++++++++++ 5 files changed, 131 insertions(+), 19 deletions(-) create mode 100644 tests/core/util_spec.lua create mode 100644 tests/helpers.lua diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index df0c315..5e34cf8 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -62,11 +62,11 @@ function M.check_path(modname, modpath) -- the correct lazy path should be part of rtp. -- so if we get here, this is folke using the local dev instance ;) - if modname:sub(1, 4) == "lazy" then + if modname and modname:sub(1, 4) == "lazy" then return false end - return M.check_autoload(modname, modpath) + return modname and M.check_autoload(modname, modpath) end function M.check_autoload(modname, modpath) @@ -246,8 +246,43 @@ function M.get_topmods(path) end ---@param modname string +---@return string?, string? +function M.find_dir(modname) + if M.cache[modname] then + -- check if modname is in cache + local modpath = M.cache[modname].modpath + if M.check_path(modname, modpath) then + local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") + return root, modpath + end + else + -- in case modname is just a directory and not a real mod, + -- check for any children in the cache + for child, entry in pairs(M.cache) do + if child:find(modname, 1, true) == 1 and M.check_path(nil, entry.modpath) then + local basename = modname:gsub("%.", "/") + local childbase = child:gsub("%.", "/") + local ret = entry.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") + local idx = assert(ret:find(childbase, 1, true)) + return ret:sub(1, idx - 1) .. basename + end + end + end + + -- not found in cache, so find the root with the special pattern + local modpath = M.find(modname, { patterns = { "" } }) + if modpath then + local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") + return root, root ~= modpath and modpath or nil + end +end + +---@param modname string +---@param opts? {patterns?:string[]} ---@return string? -function M.find(modname) +function M.find(modname, opts) + opts = opts or {} + M.stats.find.total = M.stats.find.total + 1 local start = uv.hrtime() local basename = modname:gsub("%.", "/") @@ -257,6 +292,10 @@ function M.find(modname) -- search for a directory first when topmod == modname local patterns = topmod == modname and { "/init.lua", ".lua" } or { ".lua", "/init.lua" } + if opts.patterns then + vim.list_extend(patterns, opts.patterns) + end + -- check top-level mods to find the module local function _find() for _, toppath in ipairs(M.topmods[topmod] or {}) do diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 123f762..cd16edd 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -176,25 +176,21 @@ function M.walk(path, fn) end ---@param modname string ----@param root string ---@param fn fun(modname:string, modpath:string) ----@overload fun(modname:string, fn: fun(modname:string, modpath:string)) -function M.lsmod(modname, root, fn) - if type(root) == "function" then - fn = root - root = vim.fn.stdpath("config") .. "/lua" +function M.lsmod(modname, fn) + local Cache = require("lazy.core.cache") + local root, modpath = Cache.find_dir(modname) + if not root then + return end - root = root .. "/" .. modname:gsub("%.", "/") - if vim.loop.fs_stat(root .. ".lua") then - fn(modname, root .. ".lua") + + if modpath and vim.loop.fs_stat(modpath) then + fn(modname, modpath) end + M.ls(root, function(path, name, type) - if (type == "file" or type == "link") and name:sub(-4) == ".lua" then - if name == "init.lua" then - fn(modname, path) - else - fn(modname .. "." .. name:sub(1, -5), path) - end + if name ~= "init.lua" and (type == "file" or type == "link") and name:sub(-4) == ".lua" then + fn(modname .. "." .. name:sub(1, -5), path) elseif type == "directory" and vim.loop.fs_stat(path .. "/init.lua") then fn(modname .. "." .. name, path .. "/init.lua") end diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index 3e233d0..762cfbc 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -55,7 +55,7 @@ function M.check(start) end end - Util.lsmod(Config.spec --[[@as string]], M.root, check) + Util.lsmod(Config.spec --[[@as string]], check) for file in pairs(M.files) do if not checked[file] then diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua new file mode 100644 index 0000000..3dee0a8 --- /dev/null +++ b/tests/core/util_spec.lua @@ -0,0 +1,40 @@ +local Util = require("lazy.util") +local Cache = require("lazy.core.cache") +local Helpers = require("tests.helpers") + +describe("util", function() + before_each(function() + Helpers.fs_rm("") + end) + + it("lsmod lists all mods in dir", function() + local tests = { + { + files = { "lua/foo/one.lua", "lua/foo/two.lua", "lua/foo/init.lua" }, + mods = { "foo", "foo.one", "foo.two" }, + }, + { + files = { "lua/foo/one.lua", "lua/foo/two.lua", "lua/foo.lua" }, + mods = { "foo", "foo.one", "foo.two" }, + }, + { + files = { "lua/foo/one.lua", "lua/foo/two.lua" }, + mods = { "foo.one", "foo.two" }, + }, + } + + vim.opt.rtp:append(Helpers.path("")) + for _, test in ipairs(tests) do + Cache.cache = {} + table.sort(test.mods) + Helpers.fs_rm("") + Helpers.fs_create(test.files) + local mods = {} + Util.lsmod("foo", function(modname, modpath) + mods[#mods + 1] = modname + end) + table.sort(mods) + assert.same(test.mods, mods) + end + end) +end) diff --git a/tests/helpers.lua b/tests/helpers.lua new file mode 100644 index 0000000..c6174a8 --- /dev/null +++ b/tests/helpers.lua @@ -0,0 +1,37 @@ +local Util = require("lazy.util") + +local M = {} + +M.fs_root = vim.fn.fnamemodify("./.tests/fs", ":p") + +function M.path(path) + return Util.norm(M.fs_root .. "/" .. path) +end + +---@param files string[] +function M.fs_create(files) + ---@type string[] + local ret = {} + + for _, file in ipairs(files) do + ret[#ret + 1] = Util.norm(M.fs_root .. "/" .. file) + local parent = vim.fn.fnamemodify(ret[#ret], ":h:p") + vim.fn.mkdir(parent, "p") + Util.write_file(ret[#ret], "") + end + return ret +end + +function M.fs_rm(dir) + dir = Util.norm(M.fs_root .. dir) + Util.walk(dir, function(path, _, type) + if type == "directory" then + vim.loop.fs_rmdir(path) + else + vim.loop.fs_unlink(path) + end + end) + vim.loop.fs_rmdir(dir) +end + +return M From 3974a6cbe38f7958c2e4f41c6f0d9a6c001a723d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 1 Jan 2023 20:31:27 +0100 Subject: [PATCH 0559/1610] refactor(help): replace non-word characters by - for readme filenames --- lua/lazy/help.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index f9e6637..2239b9a 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -7,16 +7,19 @@ function M.index(plugin) if Config.options.readme.skip_if_doc_exists and vim.loop.fs_stat(plugin.dir .. "/doc") then return {} end + + ---@param file string local files = vim.tbl_flatten(vim.tbl_map(function(file) return vim.fn.expand(plugin.dir .. "/" .. file, false, true) end, Config.options.readme.files)) + ---@type table<string,{file:string, tag:string, line:string}> local tags = {} for _, file in ipairs(files) do file = Util.norm(file) if vim.loop.fs_stat(file) then local rel_file = file:sub(#plugin.dir + 1) - local tag_filename = string.gsub(plugin.name .. vim.fn.fnamemodify(rel_file, ":h:gs?/?-?"), "-$", "") + local tag_filename = plugin.name .. vim.fn.fnamemodify(rel_file, ":h"):gsub("%W+", "-"):gsub("^%-$", "") local lines = vim.split(Util.read_file(file), "\n") for _, line in ipairs(lines) do local title = line:match("^#+%s*(.*)") From 39b66027a5c5db9ba6f3a7253cc6513882c27f2a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 1 Jan 2023 21:07:05 +0100 Subject: [PATCH 0560/1610] feat(spec): added support for importing multiple spec modules with `import = "foobar"` --- lua/lazy/core/config.lua | 7 +++- lua/lazy/core/plugin.lua | 78 ++++++++++++++++++++---------------- lua/lazy/manage/reloader.lua | 6 ++- lua/lazy/types.lua | 6 ++- 4 files changed, 57 insertions(+), 40 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 563e809..68daf7d 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -144,9 +144,12 @@ M.defaults = { M.ns = vim.api.nvim_create_namespace("lazy") ----@type string|LazySpec Should be either a string pointing to a module, or a spec +---@type LazySpec M.spec = nil +---@type LazySpecLoader +M.parsed = nil + ---@type table<string, LazyPlugin> M.plugins = {} @@ -167,7 +170,7 @@ M.headless = #vim.api.nvim_list_uis() == 0 ---@param spec LazySpec ---@param opts? LazyConfig function M.setup(spec, opts) - M.spec = spec + M.spec = type(spec) == "string" and { import = spec } or spec M.options = vim.tbl_deep_extend("force", M.defaults, opts or {}) M.options.performance.cache = require("lazy.core.cache") table.insert(M.options.install.colorscheme, "habamax") diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index e6e1fec..81c2a58 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -8,6 +8,7 @@ local M = {} ---@class LazySpecLoader ---@field plugins table<string, LazyPlugin> +---@field modules string[] ---@field errors string[] ---@field opts LazySpecOptions local Spec = {} @@ -21,6 +22,7 @@ function Spec.new(spec, opts) local self = setmetatable({}, { __index = Spec }) self.opts = opts or {} self.plugins = {} + self.modules = {} self.errors = {} if spec then self:normalize(spec) @@ -88,7 +90,7 @@ function Spec:error(error) end end ----@param spec LazySpec +---@param spec LazySpec|LazySpecImport ---@param results? string[] ---@param is_dep? boolean function Spec:normalize(spec, results, is_dep) @@ -105,22 +107,49 @@ function Spec:normalize(spec, results, is_dep) for _, s in ipairs(spec) do self:normalize(s, results, is_dep) end - elseif spec.enabled == nil or spec.enabled == true or (type(spec.enabled) == "function" and spec.enabled()) then - local plugin - -- check if we already processed this spec. Can happen when a user uses the same instance of a spec in multiple specs - -- see https://github.com/folke/lazy.nvim/issues/45 - if spec._ then - plugin = spec - else - ---@cast spec LazyPlugin - plugin = self:add(spec, is_dep) - plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil + elseif spec.import then + ---@cast spec LazySpecImport + self:import(spec) + else + ---@cast spec LazyPluginSpec + if spec.enabled == nil or spec.enabled == true or (type(spec.enabled) == "function" and spec.enabled()) then + local plugin + -- check if we already processed this spec. Can happen when a user uses the same instance of a spec in multiple specs + -- see https://github.com/folke/lazy.nvim/issues/45 + if spec._ then + plugin = spec + else + ---@cast spec LazyPlugin + plugin = self:add(spec, is_dep) + plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil + end + table.insert(results, plugin.name) end - table.insert(results, plugin.name) end return results end +---@param spec LazySpecImport +function Spec:import(spec) + if spec.enabled == false or (type(spec.enabled) == "function" and not spec.enabled()) then + return + end + Util.lsmod(spec.import, function(modname) + -- unload the module so we get a clean slate + ---@diagnostic disable-next-line: no-unknown + package.loaded[modname] = nil + Util.try(function() + self:normalize(Cache.require(modname)) + self.modules[#self.modules + 1] = modname + end, { + msg = "Failed to load `" .. modname .. "`", + on_error = function(msg) + self:error(msg) + end, + }) + end) +end + ---@param old LazyPlugin ---@param new LazyPlugin ---@return LazyPlugin @@ -194,35 +223,14 @@ end ---@param opts? LazySpecOptions function M.spec(opts) - local spec = Spec.new(nil, opts) - - if type(Config.spec) == "string" then - -- spec is a module - local function _load(modname) - -- unload the module so we get a clean slate - ---@diagnostic disable-next-line: no-unknown - package.loaded[modname] = nil - Util.try(function() - spec:normalize(Cache.require(modname)) - end, { - msg = "Failed to load `" .. modname .. "`", - on_error = function(msg) - spec:error(msg) - end, - }) - end - Util.lsmod(Config.spec --[[@as string]], _load) - else - -- spec is a spec - spec:normalize(vim.deepcopy(Config.spec)) - end - return spec + return Spec.new(vim.deepcopy(Config.spec), opts) end function M.load() -- load specs Util.track("spec") local spec = M.spec() + Config.parsed = spec -- add ourselves spec:add({ "folke/lazy.nvim" }) diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index 762cfbc..a0d4265 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -17,7 +17,7 @@ function M.enable() if M.timer then M.timer:stop() end - if type(Config.spec) == "string" then + if #Config.parsed.modules > 0 then M.timer = vim.loop.new_timer() M.root = vim.fn.stdpath("config") .. "/lua" M.check(true) @@ -55,7 +55,9 @@ function M.check(start) end end - Util.lsmod(Config.spec --[[@as string]], check) + for _, modname in ipairs(Config.parsed.modules) do + Util.lsmod(modname, check) + end for file in pairs(M.files) do if not checked[file] then diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index c68cdf9..3c5c5d1 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -58,4 +58,8 @@ ---@class LazyPluginSpec: LazyPluginBase,LazyPluginSpecHandlers,LazyPluginHooks,LazyPluginRef ---@field dependencies? string|string[]|LazyPluginSpec[] ----@alias LazySpec string|string[]|LazyPluginSpec[]|LazyPluginSpec[][] +---@alias LazySpec string|LazyPluginSpec|LazySpecImport|LazySpec[] + +---@class LazySpecImport +---@field import string spec module to import +---@field enabled? boolean|(fun():boolean) From 6ff480bdee276265e69f644877706ccb11892799 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 1 Jan 2023 21:09:02 +0100 Subject: [PATCH 0561/1610] fix(health): always use main spec --- lua/lazy/health.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 57c24f6..e218603 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -1,6 +1,5 @@ local Util = require("lazy.util") local Config = require("lazy.core.config") -local Plugin = require("lazy.core.plugin") local M = {} @@ -49,7 +48,7 @@ function M.check() "cond", "_", } - local spec = Plugin.spec({ show_errors = false }) + local spec = Config.parsed for _, plugin in pairs(spec.plugins) do for key in pairs(plugin) do if not vim.tbl_contains(valid, key) then From 4d77cf2efea3ddec1bc2a335f90bf3a1cfe19db2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 09:36:52 +0100 Subject: [PATCH 0562/1610] fix(handler): properly show errors generated by setting up handlers --- lua/lazy/core/handler/init.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index 99568f4..0935f51 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -1,3 +1,4 @@ +local Util = require("lazy.core.util") local Config = require("lazy.core.config") ---@class LazyHandler @@ -23,7 +24,9 @@ function M.setup() M.handlers[type] = M.new(type) end for _, plugin in pairs(Config.plugins) do - M.enable(plugin) + Util.try(function() + M.enable(plugin) + end, "Failed to setup handlers for " .. plugin.name) end end From 77ff7beaa49769961b01b4d5b9099b4536ba1de4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 09:39:28 +0100 Subject: [PATCH 0563/1610] perf(cache): cache all lua files till UIEnter instead of VimEnter --- lua/lazy/core/cache.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 5e34cf8..474779c 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -15,7 +15,7 @@ M.config = { -- The default is to disable on: -- * VimEnter: not useful to cache anything else beyond startup -- * BufReadPre: this will be triggered early when opening a file from the command line directly - disable_events = { "VimEnter", "BufReadPre" }, + disable_events = { "UIEnter", "BufReadPre" }, ttl = 3600 * 24 * 5, -- keep unused modules for up to 5 days } M.debug = false From 7d755987ba6ea6ef8a3213f2119c5e31810ac913 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 09:40:19 +0100 Subject: [PATCH 0564/1610] fix(spec): normalize deps before adding spec to make sure merging works as expected --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 81c2a58..5f01775 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -120,8 +120,8 @@ function Spec:normalize(spec, results, is_dep) plugin = spec else ---@cast spec LazyPlugin + spec.dependencies = spec.dependencies and self:normalize(spec.dependencies, {}, true) or nil plugin = self:add(spec, is_dep) - plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil end table.insert(results, plugin.name) end From 313015fdb4b44a38f4b5c9fd045c5d29a65f7c7a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 09:41:09 +0100 Subject: [PATCH 0565/1610] feat(spec): allow mergig of config, priority and dependencies --- lua/lazy/core/plugin.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 5f01775..3c99b36 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -165,7 +165,16 @@ function Spec:merge(old, new) vim.list_extend(values, type(old[k]) == "string" and { old[k] } or old[k]) ---@diagnostic disable-next-line: no-unknown old[k] = values + elseif k == "config" or k == "priority" then + old[k] = v + elseif k == "dependencies" then + for _, dep in ipairs(v) do + if not vim.tbl_contains(old[k], dep) then + table.insert(old[k], dep) + end + end else + old[k] = v self:error("Merging plugins is not supported for key `" .. k .. "`\n" .. vim.inspect({ old = old, new = new })) end else From 919b7f5de3ba78d2030be617b64ada17bddd47da Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 09:44:09 +0100 Subject: [PATCH 0566/1610] feat(spec): added `import` to import other plugin modules --- lua/lazy/core/cache.lua | 2 +- lua/lazy/core/config.lua | 24 ++++++++------- lua/lazy/core/plugin.lua | 59 ++++++++++++++++++++++-------------- lua/lazy/health.lua | 16 ++++++---- lua/lazy/init.lua | 14 +++++++-- lua/lazy/manage/reloader.lua | 4 +-- lua/lazy/view/colors.lua | 1 + 7 files changed, 74 insertions(+), 46 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 474779c..35e3852 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -331,7 +331,7 @@ function M.find(modname, opts) ---@type LazyCoreConfig local Config = package.loaded["lazy.core.config"] if Config then - for _, plugin in pairs(Config.plugins) do + for _, plugin in pairs(Config.spec.plugins) do if not (M.indexed[plugin.dir] or plugin._.loaded or plugin.module == false) then updated = M._index(plugin.dir) or updated end diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 68daf7d..d2b3146 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -11,6 +11,8 @@ M.defaults = { version = nil, -- version = "*", -- enable this to try installing the latest stable versions of plugins }, + -- leave nil when passing the spec as the first argument to setup() + spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. concurrency = nil, ---@type number limit the maximum amount of concurrent tasks git = { @@ -38,20 +40,21 @@ M.defaults = { -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { - loaded = "●", - not_loaded = "○", cmd = " ", config = "", event = "", ft = " ", init = " ", + import = " ", keys = " ", + lazy = "鈴 ", + loaded = "●", + not_loaded = "○", plugin = " ", runtime = " ", source = " ", start = "", task = "✔ ", - lazy = "鈴 ", list = { "●", "➜", @@ -144,11 +147,8 @@ M.defaults = { M.ns = vim.api.nvim_create_namespace("lazy") ----@type LazySpec -M.spec = nil - ---@type LazySpecLoader -M.parsed = nil +M.spec = nil ---@type table<string, LazyPlugin> M.plugins = {} @@ -167,12 +167,14 @@ M.mapleader = nil M.headless = #vim.api.nvim_list_uis() == 0 ----@param spec LazySpec ---@param opts? LazyConfig -function M.setup(spec, opts) - M.spec = type(spec) == "string" and { import = spec } or spec +function M.setup(opts) M.options = vim.tbl_deep_extend("force", M.defaults, opts or {}) - M.options.performance.cache = require("lazy.core.cache") + + if type(M.options.spec) == "string" then + M.options.spec = { import = M.options.spec } + end + M.options.performance.cache = require("lazy.core.cache").config table.insert(M.options.install.colorscheme, "habamax") M.options.root = Util.norm(M.options.root) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 3c99b36..1a2c153 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -9,21 +9,17 @@ local M = {} ---@class LazySpecLoader ---@field plugins table<string, LazyPlugin> ---@field modules string[] ----@field errors string[] ----@field opts LazySpecOptions +---@field notifs {msg:string, level:number, file?:string}[] +---@field importing? string local Spec = {} M.Spec = Spec ----@alias LazySpecOptions {show_errors: boolean} - ---@param spec? LazySpec ----@param opts? LazySpecOptions -function Spec.new(spec, opts) +function Spec.new(spec) local self = setmetatable({}, { __index = Spec }) - self.opts = opts or {} self.plugins = {} self.modules = {} - self.errors = {} + self.notifs = {} if spec then self:normalize(spec) end @@ -83,11 +79,19 @@ function Spec:add(plugin, is_dep) return self.plugins[plugin.name] end -function Spec:error(error) - self.errors[#self.errors + 1] = error - if self.opts.show_errors ~= false then - Util.error(error) - end +function Spec:error(msg) + self:notify(msg, vim.log.levels.ERROR) +end + +function Spec:warn(msg) + self:notify(msg, vim.log.levels.WARN) +end + +---@param msg string +---@param level number +function Spec:notify(msg, level) + self.notifs[#self.notifs + 1] = { msg = msg, level = level, file = self.importing } + Util.notify(msg, level) end ---@param spec LazySpec|LazySpecImport @@ -134,20 +138,34 @@ function Spec:import(spec) if spec.enabled == false or (type(spec.enabled) == "function" and not spec.enabled()) then return end + + Cache.indexed_unloaded = false + + local imported = 0 Util.lsmod(spec.import, function(modname) + imported = imported + 1 + 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() self:normalize(Cache.require(modname)) self.modules[#self.modules + 1] = modname + self.importing = nil + Util.track() end, { msg = "Failed to load `" .. modname .. "`", on_error = function(msg) self:error(msg) + self.importing = nil + Util.track() end, }) end) + if imported == 0 then + self:error("No specs found for module " .. spec.import) + end end ---@param old LazyPlugin @@ -230,21 +248,16 @@ function M.update_state() end end ----@param opts? LazySpecOptions -function M.spec(opts) - return Spec.new(vim.deepcopy(Config.spec), opts) -end - function M.load() -- load specs Util.track("spec") - local spec = M.spec() - Config.parsed = spec + Config.spec = Spec.new() + Config.spec:normalize(vim.deepcopy(Config.options.spec)) -- add ourselves - spec:add({ "folke/lazy.nvim" }) + Config.spec:add({ "folke/lazy.nvim" }) -- override some lazy props - local lazy = spec.plugins["lazy.nvim"] + local lazy = Config.spec.plugins["lazy.nvim"] lazy.lazy = true lazy.dir = Config.me lazy.config = function() @@ -253,7 +266,7 @@ function M.load() lazy._.loaded = {} local existing = Config.plugins - Config.plugins = spec.plugins + Config.plugins = Config.spec.plugins -- copy state. This wont do anything during startup for name, plugin in pairs(existing) do if Config.plugins[name] then diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index e218603..a498dcf 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -48,7 +48,7 @@ function M.check() "cond", "_", } - local spec = Config.parsed + local spec = Config.spec for _, plugin in pairs(spec.plugins) do for key in pairs(plugin) do if not vim.tbl_contains(valid, key) then @@ -58,12 +58,16 @@ function M.check() end end end - if #spec.errors > 0 then - vim.health.report_error("Errors were reported when loading your specs:") - for _, error in ipairs(spec.errors) do - local lines = vim.split(error, "\n") + if #spec.notifs > 0 then + vim.health.report_error("Issues were reported when loading your specs:") + for _, notif in ipairs(spec.notifs) do + local lines = vim.split(notif.msg, "\n") for _, line in ipairs(lines) do - vim.health.report_error(line) + if notif.level == vim.log.levels.ERROR then + vim.health.report_error(line) + else + vim.health.report_warn(line) + end end end end diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index b08b5b5..2214761 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -2,9 +2,17 @@ local M = {} M._start = 0 ----@param spec LazySpec Should be a module name to load, or a plugin spec ----@param opts? LazyConfig +---@overload fun(opts: LazyConfig) +---@overload fun(spec:LazySpec, opts: LazyConfig) function M.setup(spec, opts) + if type(spec) == "table" and spec.spec then + ---@cast spec LazyConfig + opts = spec + else + opts = opts or {} + opts.spec = spec + end + M._start = M._start == 0 and vim.loop.hrtime() or M._start if vim.g.lazy_did_setup then return vim.notify( @@ -38,7 +46,7 @@ function M.setup(spec, opts) -- load config Util.track("config") - Config.setup(spec, opts) + Config.setup(opts) Util.track() -- load the plugins diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index a0d4265..d338775 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -17,7 +17,7 @@ function M.enable() if M.timer then M.timer:stop() end - if #Config.parsed.modules > 0 then + if #Config.spec.modules > 0 then M.timer = vim.loop.new_timer() M.root = vim.fn.stdpath("config") .. "/lua" M.check(true) @@ -55,7 +55,7 @@ function M.check(start) end end - for _, modname in ipairs(Config.parsed.modules) do + for _, modname in ipairs(Config.spec.modules) do Util.lsmod(modname, check) end diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index 0ec8b2b..550ed09 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -23,6 +23,7 @@ M.colors = { ReasonSource = "Character", ReasonFt = "Character", ReasonCmd = "Operator", + ReasonImport = "Identifier", Button = "CursorLine", ButtonActive = "Visual", TaskOutput = "MsgArea", -- task output From 2d06faa941998f76f0348b7b69c5ecdcb5f3db2a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 10:08:45 +0100 Subject: [PATCH 0567/1610] feat(loader): incrementally install missing plugins and rebuild spec, so imported specs from plugins work as expected --- lua/lazy/core/loader.lua | 44 +++++++++++++++++++++++++++++++--------- lua/lazy/core/plugin.lua | 13 ++++++++---- lua/lazy/init.lua | 3 --- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 5a666a9..f9f2620 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -2,6 +2,7 @@ local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Handler = require("lazy.core.handler") local Cache = require("lazy.core.cache") +local Plugin = require("lazy.core.plugin") local M = {} @@ -26,29 +27,52 @@ function M.setup() end, }) + -- load the plugins + Plugin.load() + -- install missing plugins if Config.options.install.missing then Util.track("install") - for _, plugin in pairs(Config.plugins) do - if not plugin._.installed then - for _, colorscheme in ipairs(Config.options.install.colorscheme) do - if pcall(vim.cmd.colorscheme, colorscheme) then - break - end - end - require("lazy.manage").install({ wait = true, lockfile = true }) - break - end + while M.install_missing() do end Util.track() end + -- report any warnings & errors + Config.spec:report() + -- setup handlers Util.track("handlers") Handler.setup() Util.track() end +-- this will incrementally install missing plugins +-- multiple rounds can happen when importing a spec from a missing plugin +function M.install_missing() + for _, plugin in pairs(Config.plugins) do + if not plugin._.installed then + for _, colorscheme in ipairs(Config.options.install.colorscheme) do + if pcall(vim.cmd.colorscheme, colorscheme) then + break + end + end + require("lazy.manage").install({ wait = true, lockfile = true }) + -- remove and installed plugins from indexed, so cache will index again + for _, p in pairs(Config.plugins) do + if p._.installed then + Cache.indexed[p.dir] = nil + end + end + -- clear plugins. no need to merge in this stage + Config.plugins = {} + -- reload plugins + Plugin.load() + return true + end + end +end + -- Startup sequence -- 1. load any start plugins and do init function M.startup() diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 1a2c153..f6bfaf2 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -80,18 +80,23 @@ function Spec:add(plugin, is_dep) end function Spec:error(msg) - self:notify(msg, vim.log.levels.ERROR) + self:log(msg, vim.log.levels.ERROR) end function Spec:warn(msg) - self:notify(msg, vim.log.levels.WARN) + self:log(msg, vim.log.levels.WARN) end ---@param msg string ---@param level number -function Spec:notify(msg, level) +function Spec:log(msg, level) self.notifs[#self.notifs + 1] = { msg = msg, level = level, file = self.importing } - Util.notify(msg, level) +end + +function Spec:report() + for _, notif in ipairs(self.notifs) do + Util.notify(notif.msg, notif.level) + end end ---@param spec LazySpec|LazySpecImport diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 2214761..318f63c 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -49,9 +49,6 @@ function M.setup(spec, opts) Config.setup(opts) Util.track() - -- load the plugins - Plugin.load() - -- setup loader and handlers Loader.setup() From 50a456c189a6ea68f7681c95fe5cfa9c968e4fc6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 11:26:40 +0100 Subject: [PATCH 0568/1610] feat(util): added trackfn that wraps a function and tracks timings --- lua/lazy/core/util.lua | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index cd16edd..b6996f2 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -28,6 +28,22 @@ function M.track(data, time) end end +---@generic F: fun() +---@param data (string|{[string]:string})? +---@param fn F +---@return F +function M.trackfn(data, fn) + return function(...) + M.track(data) + local ok, ret = pcall(fn, ...) + M.track() + if not ok then + error(ret) + end + return ret + end +end + ---@param name string ---@return string function M.normname(name) @@ -127,7 +143,7 @@ function M.very_lazy() local function _load() vim.defer_fn(function() vim.cmd("do User VeryLazy") - end, 100) + end, 50) end vim.api.nvim_create_autocmd("User", { From 46997de1c90620897e2a7f31bd9e4751c1223d21 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 11:26:54 +0100 Subject: [PATCH 0569/1610] feat(event): track event trigger times --- lua/lazy/core/handler/event.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 6ccd769..8c64231 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -75,8 +75,10 @@ function M:trigger(event, pattern, groups) pattern and (" - **pattern:** " .. pattern), }) end + Util.track({ event = autocmd.group_name }) Util.try(function() vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false }) + Util.track() end) end end From d99238791289e7ee5bd847fd10ac3a93ab3422e6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 11:28:18 +0100 Subject: [PATCH 0570/1610] perf: track some additional cputimes --- lua/lazy/init.lua | 4 +++- lua/lazy/stats.lua | 43 +++++++++++++++++++++++++++------------- lua/lazy/view/render.lua | 18 ++++++++++++++++- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 318f63c..d3b8b93 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -36,10 +36,11 @@ function M.setup(spec, opts) -- load module cache before anything else require("lazy.core.cache").setup(opts) + require("lazy.stats").track("LazyStart") + local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") - local Plugin = require("lazy.core.plugin") Util.track({ plugin = "lazy.nvim" }) -- setup start Util.track("module", vim.loop.hrtime() - start) @@ -64,6 +65,7 @@ function M.setup(spec, opts) -- all done! vim.cmd("do User LazyDone") + require("lazy.stats").track("LazyDone") end function M.stats() diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index 285b4e6..df10593 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -1,3 +1,5 @@ +local ffi = require("ffi") + local M = {} ---@class LazyStats @@ -10,35 +12,48 @@ M._stats = { startuptime_cputime = false, count = 0, -- total number of plugins loaded = 0, -- number of loaded plugins + ---@type table<string, number> + times = {}, } -function M.on_ui_enter() - if not M.C then - pcall(function() end) - end +---@type ffi.namespace*|boolean +M.C = nil - local ok = pcall(function() - local ffi = require("ffi") - ffi.cdef([[ +function M.on_ui_enter() + M._stats.startuptime = M.track("UIEnter") + M._stats.startuptime_cputime = M.C ~= false + vim.cmd([[do User LazyVimStarted]]) +end + +function M.track(event) + local time = M.cputime() + M._stats.times[event] = time + return time +end + +function M.cputime() + if M.C == nil then + local ok = pcall(function() + ffi.cdef([[ typedef long time_t; typedef int clockid_t; - typedef struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ } nanotime; int clock_gettime(clockid_t clk_id, struct timespec *tp); ]]) + end) + M.C = ok and ffi.C or false + end + if M.C then local pnano = assert(ffi.new("nanotime[?]", 1)) local CLOCK_PROCESS_CPUTIME_ID = jit.os == "OSX" and 12 or 2 ffi.C.clock_gettime(CLOCK_PROCESS_CPUTIME_ID, pnano) - M._stats.startuptime = tonumber(pnano[0].tv_sec) / 1e6 + tonumber(pnano[0].tv_nsec) / 1e6 - M._stats.startuptime_cputime = true - end) - if not ok then - M._stats.startuptime = (vim.loop.hrtime() - require("lazy")._start) / 1e6 + return tonumber(pnano[0].tv_sec) / 1e6 + tonumber(pnano[0].tv_nsec) / 1e6 + else + return (vim.loop.hrtime() - require("lazy")._start) / 1e6 end - vim.cmd([[do User LazyVimStarted]]) end function M.stats() diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index c9824ab..e431d34 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -556,7 +556,23 @@ function M:profile() :append("UIEnter", "LazySpecial") self:append(".") end - self:nl():nl() + self:nl() + + local times = {} + for event, time in pairs(require("lazy.stats").stats().times) do + times[#times + 1] = { event, self:ms(time * 1e6), "Bold", time = time } + end + table.sort(times, function(a, b) + return a.time < b.time + end) + for p, prop in ipairs(times) do + if p > 1 then + prop[2] = prop[2] .. " (+" .. self:ms((prop.time - times[p - 1].time) * 1e6) .. ")" + end + end + self:props(times, { indent = 2 }) + + self:nl() self:append("Profile", "LazyH2"):nl():nl() self From bc4133cb3e2d3dceed11d416ab1a0ece2d37f759 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 12:53:35 +0100 Subject: [PATCH 0571/1610] feat(spec): show spec warnings in checkhealth only --- lua/lazy/core/plugin.lua | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f6bfaf2..a23a1e3 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -93,9 +93,12 @@ function Spec:log(msg, level) self.notifs[#self.notifs + 1] = { msg = msg, level = level, file = self.importing } end -function Spec:report() +function Spec:report(level) + level = level or vim.log.levels.ERROR for _, notif in ipairs(self.notifs) do - Util.notify(notif.msg, notif.level) + if notif.level >= level then + Util.notify(notif.msg, notif.level) + end end end @@ -145,6 +148,7 @@ function Spec:import(spec) end Cache.indexed_unloaded = false + self.modules[#self.modules + 1] = spec.import local imported = 0 Util.lsmod(spec.import, function(modname) @@ -155,8 +159,7 @@ function Spec:import(spec) ---@diagnostic disable-next-line: no-unknown package.loaded[modname] = nil Util.try(function() - self:normalize(Cache.require(modname)) - self.modules[#self.modules + 1] = modname + self:normalize(require(modname)) self.importing = nil Util.track() end, { @@ -198,7 +201,7 @@ function Spec:merge(old, new) end else old[k] = v - self:error("Merging plugins is not supported for key `" .. k .. "`\n" .. vim.inspect({ old = old, new = new })) + self:warn("Overwriting key `" .. k .. "`\n" .. vim.inspect({ old = old, new = new })) end else ---@diagnostic disable-next-line: no-unknown @@ -295,7 +298,7 @@ function M.find(path) local slash = name:reverse():find("/", 1, true) if slash then name = name:sub(#name - slash + 2) - return name and Config.plugins[name] or nil + return name and Config.spec.plugins[name] or nil end end end From f6b0172e92c502bd4b1482cbb8bed4e6e3231357 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 12:54:00 +0100 Subject: [PATCH 0572/1610] fix(cache): allow lazyvim as a plugin --- lua/lazy/core/cache.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 35e3852..e825b24 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -62,7 +62,7 @@ function M.check_path(modname, modpath) -- the correct lazy path should be part of rtp. -- so if we get here, this is folke using the local dev instance ;) - if modname and modname:sub(1, 4) == "lazy" then + if modname and (modname == "lazy" or modname:sub(1, 5) == "lazy.") then return false end From 0bc73db503e550076c0a8effb976a778c7cf5a6a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 12:54:38 +0100 Subject: [PATCH 0573/1610] fix(cache): only autoload when plugins have been parsed. Needed to support `import` --- lua/lazy/core/cache.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index e825b24..2207f8f 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -81,11 +81,14 @@ function M.check_autoload(modname, modpath) if plugin and modpath:find(plugin.dir, 1, true) == 1 then -- we're not interested in loader time, so calculate delta here M.stats.autoload.time = M.stats.autoload.time + uv.hrtime() - start - if not plugin._.loaded then - if plugin.module == false then - error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") + -- only autoload when plugins have been loaded + if #require("lazy.core.config").plugins > 0 then + if not plugin._.loaded then + if plugin.module == false then + error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") + end + require("lazy.core.loader").load(plugin, { require = modname }) end - require("lazy.core.loader").load(plugin, { require = modname }) end return true end From 8063523471298c8fa77b73b650e9474c8dfae25e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 14:29:55 +0100 Subject: [PATCH 0574/1610] ci: added debug info when #topmods>1 --- lua/lazy/core/cache.lua | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 2207f8f..8d716e4 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -101,6 +101,11 @@ function M.disable() if not M.enabled then return end + if M.debug and vim.tbl_count(M.topmods) > 1 then + vim.schedule(function() + vim.notify("topmods:\n" .. vim.inspect(M.topmods), vim.log.levels.WARN, { title = "lazy.nvim" }) + end) + end -- selene:allow(global_usage) _G.loadfile = M._loadfile M.enabled = false @@ -201,18 +206,6 @@ function M.load(modkey, modpath) return chunk, err end -function M.require(modname) - local chunk = M.loader(modname) - if type(chunk) == "string" then - error(chunk) - end - ---@diagnostic disable-next-line: no-unknown - local mod = chunk() - ---@diagnostic disable-next-line: no-unknown - package.loaded[modname] = mod - return mod -end - -- index the top-level lua modules for this path function M._index(path) if not M.indexed[path] and path:sub(-6, -1) ~= "/after" then @@ -262,12 +255,14 @@ function M.find_dir(modname) -- in case modname is just a directory and not a real mod, -- check for any children in the cache for child, entry in pairs(M.cache) do - if child:find(modname, 1, true) == 1 and M.check_path(nil, entry.modpath) then - local basename = modname:gsub("%.", "/") - local childbase = child:gsub("%.", "/") - local ret = entry.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - local idx = assert(ret:find(childbase, 1, true)) - return ret:sub(1, idx - 1) .. basename + if child:find(modname, 1, true) == 1 then + if M.check_path(child, entry.modpath) then + local basename = modname:gsub("%.", "/") + local childbase = child:gsub("%.", "/") + local ret = entry.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") + local idx = assert(ret:find(childbase, 1, true)) + return ret:sub(1, idx - 1) .. basename + end end end end From 69121c772121f9e5bec822a85b4f39535e0d167d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 14:35:36 +0100 Subject: [PATCH 0575/1610] tests: fixed tests --- lua/lazy/core/plugin.lua | 3 ++ tests/core/plugin_spec.lua | 66 +++++++------------------------------- 2 files changed, 14 insertions(+), 55 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index a23a1e3..284860d 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -292,6 +292,9 @@ end -- Finds the plugin that has this path ---@param path string function M.find(path) + if not Config.spec then + return + end local lua = path:find("/lua/", 1, true) if lua then local name = path:sub(1, lua - 1) diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 132d096..91f432a 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -26,7 +26,7 @@ describe("plugin spec url/name", function() end local spec = Plugin.Spec.new(test[1]) local plugins = vim.tbl_values(spec.plugins) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) assert.equal(1, #plugins) assert.same(test[2], plugins[1]) end) @@ -43,7 +43,7 @@ describe("plugin spec opt", function() } for _, test in ipairs(tests) do local spec = Plugin.Spec.new(vim.deepcopy(test)) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) Config.plugins = spec.plugins Plugin.update_state() assert(vim.tbl_count(spec.plugins) == 3) @@ -95,7 +95,7 @@ describe("plugin spec opt", function() } for _, test in ipairs(tests) do local spec = Plugin.Spec.new(vim.deepcopy(test)) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) Config.plugins = spec.plugins Plugin.update_state() spec = Plugin.Spec.new(test) @@ -131,7 +131,7 @@ describe("plugin spec opt", function() it("handles opt from dep", function() Config.options.defaults.lazy = false local spec = Plugin.Spec.new({ "foo/dep1", { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } } }) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) Config.plugins = spec.plugins Plugin.update_state() assert.same(3, vim.tbl_count(spec.plugins)) @@ -147,7 +147,7 @@ describe("plugin spec opt", function() do Config.options.defaults.lazy = true local spec = Plugin.Spec.new({ "foo/bar" }) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) Config.plugins = spec.plugins Plugin.update_state() assert(spec.plugins.bar.lazy == true) @@ -164,7 +164,7 @@ describe("plugin spec opt", function() it("handles opt from dep", function() Config.options.defaults.lazy = false local spec = Plugin.Spec.new({ "foo/bar", event = "foo" }) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) Config.plugins = spec.plugins Plugin.update_state() assert.same(1, vim.tbl_count(spec.plugins)) @@ -180,7 +180,7 @@ describe("plugin spec opt", function() } for _, test in ipairs(tests) do local spec = Plugin.Spec.new(test) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) assert(vim.tbl_count(spec.plugins) == 1) assert(type(spec.plugins.bar.event) == "table") assert(#spec.plugins.bar.event == 2) @@ -188,34 +188,12 @@ describe("plugin spec opt", function() assert(vim.tbl_contains(spec.plugins.bar.event, "mod2")) end end) - - it("refuses to merge", function() - local spec = Plugin.Spec.new({ - { "foo/dep1", config = 1 }, - { - "foo/bar", - dependencies = { { "foo/dep1", config = 2 }, "foo/dep2" }, - }, - }) - assert(#spec.errors > 0) - end) - - -- it("recursive deps", function() - -- local spec = Plugin.Spec.new({ - -- "nvim-telescope/telescope.nvim", - -- dependencies = { - -- "nvim-lua/plenary.nvim", - -- { "nvim-telescope/telescope-fzf-native.nvim", build = "make" }, - -- { "nvim-telescope/telescope-frecency.nvim", dependencies = "kkharji/sqlite.lua" }, - -- }, - -- }) - -- end) end) it("handles opt from dep", function() Config.options.defaults.lazy = false local spec = Plugin.Spec.new({ "foo/dep1", { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } } }) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) Config.plugins = spec.plugins Plugin.update_state() assert.same(3, vim.tbl_count(spec.plugins)) @@ -231,7 +209,7 @@ describe("plugin spec opt", function() do Config.options.defaults.lazy = true local spec = Plugin.Spec.new({ "foo/bar" }) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) Config.plugins = spec.plugins Plugin.update_state() assert(spec.plugins.bar.lazy == true) @@ -248,7 +226,7 @@ describe("plugin spec opt", function() it("handles opt from dep", function() Config.options.defaults.lazy = false local spec = Plugin.Spec.new({ "foo/bar", event = "foo" }) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) Config.plugins = spec.plugins Plugin.update_state() assert.same(1, vim.tbl_count(spec.plugins)) @@ -264,7 +242,7 @@ describe("plugin spec opt", function() } for _, test in ipairs(tests) do local spec = Plugin.Spec.new(test) - assert(#spec.errors == 0) + assert(#spec.notifs == 0) assert(vim.tbl_count(spec.plugins) == 1) assert(type(spec.plugins.bar.event) == "table") assert(#spec.plugins.bar.event == 2) @@ -272,26 +250,4 @@ describe("plugin spec opt", function() assert(vim.tbl_contains(spec.plugins.bar.event, "mod2")) end end) - - it("refuses to merge", function() - local spec = Plugin.Spec.new({ - { "foo/dep1", config = 1 }, - { - "foo/bar", - dependencies = { { "foo/dep1", config = 2 }, "foo/dep2" }, - }, - }) - assert(#spec.errors > 0) - end) - - -- it("recursive deps", function() - -- local spec = Plugin.Spec.new({ - -- "nvim-telescope/telescope.nvim", - -- dependencies = { - -- "nvim-lua/plenary.nvim", - -- { "nvim-telescope/telescope-fzf-native.nvim", build = "make" }, - -- { "nvim-telescope/telescope-frecency.nvim", dependencies = "kkharji/sqlite.lua" }, - -- }, - -- }) - -- end) end) From 8b6a98ad26d41e41e9fb73e8c7230560bc9c576e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 2 Jan 2023 13:36:19 +0000 Subject: [PATCH 0576/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1f8cd82..6a32bd3 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 01 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 02 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 1ec8f08480493ea1faffebcd3c89ce9e65732054 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 14:46:49 +0100 Subject: [PATCH 0577/1610] fix(cache): properly return two values for finddir --- lua/lazy/core/cache.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 8d716e4..c967142 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -271,7 +271,7 @@ function M.find_dir(modname) local modpath = M.find(modname, { patterns = { "" } }) if modpath then local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - return root, root ~= modpath and modpath or nil + return root, (root ~= modpath and modpath or nil) end end From 9e90852a471205e92e524e9052cc2df101a24d80 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 14:50:34 +0100 Subject: [PATCH 0578/1610] fix(cache): autoloading was broken! --- lua/lazy/core/cache.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index c967142..10c3848 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -82,7 +82,7 @@ function M.check_autoload(modname, modpath) -- we're not interested in loader time, so calculate delta here M.stats.autoload.time = M.stats.autoload.time + uv.hrtime() - start -- only autoload when plugins have been loaded - if #require("lazy.core.config").plugins > 0 then + if not vim.tbl_isempty(require("lazy.core.config").plugins) then if not plugin._.loaded then if plugin.module == false then error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") From 60e96b478a5374ad1829a505549e3170332d1013 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 15:04:32 +0100 Subject: [PATCH 0579/1610] fix(loader): always load init.lua in plugin mods --- lua/lazy/core/cache.lua | 2 +- lua/lazy/core/util.lua | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 10c3848..f244f84 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -271,7 +271,7 @@ function M.find_dir(modname) local modpath = M.find(modname, { patterns = { "" } }) if modpath then local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - return root, (root ~= modpath and modpath or nil) + return root, modpath end end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index b6996f2..e39d3d8 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -200,12 +200,14 @@ function M.lsmod(modname, fn) return end - if modpath and vim.loop.fs_stat(modpath) then + if modpath and not modpath:find("/init%.lua$") and vim.loop.fs_stat(modpath) then fn(modname, modpath) end M.ls(root, function(path, name, type) - if name ~= "init.lua" and (type == "file" or type == "link") and name:sub(-4) == ".lua" then + if name == "init.lua" then + fn(modname, path) + elseif (type == "file" or type == "link") and name:sub(-4) == ".lua" then fn(modname .. "." .. name:sub(1, -5), path) elseif type == "directory" and vim.loop.fs_stat(path .. "/init.lua") then fn(modname .. "." .. name, path .. "/init.lua") From 9893430187d70f69aed552e286223671e8ece72f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 15:08:20 +0100 Subject: [PATCH 0580/1610] fix(cache): dont return directories in lsmod --- lua/lazy/core/cache.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index f244f84..6fa9711 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -271,7 +271,7 @@ function M.find_dir(modname) local modpath = M.find(modname, { patterns = { "" } }) if modpath then local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - return root, modpath + return root, (modpath ~= root and modpath or nil) end end From ce3e1fc5603b9f81165f331350bd2dd54b000d32 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 15:27:01 +0100 Subject: [PATCH 0581/1610] fix(plugin): only get plugin from spec when needed. --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 284860d..caac9b1 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -301,7 +301,7 @@ function M.find(path) local slash = name:reverse():find("/", 1, true) if slash then name = name:sub(#name - slash + 2) - return name and Config.spec.plugins[name] or nil + return name and Config.plugins[name] or Config.spec.plugins[name] or nil end end end From c1a50a7fc5900a3f89f1c5754bb48310ae619e35 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 2 Jan 2023 15:49:03 +0100 Subject: [PATCH 0582/1610] chore(main): release 7.9.0 (#265) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf11e46..0fcfd92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,48 @@ # Changelog +## [7.9.0](https://github.com/folke/lazy.nvim/compare/v7.8.0...v7.9.0) (2023-01-02) + + +### Features + +* **commands:** added build command to force rebuild of a plugin ([23c0587](https://github.com/folke/lazy.nvim/commit/23c0587791607bf77f7148c04722977f72537314)) +* **event:** track event trigger times ([46997de](https://github.com/folke/lazy.nvim/commit/46997de1c90620897e2a7f31bd9e4751c1223d21)) +* **help:** accept patterns for readme ([#269](https://github.com/folke/lazy.nvim/issues/269)) ([d521a25](https://github.com/folke/lazy.nvim/commit/d521a25cfc8608057eade67bfe7991f1ce1ed1b9)) +* **loader:** incrementally install missing plugins and rebuild spec, so imported specs from plugins work as expected ([2d06faa](https://github.com/folke/lazy.nvim/commit/2d06faa941998f76f0348b7b69c5ecdcb5f3db2a)) +* **spec:** added `import` to import other plugin modules ([919b7f5](https://github.com/folke/lazy.nvim/commit/919b7f5de3ba78d2030be617b64ada17bddd47da)) +* **spec:** added support for importing multiple spec modules with `import = "foobar"` ([39b6602](https://github.com/folke/lazy.nvim/commit/39b66027a5c5db9ba6f3a7253cc6513882c27f2a)) +* **spec:** allow mergig of config, priority and dependencies ([313015f](https://github.com/folke/lazy.nvim/commit/313015fdb4b44a38f4b5c9fd045c5d29a65f7c7a)) +* **spec:** show spec warnings in checkhealth only ([bc4133c](https://github.com/folke/lazy.nvim/commit/bc4133cb3e2d3dceed11d416ab1a0ece2d37f759)) +* **ui:** show new version that is available instead of general message ([34e2c78](https://github.com/folke/lazy.nvim/commit/34e2c78e0690a93196b5e59bbc9e050dfd6f3986)) +* **ui:** when updating to a new version, show the version instead of the commit refs ([0fadb5e](https://github.com/folke/lazy.nvim/commit/0fadb5e1cec709de839ecd6937b338b9201734ad)) +* **util:** added trackfn that wraps a function and tracks timings ([50a456c](https://github.com/folke/lazy.nvim/commit/50a456c189a6ea68f7681c95fe5cfa9c968e4fc6)) + + +### Bug Fixes + +* **cache:** allow lazyvim as a plugin ([f6b0172](https://github.com/folke/lazy.nvim/commit/f6b0172e92c502bd4b1482cbb8bed4e6e3231357)) +* **cache:** autoloading was broken! ([9e90852](https://github.com/folke/lazy.nvim/commit/9e90852a471205e92e524e9052cc2df101a24d80)) +* **cache:** dont return directories in lsmod ([9893430](https://github.com/folke/lazy.nvim/commit/9893430187d70f69aed552e286223671e8ece72f)) +* **cache:** keep ordering of topmods the same as in rtp ([11eee43](https://github.com/folke/lazy.nvim/commit/11eee43c7ee63a71b08009769437e8a10814a48c)) +* **cache:** only autoload when plugins have been parsed. Needed to support `import` ([0bc73db](https://github.com/folke/lazy.nvim/commit/0bc73db503e550076c0a8effb976a778c7cf5a6a)) +* **cache:** properly return two values for finddir ([1ec8f08](https://github.com/folke/lazy.nvim/commit/1ec8f08480493ea1faffebcd3c89ce9e65732054)) +* **commands:** fixed plugin completion for commands ([205ce42](https://github.com/folke/lazy.nvim/commit/205ce42cdc93bc62b1c2ae1c754180c5a23be8de)) +* **fetch:** always fetch latest origin tags. Fixes [#264](https://github.com/folke/lazy.nvim/issues/264) ([a9de591](https://github.com/folke/lazy.nvim/commit/a9de5910f22faf9036a8297c8fd4e3d47eb8baa6)) +* **handler:** properly show errors generated by setting up handlers ([4d77cf2](https://github.com/folke/lazy.nvim/commit/4d77cf2efea3ddec1bc2a335f90bf3a1cfe19db2)) +* **health:** always use main spec ([6ff480b](https://github.com/folke/lazy.nvim/commit/6ff480bdee276265e69f644877706ccb11892799)) +* **help:** properly escape helptags search pattern ([#268](https://github.com/folke/lazy.nvim/issues/268)) ([1edd1b8](https://github.com/folke/lazy.nvim/commit/1edd1b8945ee91cdfd61654af96c427dce285a9d)) +* **loader:** always load init.lua in plugin mods ([60e96b4](https://github.com/folke/lazy.nvim/commit/60e96b478a5374ad1829a505549e3170332d1013)) +* **loader:** setup handlers after installing missing plugins. Fixes [#272](https://github.com/folke/lazy.nvim/issues/272) ([b23a5dc](https://github.com/folke/lazy.nvim/commit/b23a5dc8d5d873e3c53283a376c9d9b5ee33697f)) +* **plugin:** only get plugin from spec when needed. ([ce3e1fc](https://github.com/folke/lazy.nvim/commit/ce3e1fc5603b9f81165f331350bd2dd54b000d32)) +* **spec:** allow a spec module to be on the rtp and not only in config ([51c23b6](https://github.com/folke/lazy.nvim/commit/51c23b661e695d3998893bfd71de2646a6190ad4)) +* **spec:** normalize deps before adding spec to make sure merging works as expected ([7d75598](https://github.com/folke/lazy.nvim/commit/7d755987ba6ea6ef8a3213f2119c5e31810ac913)) + + +### Performance Improvements + +* **cache:** cache all lua files till UIEnter instead of VimEnter ([77ff7be](https://github.com/folke/lazy.nvim/commit/77ff7beaa49769961b01b4d5b9099b4536ba1de4)) +* track some additional cputimes ([d992387](https://github.com/folke/lazy.nvim/commit/d99238791289e7ee5bd847fd10ac3a93ab3422e6)) + ## [7.8.0](https://github.com/folke/lazy.nvim/compare/v7.7.0...v7.8.0) (2022-12-31) From ddcdc5e4472a5f9e0ead8afd38e4fed2ec882617 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 17:10:54 +0100 Subject: [PATCH 0583/1610] fix(stats): use fallback for cputime on windows. Fixes #280 --- lua/lazy/stats.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index df10593..9042c3a 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -21,7 +21,7 @@ M.C = nil function M.on_ui_enter() M._stats.startuptime = M.track("UIEnter") - M._stats.startuptime_cputime = M.C ~= false + M._stats.startuptime_cputime = M.C.clock_gettime ~= nil vim.cmd([[do User LazyVimStarted]]) end @@ -33,7 +33,7 @@ end function M.cputime() if M.C == nil then - local ok = pcall(function() + pcall(function() ffi.cdef([[ typedef long time_t; typedef int clockid_t; @@ -44,9 +44,9 @@ function M.cputime() int clock_gettime(clockid_t clk_id, struct timespec *tp); ]]) end) - M.C = ok and ffi.C or false + M.C = ffi.C end - if M.C then + if M.C.clock_gettime then local pnano = assert(ffi.new("nanotime[?]", 1)) local CLOCK_PROCESS_CPUTIME_ID = jit.os == "OSX" and 12 or 2 ffi.C.clock_gettime(CLOCK_PROCESS_CPUTIME_ID, pnano) From e039ff6e2888a75ede7bc02a281e1f2f1190e4dc Mon Sep 17 00:00:00 2001 From: colton <cmpadden@users.noreply.github.com> Date: Mon, 2 Jan 2023 11:20:32 -0500 Subject: [PATCH 0584/1610] docs: fix references to config.plugins (#282) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 61f95da..65d5631 100644 --- a/README.md +++ b/README.md @@ -661,8 +661,8 @@ For a real-life example, you can check my personal dots: - [init.lua](https://github.com/folke/dot/blob/master/config/nvim/init.lua) where I require `config.lazy` - [config.lazy](https://github.com/folke/dot/blob/master/config/nvim/lua/config/lazy.lua) where I bootstrap and setup **lazy.nvim** -- [config.plugins](https://github.com/folke/dot/blob/master/config/nvim/lua/config/plugins/init.lua) is my main plugin config module -- Any submodule of [config.plugins (submodules)](https://github.com/folke/dot/tree/master/config/nvim/lua/config/plugins) will be automatically loaded as well. +- [config.plugins](https://github.com/folke/dot/blob/master/config/nvim/lua/plugins/init.lua) is my main plugin config module +- Any submodule of [config.plugins (submodules)](https://github.com/folke/dot/tree/master/config/nvim/lua/plugins) will be automatically loaded as well. ## 📦 Migration Guide From 2ea0751a23f72e9920e2b1c6077e9d33df8f1bf4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 2 Jan 2023 16:21:19 +0000 Subject: [PATCH 0585/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6a32bd3..4dd56d5 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -723,8 +723,8 @@ For a real-life example, you can check my personal dots: - init.lua <https://github.com/folke/dot/blob/master/config/nvim/init.lua> where I require `config.lazy` - config.lazy <https://github.com/folke/dot/blob/master/config/nvim/lua/config/lazy.lua> where I bootstrap and setup **lazy.nvim** -- config.plugins <https://github.com/folke/dot/blob/master/config/nvim/lua/config/plugins/init.lua> is my main plugin config module -- Any submodule of config.plugins (submodules) <https://github.com/folke/dot/tree/master/config/nvim/lua/config/plugins> will be automatically loaded as well. +- config.plugins <https://github.com/folke/dot/blob/master/config/nvim/lua/plugins/init.lua> is my main plugin config module +- Any submodule of config.plugins (submodules) <https://github.com/folke/dot/tree/master/config/nvim/lua/plugins> will be automatically loaded as well. MIGRATION GUIDE *lazy.nvim-migration-guide* From 85173dcc4d7a39e67370571316a6290f31a0de4a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 17:42:12 +0100 Subject: [PATCH 0586/1610] fix(stats): windows --- lua/lazy/stats.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index 9042c3a..9297ac9 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -21,7 +21,7 @@ M.C = nil function M.on_ui_enter() M._stats.startuptime = M.track("UIEnter") - M._stats.startuptime_cputime = M.C.clock_gettime ~= nil + M._stats.startuptime_cputime = M.C ~= false vim.cmd([[do User LazyVimStarted]]) end @@ -33,6 +33,7 @@ end function M.cputime() if M.C == nil then + M.C = false pcall(function() ffi.cdef([[ typedef long time_t; @@ -43,10 +44,12 @@ function M.cputime() } nanotime; int clock_gettime(clockid_t clk_id, struct timespec *tp); ]]) + if M.C.clock_gettime then + M.C = ffi.C + end end) - M.C = ffi.C end - if M.C.clock_gettime then + if M.C then local pnano = assert(ffi.new("nanotime[?]", 1)) local CLOCK_PROCESS_CPUTIME_ID = jit.os == "OSX" and 12 or 2 ffi.C.clock_gettime(CLOCK_PROCESS_CPUTIME_ID, pnano) From 277a2ab10baeebf64548a6b5a606d7b82f8e3165 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 19:01:02 +0100 Subject: [PATCH 0587/1610] fix(git): better errors when a branch/tag/version could not be found. Fixes #276 --- lua/lazy/manage/task/git.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 376245d..d94d769 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -34,6 +34,12 @@ M.log = { elseif opts.check then local info = assert(Git.info(self.plugin.dir)) local target = assert(Git.get_target(self.plugin)) + if not target.commit then + for k, v in pairs(target) do + error(k .. " '" .. v .. "' not found") + end + error("no target commit found") + end assert(target.commit, self.plugin.name .. " " .. target.branch) if target.commit ~= info.commit then self.plugin._.updates = { from = info, to = target } From 06db1ec3c6baa9460e42ef8ed4d2cc2613b194cb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 2 Jan 2023 20:50:10 +0100 Subject: [PATCH 0588/1610] fix(stats): fixed cputime on linux --- lua/lazy/stats.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index 9297ac9..4a2b02a 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -44,7 +44,7 @@ function M.cputime() } nanotime; int clock_gettime(clockid_t clk_id, struct timespec *tp); ]]) - if M.C.clock_gettime then + if ffi.C.clock_gettime then M.C = ffi.C end end) From b5f4106892254c748c49a42e07acd80964cb0bce Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 09:12:43 +0100 Subject: [PATCH 0589/1610] fix(stats): more robust checks for native cputime --- lua/lazy/stats.lua | 27 ++++++++++++++++++--------- lua/lazy/view/render.lua | 2 +- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index 4a2b02a..facc9dc 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -9,19 +9,18 @@ M._stats = { -- 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. - startuptime_cputime = false, + real_cputime = false, count = 0, -- total number of plugins loaded = 0, -- number of loaded plugins ---@type table<string, number> times = {}, } ----@type ffi.namespace*|boolean +---@type ffi.namespace* M.C = nil function M.on_ui_enter() M._stats.startuptime = M.track("UIEnter") - M._stats.startuptime_cputime = M.C ~= false vim.cmd([[do User LazyVimStarted]]) end @@ -33,7 +32,6 @@ end function M.cputime() if M.C == nil then - M.C = false pcall(function() ffi.cdef([[ typedef long time_t; @@ -44,19 +42,30 @@ function M.cputime() } nanotime; int clock_gettime(clockid_t clk_id, struct timespec *tp); ]]) - if ffi.C.clock_gettime then - M.C = ffi.C - end + M.C = ffi.C end) end - if M.C then + + local function real() local pnano = assert(ffi.new("nanotime[?]", 1)) local CLOCK_PROCESS_CPUTIME_ID = jit.os == "OSX" and 12 or 2 ffi.C.clock_gettime(CLOCK_PROCESS_CPUTIME_ID, pnano) return tonumber(pnano[0].tv_sec) / 1e6 + tonumber(pnano[0].tv_nsec) / 1e6 - else + end + + local function fallback() return (vim.loop.hrtime() - require("lazy")._start) / 1e6 end + + local ok, ret = pcall(real) + if ok then + M.cputime = real + M._stats.real_cputime = true + return ret + else + M.cputime = fallback + return fallback() + end end function M.stats() diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index e431d34..0784ff5 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -543,7 +543,7 @@ function M:profile() local stats = require("lazy.stats").stats() local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100) self:append("Startuptime: ", "LazyH2"):append(ms .. "ms", "Number"):nl():nl() - if stats.startuptime_cputime then + if stats.real_cputime then self:append("Based on the actual CPU time of the Neovim process till "):append("UIEnter", "LazySpecial") self:append("."):nl() self:append("This is more accurate than ") From e749e68b68b66d7f1c8284941b8cca9fd3cd9482 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 09:13:11 +0100 Subject: [PATCH 0590/1610] fix(ui): check if win is still valid --- lua/lazy/view/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 7a3c595..cd91c4c 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -31,7 +31,7 @@ function M.show(mode) return end - M.view = (M.view and M.view.win) and M.view or M.create() + M.view = (M.view and M.view.win and vim.api.nvim_win_is_valid(M.view.win)) and M.view or M.create() if mode then M.view.state.mode = mode end From ff1e322b4f9ffe502341947de3d1e2ca932ec491 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 09:13:22 +0100 Subject: [PATCH 0591/1610] style: debug --- lua/lazy/core/cache.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 6fa9711..c05c0af 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -190,7 +190,7 @@ function M.load(modkey, modpath) end entry.hash = hash - if M.debug and M.enabled then + if M.debug then vim.schedule(function() vim.notify("[cache:load] " .. modpath) end) From 3ad6d95a308823cdcd3f4515b44e90e134db779c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 08:14:21 +0000 Subject: [PATCH 0592/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4dd56d5..f4a8c8f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 02 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 03 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From dc9c92a9b37352eab36d5c4ff4542b7b3c927b6f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 09:36:35 +0100 Subject: [PATCH 0593/1610] fix(git): properly compare git commits with short refs --- lua/lazy/manage/checker.lua | 2 +- lua/lazy/manage/git.lua | 8 ++++++++ lua/lazy/manage/task/git.lua | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index f86e55e..79c265d 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -22,7 +22,7 @@ function M.fast_check(opts) plugin._.updates = nil local info = Git.info(plugin.dir) local ok, target = pcall(Git.get_target, plugin) - if ok and info and target and info.commit ~= target.commit then + if ok and info and target and not Git.eq(info, target) then plugin._.updates = { from = info, to = target } end end diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 54f14b4..bbdd134 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -32,6 +32,14 @@ function M.info(repo, details) end end +---@param a GitInfo +---@param b GitInfo +function M.eq(a, b) + local ra = a.commit and a.commit:sub(1, 7) + local rb = b.commit and b.commit:sub(1, 7) + return ra == rb +end + function M.head(repo) return Util.head(repo .. "/.git/HEAD") end diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index d94d769..57388a6 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -41,7 +41,7 @@ M.log = { error("no target commit found") end assert(target.commit, self.plugin.name .. " " .. target.branch) - if target.commit ~= info.commit then + if not Git.eq(info, target) then self.plugin._.updates = { from = info, to = target } end table.insert(args, info.commit .. ".." .. target.commit) @@ -165,7 +165,7 @@ M.checkout = { -- dont run checkout if target is already reached. -- unless we just cloned, since then we won't have any data yet - if info.commit == target.commit and info.branch == target.branch then + if Git.eq(info, target) and info.branch == target.branch then self.plugin._.updated = { from = info.commit, to = info.commit, From 05aec48968f91803a53704c04f3fad3c64033256 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 10:34:53 +0100 Subject: [PATCH 0594/1610] feat(spec): allow overriding `Plugin.enabled` --- lua/lazy/core/plugin.lua | 68 +++++++++++++++++++++++--------------- tests/core/plugin_spec.lua | 20 +++++++++++ 2 files changed, 62 insertions(+), 26 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index caac9b1..1fbab67 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -8,6 +8,7 @@ local M = {} ---@class LazySpecLoader ---@field plugins table<string, LazyPlugin> +---@field disabled table<string, LazyPlugin> ---@field modules string[] ---@field notifs {msg:string, level:number, file?:string}[] ---@field importing? string @@ -18,6 +19,7 @@ M.Spec = Spec function Spec.new(spec) local self = setmetatable({}, { __index = Spec }) self.plugins = {} + self.disabled = {} self.modules = {} self.notifs = {} if spec then @@ -34,8 +36,15 @@ function Spec.get_name(pkg) end ---@param plugin LazyPlugin +---@param results? string[] ---@param is_dep? boolean -function Spec:add(plugin, is_dep) +function Spec:add(plugin, results, is_dep) + -- check if we already processed this spec. Can happen when a user uses the same instance of a spec in multiple specs + -- see https://github.com/folke/lazy.nvim/issues/45 + if plugin._ then + return results and table.insert(results, plugin.name) + end + if not plugin.url and plugin[1] then plugin.url = Config.options.git.url_format:format(plugin[1]) end @@ -74,9 +83,25 @@ function Spec:add(plugin, is_dep) plugin._ = {} plugin._.dep = is_dep - local other = self.plugins[plugin.name] - self.plugins[plugin.name] = other and self:merge(other, plugin) or plugin - return self.plugins[plugin.name] + local enabled = plugin.enabled + if enabled == nil then + enabled = self.disabled[plugin.name] == nil + else + enabled = plugin.enabled == true or (type(plugin.enabled) == "function" and plugin.enabled()) + end + + if enabled then + plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil + self.disabled[plugin.name] = nil + if self.plugins[plugin.name] then + plugin = self:merge(self.plugins[plugin.name], plugin) + end + self.plugins[plugin.name] = plugin + return results and table.insert(results, plugin.name) + else + self.disabled[plugin.name] = plugin + self.plugins[plugin.name] = nil + end end function Spec:error(msg) @@ -106,13 +131,14 @@ end ---@param results? string[] ---@param is_dep? boolean function Spec:normalize(spec, results, is_dep) - results = results or {} if type(spec) == "string" then if is_dep and not spec:find("/", 1, true) then -- spec is a plugin name - table.insert(results, spec) + if results then + table.insert(results, spec) + end else - table.insert(results, self:add({ spec }, is_dep).name) + self:add({ spec }, results, is_dep) end elseif #spec > 1 or Util.is_list(spec) then ---@cast spec LazySpec[] @@ -123,20 +149,8 @@ function Spec:normalize(spec, results, is_dep) ---@cast spec LazySpecImport self:import(spec) else - ---@cast spec LazyPluginSpec - if spec.enabled == nil or spec.enabled == true or (type(spec.enabled) == "function" and spec.enabled()) then - local plugin - -- check if we already processed this spec. Can happen when a user uses the same instance of a spec in multiple specs - -- see https://github.com/folke/lazy.nvim/issues/45 - if spec._ then - plugin = spec - else - ---@cast spec LazyPlugin - spec.dependencies = spec.dependencies and self:normalize(spec.dependencies, {}, true) or nil - plugin = self:add(spec, is_dep) - end - table.insert(results, plugin.name) - end + ---@cast spec LazyPlugin + self:add(spec, results, is_dep) end return results end @@ -266,12 +280,14 @@ function M.load() Config.spec:add({ "folke/lazy.nvim" }) -- override some lazy props local lazy = Config.spec.plugins["lazy.nvim"] - lazy.lazy = true - lazy.dir = Config.me - lazy.config = function() - error("lazy config should not be called") + if lazy then + lazy.lazy = true + lazy.dir = Config.me + lazy.config = function() + error("lazy config should not be called") + end + lazy._.loaded = {} end - lazy._.loaded = {} local existing = Config.plugins Config.plugins = Config.spec.plugins diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 91f432a..dc22bd7 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -250,4 +250,24 @@ describe("plugin spec opt", function() assert(vim.tbl_contains(spec.plugins.bar.event, "mod2")) end end) + + it("handles disabled", function() + local tests = { + [{ { "foo/bar" }, { "foo/bar", enabled = false } }] = false, + [{ { "foo/bar", enabled = false }, { "foo/bar" } }] = false, + [{ { "foo/bar", enabled = false }, { "foo/bar", enabled = true } }] = true, + [{ { "foo/bar" }, { "foo/bar", enabled = true } }] = true, + } + for test, ret in pairs(tests) do + local spec = Plugin.Spec.new(test) + assert(#spec.notifs == 0) + if ret then + assert(spec.plugins.bar) + assert(not spec.disabled.bar) + else + assert(not spec.plugins.bar) + assert(spec.disabled.bar) + end + end + end) end) From 299ffdfd538938e3241998de65d0a175fcf73f48 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 10:43:10 +0100 Subject: [PATCH 0595/1610] feat(ui): added section with disabled plugins --- lua/lazy/core/plugin.lua | 1 + lua/lazy/help.lua | 4 +++- lua/lazy/types.lua | 2 +- lua/lazy/view/render.lua | 3 +++ lua/lazy/view/sections.lua | 8 +++++++- 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 1fbab67..dd4ebfd 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -99,6 +99,7 @@ function Spec:add(plugin, results, is_dep) self.plugins[plugin.name] = plugin return results and table.insert(results, plugin.name) else + plugin._.kind = "disabled" self.disabled[plugin.name] = plugin self.plugins[plugin.name] = nil end diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index 2239b9a..599e2b4 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -38,7 +38,9 @@ function M.index(plugin) end function M.update() - vim.cmd.helptags(Config.plugins["lazy.nvim"].dir .. "/doc") + if Config.plugins["lazy.nvim"] then + vim.cmd.helptags(Config.plugins["lazy.nvim"].dir .. "/doc") + end local docs = Config.options.readme.root .. "/doc" vim.fn.mkdir(docs, "p") diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 3c5c5d1..c461c4c 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -1,5 +1,5 @@ ----@alias LazyPluginKind "normal"|"clean" +---@alias LazyPluginKind "normal"|"clean"|"disabled" ---@class LazyPluginState ---@field loaded? {[string]:string}|{time:number} diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 0784ff5..f5ce860 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -37,6 +37,7 @@ function M:update() self.plugins = vim.tbl_values(Config.plugins) vim.list_extend(self.plugins, vim.tbl_values(Config.to_clean)) + vim.list_extend(self.plugins, vim.tbl_values(Config.spec.disabled)) table.sort(self.plugins, function(a, b) return a.name < b.name end) @@ -99,6 +100,8 @@ function M:get_plugin(row) return plugin end end + elseif loc.kind == "disabled" then + return Config.spec.disabled[loc.name] else return Config.plugins[loc.name] end diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index d23cefd..8325332 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -83,7 +83,7 @@ return { }, { filter = function(plugin) - return not plugin._.installed + return not plugin._.installed and plugin._.kind ~= "disabled" end, title = "Not Installed", }, @@ -99,4 +99,10 @@ return { end, title = "Not Loaded", }, + { + filter = function(plugin) + return plugin._.kind == "disabled" + end, + title = "Disabled", + }, } From cdb998c6fec617b76063ff64e6e44eac7d0b6b7e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 11:16:15 +0100 Subject: [PATCH 0596/1610] fix(keys): make operator pending mode work. Fixes #286 --- lua/lazy/core/handler/keys.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 9597aa7..6054cfc 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -24,6 +24,9 @@ function M.retrigger(keys) c = type(c) == "number" and vim.fn.nr2char(c) or c pending = pending .. c end + if op and op ~= "" then + keys = "<esc>" .. op .. keys + end local feed = vim.api.nvim_replace_termcodes(keys, true, false, true) .. pending if vim.v.count ~= 0 then feed = vim.v.count .. feed From 2e3e65b0f7b16773f5f83ee4eea09fe6bca653cd Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 11:17:37 +0100 Subject: [PATCH 0597/1610] fix(keys): operator --- lua/lazy/core/handler/keys.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 6054cfc..0ac5c09 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -24,6 +24,7 @@ function M.retrigger(keys) c = type(c) == "number" and vim.fn.nr2char(c) or c pending = pending .. c end + local op = vim.v.operator if op and op ~= "" then keys = "<esc>" .. op .. keys end From e93f50fd1b49f09725ecd310a3cce2cd860ff5a0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 16:16:49 +0100 Subject: [PATCH 0598/1610] fix(keys): operator pending mode --- lua/lazy/core/handler/keys.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 0ac5c09..9399dff 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -25,14 +25,14 @@ function M.retrigger(keys) pending = pending .. c end local op = vim.v.operator - if op and op ~= "" then + if op and op ~= "" and vim.api.nvim_get_mode().mode:find("o") then keys = "<esc>" .. op .. keys end - local feed = vim.api.nvim_replace_termcodes(keys, true, false, true) .. pending + local feed = vim.api.nvim_replace_termcodes(keys, true, true, true) .. pending if vim.v.count ~= 0 then feed = vim.v.count .. feed end - vim.api.nvim_feedkeys(feed, "m", false) + vim.api.nvim_input(feed) end ---@param value string|LazyKeys @@ -75,7 +75,6 @@ function M:_add(value) local keys = M.parse(value) local lhs = keys[1] local opts = M.opts(keys) - opts.noremap = true vim.keymap.set(keys.mode, lhs, function() local key = self:key(value) local plugins = self.active[key] From 7b9fa284f8cd895b5831971058919cfceda6b39b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 16:17:15 +0100 Subject: [PATCH 0599/1610] style: better debug --- lua/lazy/core/cache.lua | 31 +++++++++++++++++++++++-------- lua/lazy/core/util.lua | 36 ++++++++++++++++++++++++++++++++---- lua/lazy/util.lua | 1 + 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index c05c0af..eee6b16 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -101,14 +101,31 @@ function M.disable() if not M.enabled then return end - if M.debug and vim.tbl_count(M.topmods) > 1 then - vim.schedule(function() - vim.notify("topmods:\n" .. vim.inspect(M.topmods), vim.log.levels.WARN, { title = "lazy.nvim" }) - end) - end -- selene:allow(global_usage) _G.loadfile = M._loadfile M.enabled = false + if M.debug and vim.tbl_count(M.topmods) > 1 then + M.log(M.topmods, vim.log.levels.WARN, { title = "topmods" }) + end + if M.debug then + local stats = vim.deepcopy(M.stats) + stats.time = (stats.time or 0) / 1e6 + stats.find.time = (stats.find.time or 0) / 1e6 + stats.autoload.time = (stats.autoload.time or 0) / 1e6 + M.log(stats, nil, { title = "stats" }) + end +end + +---@param msg string|table +---@param level? number +---@param opts? {lang?:string, title?:string} +function M.log(msg, level, opts) + if M.debug then + msg = vim.deepcopy(msg) + vim.schedule(function() + require("lazy.core.util").debug(msg, level, opts) + end) + end end function M.check_loaded(modname) @@ -191,9 +208,7 @@ function M.load(modkey, modpath) entry.hash = hash if M.debug then - vim.schedule(function() - vim.notify("[cache:load] " .. modpath) - end) + M.log("`" .. modpath .. "`", nil, { title = "Cache.load" }) end chunk, err = M._loadfile(entry.modpath) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index e39d3d8..31acdec 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -216,7 +216,16 @@ function M.lsmod(modname, fn) end ---@param msg string|string[] -function M.notify(msg, level) +---@param opts? {lang?:string, title?:string} +function M.notify(msg, level, opts) + if vim.in_fast_event() then + vim.schedule(function() + M.notify(msg, level, opts) + end) + return + end + + opts = opts or {} if type(msg) == "table" then msg = table.concat( vim.tbl_filter(function(line) @@ -225,17 +234,20 @@ function M.notify(msg, level) "\n" ) end + local lang = opts.lang or "markdown" vim.notify(msg, level, { on_open = function(win) + pcall(require, "nvim-treesitter") vim.wo[win].conceallevel = 3 vim.wo[win].concealcursor = "" vim.wo[win].spell = false local buf = vim.api.nvim_win_get_buf(win) - if not pcall(vim.treesitter.start, buf, "markdown") then - vim.bo[buf].filetype = "markdown" + if not pcall(vim.treesitter.start, buf, lang) then + vim.bo[buf].filetype = lang + vim.bo[buf].syntax = lang end end, - title = "lazy.nvim", + title = "lazy.nvim" .. (opts.title and ": " .. opts.title or ""), }) end @@ -254,4 +266,20 @@ function M.warn(msg) M.notify(msg, vim.log.levels.WARN) end +---@param msg string|table +---@param level? number +---@param opts? {lang?:string, title?:string} +function M.debug(msg, level, opts) + if not require("lazy.core.config").options.debug then + return + end + opts = opts or {} + if type(msg) == "string" then + M.notify(msg, level) + else + opts.lang = "lua" + M.notify(vim.inspect(msg), level, opts) + end +end + return M diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index d24794f..793e832 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -110,6 +110,7 @@ function M.open_cmd(cmd, opts) buffer = float.buf, callback = function() float:close() + vim.cmd.checktime() end, }) end From f36c7cb0dc39d1bc3d0ae56d096afd9012a25607 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 21:19:20 +0100 Subject: [PATCH 0600/1610] feat(version): allow version=false to override default version --- lua/lazy/manage/git.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index bbdd134..f104c5e 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -131,7 +131,7 @@ function M.get_target(plugin) commit = M.ref(plugin.dir, "tags/" .. plugin.tag), } end - local version = plugin.version or Config.options.defaults.version + local version = plugin.version == nil and Config.options.defaults.version or plugin.version if version then local last = Semver.last(M.get_versions(plugin.dir, version)) if last then From 953c2791d8c391bf720ae68e734078bb558329f6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 22:31:18 +0100 Subject: [PATCH 0601/1610] fix(util): made `Util.lsmod` more robust. See #298 --- lua/lazy/core/cache.lua | 8 +++--- lua/lazy/core/util.lua | 6 ++--- tests/core/util_spec.lua | 53 ++++++++++++++++++++++++++++++++++------ 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index eee6b16..3efcb55 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -257,14 +257,14 @@ function M.get_topmods(path) end ---@param modname string ----@return string?, string? -function M.find_dir(modname) +---@return string? +function M.find_root(modname) if M.cache[modname] then -- check if modname is in cache local modpath = M.cache[modname].modpath if M.check_path(modname, modpath) then local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - return root, modpath + return root end else -- in case modname is just a directory and not a real mod, @@ -286,7 +286,7 @@ function M.find_dir(modname) local modpath = M.find(modname, { patterns = { "" } }) if modpath then local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - return root, (modpath ~= root and modpath or nil) + return root end end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 31acdec..b1ba858 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -195,13 +195,13 @@ end ---@param fn fun(modname:string, modpath:string) function M.lsmod(modname, fn) local Cache = require("lazy.core.cache") - local root, modpath = Cache.find_dir(modname) + local root = Cache.find_root(modname) if not root then return end - if modpath and not modpath:find("/init%.lua$") and vim.loop.fs_stat(modpath) then - fn(modname, modpath) + if vim.loop.fs_stat(root .. ".lua") then + fn(modname, root .. ".lua") end M.ls(root, function(path, name, type) diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index 3dee0a8..655b71f 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -10,31 +10,68 @@ describe("util", function() it("lsmod lists all mods in dir", function() local tests = { { + root = "lua/foo", + mod = "foo", files = { "lua/foo/one.lua", "lua/foo/two.lua", "lua/foo/init.lua" }, - mods = { "foo", "foo.one", "foo.two" }, + mods = { "foo.one", "foo.two", "foo" }, }, { + root = "lua/foo", + mod = "foo", files = { "lua/foo/one.lua", "lua/foo/two.lua", "lua/foo.lua" }, - mods = { "foo", "foo.one", "foo.two" }, + mods = { "foo.one", "foo.two", "foo" }, }, { + root = "lua/foo", + mod = "foo", files = { "lua/foo/one.lua", "lua/foo/two.lua" }, mods = { "foo.one", "foo.two" }, }, + { + root = "lua/load-plugins", + mod = "load-plugins", + files = { "lua/load-plugins.lua" }, + mods = { "load-plugins" }, + }, } vim.opt.rtp:append(Helpers.path("")) - for _, test in ipairs(tests) do - Cache.cache = {} - table.sort(test.mods) + for t, test in ipairs(tests) do + local expected = vim.deepcopy(test.mods) + table.sort(expected) Helpers.fs_rm("") - Helpers.fs_create(test.files) + local files = Helpers.fs_create(test.files) + + -- test with empty cache + Cache.cache = {} + Cache.indexed = {} + Cache.indexed_rtp = false + local root = Cache.find_root(test.mod) + assert(root, "no root found for " .. test.mod .. " (test " .. t .. ")") + assert.same(Helpers.path(test.root), root) local mods = {} - Util.lsmod("foo", function(modname, modpath) + Util.lsmod(test.mod, function(modname, modpath) mods[#mods + 1] = modname end) table.sort(mods) - assert.same(test.mods, mods) + assert.same(expected, mods) + + -- fill the cache + Cache.cache = {} + for i, file in ipairs(files) do + Cache.cache[test.mods[i]] = { modpath = file } + end + Cache.indexed = {} + Cache.indexed_rtp = false + root = Cache.find_root(test.mod) + assert(root, "no root found for " .. test.mod .. " (test " .. t .. ")") + assert.same(Helpers.path(test.root), root) + mods = {} + Util.lsmod(test.mod, function(modname, modpath) + mods[#mods + 1] = modname + end) + table.sort(mods) + assert.same(expected, mods) end end) end) From 1fd80159d074e5c22b946d9b87f274a243ecf213 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 22:49:04 +0100 Subject: [PATCH 0602/1610] fix(spec): show error when users load a plugins module called `lazy` --- lua/lazy/core/plugin.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index dd4ebfd..2b3fbf2 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -158,6 +158,9 @@ end ---@param spec LazySpecImport function Spec:import(spec) + if spec.import == "lazy" then + return self:error("You can't name your plugins module `lazy`.") + end if spec.enabled == false or (type(spec.enabled) == "function" and not spec.enabled()) then return end From c85f929bd98032b35e09fbc5a510884caaa8a5c3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 22:50:14 +0100 Subject: [PATCH 0603/1610] fix(install): dont try re-installing failed missing plugins during startup. Fixes #303 --- lua/lazy/core/loader.lua | 9 ++++++--- lua/lazy/core/plugin.lua | 10 ++++++++++ lua/lazy/manage/checker.lua | 24 ++++++++++++++++++------ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index f9f2620..2cfdfe8 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -33,7 +33,12 @@ function M.setup() -- install missing plugins if Config.options.install.missing then Util.track("install") + local count = 0 while M.install_missing() do + count = count + 1 + if count > 5 then + break + end end Util.track() end @@ -51,7 +56,7 @@ end -- multiple rounds can happen when importing a spec from a missing plugin function M.install_missing() for _, plugin in pairs(Config.plugins) do - if not plugin._.installed then + if not (plugin._.installed or Plugin.has_errors(plugin)) then for _, colorscheme in ipairs(Config.options.install.colorscheme) do if pcall(vim.cmd.colorscheme, colorscheme) then break @@ -64,8 +69,6 @@ function M.install_missing() Cache.indexed[p.dir] = nil end end - -- clear plugins. no need to merge in this stage - Config.plugins = {} -- reload plugins Plugin.load() return true diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 2b3fbf2..3825960 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -326,4 +326,14 @@ function M.find(path) end end +---@param plugin LazyPlugin +function M.has_errors(plugin) + for _, task in ipairs(plugin._.tasks or {}) do + if task.error then + return true + end + end + return false +end + return M diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 79c265d..5597bbc 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -1,6 +1,7 @@ local Config = require("lazy.core.config") local Manage = require("lazy.manage") local Util = require("lazy.util") +local Plugin = require("lazy.core.plugin") local Git = require("lazy.manage.git") local M = {} @@ -31,13 +32,24 @@ function M.fast_check(opts) end function M.check() - Manage.check({ - show = false, - concurrency = Config.options.checker.concurrency, - }):wait(function() - M.report() + local errors = false + for _, plugin in pairs(Config.plugins) do + if Plugin.has_errors(plugin) then + errors = true + break + end + end + if errors then vim.defer_fn(M.check, Config.options.checker.frequency * 1000) - end) + else + Manage.check({ + show = false, + concurrency = Config.options.checker.concurrency, + }):wait(function() + M.report() + vim.defer_fn(M.check, Config.options.checker.frequency * 1000) + end) + end end ---@param notify? boolean From 1c854d7a6d37d7b2ab6926605e7341696c77fd6c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 3 Jan 2023 23:48:00 +0100 Subject: [PATCH 0604/1610] fix(health): check for all packages on the rtp, excluding `dist` packs --- lua/lazy/health.lua | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index a498dcf..7b8fe8a 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -1,4 +1,3 @@ -local Util = require("lazy.util") local Config = require("lazy.core.config") local M = {} @@ -6,11 +5,21 @@ local M = {} function M.check() vim.health.report_start("lazy.nvim") + local sites = vim.opt.packpath:get() + local default_site = vim.fn.stdpath("data") .. "/site" + if not vim.tbl_contains(sites, default_site) then + sites[#sites + 1] = default_site + end + local existing = false - Util.ls(vim.fn.stdpath("data") .. "/site/pack/", function(path) - existing = true - vim.health.report_warn("found existing packages at `" .. path .. "`") - end) + for _, site in pairs(sites) do + for _, packs in ipairs(vim.fn.expand(site .. "/pack/*", false, true)) do + if not packs:find("/dist$") and vim.loop.fs_stat(packs) then + existing = true + vim.health.report_warn("found existing packages at `" .. packs .. "`") + end + end + end if not existing then vim.health.report_ok("no existing packages found by other package managers") end From b2673f105704eb6f9d553bd1a7f66f2576f266b8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 00:27:31 +0100 Subject: [PATCH 0605/1610] style: debug formatting --- lua/lazy/core/cache.lua | 4 ++-- lua/lazy/core/util.lua | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 3efcb55..e67b1af 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -118,7 +118,7 @@ end ---@param msg string|table ---@param level? number ----@param opts? {lang?:string, title?:string} +---@param opts? {lang:string, title:string} function M.log(msg, level, opts) if M.debug then msg = vim.deepcopy(msg) @@ -208,7 +208,7 @@ function M.load(modkey, modpath) entry.hash = hash if M.debug then - M.log("`" .. modpath .. "`", nil, { title = "Cache.load" }) + M.log("`" .. modpath .. "`", vim.log.levels.WARN, { title = "Cache.load" }) end chunk, err = M._loadfile(entry.modpath) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index b1ba858..f1784d6 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -216,7 +216,7 @@ function M.lsmod(modname, fn) end ---@param msg string|string[] ----@param opts? {lang?:string, title?:string} +---@param opts? {lang:string, title:string} function M.notify(msg, level, opts) if vim.in_fast_event() then vim.schedule(function() @@ -268,14 +268,14 @@ end ---@param msg string|table ---@param level? number ----@param opts? {lang?:string, title?:string} +---@param opts? {lang:string, title:string} function M.debug(msg, level, opts) if not require("lazy.core.config").options.debug then return end opts = opts or {} if type(msg) == "string" then - M.notify(msg, level) + M.notify(msg, level, opts) else opts.lang = "lua" M.notify(vim.inspect(msg), level, opts) From 588caef4e97dca0a228ca85c3120104d5399011b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 00:30:14 +0100 Subject: [PATCH 0606/1610] test: fixed tests --- tests/manage/task_spec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index e172100..76608af 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -102,7 +102,7 @@ describe("task", function() task:start() assert(task:is_running()) task:wait() - assert.same(task.output, "foo\nbar\n") + assert(task.output == "foo\nbar\n" or task.output == "bar\nfoo\n") assert(done) assert(not task.error) end) From a11a317a922d4a343e611bed6629fe5a11d2cb82 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Jan 2023 00:32:33 +0100 Subject: [PATCH 0607/1610] chore(main): release 7.10.0 (#281) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fcfd92..0d82223 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # Changelog +## [7.10.0](https://github.com/folke/lazy.nvim/compare/v7.9.0...v7.10.0) (2023-01-03) + + +### Features + +* **spec:** allow overriding `Plugin.enabled` ([05aec48](https://github.com/folke/lazy.nvim/commit/05aec48968f91803a53704c04f3fad3c64033256)) +* **ui:** added section with disabled plugins ([299ffdf](https://github.com/folke/lazy.nvim/commit/299ffdfd538938e3241998de65d0a175fcf73f48)) +* **version:** allow version=false to override default version ([f36c7cb](https://github.com/folke/lazy.nvim/commit/f36c7cb0dc39d1bc3d0ae56d096afd9012a25607)) + + +### Bug Fixes + +* **git:** better errors when a branch/tag/version could not be found. Fixes [#276](https://github.com/folke/lazy.nvim/issues/276) ([277a2ab](https://github.com/folke/lazy.nvim/commit/277a2ab10baeebf64548a6b5a606d7b82f8e3165)) +* **git:** properly compare git commits with short refs ([dc9c92a](https://github.com/folke/lazy.nvim/commit/dc9c92a9b37352eab36d5c4ff4542b7b3c927b6f)) +* **health:** check for all packages on the rtp, excluding `dist` packs ([1c854d7](https://github.com/folke/lazy.nvim/commit/1c854d7a6d37d7b2ab6926605e7341696c77fd6c)) +* **install:** dont try re-installing failed missing plugins during startup. Fixes [#303](https://github.com/folke/lazy.nvim/issues/303) ([c85f929](https://github.com/folke/lazy.nvim/commit/c85f929bd98032b35e09fbc5a510884caaa8a5c3)) +* **keys:** make operator pending mode work. Fixes [#286](https://github.com/folke/lazy.nvim/issues/286) ([cdb998c](https://github.com/folke/lazy.nvim/commit/cdb998c6fec617b76063ff64e6e44eac7d0b6b7e)) +* **keys:** operator ([2e3e65b](https://github.com/folke/lazy.nvim/commit/2e3e65b0f7b16773f5f83ee4eea09fe6bca653cd)) +* **keys:** operator pending mode ([e93f50f](https://github.com/folke/lazy.nvim/commit/e93f50fd1b49f09725ecd310a3cce2cd860ff5a0)) +* **spec:** show error when users load a plugins module called `lazy` ([1fd8015](https://github.com/folke/lazy.nvim/commit/1fd80159d074e5c22b946d9b87f274a243ecf213)) +* **stats:** fixed cputime on linux ([06db1ec](https://github.com/folke/lazy.nvim/commit/06db1ec3c6baa9460e42ef8ed4d2cc2613b194cb)) +* **stats:** more robust checks for native cputime ([b5f4106](https://github.com/folke/lazy.nvim/commit/b5f4106892254c748c49a42e07acd80964cb0bce)) +* **stats:** use fallback for cputime on windows. Fixes [#280](https://github.com/folke/lazy.nvim/issues/280) ([ddcdc5e](https://github.com/folke/lazy.nvim/commit/ddcdc5e4472a5f9e0ead8afd38e4fed2ec882617)) +* **stats:** windows ([85173dc](https://github.com/folke/lazy.nvim/commit/85173dcc4d7a39e67370571316a6290f31a0de4a)) +* **ui:** check if win is still valid ([e749e68](https://github.com/folke/lazy.nvim/commit/e749e68b68b66d7f1c8284941b8cca9fd3cd9482)) +* **util:** made `Util.lsmod` more robust. See [#298](https://github.com/folke/lazy.nvim/issues/298) ([953c279](https://github.com/folke/lazy.nvim/commit/953c2791d8c391bf720ae68e734078bb558329f6)) + ## [7.9.0](https://github.com/folke/lazy.nvim/compare/v7.8.0...v7.9.0) (2023-01-02) From 507b695753b4a7e1eff75f578b7a04b6307e4bc6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 07:54:35 +0100 Subject: [PATCH 0608/1610] fix(keys): only replace localleader and maplocalleader. Fixes #307, fixes #308 --- lua/lazy/core/handler/keys.lua | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 9399dff..559e7e3 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -13,6 +13,19 @@ local Loader = require("lazy.core.loader") ---@class LazyKeysHandler:LazyHandler local M = {} +---@param feed string +function M.replace_special(feed) + for special, key in pairs({ leader = vim.g.mapleader, localleader = vim.g.maplocalleader }) do + local pattern = "<" + for i = 1, #special do + pattern = pattern .. "[" .. special:sub(i, i) .. special:upper():sub(i, i) .. "]" + end + pattern = pattern .. ">" + feed = feed:gsub(pattern, key) + end + return feed +end + function M.retrigger(keys) local pending = "" while true do @@ -28,10 +41,12 @@ function M.retrigger(keys) if op and op ~= "" and vim.api.nvim_get_mode().mode:find("o") then keys = "<esc>" .. op .. keys end - local feed = vim.api.nvim_replace_termcodes(keys, true, true, true) .. pending + local feed = keys .. pending + feed = M.replace_special(feed) if vim.v.count ~= 0 then feed = vim.v.count .. feed end + vim.notify(feed) vim.api.nvim_input(feed) end From 62214df989b626c8f31151e7226c45925e3b3af2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Jan 2023 06:55:41 +0000 Subject: [PATCH 0609/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f4a8c8f..fcef79c 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 03 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 04 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From e61b334cee143ebb136125d6faa0f18dc35eb6c0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 08:13:43 +0100 Subject: [PATCH 0610/1610] fix(diff): make diffview work again. Fixes #304 --- lua/lazy/view/diff.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lua/lazy/view/diff.lua b/lua/lazy/view/diff.lua index 03c47c4..63dc2e7 100644 --- a/lua/lazy/view/diff.lua +++ b/lua/lazy/view/diff.lua @@ -23,11 +23,13 @@ M.handlers = { ---@type LazyDiffFun ["diffview.nvim"] = function(plugin, diff) + local args if diff.commit then - vim.cmd.DiffviewOpen(("-C=%s"):format(plugin.dir) .. " " .. diff.commit) + args = ("-C=%s"):format(plugin.dir) .. " " .. diff.commit else - vim.cmd.DiffviewOpen(("-C=%s"):format(plugin.dir) .. " " .. diff.from .. ".." .. diff.to) + args = ("-C=%s"):format(plugin.dir) .. " " .. diff.from .. ".." .. diff.to end + vim.cmd("DiffviewOpen " .. args) end, ---@type LazyDiffFun From 2e875208268f0bbc9927bb9b245b00031b6c07d9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 08:57:50 +0100 Subject: [PATCH 0611/1610] fix(util): assume type is file when no type is returned by scandir. Fixes #306 --- lua/lazy/core/util.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index f1784d6..6724088 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -171,6 +171,9 @@ function M.ls(path, fn) local handle = vim.loop.fs_scandir(path) while handle do local name, t = vim.loop.fs_scandir_next(handle) + -- HACK: assume type is a file if no type returned + -- see https://github.com/folke/lazy.nvim/issues/306 + t = t or "file" if not name then break end From b4d4e6b41b0b5110019dc247db994ae294f23b77 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 09:07:30 +0100 Subject: [PATCH 0612/1610] fix(loader): move mapleader check to loader, so it can be set by spec files --- lua/lazy/core/loader.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 2cfdfe8..1b02342 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -42,6 +42,7 @@ function M.setup() end Util.track() end + Config.mapleader = vim.g.mapleader -- report any warnings & errors Config.spec:report() From 6d46a3028d6a376efc4efc3bdf8001d54e347f24 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 09:22:52 +0100 Subject: [PATCH 0613/1610] style(keys): remove debug output --- lua/lazy/core/handler/keys.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 559e7e3..c6ebdde 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -46,7 +46,6 @@ function M.retrigger(keys) if vim.v.count ~= 0 then feed = vim.v.count .. feed end - vim.notify(feed) vim.api.nvim_input(feed) end From bce0c6e327c953c644c20c043303826340596e8e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 09:35:00 +0100 Subject: [PATCH 0614/1610] perf(spec): more efficient merging of specs and added `Plugin._.super` --- lua/lazy/core/plugin.lua | 49 +++++++++++------------ lua/lazy/health.lua | 86 +++++++++++++++++++++++++--------------- lua/lazy/types.lua | 1 + 3 files changed, 77 insertions(+), 59 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 3825960..ccc2745 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -6,6 +6,9 @@ local Cache = require("lazy.core.cache") ---@class LazyCorePlugin local M = {} +local list_merge = { "dependencies" } +vim.list_extend(list_merge, vim.tbl_values(Handler.types)) + ---@class LazySpecLoader ---@field plugins table<string, LazyPlugin> ---@field disabled table<string, LazyPlugin> @@ -99,6 +102,7 @@ function Spec:add(plugin, results, is_dep) self.plugins[plugin.name] = plugin return results and table.insert(results, plugin.name) else + -- FIXME: we should somehow merge when needed plugin._.kind = "disabled" self.disabled[plugin.name] = plugin self.plugins[plugin.name] = nil @@ -198,36 +202,29 @@ end ---@param new LazyPlugin ---@return LazyPlugin function Spec:merge(old, new) - local is_dep = old._.dep and new._.dep + new._.dep = old._.dep and new._.dep - ---@diagnostic disable-next-line: no-unknown - for k, v in pairs(new) do - if k == "_" then - elseif old[k] ~= nil and old[k] ~= v then - if Handler.types[k] then - local values = type(v) == "string" and { v } or v - vim.list_extend(values, type(old[k]) == "string" and { old[k] } or old[k]) - ---@diagnostic disable-next-line: no-unknown - old[k] = values - elseif k == "config" or k == "priority" then - old[k] = v - elseif k == "dependencies" then - for _, dep in ipairs(v) do - if not vim.tbl_contains(old[k], dep) then - table.insert(old[k], dep) - end - end - else - old[k] = v - self:warn("Overwriting key `" .. k .. "`\n" .. vim.inspect({ old = old, new = new })) - end - else + for _, prop in ipairs(list_merge) do + if new[prop] and old[prop] then + ---@type any[] + local props = {} ---@diagnostic disable-next-line: no-unknown - old[k] = v + for _, value in ipairs(old[prop]) do + props[#props + 1] = value + end + ---@diagnostic disable-next-line: no-unknown + for _, value in ipairs(new[prop]) do + if not vim.tbl_contains(props, value) then + props[#props + 1] = value + end + end + ---@diagnostic disable-next-line: no-unknown + new[prop] = props end end - old._.dep = is_dep - return old + new._.super = old + setmetatable(new, { __index = old }) + return new end function M.update_state() diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 7b8fe8a..24b9de2 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -31,41 +31,10 @@ function M.check() vim.health.report_ok("packer_compiled.lua not found") end - local valid = { - 1, - "name", - "url", - "enabled", - "lazy", - "dev", - "dependencies", - "init", - "config", - "build", - "branch", - "tag", - "commit", - "version", - "module", - "pin", - "cmd", - "event", - "keys", - "ft", - "dir", - "priority", - "cond", - "_", - } local spec = Config.spec for _, plugin in pairs(spec.plugins) do - for key in pairs(plugin) do - if not vim.tbl_contains(valid, key) then - if key ~= "module" or type(plugin.module) ~= "boolean" then - vim.health.report_warn("{" .. plugin.name .. "}: unknown key <" .. key .. ">") - end - end - end + M.check_valid(plugin) + M.check_override(plugin) end if #spec.notifs > 0 then vim.health.report_error("Issues were reported when loading your specs:") @@ -82,4 +51,55 @@ function M.check() end end +---@param plugin LazyPlugin +function M.check_valid(plugin) + for key in pairs(plugin) do + if not vim.tbl_contains(M.valid, key) then + if key ~= "module" or type(plugin.module) ~= "boolean" then + vim.health.report_warn("{" .. plugin.name .. "}: unknown key <" .. key .. ">") + end + end + end +end + +---@param plugin LazyPlugin +function M.check_override(plugin) + if not plugin._.super then + return + end + + for key, value in pairs(plugin._.super) do + if key ~= "_" and plugin[key] and plugin[key] ~= value then + vim.health.report_warn("{" .. plugin.name .. "}: overriding <" .. key .. ">") + end + end +end + +M.valid = { + 1, + "name", + "url", + "enabled", + "lazy", + "dev", + "dependencies", + "init", + "config", + "build", + "branch", + "tag", + "commit", + "version", + "module", + "pin", + "cmd", + "event", + "keys", + "ft", + "dir", + "priority", + "cond", + "_", +} + return M diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index c461c4c..ab3832f 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -13,6 +13,7 @@ ---@field kind? LazyPluginKind ---@field dep? boolean True if this plugin is only in the spec as a dependency ---@field cond? boolean +---@field super? LazyPlugin ---@class LazyPluginHooks ---@field init? fun(LazyPlugin) Will always be run From 81cb352fe6150570b7dd7266e3053869ce40babc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 10:36:51 +0100 Subject: [PATCH 0615/1610] feat(spec): spec merging now properly works with `Plugin.enabled` --- lua/lazy/core/plugin.lua | 73 +++++++++++++++++++++++++++----------- tests/core/plugin_spec.lua | 1 + 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index ccc2745..cddeefc 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -86,27 +86,12 @@ function Spec:add(plugin, results, is_dep) plugin._ = {} plugin._.dep = is_dep - local enabled = plugin.enabled - if enabled == nil then - enabled = self.disabled[plugin.name] == nil - else - enabled = plugin.enabled == true or (type(plugin.enabled) == "function" and plugin.enabled()) - end - - if enabled then - plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil - self.disabled[plugin.name] = nil - if self.plugins[plugin.name] then - plugin = self:merge(self.plugins[plugin.name], plugin) - end - self.plugins[plugin.name] = plugin - return results and table.insert(results, plugin.name) - else - -- FIXME: we should somehow merge when needed - plugin._.kind = "disabled" - self.disabled[plugin.name] = plugin - self.plugins[plugin.name] = nil + plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil + if self.plugins[plugin.name] then + plugin = self:merge(self.plugins[plugin.name], plugin) end + self.plugins[plugin.name] = plugin + return results and table.insert(results, plugin.name) end function Spec:error(msg) @@ -117,6 +102,53 @@ function Spec:warn(msg) self:log(msg, vim.log.levels.WARN) end +function Spec:fix_disabled() + ---@type table<string,string[]> plugin to parent plugin + local dep_of = {} + + ---@type string[] dependencies of disabled plugins + local disabled_deps = {} + + for _, plugin in pairs(self.plugins) do + local enabled = not (plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled())) + if enabled then + for _, dep in ipairs(plugin.dependencies or {}) do + dep_of[dep] = dep_of[dep] or {} + table.insert(dep_of[dep], plugin.name) + end + else + plugin._.kind = "disabled" + self.plugins[plugin.name] = nil + self.disabled[plugin.name] = plugin + if plugin.dependencies then + vim.list_extend(disabled_deps, plugin.dependencies) + end + end + end + + -- check deps of disabled plugins + for _, dep in ipairs(disabled_deps) do + -- only check if the plugin is still enabled and it is a dep + if self.plugins[dep] and self.plugins[dep]._.dep then + -- check if the dep is still used by another plugin + local keep = false + for _, parent in ipairs(dep_of[dep] or {}) do + if self.plugins[parent] then + keep = true + break + end + end + -- disable the dep when no longer needed + if not keep then + local plugin = self.plugins[dep] + plugin._.kind = "disabled" + self.plugins[plugin.name] = nil + self.disabled[plugin.name] = plugin + end + end + end +end + ---@param msg string ---@param level number function Spec:log(msg, level) @@ -289,6 +321,7 @@ function M.load() end lazy._.loaded = {} end + Config.spec:fix_disabled() local existing = Config.plugins Config.plugins = Config.spec.plugins diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index dc22bd7..7995381 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -260,6 +260,7 @@ describe("plugin spec opt", function() } for test, ret in pairs(tests) do local spec = Plugin.Spec.new(test) + spec:fix_disabled() assert(#spec.notifs == 0) if ret then assert(spec.plugins.bar) From 09fd8fabd29eb6da82c3eb2be4b270f9de9b4d8c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 11:02:29 +0100 Subject: [PATCH 0616/1610] fix(loader): dont show error of missing plugins if they are disabled --- lua/lazy/core/loader.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 1b02342..c82654b 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -162,6 +162,8 @@ function M.load(plugins, reason) if type(plugin) == "string" then if Config.plugins[plugin] then plugin = Config.plugins[plugin] + elseif Config.spec.disabled[plugin] then + plugin = nil else Util.error("Plugin " .. plugin .. " not found") plugin = nil From a7ac2ad0204d63ece6ebca76ae906db53346c8a4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 12:40:00 +0100 Subject: [PATCH 0617/1610] feat(loader): disable plugins --- lua/lazy/core/loader.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c82654b..c2bc844 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -16,9 +16,13 @@ M.disabled_rtp_plugins = { packer_compiled = true } ---@type table<string,string> M.did_ftdetect = {} +function M.disable_rtp_plugin(plugin) + M.disabled_rtp_plugins[plugin] = true +end + function M.setup() for _, file in ipairs(Config.options.performance.rtp.disabled_plugins) do - M.disabled_rtp_plugins[file] = true + M.disable_rtp_plugin(file) end vim.api.nvim_create_autocmd("ColorSchemePre", { From d5e6bdf90c0eb22f7b4ead039905d8be149a569a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Jan 2023 12:44:35 +0100 Subject: [PATCH 0618/1610] chore(main): release 7.11.0 (#312) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d82223..191ee02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [7.11.0](https://github.com/folke/lazy.nvim/compare/v7.10.0...v7.11.0) (2023-01-04) + + +### Features + +* **loader:** disable plugins ([a7ac2ad](https://github.com/folke/lazy.nvim/commit/a7ac2ad0204d63ece6ebca76ae906db53346c8a4)) +* **spec:** spec merging now properly works with `Plugin.enabled` ([81cb352](https://github.com/folke/lazy.nvim/commit/81cb352fe6150570b7dd7266e3053869ce40babc)) + + +### Bug Fixes + +* **diff:** make diffview work again. Fixes [#304](https://github.com/folke/lazy.nvim/issues/304) ([e61b334](https://github.com/folke/lazy.nvim/commit/e61b334cee143ebb136125d6faa0f18dc35eb6c0)) +* **keys:** only replace localleader and maplocalleader. Fixes [#307](https://github.com/folke/lazy.nvim/issues/307), fixes [#308](https://github.com/folke/lazy.nvim/issues/308) ([507b695](https://github.com/folke/lazy.nvim/commit/507b695753b4a7e1eff75f578b7a04b6307e4bc6)) +* **loader:** dont show error of missing plugins if they are disabled ([09fd8fa](https://github.com/folke/lazy.nvim/commit/09fd8fabd29eb6da82c3eb2be4b270f9de9b4d8c)) +* **loader:** move mapleader check to loader, so it can be set by spec files ([b4d4e6b](https://github.com/folke/lazy.nvim/commit/b4d4e6b41b0b5110019dc247db994ae294f23b77)) +* **util:** assume type is file when no type is returned by scandir. Fixes [#306](https://github.com/folke/lazy.nvim/issues/306) ([2e87520](https://github.com/folke/lazy.nvim/commit/2e875208268f0bbc9927bb9b245b00031b6c07d9)) + + +### Performance Improvements + +* **spec:** more efficient merging of specs and added `Plugin._.super` ([bce0c6e](https://github.com/folke/lazy.nvim/commit/bce0c6e327c953c644c20c043303826340596e8e)) + ## [7.10.0](https://github.com/folke/lazy.nvim/compare/v7.9.0...v7.10.0) (2023-01-03) From 3bde7b5ba8b99941b314a75d8650a0a6c8552144 Mon Sep 17 00:00:00 2001 From: Tsakiris Tryfon <tr.tsakiris@gmail.com> Date: Wed, 4 Jan 2023 15:02:48 +0200 Subject: [PATCH 0619/1610] fix(keys): Use vim's default value for an unset g:mapleader (#316) --- lua/lazy/core/handler/keys.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index c6ebdde..dd55cef 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -15,7 +15,7 @@ local M = {} ---@param feed string function M.replace_special(feed) - for special, key in pairs({ leader = vim.g.mapleader, localleader = vim.g.maplocalleader }) do + for special, key in pairs({ leader = vim.g.mapleader or "\\", localleader = vim.g.maplocalleader or "\\" }) do local pattern = "<" for i = 1, #special do pattern = pattern .. "[" .. special:sub(i, i) .. special:upper():sub(i, i) .. "]" From dea43afc4adff21a6d5864a378459a140a702c0c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 17:50:57 +0100 Subject: [PATCH 0620/1610] feat(spec): allow import property on a plugin spec --- lua/lazy/core/plugin.lua | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index cddeefc..e9af209 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -45,7 +45,10 @@ function Spec:add(plugin, results, is_dep) -- check if we already processed this spec. Can happen when a user uses the same instance of a spec in multiple specs -- see https://github.com/folke/lazy.nvim/issues/45 if plugin._ then - return results and table.insert(results, plugin.name) + if results then + table.insert(results, plugin.name) + end + return plugin end if not plugin.url and plugin[1] then @@ -76,6 +79,7 @@ function Spec:add(plugin, results, is_dep) end else self:error("Invalid plugin spec " .. vim.inspect(plugin)) + return end plugin.event = type(plugin.event) == "string" and { plugin.event } or plugin.event @@ -91,7 +95,10 @@ function Spec:add(plugin, results, is_dep) plugin = self:merge(self.plugins[plugin.name], plugin) end self.plugins[plugin.name] = plugin - return results and table.insert(results, plugin.name) + if results then + table.insert(results, plugin.name) + end + return plugin end function Spec:error(msg) @@ -182,12 +189,19 @@ function Spec:normalize(spec, results, is_dep) for _, s in ipairs(spec) do self:normalize(s, results, is_dep) end + elseif spec[1] or spec.dir or spec.url then + ---@cast spec LazyPlugin + local plugin = self:add(spec, results, is_dep) + ---@diagnostic disable-next-line: cast-type-mismatch + ---@cast plugin LazySpecImport + if plugin and plugin.import then + self:import(plugin) + end elseif spec.import then ---@cast spec LazySpecImport self:import(spec) else - ---@cast spec LazyPlugin - self:add(spec, results, is_dep) + self:error("Invalid plugin spec " .. vim.inspect(spec)) end return results end From 886a91c688c57b59f86945127f5822db8f49cf8e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 20:23:36 +0100 Subject: [PATCH 0621/1610] ci: new templates --- .github/ISSUE_TEMPLATE/bug_report.yml | 15 ++++----------- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- .github/workflows/ci.yml | 8 ++------ 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e6b2b68..c7a92d3 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -12,11 +12,11 @@ body: label: Did you check docs and existing issues? description: Make sure you checked all of the below before submitting an issue options: - - label: I have read all the lazy docs + - label: I have read all the lazy.nvim docs required: true - - label: I have searched the existing issues of lazy + - label: I have searched the existing issues of lazy.nvim required: true - - label: I have searched the exsiting issues of the plugin I have a problem with + - label: I have searched the exsiting issues of plugins related to this issue required: true - type: input attributes: @@ -68,14 +68,7 @@ body: -- bootstrap lazy local lazypath = root .. "/plugins/lazy.nvim" if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "--single-branch", - "https://github.com/folke/lazy.nvim.git", - lazypath, - }) + vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath, }) end vim.opt.runtimepath:prepend(lazypath) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index ad7f1a1..7a10d84 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -8,7 +8,7 @@ body: label: Did you check the docs? description: Make sure you read all the docs before submitting a feature request options: - - label: I have read all the lazy docs + - label: I have read all the lazy.nvim docs required: true - type: textarea validations: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0012797..2adb58f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,17 +15,13 @@ jobs: - name: Install Neovim shell: bash run: | - if [ "$RUNNER_OS" == "Linux" ]; then wget -q https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.deb -O /tmp/nvim.deb sudo dpkg -i /tmp/nvim.deb - else - choco install neovim --pre - echo "C:/tools/neovim/nvim-win64/bin" >> $GITHUB_PATH - fi - name: Run Tests run: | nvim --version - nvim --headless -u tests/init.lua -c "PlenaryBustedDirectory tests// {minimal_init = 'tests//init.lua', sequential = true}" + [ ! -d tests ] && exit 0 + nvim --headless -u tests/init.lua -c "PlenaryBustedDirectory tests/ {minimal_init = 'tests/init.lua', sequential = true}" docs: runs-on: ubuntu-latest needs: tests From 457f0bb7cec1e86ab58b9895f9c2cc3088a724d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Jan 2023 22:50:23 +0100 Subject: [PATCH 0622/1610] chore(main): release 7.12.0 (#317) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 191ee02..9eac654 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [7.12.0](https://github.com/folke/lazy.nvim/compare/v7.11.0...v7.12.0) (2023-01-04) + + +### Features + +* **spec:** allow import property on a plugin spec ([dea43af](https://github.com/folke/lazy.nvim/commit/dea43afc4adff21a6d5864a378459a140a702c0c)) + + +### Bug Fixes + +* **keys:** Use vim's default value for an unset g:mapleader ([#316](https://github.com/folke/lazy.nvim/issues/316)) ([3bde7b5](https://github.com/folke/lazy.nvim/commit/3bde7b5ba8b99941b314a75d8650a0a6c8552144)) + ## [7.11.0](https://github.com/folke/lazy.nvim/compare/v7.10.0...v7.11.0) (2023-01-04) From c59c05c7a80693fda369ccab572f8eaca50a1b4f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Jan 2023 23:16:55 +0100 Subject: [PATCH 0623/1610] fix(loader): run plugin config before sourcing runtime --- .gitignore | 2 ++ lua/lazy/core/loader.lua | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e62ab00..cc5457a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ doc/tags debug .repro foo.* +*.log +data diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c2bc844..aaffe94 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -217,10 +217,10 @@ function M._load(plugin, reason) end, "Failed to load deps for " .. plugin.name) end - M.packadd(plugin.dir) if plugin.config then M.config(plugin) end + M.packadd(plugin.dir) plugin._.loaded.time = Util.track().time table.remove(M.loading) From 847ef091fa65e09cb682be0736b2b7d6a5d1649d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 5 Jan 2023 11:30:47 +0100 Subject: [PATCH 0624/1610] style: disabled stats debug --- lua/lazy/core/cache.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index e67b1af..b63cc87 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -107,7 +107,7 @@ function M.disable() if M.debug and vim.tbl_count(M.topmods) > 1 then M.log(M.topmods, vim.log.levels.WARN, { title = "topmods" }) end - if M.debug then + if M.debug and false then local stats = vim.deepcopy(M.stats) stats.time = (stats.time or 0) / 1e6 stats.find.time = (stats.find.time or 0) / 1e6 From e4f79a42d650c926ea12edb7dbe2efbe1031b723 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 5 Jan 2023 11:31:13 +0100 Subject: [PATCH 0625/1610] fix(util): Util.try can now work without an error message --- lua/lazy/core/util.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 6724088..48582c0 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -92,7 +92,7 @@ function M.try(fn, opts) end level = level + 1 end - msg = msg .. "\n\n" .. err + msg = (msg and (msg .. "\n\n") or "") .. err if #trace > 0 then msg = msg .. "\n\n# stacktrace:\n" .. table.concat(trace, "\n") end From af351f69ba94b526eecf6488e0d6c86eb6875e65 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 10:31:58 +0000 Subject: [PATCH 0626/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index fcef79c..f0599b9 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 04 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 05 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From b2dec14824383137440040da0d9d107f3a29c656 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 5 Jan 2023 13:42:17 +0100 Subject: [PATCH 0627/1610] fix(cache): check full paths of cached modpaths. Fixes #324 --- lua/lazy/core/cache.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index b63cc87..edba74a 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -55,7 +55,7 @@ function M.check_path(modname, modpath) -- check rtp excluding plugins. This is a very small list, so should be fast for _, path in ipairs(M.get_rtp()) do - if modpath:find(path, 1, true) == 1 then + if modpath:find(path .. "/", 1, true) == 1 then return true end end From aadc9126947923de074737795738714011d75b65 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 5 Jan 2023 14:28:28 +0100 Subject: [PATCH 0628/1610] docs: removed my dots in favor of LazyVim --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 65d5631..85020ab 100644 --- a/README.md +++ b/README.md @@ -657,12 +657,12 @@ return { - 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 my personal dots: +For a real-life example, you can check [LazyVim](https://github.com/folke/LazyVim), +a starter template for lazy Neovim users. -- [init.lua](https://github.com/folke/dot/blob/master/config/nvim/init.lua) where I require `config.lazy` -- [config.lazy](https://github.com/folke/dot/blob/master/config/nvim/lua/config/lazy.lua) where I bootstrap and setup **lazy.nvim** -- [config.plugins](https://github.com/folke/dot/blob/master/config/nvim/lua/plugins/init.lua) is my main plugin config module -- Any submodule of [config.plugins (submodules)](https://github.com/folke/dot/tree/master/config/nvim/lua/plugins) will be automatically loaded as well. +- [init.lua](https://github.com/folke/LazyVim/blob/main/init.lua) where `lazyvim.config.lazy` is required +- [lazyvim.config.lazy](https://github.com/folke/LazyVim/blob/main/lua/lazyvim/config/lazy.lua) where we setup **lazy.nvim** +- [lazyvim.plugins](https://github.com/folke/LazyVim/tree/main/lua/lazyvim/plugins) contains all the plugin specs that will be loaded ## 📦 Migration Guide From caf3897841ec870db66e7785c32c93a22a54bacf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 13:29:20 +0000 Subject: [PATCH 0629/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f0599b9..9f8d335 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -718,13 +718,13 @@ Example: - 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 my personal dots: +For a real-life example, you can check LazyVim +<https://github.com/folke/LazyVim>, a starter template for lazy Neovim users. -- init.lua <https://github.com/folke/dot/blob/master/config/nvim/init.lua> where I require `config.lazy` -- config.lazy <https://github.com/folke/dot/blob/master/config/nvim/lua/config/lazy.lua> where I bootstrap and setup **lazy.nvim** -- config.plugins <https://github.com/folke/dot/blob/master/config/nvim/lua/plugins/init.lua> is my main plugin config module -- Any submodule of config.plugins (submodules) <https://github.com/folke/dot/tree/master/config/nvim/lua/plugins> will be automatically loaded as well. +- init.lua <https://github.com/folke/LazyVim/blob/main/init.lua> where `lazyvim.config.lazy` is required +- lazyvim.config.lazy <https://github.com/folke/LazyVim/blob/main/lua/lazyvim/config/lazy.lua> where we setup **lazy.nvim** +- lazyvim.plugins <https://github.com/folke/LazyVim/tree/main/lua/lazyvim/plugins> contains all the plugin specs that will be loaded MIGRATION GUIDE *lazy.nvim-migration-guide* From d3b0d3e851b5609a2630e0307e18dc852efd0bd0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 14:32:13 +0100 Subject: [PATCH 0630/1610] chore(main): release 7.12.1 (#321) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9eac654..76760e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [7.12.1](https://github.com/folke/lazy.nvim/compare/v7.12.0...v7.12.1) (2023-01-05) + + +### Bug Fixes + +* **cache:** check full paths of cached modpaths. Fixes [#324](https://github.com/folke/lazy.nvim/issues/324) ([b2dec14](https://github.com/folke/lazy.nvim/commit/b2dec14824383137440040da0d9d107f3a29c656)) +* **loader:** run plugin config before sourcing runtime ([c59c05c](https://github.com/folke/lazy.nvim/commit/c59c05c7a80693fda369ccab572f8eaca50a1b4f)) +* **util:** Util.try can now work without an error message ([e4f79a4](https://github.com/folke/lazy.nvim/commit/e4f79a42d650c926ea12edb7dbe2efbe1031b723)) + ## [7.12.0](https://github.com/folke/lazy.nvim/compare/v7.11.0...v7.12.0) (2023-01-04) From 13af39b83ebbe632b265d5b84c3a0225022d4359 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 5 Jan 2023 16:52:02 +0100 Subject: [PATCH 0631/1610] refactor: easier to pass window options for floats --- lua/lazy/util.lua | 23 ++++++++---- lua/lazy/view/float.lua | 80 ++++++++++++++++++++-------------------- lua/lazy/view/init.lua | 6 ++- lua/lazy/view/render.lua | 2 +- 4 files changed, 62 insertions(+), 49 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 793e832..d1b4257 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -5,18 +5,22 @@ function M.file_exists(file) return vim.loop.fs_stat(file) ~= nil end ----@param opts? LazyViewOptions +---@param opts? LazyFloatOptions function M.float(opts) - opts = vim.tbl_deep_extend("force", { - win_opts = { zindex = 60, border = "none" }, - margin = { top = 3, left = 2, right = 2 }, - }, opts or {}) + opts = opts or {} + if require("lazy.view").visible() then + opts = vim.tbl_deep_extend("force", { + zindex = 60, + border = "none", + margin = { top = 3, left = 2, right = 2 }, + }, opts) + end return require("lazy.view.float")(opts) end function M.open(uri) if M.file_exists(uri) then - return M.float({ win_opts = { style = "" }, file = uri }) + return M.float({ style = "", file = uri }) end local Config = require("lazy.core.config") local cmd @@ -89,8 +93,13 @@ function M.throttle(ms, fn) end end +---@class LazyCmdOpts +---@field cwd? string +---@field env? table<string,string> +---@field float? LazyFloatOptions + ---@param cmd string[] ----@param opts? {cwd:string, filetype:string, terminal?:boolean, close_on_exit?:boolean, enter?:boolean, float?:LazyViewOptions} +---@param opts? {cwd:string, filetype:string, terminal?:boolean, close_on_exit?:boolean, enter?:boolean, float?:LazyFloatOptions} function M.open_cmd(cmd, opts) opts = opts or {} local float = M.float(opts.float) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 5539f35..6b22052 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -1,21 +1,21 @@ local Config = require("lazy.core.config") local ViewConfig = require("lazy.view.config") ----@class LazyViewOptions +---@class LazyFloatOptions ---@field buf? number ---@field file? string ---@field margin? {top?:number, right?:number, bottom?:number, left?:number} ----@field win_opts LazyViewWinOpts ---@field size? {width:number, height:number} -local defaults = { - win_opts = {}, -} +---@field zindex? number +---@field style? "" | "minimal" +---@field border? "none" | "single" | "double" | "rounded" | "solid" | "shadow" ---@class LazyFloat ---@field buf number ---@field win number ----@field opts LazyViewOptions ----@overload fun(opts?:LazyViewOptions):LazyFloat +---@field opts LazyFloatOptions +---@field win_opts LazyWinOpts +---@overload fun(opts?:LazyFloatOptions):LazyFloat local M = {} setmetatable(M, { @@ -24,16 +24,33 @@ setmetatable(M, { end, }) ----@param opts? LazyViewOptions +---@param opts? LazyFloatOptions function M.new(opts) local self = setmetatable({}, { __index = M }) return self:init(opts) end ----@param opts? LazyViewOptions +---@param opts? LazyFloatOptions function M:init(opts) - self.opts = vim.tbl_deep_extend("force", defaults, opts or {}) - self.opts.size = vim.tbl_extend("keep", self.opts.size or {}, Config.options.ui.size) + self.opts = vim.tbl_deep_extend("force", { + size = Config.options.ui.size, + style = "minimal", + border = Config.options.ui.border, + zindex = 50, + }, opts or {}) + + ---@class LazyWinOpts + ---@field width number + ---@field height number + ---@field row number + ---@field col number + self.win_opts = { + relative = "editor", + style = self.opts.style ~= "" and self.opts.style or nil, + border = self.opts.border, + zindex = self.opts.zindex, + noautocmd = true, + } self:mount() self:on_key(ViewConfig.keys.close, self.close) self:on({ "BufDelete", "BufLeave", "BufHidden" }, self.close, { once = true }) @@ -44,25 +61,25 @@ function M:layout() local function size(max, value) return value > 1 and math.min(value, max) or math.floor(max * value) end - self.opts.win_opts.width = size(vim.o.columns, self.opts.size.width) - self.opts.win_opts.height = size(vim.o.lines, self.opts.size.height) - self.opts.win_opts.row = math.floor((vim.o.lines - self.opts.win_opts.height) / 2) - self.opts.win_opts.col = math.floor((vim.o.columns - self.opts.win_opts.width) / 2) + self.win_opts.width = size(vim.o.columns, self.opts.size.width) + self.win_opts.height = size(vim.o.lines, self.opts.size.height) + self.win_opts.row = math.floor((vim.o.lines - self.win_opts.height) / 2) + self.win_opts.col = math.floor((vim.o.columns - self.win_opts.width) / 2) if self.opts.margin then if self.opts.margin.top then - self.opts.win_opts.height = self.opts.win_opts.height - self.opts.margin.top - self.opts.win_opts.row = self.opts.win_opts.row + self.opts.margin.top + self.win_opts.height = self.win_opts.height - self.opts.margin.top + self.win_opts.row = self.win_opts.row + self.opts.margin.top end if self.opts.margin.right then - self.opts.win_opts.width = self.opts.win_opts.width - self.opts.margin.right + self.win_opts.width = self.win_opts.width - self.opts.margin.right end if self.opts.margin.bottom then - self.opts.win_opts.height = self.opts.win_opts.height - self.opts.margin.bottom + self.win_opts.height = self.win_opts.height - self.opts.margin.bottom end if self.opts.margin.left then - self.opts.win_opts.width = self.opts.win_opts.width - self.opts.margin.left - self.opts.win_opts.col = self.opts.win_opts.col + self.opts.margin.left + self.win_opts.width = self.win_opts.width - self.opts.margin.left + self.win_opts.col = self.win_opts.col + self.opts.margin.left end end end @@ -78,25 +95,8 @@ function M:mount() self.buf = vim.api.nvim_create_buf(false, false) end - ---@class LazyViewWinOpts - ---@field width number - ---@field height number - ---@field row number - ---@field col number - local win_opts = { - relative = "editor", - style = "minimal", - border = Config.options.ui.border, - noautocmd = true, - zindex = 50, - } - self.opts.win_opts = vim.tbl_extend("force", win_opts, self.opts.win_opts) - if self.opts.win_opts.style == "" then - self.opts.win_opts.style = nil - end - self:layout() - self.win = vim.api.nvim_open_win(self.buf, true, self.opts.win_opts) + self.win = vim.api.nvim_open_win(self.buf, true, self.win_opts) self:focus() vim.bo[self.buf].buftype = "nofile" @@ -118,7 +118,7 @@ function M:mount() local config = {} for _, key in ipairs({ "relative", "width", "height", "col", "row" }) do ---@diagnostic disable-next-line: no-unknown - config[key] = self.opts.win_opts[key] + config[key] = self.win_opts[key] end vim.api.nvim_win_set_config(self.win, config) vim.cmd([[do User LazyFloatResized]]) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index cd91c4c..0f4e0d2 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -25,13 +25,17 @@ local M = {} ---@type LazyView M.view = nil +function M.visible() + return M.view and M.view.win and vim.api.nvim_win_is_valid(M.view.win) +end + ---@param mode? string function M.show(mode) if Config.headless then return end - M.view = (M.view and M.view.win and vim.api.nvim_win_is_valid(M.view.win)) and M.view or M.create() + M.view = M.visible() and M.view or M.create() if mode then M.view.state.mode = mode end diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index f5ce860..fd4b138 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -26,7 +26,7 @@ function M.new(view) local self = setmetatable({}, { __index = setmetatable(M, { __index = Text }) }) self.view = view self.padding = 2 - self.wrap = view.opts.win_opts.width + self.wrap = view.win_opts.width return self end From e89e938991701cef7b9ace1913a7251c4c0fa46c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 5 Jan 2023 17:36:01 +0100 Subject: [PATCH 0632/1610] refactor: split open_cmd in float_cmd and float_term --- lua/lazy/core/config.lua | 10 ++----- lua/lazy/util.lua | 65 +++++++++++++++++++++++----------------- lua/lazy/view/diff.lua | 4 +-- 3 files changed, 42 insertions(+), 37 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index d2b3146..f5441e0 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -72,21 +72,15 @@ M.defaults = { -- open lazygit log ["<localleader>l"] = function(plugin) - require("lazy.util").open_cmd({ "lazygit", "log" }, { + require("lazy.util").float_term({ "lazygit", "log" }, { cwd = plugin.dir, - terminal = true, - close_on_exit = true, - enter = true, }) end, -- open a terminal for the plugin dir ["<localleader>t"] = function(plugin) - require("lazy.util").open_cmd({ vim.go.shell }, { + require("lazy.util").float_term(nil, { cwd = plugin.dir, - terminal = true, - close_on_exit = true, - enter = true, }) end, }, diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index d1b4257..edd6610 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -93,42 +93,53 @@ function M.throttle(ms, fn) end end ----@class LazyCmdOpts +---@class LazyCmdOptions: LazyFloatOptions ---@field cwd? string ---@field env? table<string,string> ---@field float? LazyFloatOptions ----@param cmd string[] ----@param opts? {cwd:string, filetype:string, terminal?:boolean, close_on_exit?:boolean, enter?:boolean, float?:LazyFloatOptions} -function M.open_cmd(cmd, opts) +-- Opens a floating terminal (interactive by default) +---@param cmd? string[]|string +---@param opts? LazyCmdOptions|{interactive?:boolean} +function M.float_term(cmd, opts) + cmd = cmd or {} + if type(cmd) == "string" then + cmd = { cmd } + end + if #cmd == 0 then + cmd = { vim.env.SHELL or vim.o.shell } + end opts = opts or {} - local float = M.float(opts.float) + local float = M.float(opts) + vim.fn.termopen(cmd, vim.tbl_isempty(opts) and vim.empty_dict() or opts) + if opts.interactive ~= false then + vim.cmd.startinsert() + vim.api.nvim_create_autocmd("TermClose", { + once = true, + buffer = float.buf, + callback = function() + float:close() + vim.cmd.checktime() + end, + }) + end + return float +end +--- Runs the command and shows it in a floating window +---@param cmd string[] +---@param opts? LazyCmdOptions|{filetype?:string} +function M.float_cmd(cmd, opts) + opts = opts or {} + local float = M.float(opts) if opts.filetype then vim.bo[float.buf].filetype = opts.filetype end - if opts.terminal then - opts.terminal = nil - vim.fn.termopen(cmd, opts) - if opts.enter then - vim.cmd.startinsert() - end - if opts.close_on_exit then - vim.api.nvim_create_autocmd("TermClose", { - once = true, - buffer = float.buf, - callback = function() - float:close() - vim.cmd.checktime() - end, - }) - end - else - local Process = require("lazy.manage.process") - local lines = Process.exec(cmd, { cwd = opts.cwd }) - vim.api.nvim_buf_set_lines(float.buf, 0, -1, false, lines) - vim.bo[float.buf].modifiable = false - end + local Process = require("lazy.manage.process") + local lines = Process.exec(cmd, { cwd = opts.cwd }) + vim.api.nvim_buf_set_lines(float.buf, 0, -1, false, lines) + vim.bo[float.buf].modifiable = false + return float end ---@return string? diff --git a/lua/lazy/view/diff.lua b/lua/lazy/view/diff.lua index 63dc2e7..24955b8 100644 --- a/lua/lazy/view/diff.lua +++ b/lua/lazy/view/diff.lua @@ -43,7 +43,7 @@ M.handlers = { cmd[#cmd + 1] = diff.from cmd[#cmd + 1] = diff.to end - Util.open_cmd(cmd, { cwd = plugin.dir, filetype = "git" }) + Util.float_cmd(cmd, { cwd = plugin.dir, filetype = "git" }) end, ---@type LazyDiffFun @@ -57,7 +57,7 @@ M.handlers = { cmd[#cmd + 1] = diff.from cmd[#cmd + 1] = diff.to end - Util.open_cmd(cmd, { cwd = plugin.dir, terminal = true, env = { PAGER = "cat" } }) + Util.float_term(cmd, { cwd = plugin.dir, interactive = false, env = { PAGER = "cat" } }) end, } From 2ef44e2dee112ba7b83bdfca98f6c07967d65484 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 5 Jan 2023 19:43:47 +0100 Subject: [PATCH 0633/1610] fix(loader): revert change that loaded /plugin after config. Fixes #328 --- lua/lazy/core/loader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index aaffe94..c2bc844 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -217,10 +217,10 @@ function M._load(plugin, reason) end, "Failed to load deps for " .. plugin.name) end + M.packadd(plugin.dir) if plugin.config then M.config(plugin) end - M.packadd(plugin.dir) plugin._.loaded.time = Util.track().time table.remove(M.loading) From eed1ef3c2d13b374def716ed7e9997595c466b3f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 6 Jan 2023 07:11:50 +0100 Subject: [PATCH 0634/1610] feat(commands): `:Lazy! load` now skips `cond` checks when loading plugins. Fixes #330 --- README.md | 28 ++++++++++++++-------------- lua/lazy/core/loader.lua | 10 ++++++---- lua/lazy/view/commands.lua | 3 ++- lua/lazy/view/config.lua | 2 +- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 85020ab..21ab555 100644 --- a/README.md +++ b/README.md @@ -303,6 +303,8 @@ return { version = nil, -- version = "*", -- enable this to try installing the latest stable versions of plugins }, + -- leave nil when passing the spec as the first argument to setup() + spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. concurrency = nil, ---@type number limit the maximum amount of concurrent tasks git = { @@ -330,20 +332,21 @@ return { -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { - loaded = "●", - not_loaded = "○", cmd = " ", config = "", event = "", ft = " ", init = " ", + import = " ", keys = " ", + lazy = "鈴 ", + loaded = "●", + not_loaded = "○", plugin = " ", runtime = " ", source = " ", start = "", task = "✔ ", - lazy = "鈴 ", list = { "●", "➜", @@ -361,21 +364,15 @@ return { -- open lazygit log ["<localleader>l"] = function(plugin) - require("lazy.util").open_cmd({ "lazygit", "log" }, { + require("lazy.util").float_term({ "lazygit", "log" }, { cwd = plugin.dir, - terminal = true, - close_on_exit = true, - enter = true, }) end, -- open a terminal for the plugin dir ["<localleader>t"] = function(plugin) - require("lazy.util").open_cmd({ vim.go.shell }, { + require("lazy.util").float_term(nil, { cwd = plugin.dir, - terminal = true, - close_on_exit = true, - enter = true, }) end, }, @@ -410,7 +407,7 @@ return { -- The default is to disable on: -- * VimEnter: not useful to cache anything else beyond startup -- * BufReadPre: this will be triggered early when opening a file from the command line directly - disable_events = { "VimEnter", "BufReadPre" }, + disable_events = { "UIEnter", "BufReadPre" }, ttl = 3600 * 24 * 5, -- keep unused modules for up to 5 days }, reset_packpath = true, -- reset the package path to improve startup time @@ -498,7 +495,7 @@ Any operation can be started from the UI, with a sub command or an API function: | `: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` | +| `: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 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 | @@ -532,9 +529,11 @@ Stats API (`require("lazy").stats()`): -- 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. - startuptime_cputime = false, + real_cputime = false, count = 0, -- total number of plugins loaded = 0, -- number of loaded plugins + ---@type table<string, number> + times = {}, } ``` @@ -738,6 +737,7 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori | **LazyReasonCmd** | **_Operator_** | | | **LazyReasonEvent** | **_Constant_** | | | **LazyReasonFt** | **_Character_** | | +| **LazyReasonImport** | **_Identifier_** | | | **LazyReasonKeys** | **_Statement_** | | | **LazyReasonPlugin** | **_Special_** | | | **LazyReasonRuntime** | **_@macro_** | | diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c2bc844..235335b 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -157,7 +157,8 @@ end ---@class Loader ---@param plugins string|LazyPlugin|string[]|LazyPlugin[] ---@param reason {[string]:string} -function M.load(plugins, reason) +---@param opts? {force:boolean} when force is true, we skip the cond check +function M.load(plugins, reason, opts) ---@diagnostic disable-next-line: cast-local-type plugins = (type(plugins) == "string" or plugins.name) and { plugins } or plugins ---@cast plugins (string|LazyPlugin)[] @@ -174,19 +175,20 @@ function M.load(plugins, reason) end end if plugin and not plugin._.loaded then - M._load(plugin, reason) + M._load(plugin, reason, opts) end end end ---@param plugin LazyPlugin ---@param reason {[string]:string} -function M._load(plugin, reason) +---@param opts? {force:boolean} when force is true, we skip the cond check +function M._load(plugin, reason, opts) if not plugin._.installed then return Util.error("Plugin " .. plugin.name .. " is not installed") end - if plugin.cond ~= nil then + if plugin.cond ~= nil and not (opts and opts.force) then if plugin.cond == false or (type(plugin.cond) == "function" and not plugin.cond()) then plugin._.cond = false return diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 39bd3f8..4944e65 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -50,7 +50,8 @@ M.commands = { end, ---@param opts ManagerOpts load = function(opts) - require("lazy.core.loader").load(opts.plugins, { cmd = "LazyLoad" }) + -- when a command is executed with a bang, wait will be set + require("lazy.core.loader").load(opts.plugins, { cmd = "Lazy load" }, { force = opts.wait }) end, log = Manage.log, build = Manage.build, diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index e229352..b75c0f5 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -130,7 +130,7 @@ M.commands = { id = 12, }, load = { - desc = "Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim`", + desc = "Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim`. Use `:Lazy! load` to skip `cond` checks.", id = 13, plugins = true, plugins_required = true, From 317df42fcf05761e2e8526d91f282a0f868ff766 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Jan 2023 06:13:06 +0000 Subject: [PATCH 0635/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9f8d335..d7a0510 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 05 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -347,6 +347,8 @@ CONFIGURATION *lazy.nvim-configuration* version = nil, -- version = "", -- enable this to try installing the latest stable versions of plugins }, + -- leave nil when passing the spec as the first argument to setup() + spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. concurrency = nil, ---@type number limit the maximum amount of concurrent tasks git = { @@ -374,20 +376,21 @@ CONFIGURATION *lazy.nvim-configuration* -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { - loaded = "", - not_loaded = "", cmd = " ", config = "", event = "", ft = " ", init = " ", + import = " ", keys = " ", + lazy = " ", + loaded = "", + not_loaded = "", plugin = " ", runtime = " ", source = " ", start = "", task = " ", - lazy = " ", list = { "", "", @@ -405,21 +408,15 @@ CONFIGURATION *lazy.nvim-configuration* -- open lazygit log ["<localleader>l"] = function(plugin) - require("lazy.util").open_cmd({ "lazygit", "log" }, { + require("lazy.util").float_term({ "lazygit", "log" }, { cwd = plugin.dir, - terminal = true, - close_on_exit = true, - enter = true, }) end, -- open a terminal for the plugin dir ["<localleader>t"] = function(plugin) - require("lazy.util").open_cmd({ vim.go.shell }, { + require("lazy.util").float_term(nil, { cwd = plugin.dir, - terminal = true, - close_on_exit = true, - enter = true, }) end, }, @@ -454,7 +451,7 @@ CONFIGURATION *lazy.nvim-configuration* -- The default is to disable on: -- VimEnter: not useful to cache anything else beyond startup -- BufReadPre: this will be triggered early when opening a file from the command line directly - disable_events = { "VimEnter", "BufReadPre" }, + disable_events = { "UIEnter", "BufReadPre" }, ttl = 3600 24 5, -- keep unused modules for up to 5 days }, reset_packpath = true, -- reset the package path to improve startup time @@ -537,7 +534,7 @@ function: │: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 │ +│: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 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│ @@ -571,9 +568,11 @@ Stats API (`require("lazy").stats()`): -- 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. - startuptime_cputime = false, + real_cputime = false, count = 0, -- total number of plugins loaded = 0, -- number of loaded plugins + ---@type table<string, number> + times = {}, } < @@ -809,6 +808,7 @@ Click to see all highlight groups │**LazyReasonCmd** │**_Operator_** │ │ │**LazyReasonEvent** │**_Constant_** │ │ │**LazyReasonFt** │**_Character_** │ │ +│**LazyReasonImport** │**_Identifier_** │ │ │**LazyReasonKeys** │**_Statement_** │ │ │**LazyReasonPlugin** │**_Special_** │ │ │**LazyReasonRuntime**│_macro │ │ From 4f76b431f73c912a7021bc17384533fbad96fba7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 6 Jan 2023 11:18:48 +0100 Subject: [PATCH 0636/1610] refactor(util)!: `require("lazy.util").open_cmd()` is deprecated. See the docs --- lua/lazy/util.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index edd6610..8e8a638 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -142,6 +142,11 @@ function M.float_cmd(cmd, opts) return float end +---@deprecated use float_term or float_cmd instead +function M.open_cmd() + M.warn([[`require("lazy.util").open_cmd()` is deprecated. Please use `float_term` instead. Check the docs]]) +end + ---@return string? function M.head(file) local f = io.open(file) From 102bc2722e73d0dcebd6c90b45a41cb33e0660cb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 6 Jan 2023 19:16:39 +0100 Subject: [PATCH 0637/1610] fix(loader): source runtime files without `silent`. Fixes #336 --- lua/lazy/core/loader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 235335b..8ef6ee5 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -345,7 +345,7 @@ end function M.source(path) Util.track({ runtime = path }) Util.try(function() - vim.cmd("silent source " .. path) + vim.cmd("source " .. path) end, "Failed to source `" .. path .. "`") Util.track() end From 7eadaacc48bd4d5eff375c1d303caff51e4ec99e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Jan 2023 22:13:50 +0100 Subject: [PATCH 0638/1610] chore(main): release 8.0.0 (#329) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76760e5..2332fb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [8.0.0](https://github.com/folke/lazy.nvim/compare/v7.12.1...v8.0.0) (2023-01-06) + + +### ⚠ BREAKING CHANGES + +* **util:** `require("lazy.util").open_cmd()` is deprecated. See the docs + +### Features + +* **commands:** `:Lazy! load` now skips `cond` checks when loading plugins. Fixes [#330](https://github.com/folke/lazy.nvim/issues/330) ([eed1ef3](https://github.com/folke/lazy.nvim/commit/eed1ef3c2d13b374def716ed7e9997595c466b3f)) + + +### Bug Fixes + +* **loader:** revert change that loaded /plugin after config. Fixes [#328](https://github.com/folke/lazy.nvim/issues/328) ([2ef44e2](https://github.com/folke/lazy.nvim/commit/2ef44e2dee112ba7b83bdfca98f6c07967d65484)) +* **loader:** source runtime files without `silent`. Fixes [#336](https://github.com/folke/lazy.nvim/issues/336) ([102bc27](https://github.com/folke/lazy.nvim/commit/102bc2722e73d0dcebd6c90b45a41cb33e0660cb)) + + +### Code Refactoring + +* **util:** `require("lazy.util").open_cmd()` is deprecated. See the docs ([4f76b43](https://github.com/folke/lazy.nvim/commit/4f76b431f73c912a7021bc17384533fbad96fba7)) + ## [7.12.1](https://github.com/folke/lazy.nvim/compare/v7.12.0...v7.12.1) (2023-01-05) From 05b55deb16f074f2a44b81927c2e5feb63fba651 Mon Sep 17 00:00:00 2001 From: Brian Koropoff <bkoropoff@gmail.com> Date: Sat, 7 Jan 2023 00:01:45 -0800 Subject: [PATCH 0639/1610] fix(config): Don't cache check for attached UIs (#340) UIs can attach and detach from headless nvim dynamically (indeed, this is one of its use cases). --- lua/lazy/core/config.lua | 6 ++++-- lua/lazy/view/init.lua | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f5441e0..c83a09a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -159,7 +159,9 @@ M.me = nil ---@type string M.mapleader = nil -M.headless = #vim.api.nvim_list_uis() == 0 +function M.headless() + return #vim.api.nvim_list_uis() == 0 +end ---@param opts? LazyConfig function M.setup(opts) @@ -200,7 +202,7 @@ function M.setup(opts) vim.go.loadplugins = false M.mapleader = vim.g.mapleader - if M.headless then + if M.headless() then require("lazy.view.commands").setup() else vim.api.nvim_create_autocmd("UIEnter", { diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 0f4e0d2..ac64e74 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -31,7 +31,7 @@ end ---@param mode? string function M.show(mode) - if Config.headless then + if Config.headless() then return end From 457e65eec8a7be03f634d3e880b0e7cd03349265 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Jan 2023 08:02:29 +0000 Subject: [PATCH 0640/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d7a0510..5e62d74 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 06 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 07 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 5ed89b5a0d6be65ec9fd0f6526c8c27a922f50a1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Jan 2023 09:12:51 +0100 Subject: [PATCH 0641/1610] fix(config): properly handle uis connecting after startup --- lua/lazy/core/config.lua | 49 ++++++++++++++++++------------------ lua/lazy/core/util.lua | 1 + lua/lazy/manage/checker.lua | 2 +- lua/lazy/manage/reloader.lua | 2 +- 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c83a09a..372bc70 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -160,7 +160,7 @@ M.me = nil M.mapleader = nil function M.headless() - return #vim.api.nvim_list_uis() == 0 + return #vim.api.nvim_list_uis() == 0 end ---@param opts? LazyConfig @@ -204,31 +204,32 @@ function M.setup(opts) if M.headless() then require("lazy.view.commands").setup() - else - vim.api.nvim_create_autocmd("UIEnter", { - callback = function() - require("lazy.stats").on_ui_enter() - end, - }) - - vim.api.nvim_create_autocmd("User", { - pattern = "VeryLazy", - once = true, - callback = function() - require("lazy.core.cache").autosave() - require("lazy.view.commands").setup() - if M.options.change_detection.enabled then - require("lazy.manage.reloader").enable() - end - if M.options.checker.enabled then - vim.defer_fn(function() - require("lazy.manage.checker").start() - end, 10) - end - end, - }) end + vim.api.nvim_create_autocmd("UIEnter", { + once = true, + callback = function() + require("lazy.stats").on_ui_enter() + end, + }) + + vim.api.nvim_create_autocmd("User", { + pattern = "VeryLazy", + once = true, + callback = function() + require("lazy.core.cache").autosave() + require("lazy.view.commands").setup() + if M.options.change_detection.enabled then + require("lazy.manage.reloader").enable() + end + if M.options.checker.enabled then + vim.defer_fn(function() + require("lazy.manage.checker").start() + end, 10) + end + end, + }) + Util.very_lazy() end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 48582c0..5111566 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -142,6 +142,7 @@ end function M.very_lazy() local function _load() vim.defer_fn(function() + vim.g.did_very_lazy = true vim.cmd("do User VeryLazy") end, 50) end diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 5597bbc..477c63d 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -65,7 +65,7 @@ function M.report(notify) end end end - if #lines > 0 and notify and Config.options.checker.notify then + if #lines > 0 and notify and Config.options.checker.notify and not Config.headless() then table.insert(lines, 1, "# Plugin Updates") Util.info(lines) end diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index d338775..5f9a74b 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -75,7 +75,7 @@ function M.check(start) if not (start or #changes == 0) then vim.schedule(function() - if Config.options.change_detection.notify then + if Config.options.change_detection.notify and not Config.headless() then local lines = { "# Config Change Detected. Reloading...", "" } for _, change in ipairs(changes) do table.insert(lines, "- **" .. change.what .. "**: `" .. vim.fn.fnamemodify(change.file, ":p:~:.") .. "`") From c3132492714661121f70daf77d716053ab39bd0b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Jan 2023 09:37:03 +0100 Subject: [PATCH 0642/1610] feat(spec): show error when loading two specs with the same name and a different url. Fixes #337 --- lua/lazy/core/plugin.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index e9af209..fe3a34b 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -250,6 +250,10 @@ end function Spec:merge(old, new) new._.dep = old._.dep and new._.dep + if new.url and old.url and new.url ~= old.url then + self:error("Two plugins with the same name and different url:\n" .. vim.inspect({ old = old, new = new })) + end + for _, prop in ipairs(list_merge) do if new[prop] and old[prop] then ---@type any[] From ae12dd9686d26643f79a6e9966d50e6a8e92f8be Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Jan 2023 12:08:31 +0100 Subject: [PATCH 0643/1610] docs: updated LazyVim links --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 21ab555..2667426 100644 --- a/README.md +++ b/README.md @@ -656,12 +656,10 @@ return { - 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](https://github.com/folke/LazyVim), +For a real-life example, you can check [LazyVim](https://github.com/LazyVim/LazyVim), a starter template for lazy Neovim users. -- [init.lua](https://github.com/folke/LazyVim/blob/main/init.lua) where `lazyvim.config.lazy` is required -- [lazyvim.config.lazy](https://github.com/folke/LazyVim/blob/main/lua/lazyvim/config/lazy.lua) where we setup **lazy.nvim** -- [lazyvim.plugins](https://github.com/folke/LazyVim/tree/main/lua/lazyvim/plugins) contains all the plugin specs that will be loaded +- [lazyvim.plugins](https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/plugins) contains all the plugin specs that will be loaded ## 📦 Migration Guide From a1c926f87b7a4c9d0642a76c1205623045541568 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Jan 2023 11:09:20 +0000 Subject: [PATCH 0644/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5e62d74..2cefafa 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -718,12 +718,10 @@ Example: For a real-life example, you can check LazyVim -<https://github.com/folke/LazyVim>, a starter template for lazy Neovim users. +<https://github.com/LazyVim/LazyVim>, a starter template for lazy Neovim users. -- init.lua <https://github.com/folke/LazyVim/blob/main/init.lua> where `lazyvim.config.lazy` is required -- lazyvim.config.lazy <https://github.com/folke/LazyVim/blob/main/lua/lazyvim/config/lazy.lua> where we setup **lazy.nvim** -- lazyvim.plugins <https://github.com/folke/LazyVim/tree/main/lua/lazyvim/plugins> contains all the plugin specs that will be loaded +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/plugins> contains all the plugin specs that will be loaded MIGRATION GUIDE *lazy.nvim-migration-guide* From 735f2a280ee4b6d3c41b8d54f228fbf0a00f3755 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Jan 2023 12:10:19 +0100 Subject: [PATCH 0645/1610] docs: LazyVim --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 2667426..a237743 100644 --- a/README.md +++ b/README.md @@ -656,8 +656,7 @@ return { - 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](https://github.com/LazyVim/LazyVim), -a starter template for lazy Neovim users. +For a real-life example, you can check [LazyVim](https://github.com/LazyVim/LazyVim) and more specifically: - [lazyvim.plugins](https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/plugins) contains all the plugin specs that will be loaded From 8798ccc95031225e3b2241bd8b2d26c2452b06c4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Jan 2023 11:11:08 +0000 Subject: [PATCH 0646/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 2cefafa..674c173 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -718,7 +718,7 @@ Example: For a real-life example, you can check LazyVim -<https://github.com/LazyVim/LazyVim>, a starter template for lazy Neovim users. +<https://github.com/LazyVim/LazyVim> and more specifically: - lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/plugins> contains all the plugin specs that will be loaded From d34c85d58007f37f9eb60fe0c1075950a5ce615e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Jan 2023 22:24:46 +0100 Subject: [PATCH 0647/1610] fix(cache): check that modpaths still exist when finding mod root --- lua/lazy/core/cache.lua | 4 +-- tests/core/util_spec.lua | 59 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index edba74a..709e321 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -262,7 +262,7 @@ function M.find_root(modname) if M.cache[modname] then -- check if modname is in cache local modpath = M.cache[modname].modpath - if M.check_path(modname, modpath) then + if M.check_path(modname, modpath) and vim.loop.fs_stat(modpath) then local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") return root end @@ -271,7 +271,7 @@ function M.find_root(modname) -- check for any children in the cache for child, entry in pairs(M.cache) do if child:find(modname, 1, true) == 1 then - if M.check_path(child, entry.modpath) then + if M.check_path(child, entry.modpath) and vim.loop.fs_stat(entry.modpath) then local basename = modname:gsub("%.", "/") local childbase = child:gsub("%.", "/") local ret = entry.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index 655b71f..53566a3 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -3,11 +3,19 @@ local Cache = require("lazy.core.cache") local Helpers = require("tests.helpers") describe("util", function() + local rtp = vim.opt.rtp:get() before_each(function() + vim.opt.rtp = rtp + for k, v in pairs(package.loaded) do + if k:find("^foobar") then + package.loaded[k] = nil + end + end Helpers.fs_rm("") end) it("lsmod lists all mods in dir", function() + vim.opt.rtp:append(Helpers.path("")) local tests = { { root = "lua/foo", @@ -35,7 +43,6 @@ describe("util", function() }, } - vim.opt.rtp:append(Helpers.path("")) for t, test in ipairs(tests) do local expected = vim.deepcopy(test.mods) table.sort(expected) @@ -74,4 +81,54 @@ describe("util", function() assert.same(expected, mods) end end) + + it("find the correct root with dels", function() + Cache.cache = {} + Cache.indexed = {} + Cache.indexed_rtp = false + vim.opt.rtp:append(Helpers.path("old")) + Helpers.fs_create({ "old/lua/foobar/init.lua" }) + require("foobar") + local root = Cache.find_root("foobar") + assert(root, "foobar root not found") + assert.same(Helpers.path("old/lua/foobar"), root) + + Helpers.fs_rm("old/") + + -- vim.opt.rtp = rtp + Cache.indexed = {} + Cache.indexed_rtp = false + vim.opt.rtp:append(Helpers.path("new")) + Helpers.fs_create({ "new/lua/foobar/init.lua" }) + root = Cache.find_root("foobar") + assert(root, "foobar root not found") + assert.same(Helpers.path("new/lua/foobar"), root) + end) + + it("find the correct root with mod dels", function() + Cache.cache = {} + Cache.indexed = {} + Cache.indexed_rtp = false + Cache.topmods = {} + Cache.enabled = true + vim.opt.rtp:append(Helpers.path("old")) + Helpers.fs_create({ "old/lua/foobar/test.lua" }) + Cache.cache["foobar.test"] = { modpath = Helpers.path("old/lua/foobar/test.lua") } + local root = Cache.find_root("foobar") + assert(root, "foobar root not found") + assert.same(Helpers.path("old/lua/foobar"), root) + assert(not Cache.cache["foobar"], "foobar should not be in cache") + assert(Cache.cache["foobar.test"], "foobar.test not found in cache") + + Helpers.fs_rm("old/") + + -- vim.opt.rtp = rtp + Cache.indexed = {} + Cache.indexed_rtp = false + vim.opt.rtp:append(Helpers.path("new")) + Helpers.fs_create({ "new/lua/foobar/test.lua" }) + root = Cache.find_root("foobar") + assert(root, "foobar root not found") + assert.same(Helpers.path("new/lua/foobar"), root) + end) end) From ad00eb1be2f79da81924e01f3804ea24caa75f82 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Jan 2023 22:52:49 +0100 Subject: [PATCH 0648/1610] test: fixed helper function to delete test directory --- lua/lazy/core/cache.lua | 4 ++-- tests/core/util_spec.lua | 9 +++++---- tests/helpers.lua | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 709e321..09792bc 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -262,7 +262,7 @@ function M.find_root(modname) if M.cache[modname] then -- check if modname is in cache local modpath = M.cache[modname].modpath - if M.check_path(modname, modpath) and vim.loop.fs_stat(modpath) then + if M.check_path(modname, modpath) and uv.fs_stat(modpath) then local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") return root end @@ -271,7 +271,7 @@ function M.find_root(modname) -- check for any children in the cache for child, entry in pairs(M.cache) do if child:find(modname, 1, true) == 1 then - if M.check_path(child, entry.modpath) and vim.loop.fs_stat(entry.modpath) then + if M.check_path(child, entry.modpath) and uv.fs_stat(entry.modpath) then local basename = modname:gsub("%.", "/") local childbase = child:gsub("%.", "/") local ret = entry.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index 53566a3..7349c68 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -12,6 +12,7 @@ describe("util", function() end end Helpers.fs_rm("") + assert(not vim.loop.fs_stat(Helpers.path("")), "fs root should be deleted") end) it("lsmod lists all mods in dir", function() @@ -88,12 +89,13 @@ describe("util", function() Cache.indexed_rtp = false vim.opt.rtp:append(Helpers.path("old")) Helpers.fs_create({ "old/lua/foobar/init.lua" }) - require("foobar") + Cache.cache["foobar"] = { modpath = Helpers.path("old/lua/foobar/init.lua") } local root = Cache.find_root("foobar") assert(root, "foobar root not found") assert.same(Helpers.path("old/lua/foobar"), root) - Helpers.fs_rm("old/") + Helpers.fs_rm("old") + assert(not vim.loop.fs_stat(Helpers.path("old/lua/foobar")), "old/lua/foobar should not exist") -- vim.opt.rtp = rtp Cache.indexed = {} @@ -109,7 +111,6 @@ describe("util", function() Cache.cache = {} Cache.indexed = {} Cache.indexed_rtp = false - Cache.topmods = {} Cache.enabled = true vim.opt.rtp:append(Helpers.path("old")) Helpers.fs_create({ "old/lua/foobar/test.lua" }) @@ -120,7 +121,7 @@ describe("util", function() assert(not Cache.cache["foobar"], "foobar should not be in cache") assert(Cache.cache["foobar.test"], "foobar.test not found in cache") - Helpers.fs_rm("old/") + Helpers.fs_rm("old") -- vim.opt.rtp = rtp Cache.indexed = {} diff --git a/tests/helpers.lua b/tests/helpers.lua index c6174a8..48d84f9 100644 --- a/tests/helpers.lua +++ b/tests/helpers.lua @@ -23,7 +23,7 @@ function M.fs_create(files) end function M.fs_rm(dir) - dir = Util.norm(M.fs_root .. dir) + dir = Util.norm(M.fs_root .. "/" .. dir) Util.walk(dir, function(path, _, type) if type == "directory" then vim.loop.fs_rmdir(path) From 8a3754717162cd453abd8da87a6020beaba17994 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Jan 2023 22:59:05 +0100 Subject: [PATCH 0649/1610] chore(main): release 8.1.0 (#341) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2332fb0..b02ae2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [8.1.0](https://github.com/folke/lazy.nvim/compare/v8.0.0...v8.1.0) (2023-01-07) + + +### Features + +* **spec:** show error when loading two specs with the same name and a different url. Fixes [#337](https://github.com/folke/lazy.nvim/issues/337) ([c313249](https://github.com/folke/lazy.nvim/commit/c3132492714661121f70daf77d716053ab39bd0b)) + + +### Bug Fixes + +* **cache:** check that modpaths still exist when finding mod root ([d34c85d](https://github.com/folke/lazy.nvim/commit/d34c85d58007f37f9eb60fe0c1075950a5ce615e)) +* **config:** Don't cache check for attached UIs ([#340](https://github.com/folke/lazy.nvim/issues/340)) ([05b55de](https://github.com/folke/lazy.nvim/commit/05b55deb16f074f2a44b81927c2e5feb63fba651)) +* **config:** properly handle uis connecting after startup ([5ed89b5](https://github.com/folke/lazy.nvim/commit/5ed89b5a0d6be65ec9fd0f6526c8c27a922f50a1)) + ## [8.0.0](https://github.com/folke/lazy.nvim/compare/v7.12.1...v8.0.0) (2023-01-06) From a39fa0f0ced7324800eff0a4eb0ed68bf13452d1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 8 Jan 2023 08:04:34 +0100 Subject: [PATCH 0650/1610] feat(git): added fast `Git.get_origin` and `Git.get_config` --- lua/lazy/manage/git.lua | 32 ++++++++++++++++++++++++++++++++ tests/core/e2e_spec.lua | 4 ++++ 2 files changed, 36 insertions(+) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index f104c5e..76f7009 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -193,4 +193,36 @@ function M.get_tag_refs(repo, tagref) return tags end +---@param repo string +function M.get_origin(repo) + return M.get_config(repo)["remote.origin.url"] +end + +---@param repo string +function M.get_config(repo) + local ok, config = pcall(Util.read_file, repo .. "/.git/config") + if not ok then + return {} + end + ---@type table<string, string> + local ret = {} + ---@type string + local current_section = nil + for line in config:gmatch("[^\n]+") do + -- Check if the line is a section header + local section = line:match("^%s*%[(.+)%]%s*$") + if section then + ---@type string + current_section = section:gsub('%s+"', "."):gsub('"+%s*$', "") + else + -- Ignore comments and blank lines + if not line:match("^%s*#") and line:match("%S") then + local key, value = line:match("^%s*(%S+)%s*=%s*(.+)%s*$") + ret[current_section .. "." .. key] = value + end + end + end + return ret +end + return M diff --git a/tests/core/e2e_spec.lua b/tests/core/e2e_spec.lua index db59155..a7d02fc 100644 --- a/tests/core/e2e_spec.lua +++ b/tests/core/e2e_spec.lua @@ -1,3 +1,5 @@ +local Git = require("lazy.manage.git") + describe("lazy", function() before_each(function() vim.g.lazy_did_setup = false @@ -31,5 +33,7 @@ describe("lazy", function() assert(not neodev) assert(Config.plugins["neodev.nvim"]._.installed) assert(not Config.plugins["neodev.nvim"]._.is_local) + assert.equal("https://github.com/folke/neodev.nvim.git", Git.get_origin(Config.plugins["neodev.nvim"].dir)) + assert.equal("https://github.com/folke/paint.nvim.git", Git.get_origin(Config.plugins["paint.nvim"].dir)) end) end) From 615781aebfc0230669a2e5750cba3c65f0b8a90e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 8 Jan 2023 08:32:03 +0100 Subject: [PATCH 0651/1610] feat(git): lazy now detects origin changes and will fix it on update. Fixes #346. Fixes #331 --- lua/lazy/manage/init.lua | 7 ++++++- lua/lazy/manage/task/git.lua | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 375f445..d14a7b8 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -94,6 +94,7 @@ function M.update(opts) opts = M.opts(opts, { mode = "update" }) return M.run({ pipeline = { + "git.origin", "git.branch", "git.fetch", { "git.checkout", lockfile = opts.lockfile }, @@ -123,6 +124,7 @@ function M.check(opts) opts = opts or {} return M.run({ pipeline = { + { "git.origin", check = true }, "git.fetch", "wait", { "git.log", check = true }, @@ -137,7 +139,10 @@ end function M.log(opts) opts = M.opts(opts, { mode = "log" }) return M.run({ - pipeline = { "git.log" }, + pipeline = { + { "git.origin", check = true }, + "git.log", + }, plugins = function(plugin) return plugin.url and plugin._.installed end, diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 57388a6..c314c90 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -113,6 +113,30 @@ M.branch = { end, } +-- check and switch origin +M.origin = { + skip = function(plugin) + if not plugin._.installed or plugin._.is_local then + return true + end + local origin = Git.get_origin(plugin.dir) + return origin == plugin.url + end, + ---@param opts {check?:boolean} + run = function(self, opts) + if opts.check then + local origin = Git.get_origin(self.plugin.dir) + self.error = "Origin has changed:\n" + self.error = self.error .. " * old: " .. origin .. "\n" + self.error = self.error .. " * new: " .. self.plugin.url .. "\n" + self.error = self.error .. "Please run update to fix" + return + end + require("lazy.manage.task.fs").clean.run(self, opts) + M.clone.run(self, opts) + end, +} + -- fetches all needed origin branches M.fetch = { skip = function(plugin) From b178daf9dc95b9171ead57a89ea81239cadda2ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 07:32:49 +0000 Subject: [PATCH 0652/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 674c173..0ff1888 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 07 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 08 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 6a31b97e3729af3710207642968e1492071a7dbc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 8 Jan 2023 14:58:17 +0100 Subject: [PATCH 0653/1610] feat(util): better deep merging with `Util.merge` --- lua/lazy/core/util.lua | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 5111566..70c1eb8 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -286,4 +286,31 @@ function M.debug(msg, level, opts) end end +local function can_merge(v) + return type(v) == "table" and (vim.tbl_isempty(v) or not M.is_list(v)) +end + +--- Merges the values similar to vim.tbl_deep_extend with the **force** behavior, +--- but the values can be any type, in which case they override the values on the left. +--- Values will me merged in-place in the first left-most table. If you want the result to be in +--- a new table, then simply pass an empty table as the first argument `vim.merge({}, ...)` +--- Supports clearing values by setting a key to `vim.NIL` +function M.merge(...) + local values = { ... } + local ret = values[1] + for i = 2, #values, 1 do + local value = values[i] + if can_merge(ret) and can_merge(value) then + for k, v in pairs(value) do + ret[k] = M.merge(ret[k], v) + end + elseif value == vim.NIL then + ret = nil + else + ret = value + end + end + return ret +end + return M From 7260a2b28be807c4bdc1caf23fa35c2aa33aa6ac Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 8 Jan 2023 15:01:49 +0100 Subject: [PATCH 0654/1610] feat(spec)!: setting a table to `Plugin.config` is now deprecated. Please use `Plugin.opts` instead. (backward compatible for now) --- README.md | 73 ++++++++++++++++++++++++-------------- lua/lazy/core/loader.lua | 27 +++++++++++--- lua/lazy/core/plugin.lua | 9 +++++ lua/lazy/example.lua | 4 +-- lua/lazy/health.lua | 52 +++++++++++++++------------ lua/lazy/types.lua | 9 +++-- tests/core/plugin_spec.lua | 35 ++++++++++++++++++ 7 files changed, 150 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index a237743..594b1ae 100644 --- a/README.md +++ b/README.md @@ -79,31 +79,32 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | -| **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 | -| **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 `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | -| **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. | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | -| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | -| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | -| **event** | `string?` or `string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | -| **cmd** | `string?` or `string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | -| **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. | +| Property | Type | Description | +| ---------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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` | +| **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 | +| **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 `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | +| **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. | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **config** | `fun(LazyPlugin, opts:table)` or `true` | `config` is executed when the plugin loads. You can also set it to `true`, to automatically run `require("plugin").setup(opts)`. See also `opts`. | +| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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()` | +| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | +| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | +| **event** | `string?` or `string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | +| **cmd** | `string?` or `string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| **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. | ### Lazy Loading @@ -224,11 +225,11 @@ return { config = true, -- run require("neorg").setup() }, - -- or set a custom config: + -- or set custom options: { "nvim-neorg/neorg", ft = "norg", - config = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) + opts = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) }, { @@ -660,6 +661,24 @@ For a real-life example, you can check [LazyVim](https://github.com/LazyVim/Lazy - [lazyvim.plugins](https://github.com/LazyVim/LazyVim/tree/main/lua/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"}}) +``` + +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. + ## 📦 Migration Guide ### [packer.nvim](https://github.com/wbthomason/packer.nvim) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 8ef6ee5..9054d32 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -220,7 +220,7 @@ function M._load(plugin, reason, opts) end M.packadd(plugin.dir) - if plugin.config then + if plugin.config or plugin.opts then M.config(plugin) end @@ -231,13 +231,32 @@ function M._load(plugin, reason, opts) end) end +-- Merges super opts or runs the opts function to override opts or return new ones +---@param plugin LazyPlugin +function M.opts(plugin) + local opts = plugin._.super and M.opts(plugin._.super) or {} + ---@type PluginOpts? + local plugin_opts = rawget(plugin, "opts") + + if type(plugin_opts) == "table" then + opts = Util.merge(opts, plugin_opts) + elseif type(plugin_opts) == "function" then + local new_opts = plugin_opts(plugin, opts) + if new_opts then + opts = new_opts + end + end + + return opts +end + --- runs plugin config ---@param plugin LazyPlugin function M.config(plugin) local fn if type(plugin.config) == "function" then fn = function() - plugin.config(plugin) + plugin.config(plugin, M.opts(plugin)) end else local normname = Util.normname(plugin.name) @@ -254,8 +273,8 @@ function M.config(plugin) end if #mods == 1 then fn = function() - local opts = plugin.config - if opts == true then + local opts = M.opts(plugin) + if next(opts) == nil then opts = nil end require(mods[1]).setup(opts) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index fe3a34b..d955b49 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -87,6 +87,15 @@ function Spec:add(plugin, results, is_dep) plugin.cmd = type(plugin.cmd) == "string" and { plugin.cmd } or plugin.cmd plugin.ft = type(plugin.ft) == "string" and { plugin.ft } or plugin.ft + if type(plugin.config) == "table" then + self:warn( + "{" .. plugin.name .. "}: setting a table to `Plugin.config` is deprecated. Please use `Plugin.opts` instead" + ) + ---@diagnostic disable-next-line: assign-type-mismatch + plugin.opts = plugin.config + plugin.config = nil + end + plugin._ = {} plugin._.dep = is_dep diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua index 93f87d4..18c1ca9 100644 --- a/lua/lazy/example.lua +++ b/lua/lazy/example.lua @@ -31,11 +31,11 @@ return { config = true, -- run require("neorg").setup() }, - -- or set a custom config: + -- or set custom options: { "nvim-neorg/neorg", ft = "norg", - config = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) + opts = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) }, { diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 24b9de2..59fa139 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -68,8 +68,12 @@ function M.check_override(plugin) return end + local Handler = require("lazy.core.handler") + local skip = { "dependencies", "_", "opts" } + vim.list_extend(skip, vim.tbl_values(Handler.types)) + for key, value in pairs(plugin._.super) do - if key ~= "_" and plugin[key] and plugin[key] ~= value then + if not vim.tbl_contains(skip, key) and plugin[key] and plugin[key] ~= value then vim.health.report_warn("{" .. plugin.name .. "}: overriding <" .. key .. ">") end end @@ -77,29 +81,31 @@ end M.valid = { 1, - "name", - "url", - "enabled", - "lazy", - "dev", - "dependencies", - "init", - "config", - "build", - "branch", - "tag", - "commit", - "version", - "module", - "pin", - "cmd", - "event", - "keys", - "ft", - "dir", - "priority", - "cond", "_", + "branch", + "build", + "cmd", + "commit", + "cond", + "config", + "dependencies", + "dev", + "dir", + "enabled", + "event", + "ft", + "import", + "init", + "keys", + "lazy", + "module", + "name", + "opts", + "pin", + "priority", + "tag", + "url", + "version", } return M diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index ab3832f..557a2f4 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -15,10 +15,13 @@ ---@field cond? boolean ---@field super? LazyPlugin +---@alias PluginOpts table|fun(self:LazyPlugin, opts:table):table? + ---@class LazyPluginHooks ----@field init? fun(LazyPlugin) Will always be run ----@field config? fun(LazyPlugin)|true|table Will be executed when loading the plugin ----@field build? string|fun(LazyPlugin)|(string|fun(LazyPlugin))[] +---@field init? fun(self:LazyPlugin) Will always be run +---@field config? fun(self:LazyPlugin, opts:table)|true Will be executed when loading the plugin +---@field build? string|fun(self:LazyPlugin)|(string|fun(self:LazyPlugin))[] +---@field opts? PluginOpts ---@class LazyPluginHandlers ---@field event? string[] diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 7995381..d3b8902 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -1,5 +1,6 @@ local Config = require("lazy.core.config") local Plugin = require("lazy.core.plugin") +local Loader = require("lazy.core.loader") local assert = require("luassert") @@ -272,3 +273,37 @@ describe("plugin spec opt", function() end end) end) + +describe("plugin opts", function() + it("correctly parses opts", function() + ---@type {spec:LazySpec, opts:table}[] + local tests = { + { + spec = { { "foo/foo", opts = { a = 1, b = 1 } }, { "foo/foo", opts = { a = 2 } } }, + opts = { a = 2, b = 1 }, + }, + { + spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", opts = { a = 2 } } }, + opts = { a = 2, b = 1 }, + }, + { + spec = { { "foo/foo", opts = { a = 1, b = 1 } }, { "foo/foo", config = { a = 2 } } }, + opts = { a = 2, b = 1 }, + }, + { + spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", config = { a = 2 } } }, + opts = { a = 2, b = 1 }, + }, + { + spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", config = { a = vim.NIL } } }, + opts = { b = 1 }, + }, + } + + for _, test in ipairs(tests) do + local spec = Plugin.Spec.new(test.spec) + assert(spec.plugins.foo) + assert.same(test.opts, Loader.opts(spec.plugins.foo)) + end + end) +end) From 2b1fccb817c41cc141ddb094244ac3849b45835b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 14:02:50 +0000 Subject: [PATCH 0655/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 73 ++++++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0ff1888..c9b3d98 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -111,30 +111,31 @@ It is recommended to run `:checkhealth lazy` after installation PLUGIN SPEC *lazy.nvim-plugin-spec* -│ Property │ Type │ Description │ -│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ -│**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 │ -│**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 │ -│**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 fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ -│**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.│ -│**init** │fun(LazyPlugin) │init functions are always executed during startup │ -│**config** │fun(LazyPlugin) or true or table │config is executed when the plugin loads. You can also set to true or pass a table, that will be passed to require("plugin").setup(opts) │ -│**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ -│**branch** │string? │Branch of the repository │ -│**tag** │string? │Tag of the repository │ -│**commit** │string? │Commit of the repository │ -│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ -│**pin** │boolean? │When true, this plugin will not be included in updates │ -│**event** │string? or string[] │Lazy-load on event. Events can be specified as BufEnter or with a pattern like BufEnter .lua │ -│**cmd** │string? or string[] │Lazy-load on command │ -│**ft** │string? or string[] │Lazy-load on filetype │ -│**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ -│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ -│**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. │ +│ Property │ Type │ Description │ +│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ +│**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 │ +│**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 │ +│**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 fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ +│**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. │ +│**init** │fun(LazyPlugin) │init functions are always executed during startup │ +│**config** │fun(LazyPlugin, opts:table) or true │config is executed when the plugin loads. You can also set it to true, to automatically run require("plugin").setup(opts). See also opts. │ +│**opts** │table or fun(LazyPlugin, opts:table) │opts should be a table (will be merged with parent 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() │ +│**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ +│**branch** │string? │Branch of the repository │ +│**tag** │string? │Tag of the repository │ +│**commit** │string? │Commit of the repository │ +│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ +│**pin** │boolean? │When true, this plugin will not be included in updates │ +│**event** │string? or string[] │Lazy-load on event. Events can be specified as BufEnter or with a pattern like BufEnter .lua │ +│**cmd** │string? or string[] │Lazy-load on command │ +│**ft** │string? or string[] │Lazy-load on filetype │ +│**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ +│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ +│**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. │ LAZY LOADING ~ @@ -271,11 +272,11 @@ EXAMPLES ~ config = true, -- run require("neorg").setup() }, - -- or set a custom config: + -- or set custom options: { "nvim-neorg/neorg", ft = "norg", - config = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) + opts = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) }, { @@ -724,6 +725,26 @@ For a real-life example, you can check LazyVim - lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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"}}) +< + + +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. + MIGRATION GUIDE *lazy.nvim-migration-guide* PACKER.NVIM <HTTPS://GITHUB.COM/WBTHOMASON/PACKER.NVIM> ~ From ef87c24e8ede2a94cbeaea1667eaeb7f8ed40dc0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 15:18:50 +0100 Subject: [PATCH 0656/1610] chore(main): release 9.0.0 (#350) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b02ae2f..212b4bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [9.0.0](https://github.com/folke/lazy.nvim/compare/v8.1.0...v9.0.0) (2023-01-08) + + +### ⚠ BREAKING CHANGES + +* **spec:** setting a table to `Plugin.config` is now deprecated. Please use `Plugin.opts` instead. (backward compatible for now) + +### Features + +* **git:** added fast `Git.get_origin` and `Git.get_config` ([a39fa0f](https://github.com/folke/lazy.nvim/commit/a39fa0f0ced7324800eff0a4eb0ed68bf13452d1)) +* **git:** lazy now detects origin changes and will fix it on update. Fixes [#346](https://github.com/folke/lazy.nvim/issues/346). Fixes [#331](https://github.com/folke/lazy.nvim/issues/331) ([615781a](https://github.com/folke/lazy.nvim/commit/615781aebfc0230669a2e5750cba3c65f0b8a90e)) +* **spec:** setting a table to `Plugin.config` is now deprecated. Please use `Plugin.opts` instead. (backward compatible for now) ([7260a2b](https://github.com/folke/lazy.nvim/commit/7260a2b28be807c4bdc1caf23fa35c2aa33aa6ac)) +* **util:** better deep merging with `Util.merge` ([6a31b97](https://github.com/folke/lazy.nvim/commit/6a31b97e3729af3710207642968e1492071a7dbc)) + ## [8.1.0](https://github.com/folke/lazy.nvim/compare/v8.0.0...v8.1.0) (2023-01-07) From e77be3cf3b01402b86464e1734fb5ead448ce12e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 8 Jan 2023 18:45:30 +0100 Subject: [PATCH 0657/1610] fix(spec): `Plugin.opts` is now always a table. Fixes #351 --- lua/lazy/core/loader.lua | 7 ++----- lua/lazy/core/util.lua | 3 +++ tests/core/plugin_spec.lua | 8 ++++++++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 9054d32..1ed7361 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -234,6 +234,7 @@ end -- Merges super opts or runs the opts function to override opts or return new ones ---@param plugin LazyPlugin function M.opts(plugin) + ---@type table local opts = plugin._.super and M.opts(plugin._.super) or {} ---@type PluginOpts? local plugin_opts = rawget(plugin, "opts") @@ -273,11 +274,7 @@ function M.config(plugin) end if #mods == 1 then fn = function() - local opts = M.opts(plugin) - if next(opts) == nil then - opts = nil - end - require(mods[1]).setup(opts) + require(mods[1]).setup(M.opts(plugin)) end else return Util.error( diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 70c1eb8..213a217 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -295,6 +295,9 @@ end --- Values will me merged in-place in the first left-most table. If you want the result to be in --- a new table, then simply pass an empty table as the first argument `vim.merge({}, ...)` --- Supports clearing values by setting a key to `vim.NIL` +---@generic T +---@param ... T +---@return T function M.merge(...) local values = { ... } local ret = values[1] diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index d3b8902..f7d39e2 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -298,6 +298,14 @@ describe("plugin opts", function() spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", config = { a = vim.NIL } } }, opts = { b = 1 }, }, + { + spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo" } }, + opts = { a = 1, b = 1 }, + }, + { + spec = { { "foo/foo" }, { "foo/foo" } }, + opts = {}, + }, } for _, test in ipairs(tests) do From a32e307981519a25dd3f05a33a6b7eea709f0fdc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 9 Jan 2023 08:05:32 +0100 Subject: [PATCH 0658/1610] fix(diffview): fixed parameter for showing single commit with DiffView. Fixes #304 --- lua/lazy/view/diff.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/diff.lua b/lua/lazy/view/diff.lua index 24955b8..f4fe5af 100644 --- a/lua/lazy/view/diff.lua +++ b/lua/lazy/view/diff.lua @@ -25,7 +25,7 @@ M.handlers = { ["diffview.nvim"] = function(plugin, diff) local args if diff.commit then - args = ("-C=%s"):format(plugin.dir) .. " " .. diff.commit + args = ("-C=%s"):format(plugin.dir) .. " " .. diff.commit .. "^!" else args = ("-C=%s"):format(plugin.dir) .. " " .. diff.from .. ".." .. diff.to end From 3a216d008def355813ede7deb5392276b7e3c10c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 9 Jan 2023 08:05:46 +0100 Subject: [PATCH 0659/1610] fix(docs): auto-gen of readme stuff --- lua/lazy/docs.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index d274a57..118fcde 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -36,7 +36,7 @@ function M.save(contents) if not readme:find(pattern) then error("tag " .. tag .. " not found") end - if tag == "commands" or tag == "colors" or tag == "plugins" then + if tag == "commands" or tag == "colors" or tag == "plugins" or tag == "keymaps" then readme = readme:gsub(pattern, "%1\n\n" .. content .. "\n\n%2") else readme = readme:gsub(pattern, "%1\n\n```lua\n" .. content .. "\n```\n\n%2") @@ -137,7 +137,7 @@ end function M.plugins() local Config = require("lazy.core.config") - local lines = { "## Plugins", "" } + local lines = {} Util.foreach(Config.plugins, function(name, plugin) if plugin.url then lines[#lines + 1] = "- [" .. name .. "](" .. plugin.url:gsub("%.git$", "") .. ")" From 55e86f855adfa259b751242da6c6cce2cebbbc7c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Jan 2023 07:06:45 +0000 Subject: [PATCH 0660/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c9b3d98..1c3dad8 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 08 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 09 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From d5345910a742f236d4c04273ed3956e543936022 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 9 Jan 2023 08:22:01 +0100 Subject: [PATCH 0661/1610] docs: clarified opts/config a bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 594b1ae..d2f1e49 100644 --- a/README.md +++ b/README.md @@ -91,8 +91,8 @@ require("lazy").setup({ | **cond** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | | **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. | | **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **config** | `fun(LazyPlugin, opts:table)` or `true` | `config` is executed when the plugin loads. You can also set it to `true`, to automatically run `require("plugin").setup(opts)`. See also `opts`. | | **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require("plugin").setup(opts)`. See also `opts`. | | **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | | **branch** | `string?` | Branch of the repository | | **tag** | `string?` | Tag of the repository | From 1ca3f101c888b0cf5085bc12446061792e8ee024 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Jan 2023 07:22:56 +0000 Subject: [PATCH 0662/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1c3dad8..4296883 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -122,8 +122,8 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**cond** │boolean? or fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ │**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. │ │**init** │fun(LazyPlugin) │init functions are always executed during startup │ -│**config** │fun(LazyPlugin, opts:table) or true │config is executed when the plugin loads. You can also set it to true, to automatically run require("plugin").setup(opts). See also opts. │ │**opts** │table or fun(LazyPlugin, opts:table) │opts should be a table (will be merged with parent 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) or true │config is executed when the plugin loads. The default implementation will automatically run require("plugin").setup(opts). See also opts. │ │**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ │**branch** │string? │Branch of the repository │ │**tag** │string? │Tag of the repository │ From d813c518d54ced6e8c4c96931bf31329e258b791 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 9 Jan 2023 09:47:23 +0100 Subject: [PATCH 0663/1610] docs: improvements to readme updater --- lua/lazy/docs.lua | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 118fcde..44bddfa 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -25,25 +25,31 @@ function M.fix_indent(str) return table.concat(lines, "\n") end ----@param contents table<string, string> +---@alias ReadmeBlock {content:string, lang?:string} +---@param contents table<string, ReadmeBlock|string> function M.save(contents) local readme = Util.read_file("README.md") - for tag, content in pairs(contents) do - content = M.fix_indent(content) + for tag, block in pairs(contents) do + if type(block) == "string" then + block = { content = block, lang = "lua" } + end + ---@cast block ReadmeBlock + local content = M.fix_indent(block.content) content = content:gsub("%%", "%%%%") content = vim.trim(content) local pattern = "(<%!%-%- " .. tag .. ":start %-%->).*(<%!%-%- " .. tag .. ":end %-%->)" if not readme:find(pattern) then error("tag " .. tag .. " not found") end - if tag == "commands" or tag == "colors" or tag == "plugins" or tag == "keymaps" then - readme = readme:gsub(pattern, "%1\n\n" .. content .. "\n\n%2") + if block.lang then + readme = readme:gsub(pattern, "%1\n\n```" .. block.lang .. "\n" .. content .. "\n```\n\n%2") else - readme = readme:gsub(pattern, "%1\n\n```lua\n" .. content .. "\n```\n\n%2") + readme = readme:gsub(pattern, "%1\n\n" .. content .. "\n\n%2") end end Util.write_file("README.md", readme) + vim.cmd.checktime() end ---@return string @@ -52,6 +58,7 @@ function M.extract(file, pattern) return assert(init:match(pattern)) end +---@return ReadmeBlock function M.commands() local commands = require("lazy.view.commands").commands local modes = require("lazy.view.config").commands @@ -83,7 +90,7 @@ function M.commands() end end end) - return M.table(lines) + return { content = M.table(lines) } end ---@param lines string[][] @@ -96,6 +103,7 @@ function M.table(lines) return table.concat(ret, "\n") end +---@return ReadmeBlock function M.colors() local str = M.extract("lua/lazy/view/colors.lua", "\nM%.colors = ({.-\n})") ---@type table<string,string> @@ -113,7 +121,7 @@ function M.colors() Util.foreach(require("lazy.view.colors").colors, function(group, link) lines[#lines + 1] = { "**Lazy" .. group .. "**", "***" .. link .. "***", comments[group] or "" } end) - return M.table(lines) + return { content = M.table(lines) } end function M.update() @@ -132,18 +140,20 @@ function M.update() commands = M.commands(), colors = M.colors(), }) - vim.cmd.checktime() end -function M.plugins() - local Config = require("lazy.core.config") +---@param plugins? LazyPlugin[] +---@return ReadmeBlock +function M.plugins(plugins) + plugins = plugins or require("lazy.core.config").plugins + ---@type string[] local lines = {} - Util.foreach(Config.plugins, function(name, plugin) + Util.foreach(plugins, function(name, plugin) if plugin.url then lines[#lines + 1] = "- [" .. name .. "](" .. plugin.url:gsub("%.git$", "") .. ")" end end) - M.save({ plugins = table.concat(lines, "\n") }) + return { content = table.concat(lines, "\n") } end return M From 4304035ef4eae2d9dfac4fc082a1b391e6cd928e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 9 Jan 2023 13:25:50 +0100 Subject: [PATCH 0664/1610] feat(spec): allow git@ and http urls in `Plugin[1]` without `url=`. Fixes #357 --- lua/lazy/core/plugin.lua | 7 ++++++- tests/core/plugin_spec.lua | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index d955b49..adaefae 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -52,7 +52,12 @@ function Spec:add(plugin, results, is_dep) end if not plugin.url and plugin[1] then - plugin.url = Config.options.git.url_format:format(plugin[1]) + local prefix = plugin[1]:sub(1, 4) + if prefix == "http" or prefix == "git@" then + plugin.url = plugin[1] + else + plugin.url = Config.options.git.url_format:format(plugin[1]) + end end if plugin.dir then diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index f7d39e2..ac8b3cb 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -11,6 +11,7 @@ describe("plugin spec url/name", function() { { dir = "~/foo" }, { name = "foo", dir = vim.fn.fnamemodify("~/foo", ":p") } }, { { dir = "/tmp/foo" }, { dir = "/tmp/foo", name = "foo" } }, { { "foo/bar" }, { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } }, + { { "https://foo.bar" }, { [1] = "https://foo.bar", name = "foo.bar", url = "https://foo.bar" } }, { { "foo/bar", name = "foobar" }, { [1] = "foo/bar", name = "foobar", url = "https://github.com/foo/bar.git" } }, { { "foo/bar", url = "123" }, { [1] = "foo/bar", name = "123", url = "123" } }, { { url = "https://foobar" }, { name = "foobar", url = "https://foobar" } }, From e6ee0fa6103e9514e85a96fc16902ad7f777b53f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 9 Jan 2023 20:21:31 +0100 Subject: [PATCH 0665/1610] fix(ui): keymap for building a single plugin changed from `b` to `gb`. Fixes #358 --- lua/lazy/view/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index b75c0f5..1f38540 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -144,7 +144,7 @@ M.commands = { id = 13, plugins = true, plugins_required = true, - key_plugin = "b", + key_plugin = "gb", }, } From b28c6b900030556e4e72f2ce68abae0e7292a3bf Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Jan 2023 07:32:28 +0100 Subject: [PATCH 0666/1610] feat(util): `Util.merge` now support advanced merging strategies. Docs coming soon --- TODO.md | 5 +++++ lua/lazy/core/plugin.lua | 16 +++------------- lua/lazy/core/util.lua | 31 +++++++++++++++++++++++++++++- tests/core/util_spec.lua | 41 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 14 deletions(-) diff --git a/TODO.md b/TODO.md index 5ad36cb..59607a5 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,10 @@ # ✅ TODO +- [ ] better merging options? +- [ ] especially what to do with merging of handlers? +- [ ] overwriting keymaps probably doesn't work +- [ ] disabled deps? + - [x] fancy UI to manage all your Neovim plugins - [x] auto lazy-loading of lua modules - [x] lazy-loading on events, commands, filetypes and key mappings diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index adaefae..8156240 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -270,20 +270,10 @@ function Spec:merge(old, new) for _, prop in ipairs(list_merge) do if new[prop] and old[prop] then - ---@type any[] - local props = {} - ---@diagnostic disable-next-line: no-unknown - for _, value in ipairs(old[prop]) do - props[#props + 1] = value + if new[prop].__merge == nil then + new[prop].__merge = true end - ---@diagnostic disable-next-line: no-unknown - for _, value in ipairs(new[prop]) do - if not vim.tbl_contains(props, value) then - props[#props + 1] = value - end - end - ---@diagnostic disable-next-line: no-unknown - new[prop] = props + new[prop] = Util.merge(old[prop], new[prop]) end end new._.super = old diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 213a217..981ad34 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -286,10 +286,27 @@ function M.debug(msg, level, opts) end end +local MERGE = "__merge" + local function can_merge(v) return type(v) == "table" and (vim.tbl_isempty(v) or not M.is_list(v)) end +local function can_extend(v) + return type(v) == "table" and (vim.tbl_isempty(v) or M.is_list(v)) +end + +---@param v any|{__merge:boolean} +---@param merge? boolean +---@return boolean? +local function check_merge(v, merge) + if type(v) == "table" and v[MERGE] ~= nil then + merge = v[MERGE] + v[MERGE] = nil + end + return merge +end + --- Merges the values similar to vim.tbl_deep_extend with the **force** behavior, --- but the values can be any type, in which case they override the values on the left. --- Values will me merged in-place in the first left-most table. If you want the result to be in @@ -301,12 +318,24 @@ end function M.merge(...) local values = { ... } local ret = values[1] + + if ret == vim.NIL then + ret = nil + end + + local merge = check_merge(ret) + for i = 2, #values, 1 do local value = values[i] - if can_merge(ret) and can_merge(value) then + merge = check_merge(value, merge) + if can_merge(ret) and can_merge(value) and merge ~= false then for k, v in pairs(value) do ret[k] = M.merge(ret[k], v) end + elseif can_extend(ret) and can_extend(value) and merge then + for _, v in ipairs(value) do + ret[#ret + 1] = v + end elseif value == vim.NIL then ret = nil else diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index 7349c68..7d16ca6 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -132,4 +132,45 @@ describe("util", function() assert(root, "foobar root not found") assert.same(Helpers.path("new/lua/foobar"), root) end) + + it("merges correctly", function() + local tests = { + { + input = { { a = 1 }, { b = 2 } }, + output = { a = 1, b = 2 }, + }, + { + input = { { a = 1 }, { a = 2 } }, + output = { a = 2 }, + }, + { + input = { { a = { 1, 2 } }, { a = { 3 } } }, + output = { a = { 3 } }, + }, + { + input = { { b = { 1, 2 } }, { a = { 3 }, __merge = false } }, + output = { a = { 3 } }, + }, + { + input = { { a = 1 }, { b = 2, __merge = false } }, + output = { b = 2 }, + }, + { + input = { { a = { 1, 2 } }, { a = { 3, __merge = true } } }, + output = { a = { 1, 2, 3 } }, + }, + { + input = { { a = { 1, 2, __merge = true } }, { a = { 3 } } }, + output = { a = { 1, 2, 3 } }, + }, + { + input = { { a = { 1, 2, __merge = true } }, { a = { 3, __merge = false } } }, + output = { a = { 3 } }, + }, + } + + for _, test in ipairs(tests) do + assert.same(test.output, Util.merge(unpack(test.input))) + end + end) end) From 1f17bb79b77882118db1b7913e7f1a89c9734433 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Jan 2023 06:33:21 +0000 Subject: [PATCH 0667/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4296883..618d3e0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 09 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 10 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From d3a963d51c0b5419a1fd84774b24d35a3e6c8996 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Jan 2023 08:42:20 +0100 Subject: [PATCH 0668/1610] refactor(util): improved notify functions --- lua/lazy/core/cache.lua | 13 +++++------ lua/lazy/core/plugin.lua | 2 +- lua/lazy/core/util.lua | 48 +++++++++++++++++++++++++--------------- 3 files changed, 37 insertions(+), 26 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 09792bc..e99f79e 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -105,25 +105,24 @@ function M.disable() _G.loadfile = M._loadfile M.enabled = false if M.debug and vim.tbl_count(M.topmods) > 1 then - M.log(M.topmods, vim.log.levels.WARN, { title = "topmods" }) + M.log(M.topmods, { level = vim.log.levels.WARN, title = "topmods" }) end if M.debug and false then local stats = vim.deepcopy(M.stats) stats.time = (stats.time or 0) / 1e6 stats.find.time = (stats.find.time or 0) / 1e6 stats.autoload.time = (stats.autoload.time or 0) / 1e6 - M.log(stats, nil, { title = "stats" }) + M.log(stats, { title = "stats" }) end end ---@param msg string|table ----@param level? number ----@param opts? {lang:string, title:string} -function M.log(msg, level, opts) +---@param opts? LazyNotifyOpts +function M.log(msg, opts) if M.debug then msg = vim.deepcopy(msg) vim.schedule(function() - require("lazy.core.util").debug(msg, level, opts) + require("lazy.core.util").debug(msg, opts) end) end end @@ -208,7 +207,7 @@ function M.load(modkey, modpath) entry.hash = hash if M.debug then - M.log("`" .. modpath .. "`", vim.log.levels.WARN, { title = "Cache.load" }) + M.log("`" .. modpath .. "`", { level = vim.log.levels.WARN, title = "Cache.load" }) end chunk, err = M._loadfile(entry.modpath) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 8156240..135bdd6 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -180,7 +180,7 @@ function Spec:report(level) level = level or vim.log.levels.ERROR for _, notif in ipairs(self.notifs) do if notif.level >= level then - Util.notify(notif.msg, notif.level) + Util.notify(notif.msg, { level = notif.level }) end end end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 981ad34..b3a9811 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -219,14 +219,15 @@ function M.lsmod(modname, fn) end) end +---@alias LazyNotifyOpts {lang?:string, title?:string, level?:number} + ---@param msg string|string[] ----@param opts? {lang:string, title:string} -function M.notify(msg, level, opts) +---@param opts? LazyNotifyOpts +function M.notify(msg, opts) if vim.in_fast_event() then - vim.schedule(function() - M.notify(msg, level, opts) + return vim.schedule(function() + M.notify(msg, opts) end) - return end opts = opts or {} @@ -239,7 +240,7 @@ function M.notify(msg, level, opts) ) end local lang = opts.lang or "markdown" - vim.notify(msg, level, { + vim.notify(msg, opts.level or vim.log.levels.INFO, { on_open = function(win) pcall(require, "nvim-treesitter") vim.wo[win].conceallevel = 3 @@ -251,38 +252,49 @@ function M.notify(msg, level, opts) vim.bo[buf].syntax = lang end end, - title = "lazy.nvim" .. (opts.title and ": " .. opts.title or ""), + title = opts.title or "lazy.nvim", }) end ---@param msg string|string[] -function M.error(msg) - M.notify(msg, vim.log.levels.ERROR) +---@param opts? LazyNotifyOpts +function M.error(msg, opts) + opts = opts or {} + opts.level = vim.log.levels.ERROR + M.notify(msg, opts) end ---@param msg string|string[] -function M.info(msg) - M.notify(msg, vim.log.levels.INFO) +---@param opts? LazyNotifyOpts +function M.info(msg, opts) + opts = opts or {} + opts.level = vim.log.levels.INFO + M.notify(msg, opts) end ---@param msg string|string[] -function M.warn(msg) - M.notify(msg, vim.log.levels.WARN) +---@param opts? LazyNotifyOpts +function M.warn(msg, opts) + opts = opts or {} + opts.level = vim.log.levels.WARN + M.notify(msg, opts) end ---@param msg string|table ----@param level? number ----@param opts? {lang:string, title:string} -function M.debug(msg, level, opts) +---@param opts? LazyNotifyOpts +function M.debug(msg, opts) if not require("lazy.core.config").options.debug then return end opts = opts or {} + if opts.title then + opts.title = "lazy.nvim: " .. opts.title + end if type(msg) == "string" then - M.notify(msg, level, opts) + M.notify(msg, opts) else opts.lang = "lua" - M.notify(vim.inspect(msg), level, opts) + M.notify(vim.inspect(msg), opts) end end From 9fa62ea8ea935dec7078587c3664047db2065bf2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Jan 2023 08:42:51 +0100 Subject: [PATCH 0669/1610] fix(cache): dont keep invalid entries in the cache (cleanup) --- lua/lazy/core/cache.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index e99f79e..4d5058a 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -144,9 +144,14 @@ function M.loader(modname) local entry = M.cache[modname] local chunk, err - if entry and M.check_path(modname, entry.modpath) then - M.stats.find.total = M.stats.find.total + 1 - chunk, err = M.load(modname, entry.modpath) + if entry then + if M.check_path(modname, entry.modpath) then + M.stats.find.total = M.stats.find.total + 1 + chunk, err = M.load(modname, entry.modpath) + else + M.cache[modname] = nil + M.dirty = true + end end if not chunk then -- find the modpath and load the module From ad7aafb257516cefff85aceb5d36041090b40559 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Jan 2023 09:20:39 +0100 Subject: [PATCH 0670/1610] fix(spec): don't import specs more than once --- lua/lazy/core/plugin.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 135bdd6..bdba503 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -225,6 +225,9 @@ function Spec:import(spec) if spec.import == "lazy" then return self:error("You can't name your plugins module `lazy`.") end + if vim.tbl_contains(self.modules, spec.import) then + return + end if spec.enabled == false or (type(spec.enabled) == "function" and not spec.enabled()) then return end @@ -278,6 +281,7 @@ function Spec:merge(old, new) end new._.super = old setmetatable(new, { __index = old }) + return new end From 70b07ebad5061010290e4b47cee3b2ba2277fe73 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Jan 2023 09:28:54 +0100 Subject: [PATCH 0671/1610] ci: let release-please update Config.version --- .github/workflows/ci.yml | 2 ++ lua/lazy/core/config.lua | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2adb58f..8046e5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,6 +55,8 @@ jobs: with: release-type: simple package-name: lazy.nvim + extra-files: | + lua/lazy/core/config.lua - uses: actions/checkout@v2 - name: tag stable versions if: ${{ steps.release.outputs.release_created }} diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 372bc70..ed010b9 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -139,6 +139,8 @@ M.defaults = { debug = false, } +M.version = "9.0.0" -- x-release-please-version + M.ns = vim.api.nvim_create_namespace("lazy") ---@type LazySpecLoader From 18eb724dffd613b1c2bde45f86aa05a5477ce80b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Jan 2023 09:40:28 +0100 Subject: [PATCH 0672/1610] chore(main): release 9.1.0 (#352) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 18 ++++++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 212b4bd..9663cf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## [9.1.0](https://github.com/folke/lazy.nvim/compare/v9.0.0...v9.1.0) (2023-01-10) + + +### Features + +* **spec:** allow git@ and http urls in `Plugin[1]` without `url=`. Fixes [#357](https://github.com/folke/lazy.nvim/issues/357) ([4304035](https://github.com/folke/lazy.nvim/commit/4304035ef4eae2d9dfac4fc082a1b391e6cd928e)) +* **util:** `Util.merge` now support advanced merging strategies. Docs coming soon ([b28c6b9](https://github.com/folke/lazy.nvim/commit/b28c6b900030556e4e72f2ce68abae0e7292a3bf)) + + +### Bug Fixes + +* **cache:** dont keep invalid entries in the cache (cleanup) ([9fa62ea](https://github.com/folke/lazy.nvim/commit/9fa62ea8ea935dec7078587c3664047db2065bf2)) +* **diffview:** fixed parameter for showing single commit with DiffView. Fixes [#304](https://github.com/folke/lazy.nvim/issues/304) ([a32e307](https://github.com/folke/lazy.nvim/commit/a32e307981519a25dd3f05a33a6b7eea709f0fdc)) +* **docs:** auto-gen of readme stuff ([3a216d0](https://github.com/folke/lazy.nvim/commit/3a216d008def355813ede7deb5392276b7e3c10c)) +* **spec:** `Plugin.opts` is now always a table. Fixes [#351](https://github.com/folke/lazy.nvim/issues/351) ([e77be3c](https://github.com/folke/lazy.nvim/commit/e77be3cf3b01402b86464e1734fb5ead448ce12e)) +* **spec:** don't import specs more than once ([ad7aafb](https://github.com/folke/lazy.nvim/commit/ad7aafb257516cefff85aceb5d36041090b40559)) +* **ui:** keymap for building a single plugin changed from `b` to `gb`. Fixes [#358](https://github.com/folke/lazy.nvim/issues/358) ([e6ee0fa](https://github.com/folke/lazy.nvim/commit/e6ee0fa6103e9514e85a96fc16902ad7f777b53f)) + ## [9.0.0](https://github.com/folke/lazy.nvim/compare/v8.1.0...v9.0.0) (2023-01-08) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index ed010b9..69ff4d1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -139,7 +139,7 @@ M.defaults = { debug = false, } -M.version = "9.0.0" -- x-release-please-version +M.version = "9.1.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 5faadf6398f99f781a212d2a7cbd39a688d32300 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Jan 2023 11:19:47 +0100 Subject: [PATCH 0673/1610] fix(ui): get_plugin should return when ui is not showing --- lua/lazy/view/render.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index fd4b138..1c0bd3c 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -91,6 +91,9 @@ end ---@param row? number ---@return LazyPlugin? function M:get_plugin(row) + if not (self.view.win and vim.api.nvim_win_is_valid(self.view.win)) then + return + end row = row or vim.api.nvim_win_get_cursor(self.view.win)[1] for _, loc in ipairs(self.locations) do if row >= loc.from and row <= loc.to then From d2110278be136fd977d357ff49689352d58b2e83 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Jan 2023 11:21:52 +0100 Subject: [PATCH 0674/1610] chore(main): release 9.1.1 (#360) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9663cf1..e6db6e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.1.1](https://github.com/folke/lazy.nvim/compare/v9.1.0...v9.1.1) (2023-01-10) + + +### Bug Fixes + +* **ui:** get_plugin should return when ui is not showing ([5faadf6](https://github.com/folke/lazy.nvim/commit/5faadf6398f99f781a212d2a7cbd39a688d32300)) + ## [9.1.0](https://github.com/folke/lazy.nvim/compare/v9.0.0...v9.1.0) (2023-01-10) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 69ff4d1..720b4ce 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -139,7 +139,7 @@ M.defaults = { debug = false, } -M.version = "9.1.0" -- x-release-please-version +M.version = "9.1.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 8756c0950ca9053713262abd1092f6d100adc9a5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Jan 2023 14:26:28 +0100 Subject: [PATCH 0675/1610] fix(ui): properly position Lazy tabs when opening another cmd. Fixes #361 --- lua/lazy/util.lua | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 8e8a638..846c6d0 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -8,14 +8,28 @@ end ---@param opts? LazyFloatOptions function M.float(opts) opts = opts or {} - if require("lazy.view").visible() then + local cursor + local View = require("lazy.view") + if View.visible() then + -- set cursor to the top of the ui, so the tabs are visible + cursor = vim.api.nvim_win_get_cursor(View.view.win) + vim.api.nvim_win_set_cursor(View.view.win, { 1, 0 }) opts = vim.tbl_deep_extend("force", { zindex = 60, border = "none", margin = { top = 3, left = 2, right = 2 }, }, opts) end - return require("lazy.view.float")(opts) + local ret = require("lazy.view.float")(opts) + -- restore the cursor + if cursor then + ret:on("BufLeave", function() + if View.visible() then + vim.api.nvim_win_set_cursor(View.view.win, cursor) + end + end, { once = true }) + end + return ret end function M.open(uri) From 5aca9280df4245df8bf8e33fe9bc4ce85507dc31 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 11 Jan 2023 13:40:19 +0100 Subject: [PATCH 0676/1610] perf(util): execute VeryLazy right after UIEnter --- lua/lazy/core/util.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index b3a9811..c13d7fe 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -141,10 +141,10 @@ end function M.very_lazy() local function _load() - vim.defer_fn(function() + vim.schedule(function() vim.g.did_very_lazy = true vim.cmd("do User VeryLazy") - end, 50) + end) end vim.api.nvim_create_autocmd("User", { @@ -154,7 +154,7 @@ function M.very_lazy() if vim.v.vim_did_enter == 1 then _load() else - vim.api.nvim_create_autocmd("VimEnter", { + vim.api.nvim_create_autocmd("UIEnter", { once = true, callback = function() _load() From 3b44c3c14ad69e7a26ae6408816f332af58202c3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 11 Jan 2023 13:43:17 +0100 Subject: [PATCH 0677/1610] fix(ui): reset buf and win options on resize --- lua/lazy/view/float.lua | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 6b22052..a4a05b0 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -103,11 +103,15 @@ function M:mount() if vim.bo[self.buf].filetype == "" then vim.bo[self.buf].filetype = "lazy" end - vim.bo[self.buf].bufhidden = "wipe" - vim.wo[self.win].conceallevel = 3 - vim.wo[self.win].spell = false - vim.wo[self.win].wrap = true - vim.wo[self.win].winhighlight = "Normal:LazyNormal" + + local function opts() + vim.bo[self.buf].bufhidden = "wipe" + vim.wo[self.win].conceallevel = 3 + vim.wo[self.win].spell = false + vim.wo[self.win].wrap = true + vim.wo[self.win].winhighlight = "Normal:LazyNormal" + end + opts() vim.api.nvim_create_autocmd("VimResized", { callback = function() @@ -120,7 +124,9 @@ function M:mount() ---@diagnostic disable-next-line: no-unknown config[key] = self.win_opts[key] end + config.style = self.opts.style ~= "" and self.opts.style or nil vim.api.nvim_win_set_config(self.win, config) + opts() vim.cmd([[do User LazyFloatResized]]) end, }) From 74bc61ab97c3bc2e73e19d269f23076d50c3285f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 11 Jan 2023 13:43:57 +0100 Subject: [PATCH 0678/1610] fix(handlers): allow overriding handler values --- lua/lazy/core/handler/init.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index 0935f51..67ad44c 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -77,8 +77,13 @@ end ---@param plugin LazyPlugin function M:add(plugin) + local values = {} for _, value in ipairs(plugin[self.type] or {}) do local key = self:key(value) + values[key] = value + end + + for key, value in pairs(values) do if not self.active[key] then self.active[key] = {} self:_add(value) @@ -89,7 +94,13 @@ end ---@param plugin LazyPlugin function M:del(plugin) + local values = {} for _, value in ipairs(plugin[self.type] or {}) do + local key = self:key(value) + values[key] = value + end + + for key, value in pairs(values) do local key = self:key(value) if self.active[key] and self.active[key][plugin.name] then self.active[key][plugin.name] = nil From 41c7a6a6c0569280e88f9d264c2734fbdacbe433 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Jan 2023 12:45:07 +0000 Subject: [PATCH 0679/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 618d3e0..584c2c2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 10 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 11 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From a64623899db9fe1a41c8bf86562feed6d4757ba0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 11 Jan 2023 17:13:03 +0100 Subject: [PATCH 0680/1610] fix(ui): possible error during initial install --- TODO.md | 5 +++++ lua/lazy/view/float.lua | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index 59607a5..d3d2f09 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,10 @@ # ✅ TODO +- [x] progress bar? +- [x] options when opening file +- [x] lazy notify? not ideal when installing missing stuff +- [x] topmods? + - [ ] better merging options? - [ ] especially what to do with merging of handlers? - [ ] overwriting keymaps probably doesn't work diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index a4a05b0..d6e3c39 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -115,7 +115,7 @@ function M:mount() vim.api.nvim_create_autocmd("VimResized", { callback = function() - if not self.win then + if not (self.win and vim.api.nvim_win_is_valid(self.win)) then return true end self:layout() From 9d494e05943995f8836cefd22b709920af36665b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Jan 2023 21:45:02 +0100 Subject: [PATCH 0681/1610] chore(main): release 9.1.2 (#362) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 15 +++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6db6e8..4d9de10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## [9.1.2](https://github.com/folke/lazy.nvim/compare/v9.1.1...v9.1.2) (2023-01-11) + + +### Bug Fixes + +* **handlers:** allow overriding handler values ([74bc61a](https://github.com/folke/lazy.nvim/commit/74bc61ab97c3bc2e73e19d269f23076d50c3285f)) +* **ui:** possible error during initial install ([a646238](https://github.com/folke/lazy.nvim/commit/a64623899db9fe1a41c8bf86562feed6d4757ba0)) +* **ui:** properly position Lazy tabs when opening another cmd. Fixes [#361](https://github.com/folke/lazy.nvim/issues/361) ([8756c09](https://github.com/folke/lazy.nvim/commit/8756c0950ca9053713262abd1092f6d100adc9a5)) +* **ui:** reset buf and win options on resize ([3b44c3c](https://github.com/folke/lazy.nvim/commit/3b44c3c14ad69e7a26ae6408816f332af58202c3)) + + +### Performance Improvements + +* **util:** execute VeryLazy right after UIEnter ([5aca928](https://github.com/folke/lazy.nvim/commit/5aca9280df4245df8bf8e33fe9bc4ce85507dc31)) + ## [9.1.1](https://github.com/folke/lazy.nvim/compare/v9.1.0...v9.1.1) (2023-01-10) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 720b4ce..410f06e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -139,7 +139,7 @@ M.defaults = { debug = false, } -M.version = "9.1.1" -- x-release-please-version +M.version = "9.1.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From e1cd9cd0adfb04432ffaf3d8bd54a5b409eb4273 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 11 Jan 2023 23:07:58 +0100 Subject: [PATCH 0682/1610] fix(loader): prevent loading plugins when loading specs --- lua/lazy/core/cache.lua | 14 ++++++-------- lua/lazy/core/plugin.lua | 3 +++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 4d5058a..5bd370a 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -72,23 +72,21 @@ end function M.check_autoload(modname, modpath) local start = uv.hrtime() M.stats.autoload.total = M.stats.autoload.total + 1 + -- check plugins. Again fast, since we check the plugin name from the path. -- only needed when the plugin mod has been loaded ---@type LazyCorePlugin local Plugin = package.loaded["lazy.core.plugin"] - if Plugin then + if Plugin and not Plugin.loading then local plugin = Plugin.find(modpath) if plugin and modpath:find(plugin.dir, 1, true) == 1 then -- we're not interested in loader time, so calculate delta here M.stats.autoload.time = M.stats.autoload.time + uv.hrtime() - start - -- only autoload when plugins have been loaded - if not vim.tbl_isempty(require("lazy.core.config").plugins) then - if not plugin._.loaded then - if plugin.module == false then - error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") - end - require("lazy.core.loader").load(plugin, { require = modname }) + if not plugin._.loaded then + if plugin.module == false then + error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") end + require("lazy.core.loader").load(plugin, { require = modname }) end return true end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index bdba503..88713e4 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -5,6 +5,7 @@ local Cache = require("lazy.core.cache") ---@class LazyCorePlugin local M = {} +M.loading = false local list_merge = { "dependencies" } vim.list_extend(list_merge, vim.tbl_values(Handler.types)) @@ -330,6 +331,7 @@ function M.update_state() end function M.load() + M.loading = true -- load specs Util.track("spec") Config.spec = Spec.new() @@ -363,6 +365,7 @@ function M.load() M.update_state() Util.track() require("lazy.core.cache").indexed_unloaded = false + M.loading = false end -- Finds the plugin that has this path From 07fd7adb3427ac510c33de308cd5dfcc6ba701b6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 11 Jan 2023 23:11:38 +0100 Subject: [PATCH 0683/1610] fix(cache): use cached chunk when specs are loading for valid plugins --- lua/lazy/core/cache.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 5bd370a..bad46ab 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -77,12 +77,13 @@ function M.check_autoload(modname, modpath) -- only needed when the plugin mod has been loaded ---@type LazyCorePlugin local Plugin = package.loaded["lazy.core.plugin"] - if Plugin and not Plugin.loading then + if Plugin then local plugin = Plugin.find(modpath) if plugin and modpath:find(plugin.dir, 1, true) == 1 then -- we're not interested in loader time, so calculate delta here M.stats.autoload.time = M.stats.autoload.time + uv.hrtime() - start - if not plugin._.loaded then + -- don't load if we're loading specs or if the plugin is already loaded + if not (Plugin.loading or plugin._.loaded) then if plugin.module == false then error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") end From 0741d6231917ef77cd5f69a9b1aacc402a676dd1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Jan 2023 23:13:41 +0100 Subject: [PATCH 0684/1610] chore(main): release 9.1.3 (#374) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d9de10..c80a637 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [9.1.3](https://github.com/folke/lazy.nvim/compare/v9.1.2...v9.1.3) (2023-01-11) + + +### Bug Fixes + +* **cache:** use cached chunk when specs are loading for valid plugins ([07fd7ad](https://github.com/folke/lazy.nvim/commit/07fd7adb3427ac510c33de308cd5dfcc6ba701b6)) +* **loader:** prevent loading plugins when loading specs ([e1cd9cd](https://github.com/folke/lazy.nvim/commit/e1cd9cd0adfb04432ffaf3d8bd54a5b409eb4273)) + ## [9.1.2](https://github.com/folke/lazy.nvim/compare/v9.1.1...v9.1.2) (2023-01-11) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 410f06e..97cc131 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -139,7 +139,7 @@ M.defaults = { debug = false, } -M.version = "9.1.2" -- x-release-please-version +M.version = "9.1.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 3fbe4fe27ab6b58e5dafd45c5316ec62791907d4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 12 Jan 2023 09:01:29 +0100 Subject: [PATCH 0685/1610] fix(ui): open diff and others over the ui. Don't try to be smart about it. Fixes #361 --- lua/lazy/util.lua | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 846c6d0..456ad83 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -7,29 +7,7 @@ end ---@param opts? LazyFloatOptions function M.float(opts) - opts = opts or {} - local cursor - local View = require("lazy.view") - if View.visible() then - -- set cursor to the top of the ui, so the tabs are visible - cursor = vim.api.nvim_win_get_cursor(View.view.win) - vim.api.nvim_win_set_cursor(View.view.win, { 1, 0 }) - opts = vim.tbl_deep_extend("force", { - zindex = 60, - border = "none", - margin = { top = 3, left = 2, right = 2 }, - }, opts) - end - local ret = require("lazy.view.float")(opts) - -- restore the cursor - if cursor then - ret:on("BufLeave", function() - if View.visible() then - vim.api.nvim_win_set_cursor(View.view.win, cursor) - end - end, { once = true }) - end - return ret + return require("lazy.view.float")(opts) end function M.open(uri) From bcd87a02150d68d2ee187e61b97585e1b33110ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Jan 2023 08:02:16 +0000 Subject: [PATCH 0686/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 584c2c2..5a9c935 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 11 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 12 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 2128ca90fb67928e5e23590142de9c94fc0a0d31 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 12 Jan 2023 13:07:51 +0100 Subject: [PATCH 0687/1610] feat(spec): event, keys, ft and cmd can now also be a function that returns the values to be used --- README.md | 52 ++++++++++++++++---------------- lua/lazy/core/cache.lua | 2 +- lua/lazy/core/loader.lua | 25 ++-------------- lua/lazy/core/plugin.lua | 61 +++++++++++++++++++++++++------------- lua/lazy/types.lua | 10 +++---- tests/core/plugin_spec.lua | 1 - 6 files changed, 76 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index d2f1e49..e568d31 100644 --- a/README.md +++ b/README.md @@ -79,32 +79,32 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | -| **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 | -| **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 `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | -| **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. | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require("plugin").setup(opts)`. See also `opts`. | -| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | -| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | -| **event** | `string?` or `string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | -| **cmd** | `string?` or `string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | -| **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. | +| Property | Type | Description | +| ---------------- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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` | +| **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 | +| **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 `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | +| **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. | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require("plugin").setup(opts)`. See also `opts`. | +| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | +| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | +| **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | +| **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| **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. | ### Lazy Loading diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index bad46ab..4cf01b5 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -346,7 +346,7 @@ function M.find(modname, opts) local updated = false ---@type LazyCoreConfig local Config = package.loaded["lazy.core.config"] - if Config then + if Config and Config.spec then for _, plugin in pairs(Config.spec.plugins) do if not (M.indexed[plugin.dir] or plugin._.loaded or plugin.module == false) then updated = M._index(plugin.dir) or updated diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 1ed7361..663a6da 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -231,33 +231,14 @@ function M._load(plugin, reason, opts) end) end --- Merges super opts or runs the opts function to override opts or return new ones ----@param plugin LazyPlugin -function M.opts(plugin) - ---@type table - local opts = plugin._.super and M.opts(plugin._.super) or {} - ---@type PluginOpts? - local plugin_opts = rawget(plugin, "opts") - - if type(plugin_opts) == "table" then - opts = Util.merge(opts, plugin_opts) - elseif type(plugin_opts) == "function" then - local new_opts = plugin_opts(plugin, opts) - if new_opts then - opts = new_opts - end - end - - return opts -end - --- runs plugin config ---@param plugin LazyPlugin function M.config(plugin) + local opts = Plugin.values(plugin, "opts", false) local fn if type(plugin.config) == "function" then fn = function() - plugin.config(plugin, M.opts(plugin)) + plugin.config(plugin, opts) end else local normname = Util.normname(plugin.name) @@ -274,7 +255,7 @@ function M.config(plugin) end if #mods == 1 then fn = function() - require(mods[1]).setup(M.opts(plugin)) + require(mods[1]).setup(opts) end else return Util.error( diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 88713e4..21634a4 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -7,9 +7,6 @@ local Cache = require("lazy.core.cache") local M = {} M.loading = false -local list_merge = { "dependencies" } -vim.list_extend(list_merge, vim.tbl_values(Handler.types)) - ---@class LazySpecLoader ---@field plugins table<string, LazyPlugin> ---@field disabled table<string, LazyPlugin> @@ -27,11 +24,26 @@ function Spec.new(spec) self.modules = {} self.notifs = {} if spec then - self:normalize(spec) + self:parse(spec) end return self end +function Spec:parse(spec) + self:normalize(spec) + + -- calculate handlers + for _, plugin in pairs(self.plugins) do + for _, handler in pairs(Handler.types) do + if plugin[handler] then + plugin[handler] = M.values(plugin, handler, true) + end + end + end + + self:fix_disabled() +end + -- PERF: optimized code to get package name without using lua patterns function Spec.get_name(pkg) local name = pkg:sub(-4) == ".git" and pkg:sub(1, -5) or pkg @@ -88,11 +100,6 @@ function Spec:add(plugin, results, is_dep) return end - plugin.event = type(plugin.event) == "string" and { plugin.event } or plugin.event - plugin.keys = type(plugin.keys) == "string" and { plugin.keys } or plugin.keys - plugin.cmd = type(plugin.cmd) == "string" and { plugin.cmd } or plugin.cmd - plugin.ft = type(plugin.ft) == "string" and { plugin.ft } or plugin.ft - if type(plugin.config) == "table" then self:warn( "{" .. plugin.name .. "}: setting a table to `Plugin.config` is deprecated. Please use `Plugin.opts` instead" @@ -272,14 +279,10 @@ function Spec:merge(old, new) self:error("Two plugins with the same name and different url:\n" .. vim.inspect({ old = old, new = new })) end - for _, prop in ipairs(list_merge) do - if new[prop] and old[prop] then - if new[prop].__merge == nil then - new[prop].__merge = true - end - new[prop] = Util.merge(old[prop], new[prop]) - end + if new.dependencies and old.dependencies then + vim.list_extend(new.dependencies, old.dependencies) end + new._.super = old setmetatable(new, { __index = old }) @@ -335,10 +338,8 @@ function M.load() -- load specs Util.track("spec") Config.spec = Spec.new() - Config.spec:normalize(vim.deepcopy(Config.options.spec)) + Config.spec:parse({ vim.deepcopy(Config.options.spec), "folke/lazy.nvim" }) - -- add ourselves - Config.spec:add({ "folke/lazy.nvim" }) -- override some lazy props local lazy = Config.spec.plugins["lazy.nvim"] if lazy then @@ -349,7 +350,6 @@ function M.load() end lazy._.loaded = {} end - Config.spec:fix_disabled() local existing = Config.plugins Config.plugins = Config.spec.plugins @@ -395,4 +395,25 @@ function M.has_errors(plugin) return false end +-- Merges super values or runs the values function to override values or return new ones +-- Used for opts, cmd, event, ft and keys +---@param plugin LazyPlugin +---@param prop string +---@param is_list? boolean +function M.values(plugin, prop, is_list) + ---@type table + local ret = plugin._.super and M.values(plugin._.super, prop) or {} + local values = rawget(plugin, prop) + + if not values then + return ret + elseif type(values) == "function" then + ret = values(plugin, ret) or ret + return type(ret) == "table" and ret or { ret } + end + + values = type(values) == "table" and values or { values } + return is_list and vim.list_extend(ret, values) or Util.merge(ret, values) +end + return M diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 557a2f4..6a0c055 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -27,7 +27,7 @@ ---@field event? string[] ---@field cmd? string[] ---@field ft? string[] ----@field keys? string[] +---@field keys? (string|LazyKeys)[] ---@field module? false ---@class LazyPluginRef @@ -53,10 +53,10 @@ ---@field _ LazyPluginState ---@class LazyPluginSpecHandlers ----@field event? string[]|string ----@field cmd? string[]|string ----@field ft? string[]|string ----@field keys? string|string[]|LazyKeys[] +---@field event? string[]|string|fun(self:LazyPlugin, event:string[]):string[] +---@field cmd? string[]|string|fun(self:LazyPlugin, cmd:string[]):string[] +---@field ft? string[]|string|fun(self:LazyPlugin, ft:string[]):string[] +---@field keys? string|string[]|LazyKeys[]|fun(self:LazyPlugin, keys:string[]):(string|LazyKeys)[] ---@field module? false ---@class LazyPluginSpec: LazyPluginBase,LazyPluginSpecHandlers,LazyPluginHooks,LazyPluginRef diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index ac8b3cb..d948817 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -262,7 +262,6 @@ describe("plugin spec opt", function() } for test, ret in pairs(tests) do local spec = Plugin.Spec.new(test) - spec:fix_disabled() assert(#spec.notifs == 0) if ret then assert(spec.plugins.bar) From 784bb3c10093b428c4dcc97f113fee8ce501350d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 12 Jan 2023 13:13:30 +0100 Subject: [PATCH 0688/1610] refactor: removed special `__merge` functionality --- lua/lazy/core/util.lua | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index c13d7fe..8a937a8 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -298,27 +298,10 @@ function M.debug(msg, opts) end end -local MERGE = "__merge" - local function can_merge(v) return type(v) == "table" and (vim.tbl_isempty(v) or not M.is_list(v)) end -local function can_extend(v) - return type(v) == "table" and (vim.tbl_isempty(v) or M.is_list(v)) -end - ----@param v any|{__merge:boolean} ----@param merge? boolean ----@return boolean? -local function check_merge(v, merge) - if type(v) == "table" and v[MERGE] ~= nil then - merge = v[MERGE] - v[MERGE] = nil - end - return merge -end - --- Merges the values similar to vim.tbl_deep_extend with the **force** behavior, --- but the values can be any type, in which case they override the values on the left. --- Values will me merged in-place in the first left-most table. If you want the result to be in @@ -335,19 +318,12 @@ function M.merge(...) ret = nil end - local merge = check_merge(ret) - for i = 2, #values, 1 do local value = values[i] - merge = check_merge(value, merge) - if can_merge(ret) and can_merge(value) and merge ~= false then + if can_merge(ret) and can_merge(value) then for k, v in pairs(value) do ret[k] = M.merge(ret[k], v) end - elseif can_extend(ret) and can_extend(value) and merge then - for _, v in ipairs(value) do - ret[#ret + 1] = v - end elseif value == vim.NIL then ret = nil else From 3f3d9df324022f1054d895c7eaeee6fe4e284545 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 12 Jan 2023 13:13:45 +0100 Subject: [PATCH 0689/1610] test: fixed tests for `Plugin.opts` --- tests/core/plugin_spec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index d948817..2eaf349 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -311,7 +311,7 @@ describe("plugin opts", function() for _, test in ipairs(tests) do local spec = Plugin.Spec.new(test.spec) assert(spec.plugins.foo) - assert.same(test.opts, Loader.opts(spec.plugins.foo)) + assert.same(test.opts, Plugin.values(spec.plugins.foo, "opts")) end end) end) From f3695bc5be49353a996af2fbd6d51e8367a778d0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 12 Jan 2023 13:16:23 +0100 Subject: [PATCH 0690/1610] test: fixed tests for `Util.merge` --- tests/core/util_spec.lua | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index 7d16ca6..87102d3 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -148,25 +148,13 @@ describe("util", function() output = { a = { 3 } }, }, { - input = { { b = { 1, 2 } }, { a = { 3 }, __merge = false } }, + input = { { b = { 1, 2 } }, { a = { 3 }, b = vim.NIL } }, output = { a = { 3 } }, }, { - input = { { a = 1 }, { b = 2, __merge = false } }, + input = { { a = 1 }, { b = 2, a = vim.NIL } }, output = { b = 2 }, }, - { - input = { { a = { 1, 2 } }, { a = { 3, __merge = true } } }, - output = { a = { 1, 2, 3 } }, - }, - { - input = { { a = { 1, 2, __merge = true } }, { a = { 3 } } }, - output = { a = { 1, 2, 3 } }, - }, - { - input = { { a = { 1, 2, __merge = true } }, { a = { 3, __merge = false } } }, - output = { a = { 3 } }, - }, } for _, test in ipairs(tests) do From 70e5e08dc12613006ee86489291929c592f1145d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Jan 2023 12:17:08 +0000 Subject: [PATCH 0691/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 50 +++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5a9c935..c02a70e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -111,31 +111,31 @@ It is recommended to run `:checkhealth lazy` after installation PLUGIN SPEC *lazy.nvim-plugin-spec* -│ Property │ Type │ Description │ -│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ -│**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 │ -│**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 │ -│**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 fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ -│**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. │ -│**init** │fun(LazyPlugin) │init functions are always executed during startup │ -│**opts** │table or fun(LazyPlugin, opts:table) │opts should be a table (will be merged with parent 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) or true │config is executed when the plugin loads. The default implementation will automatically run require("plugin").setup(opts). See also opts. │ -│**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ -│**branch** │string? │Branch of the repository │ -│**tag** │string? │Tag of the repository │ -│**commit** │string? │Commit of the repository │ -│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ -│**pin** │boolean? │When true, this plugin will not be included in updates │ -│**event** │string? or string[] │Lazy-load on event. Events can be specified as BufEnter or with a pattern like BufEnter .lua │ -│**cmd** │string? or string[] │Lazy-load on command │ -│**ft** │string? or string[] │Lazy-load on filetype │ -│**keys** │string? or string[] or LazyKeys[] │Lazy-load on key mapping │ -│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ -│**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. │ +│ Property │ Type │ Description │ +│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ +│**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 │ +│**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 │ +│**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 fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ +│**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. │ +│**init** │fun(LazyPlugin) │init functions are always executed during startup │ +│**opts** │table or fun(LazyPlugin, opts:table) │opts should be a table (will be merged with parent 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) or true │config is executed when the plugin loads. The default implementation will automatically run require("plugin").setup(opts). See also opts. │ +│**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ +│**branch** │string? │Branch of the repository │ +│**tag** │string? │Tag of the repository │ +│**commit** │string? │Commit of the repository │ +│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ +│**pin** │boolean? │When true, this plugin will not be included in updates │ +│**event** │string? or string[] or fun(self:LazyPlugin, event:string[]):string[] │Lazy-load on event. Events can be specified as BufEnter or with a pattern like BufEnter .lua │ +│**cmd** │string? or string[] or fun(self:LazyPlugin, cmd:string[]):string[] │Lazy-load on command │ +│**ft** │string? or string[] or fun(self:LazyPlugin, ft:string[]):string[] │Lazy-load on filetype │ +│**keys** │string? or string[] or LazyKeys[] or fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[] │Lazy-load on key mapping │ +│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ +│**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. │ LAZY LOADING ~ From 81017b99e799d08ea5297b0f620e4404ef41e51f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 13 Jan 2023 08:58:18 +0100 Subject: [PATCH 0692/1610] fix(cache): de-duplicate topmods. Fixes #349 --- lua/lazy/core/cache.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 4cf01b5..3f30ff2 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -246,7 +246,9 @@ function M._index(path) if not vim.tbl_contains(M.topmods[topname], path) then table.insert(M.topmods[topname], path) end - table.insert(M.indexed[path], topname) + if not vim.tbl_contains(M.indexed[path], topname) then + table.insert(M.indexed[path], topname) + end end end) return true From b73312aa32c685ff68771a31d209a43866e4d4b2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 13 Jan 2023 09:00:15 +0100 Subject: [PATCH 0693/1610] fix: use `vim.api.nvim_exec_autocmds` instead of `vim.cmd[[do]]` to prevent weird `vim.notify` behavior --- lua/lazy/core/loader.lua | 2 +- lua/lazy/core/util.lua | 2 +- lua/lazy/init.lua | 2 +- lua/lazy/manage/init.lua | 11 ++++++----- lua/lazy/manage/reloader.lua | 4 ++-- lua/lazy/manage/task/init.lua | 4 ++-- lua/lazy/stats.lua | 2 +- lua/lazy/view/float.lua | 2 +- 8 files changed, 15 insertions(+), 14 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 663a6da..e5f727a 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -227,7 +227,7 @@ function M._load(plugin, reason, opts) plugin._.loaded.time = Util.track().time table.remove(M.loading) vim.schedule(function() - vim.cmd("do User LazyRender") + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) end) end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 8a937a8..bc7720d 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -143,7 +143,7 @@ function M.very_lazy() local function _load() vim.schedule(function() vim.g.did_very_lazy = true - vim.cmd("do User VeryLazy") + vim.api.nvim_exec_autocmds("User", { pattern = "VeryLazy", modeline = false }) end) end diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index d3b8b93..a0b073a 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -64,7 +64,7 @@ function M.setup(spec, opts) Loader.startup() -- all done! - vim.cmd("do User LazyDone") + vim.api.nvim_exec_autocmds("User", { pattern = "LazyDone", modeline = false }) require("lazy.stats").track("LazyDone") end diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index d14a7b8..9ffda73 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -42,16 +42,17 @@ function M.run(ropts, opts) local runner = Runner.new(ropts) runner:start() - vim.cmd([[do User LazyRender]]) + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) -- wait for post-install to finish runner:wait(function() - vim.cmd([[do User LazyRender]]) + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) Plugin.update_state() require("lazy.manage.checker").fast_check({ report = false }) local mode = opts.mode if mode then - vim.cmd("do User Lazy" .. mode:sub(1, 1):upper() .. mode:sub(2)) + local event = "Lazy" .. mode:sub(1, 1):upper() .. mode:sub(2) + vim.api.nvim_exec_autocmds("User", { pattern = event, modeline = false }) end end) @@ -179,7 +180,7 @@ function M.sync(opts) clean:wait(function() install:wait(function() update:wait(function() - vim.cmd([[do User LazySync]]) + vim.api.nvim_exec_autocmds("User", { pattern = "LazySync", modeline = false }) end) end) end) @@ -211,7 +212,7 @@ function M.clear(plugins) end, plugin._.tasks) end end - vim.cmd([[do User LazyRender]]) + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) end return M diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index 5f9a74b..7d30d3d 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -83,8 +83,8 @@ function M.check(start) Util.warn(lines) end Plugin.load() - vim.cmd([[do User LazyRender]]) - vim.cmd([[do User LazyReload]]) + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) + vim.api.nvim_exec_autocmds("User", { pattern = "LazyReload", modeline = false }) end) end end diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 92596e3..a68c7d7 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -85,7 +85,7 @@ function Task:_check() if self._opts.on_done then self._opts.on_done(self) end - vim.cmd("do User LazyRender") + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) vim.api.nvim_exec_autocmds("User", { pattern = "LazyPlugin" .. self.name:sub(1, 1):upper() .. self.name:sub(2), data = { plugin = self.plugin.name }, @@ -131,7 +131,7 @@ function Task:spawn(cmd, opts) if on_line then pcall(on_line, line) end - vim.cmd("do User LazyRender") + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) end ---@param output string diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index facc9dc..a2ccdd8 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -21,7 +21,7 @@ M.C = nil function M.on_ui_enter() M._stats.startuptime = M.track("UIEnter") - vim.cmd([[do User LazyVimStarted]]) + vim.api.nvim_exec_autocmds("User", { pattern = "LazyVimStarted", modeline = false }) end function M.track(event) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index d6e3c39..821121b 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -127,7 +127,7 @@ function M:mount() config.style = self.opts.style ~= "" and self.opts.style or nil vim.api.nvim_win_set_config(self.win, config) opts() - vim.cmd([[do User LazyFloatResized]]) + vim.api.nvim_exec_autocmds("User", { pattern = "LazyFloatResized", modeline = false }) end, }) end From 7b0d1a786664a707accfde09ecf54315e91f9a2b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 13 Jan 2023 09:00:38 +0100 Subject: [PATCH 0694/1610] fix(float): only clear diagnostics for valid buffers --- lua/lazy/view/float.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 821121b..2a2cc5f 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -173,12 +173,12 @@ function M:close() local win = self.win self.win = nil self.buf = nil - vim.diagnostic.reset(Config.ns, buf) vim.schedule(function() if win and vim.api.nvim_win_is_valid(win) then vim.api.nvim_win_close(win, true) end if buf and vim.api.nvim_buf_is_valid(buf) then + vim.diagnostic.reset(Config.ns, buf) vim.api.nvim_buf_delete(buf, { force = true }) end end) From e2556e38c738d62ea7c7956dc4c3b276ac595823 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Jan 2023 08:02:17 +0000 Subject: [PATCH 0695/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c02a70e..cabc587 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 12 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 13 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 7b78ce33327c3caee9a0933792b432bce5c6c885 Mon Sep 17 00:00:00 2001 From: hgigas <100573434+hgigas@users.noreply.github.com> Date: Fri, 13 Jan 2023 09:05:13 +0100 Subject: [PATCH 0696/1610] feat(commands): allow commands like `Lazy ... | ...` (#377) Set bar attribute: ``` -bar The command can be followed by a "|" and another command. ``` --- lua/lazy/view/commands.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 4944e65..f1ab877 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -94,6 +94,7 @@ function M.setup() end M.cmd(prefix, opts) end, { + bar = true, bang = true, nargs = "?", desc = "Lazy", From 0d0d5870a3265f1c92a89dccef4a592c44e70179 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Jan 2023 09:13:19 +0100 Subject: [PATCH 0697/1610] chore(main): release 9.2.0 (#376) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 16 ++++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c80a637..ff567f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [9.2.0](https://github.com/folke/lazy.nvim/compare/v9.1.3...v9.2.0) (2023-01-13) + + +### Features + +* **commands:** allow commands like `Lazy ... | ...` ([#377](https://github.com/folke/lazy.nvim/issues/377)) ([7b78ce3](https://github.com/folke/lazy.nvim/commit/7b78ce33327c3caee9a0933792b432bce5c6c885)) +* **spec:** event, keys, ft and cmd can now also be a function that returns the values to be used ([2128ca9](https://github.com/folke/lazy.nvim/commit/2128ca90fb67928e5e23590142de9c94fc0a0d31)) + + +### Bug Fixes + +* **cache:** de-duplicate topmods. Fixes [#349](https://github.com/folke/lazy.nvim/issues/349) ([81017b9](https://github.com/folke/lazy.nvim/commit/81017b99e799d08ea5297b0f620e4404ef41e51f)) +* **float:** only clear diagnostics for valid buffers ([7b0d1a7](https://github.com/folke/lazy.nvim/commit/7b0d1a786664a707accfde09ecf54315e91f9a2b)) +* **ui:** open diff and others over the ui. Don't try to be smart about it. Fixes [#361](https://github.com/folke/lazy.nvim/issues/361) ([3fbe4fe](https://github.com/folke/lazy.nvim/commit/3fbe4fe27ab6b58e5dafd45c5316ec62791907d4)) +* use `vim.api.nvim_exec_autocmds` instead of `vim.cmd[[do]]` to prevent weird `vim.notify` behavior ([b73312a](https://github.com/folke/lazy.nvim/commit/b73312aa32c685ff68771a31d209a43866e4d4b2)) + ## [9.1.3](https://github.com/folke/lazy.nvim/compare/v9.1.2...v9.1.3) (2023-01-11) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 97cc131..5f56dc1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -139,7 +139,7 @@ M.defaults = { debug = false, } -M.version = "9.1.3" -- x-release-please-version +M.version = "9.2.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 666ed7bf73eb5895253c1155bd29270b066cbdac Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 13 Jan 2023 09:19:51 +0100 Subject: [PATCH 0698/1610] fix(build): make sure `rplugin.vim` is loaded when doing a build. Fixes #382 --- lua/lazy/manage/task/plugin.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 9b32b51..9e6d84a 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -13,6 +13,8 @@ M.build = { return not (plugin._.dirty and plugin.build) end, run = function(self) + vim.cmd([[silent! runtime plugin/rplugin.vim]]) + Loader.load(self.plugin, { task = "build" }) local builders = self.plugin.build From 891cdfacde26ebef718f67800276dec16dddd25e Mon Sep 17 00:00:00 2001 From: Axel Dahlberg <git@valleymnt.com> Date: Sun, 15 Jan 2023 03:01:12 -0800 Subject: [PATCH 0699/1610] docs: clarify config = true (#390) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e568d31..6eeaf12 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ require("lazy").setup({ | **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. | | **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | | **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require("plugin").setup(opts)`. See also `opts`. | +| **config** | `fun(LazyPlugin, opts:table)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require("plugin").setup(opts)`. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | | **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | | **branch** | `string?` | Branch of the repository | | **tag** | `string?` | Tag of the repository | From 6ac67d46dc19aa4c9b72c0e9d716bcae9e122204 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 15 Jan 2023 11:02:12 +0000 Subject: [PATCH 0700/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index cabc587..bc7f626 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 13 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 15 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -123,7 +123,7 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**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. │ │**init** │fun(LazyPlugin) │init functions are always executed during startup │ │**opts** │table or fun(LazyPlugin, opts:table) │opts should be a table (will be merged with parent 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) or true │config is executed when the plugin loads. The default implementation will automatically run require("plugin").setup(opts). See also opts. │ +│**config** │fun(LazyPlugin, opts:table) or true │config is executed when the plugin loads. The default implementation will automatically run require("plugin").setup(opts). See also opts. To use the default implementation without opts set config to true. │ │**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ │**branch** │string? │Branch of the repository │ │**tag** │string? │Tag of the repository │ From 1b219c17042733dd9bda43ce1478e8ba26d22b1b Mon Sep 17 00:00:00 2001 From: Jay Patel <36803168+jay-babu@users.noreply.github.com> Date: Sun, 15 Jan 2023 13:56:51 -0500 Subject: [PATCH 0701/1610] docs: Update plugin table `config` to represent how `require` works (#399) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6eeaf12..79602a5 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ require("lazy").setup({ | **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. | | **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | | **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require("plugin").setup(opts)`. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | +| **config** | `fun(LazyPlugin, opts:table)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require("plugin").setup(opts)`. `"plugin"` will default to `name` if specified, otherwise `lazy.nvim` will do its best to guess the correct plugin name. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | | **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | | **branch** | `string?` | Branch of the repository | | **tag** | `string?` | Tag of the repository | From 9375f68dcdd616d12d4e95dac1c01e15d62a8b32 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 15 Jan 2023 18:57:33 +0000 Subject: [PATCH 0702/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 50 +++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index bc7f626..1e309ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -111,31 +111,31 @@ It is recommended to run `:checkhealth lazy` after installation PLUGIN SPEC *lazy.nvim-plugin-spec* -│ Property │ Type │ Description │ -│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ -│**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 │ -│**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 │ -│**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 fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ -│**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. │ -│**init** │fun(LazyPlugin) │init functions are always executed during startup │ -│**opts** │table or fun(LazyPlugin, opts:table) │opts should be a table (will be merged with parent 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) or true │config is executed when the plugin loads. The default implementation will automatically run require("plugin").setup(opts). See also opts. To use the default implementation without opts set config to true. │ -│**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ -│**branch** │string? │Branch of the repository │ -│**tag** │string? │Tag of the repository │ -│**commit** │string? │Commit of the repository │ -│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ -│**pin** │boolean? │When true, this plugin will not be included in updates │ -│**event** │string? or string[] or fun(self:LazyPlugin, event:string[]):string[] │Lazy-load on event. Events can be specified as BufEnter or with a pattern like BufEnter .lua │ -│**cmd** │string? or string[] or fun(self:LazyPlugin, cmd:string[]):string[] │Lazy-load on command │ -│**ft** │string? or string[] or fun(self:LazyPlugin, ft:string[]):string[] │Lazy-load on filetype │ -│**keys** │string? or string[] or LazyKeys[] or fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[] │Lazy-load on key mapping │ -│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ -│**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. │ +│ Property │ Type │ Description │ +│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ +│**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 │ +│**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 │ +│**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 fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ +│**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. │ +│**init** │fun(LazyPlugin) │init functions are always executed during startup │ +│**opts** │table or fun(LazyPlugin, opts:table) │opts should be a table (will be merged with parent 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) or true │config is executed when the plugin loads. The default implementation will automatically run require("plugin").setup(opts). "plugin" will default to name if specified, otherwise lazy.nvim will do its best to guess the correct plugin name. See also opts. To use the default implementation without opts set config to true. │ +│**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ +│**branch** │string? │Branch of the repository │ +│**tag** │string? │Tag of the repository │ +│**commit** │string? │Commit of the repository │ +│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/semver> ranges are supported │ +│**pin** │boolean? │When true, this plugin will not be included in updates │ +│**event** │string? or string[] or fun(self:LazyPlugin, event:string[]):string[] │Lazy-load on event. Events can be specified as BufEnter or with a pattern like BufEnter .lua │ +│**cmd** │string? or string[] or fun(self:LazyPlugin, cmd:string[]):string[] │Lazy-load on command │ +│**ft** │string? or string[] or fun(self:LazyPlugin, ft:string[]):string[] │Lazy-load on filetype │ +│**keys** │string? or string[] or LazyKeys[] or fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[] │Lazy-load on key mapping │ +│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ +│**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. │ LAZY LOADING ~ From 7160ca419e7be36536dd8fe90ad0bf26cdd773ae Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 15 Jan 2023 20:00:07 +0100 Subject: [PATCH 0703/1610] fix(loader): load plugin opts inside a `try` clause to report errors --- lua/lazy/core/loader.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index e5f727a..68f05e8 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -234,10 +234,10 @@ end --- runs plugin config ---@param plugin LazyPlugin function M.config(plugin) - local opts = Plugin.values(plugin, "opts", false) local fn if type(plugin.config) == "function" then fn = function() + local opts = Plugin.values(plugin, "opts", false) plugin.config(plugin, opts) end else @@ -255,6 +255,7 @@ function M.config(plugin) end if #mods == 1 then fn = function() + local opts = Plugin.values(plugin, "opts", false) require(mods[1]).setup(opts) end else From 984008f7ae17c1a8009d9e2f6dc007e13b90a744 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 15 Jan 2023 20:04:37 +0100 Subject: [PATCH 0704/1610] refactor: add lazy.nvim with full url. Fixes #396 --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 21634a4..d44f525 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -338,7 +338,7 @@ function M.load() -- load specs Util.track("spec") Config.spec = Spec.new() - Config.spec:parse({ vim.deepcopy(Config.options.spec), "folke/lazy.nvim" }) + Config.spec:parse({ vim.deepcopy(Config.options.spec), { url = "https://github.com/folke/lazy.nvim.git" } }) -- override some lazy props local lazy = Config.spec.plugins["lazy.nvim"] From fdf0332fe17d9c01f92a8464c04213123a025a07 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Jan 2023 10:16:35 +0100 Subject: [PATCH 0705/1610] feat(keys): allow overriding a keys value to `vim.NIL` to not add the key --- lua/lazy/core/handler/init.lua | 37 ++++++++------------ lua/lazy/core/handler/keys.lua | 64 +++++++++++++++++++--------------- 2 files changed, 51 insertions(+), 50 deletions(-) diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index 67ad44c..5e9074b 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -62,28 +62,28 @@ function M.new(type) return self end ----@param value string +---@param _value string ---@protected -function M:_add(value) end +function M:_add(_value) end ----@param value string +---@param _value string ---@protected -function M:_del(value) end +function M:_del(_value) end ----@return string -function M:key(value) - return value +---@param plugin LazyPlugin +function M:values(plugin) + ---@type table<string,any> + local values = {} + ---@diagnostic disable-next-line: no-unknown + for _, value in ipairs(plugin[self.type] or {}) do + values[value] = value + end + return values end ---@param plugin LazyPlugin function M:add(plugin) - local values = {} - for _, value in ipairs(plugin[self.type] or {}) do - local key = self:key(value) - values[key] = value - end - - for key, value in pairs(values) do + for key, value in pairs(self:values(plugin)) do if not self.active[key] then self.active[key] = {} self:_add(value) @@ -94,14 +94,7 @@ end ---@param plugin LazyPlugin function M:del(plugin) - local values = {} - for _, value in ipairs(plugin[self.type] or {}) do - local key = self:key(value) - values[key] = value - end - - for key, value in pairs(values) do - local key = self:key(value) + for key, value in pairs(self:values(plugin)) do if self.active[key] and self.active[key][plugin.name] then self.active[key][plugin.name] = nil if vim.tbl_isempty(self.active[key]) then diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index dd55cef..ddd97ef 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -9,6 +9,7 @@ local Loader = require("lazy.core.loader") ---@field noremap? boolean ---@field remap? boolean ---@field expr? boolean +---@field id string ---@class LazyKeysHandler:LazyHandler local M = {} @@ -54,48 +55,56 @@ function M.parse(value) local ret = vim.deepcopy(value) ret = type(ret) == "string" and { ret } or ret --[[@as LazyKeys]] ret.mode = ret.mode or "n" + ret.id = (ret[1] or "") + if ret.mode then + local mode = ret.mode + if type(mode) == "table" then + ---@cast mode string[] + table.sort(mode) + ret.id = ret.id .. " (" .. table.concat(mode, ", ") .. ")" + elseif mode ~= "n" then + ret.id = ret.id .. " (" .. mode .. ")" + end + end return ret end +---@param plugin LazyPlugin +function M:values(plugin) + ---@type table<string,any> + local values = {} + ---@diagnostic disable-next-line: no-unknown + for _, value in ipairs(plugin[self.type] or {}) do + local keys = M.parse(value) + if keys[2] == vim.NIL then + values[keys.id] = nil + else + values[keys.id] = keys + end + end + return values +end + function M.opts(keys) local opts = {} for k, v in pairs(keys) do - if type(k) ~= "number" and k ~= "mode" then + if type(k) ~= "number" and k ~= "mode" and k ~= "id" then opts[k] = v end end return opts end ----@return string -function M:key(value) - if type(value) == "string" then - return value - end - local mode = value.mode or { "n" } - if type(mode) == "string" then - mode = { mode } - end - ---@type string - local ret = value[1] - if #mode > 0 then - ret = table.concat(mode, ",") .. ": " .. ret - end - return ret -end - ----@param value string|LazyKeys -function M:_add(value) - local keys = M.parse(value) +---@param keys LazyKeys +function M:_add(keys) local lhs = keys[1] local opts = M.opts(keys) vim.keymap.set(keys.mode, lhs, function() - local key = self:key(value) - local plugins = self.active[key] + local plugins = self.active[keys.id] -- always delete the mapping immediately to prevent recursive mappings - self:_del(value) - self.active[key] = nil + self:_del(keys) + self.active[keys.id] = nil Util.track({ keys = lhs }) Loader.load(plugins, { keys = lhs }) @@ -104,9 +113,8 @@ function M:_add(value) end, opts) end ----@param value string|LazyKeys -function M:_del(value) - local keys = M.parse(value) +---@param keys LazyKeys +function M:_del(keys) pcall(vim.keymap.del, keys.mode, keys[1]) if keys[2] then vim.keymap.set(keys.mode, keys[1], keys[2], M.opts(keys)) From 02482b1ec94e6c2801dbbfc40122c936dd157dea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Jan 2023 09:17:20 +0000 Subject: [PATCH 0706/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1e309ae..323a4e6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 15 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 16 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 1e67dc0d56b8e7cf6befdc7176a4a54e17afc244 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Jan 2023 12:29:19 +0100 Subject: [PATCH 0707/1610] perf(util): dont trigger VeryLazy autocmds when exiting --- lua/lazy/core/util.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index bc7720d..58874d3 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -142,6 +142,9 @@ end function M.very_lazy() local function _load() vim.schedule(function() + if vim.v.exiting then + return + end vim.g.did_very_lazy = true vim.api.nvim_exec_autocmds("User", { pattern = "VeryLazy", modeline = false }) end) From e8cb863703276c579d781b7e4e0b27052df8fc68 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Jan 2023 12:33:03 +0100 Subject: [PATCH 0708/1610] fix(util): rever --- lua/lazy/core/util.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 58874d3..5173520 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -142,9 +142,9 @@ end function M.very_lazy() local function _load() vim.schedule(function() - if vim.v.exiting then - return - end + -- if vim.v.exiting then + -- return + -- end vim.g.did_very_lazy = true vim.api.nvim_exec_autocmds("User", { pattern = "VeryLazy", modeline = false }) end) From efe72d98e6fb71252bd9a904c00a40ccd54ebf05 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Jan 2023 12:37:28 +0100 Subject: [PATCH 0709/1610] perf(util): properly check that Neovim is exiting. Dont run VeryLazy when that's the case --- lua/lazy/core/util.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 5173520..3a27a8f 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -142,9 +142,9 @@ end function M.very_lazy() local function _load() vim.schedule(function() - -- if vim.v.exiting then - -- return - -- end + if vim.v.exiting ~= vim.NIL then + return + end vim.g.did_very_lazy = true vim.api.nvim_exec_autocmds("User", { pattern = "VeryLazy", modeline = false }) end) From 0cbd91d2cd942cc448b4648dbc7ba57515a2867c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Jan 2023 17:03:43 +0100 Subject: [PATCH 0710/1610] feat(spec): you can now override specs using only the plugin name instead of the short url --- lua/lazy/core/plugin.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index d44f525..bbc68ad 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -64,7 +64,9 @@ function Spec:add(plugin, results, is_dep) return plugin end - if not plugin.url and plugin[1] then + local is_ref = plugin[1] and not plugin[1]:find("/", 1, true) + + if not plugin.url and not is_ref and plugin[1] then local prefix = plugin[1]:sub(1, 4) if prefix == "http" or prefix == "git@" then plugin.url = plugin[1] @@ -95,6 +97,8 @@ function Spec:add(plugin, results, is_dep) -- remote plugin plugin.dir = Config.options.root .. "/" .. plugin.name end + elseif is_ref then + plugin.name = plugin[1] else self:error("Invalid plugin spec " .. vim.inspect(plugin)) return From 208f91b52fff5f7b6120b19b80e529821d70d009 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Jan 2023 20:41:29 +0100 Subject: [PATCH 0711/1610] feat(git): some debugging tools for git --- lua/lazy/manage/git.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 76f7009..5d431ae 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -225,4 +225,14 @@ function M.get_config(repo) return ret end +function M.count(repo, commit1, commit2) + local lines = Process.exec({ "git", "rev-list", "--count", commit1 .. ".." .. commit2 }, { cwd = repo }) + return tonumber(lines[1] or "0") or 0 +end + +function M.age(repo, commit) + local lines = Process.exec({ "git", "show", "-s", "--format=%cr", "--date=short", commit }, { cwd = repo }) + return lines[1] or "" +end + return M From 870af80c68f3834ffcbced1528cce6197ec2b4ae Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Jan 2023 21:27:55 +0100 Subject: [PATCH 0712/1610] feat(spec): overriding keys with an rhs of `false` will remove the key instead --- lua/lazy/core/handler/keys.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index ddd97ef..dd78581 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -76,7 +76,7 @@ function M:values(plugin) ---@diagnostic disable-next-line: no-unknown for _, value in ipairs(plugin[self.type] or {}) do local keys = M.parse(value) - if keys[2] == vim.NIL then + if keys[2] == vim.NIL or keys[2] == false then values[keys.id] = nil else values[keys.id] = keys From c05d61d208afaccb2a6765c0a6eb2d4e506a8c18 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Jan 2023 22:18:55 +0100 Subject: [PATCH 0713/1610] chore(main): release 9.3.0 (#385) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 23 +++++++++++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff567f7..b01a57e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## [9.3.0](https://github.com/folke/lazy.nvim/compare/v9.2.0...v9.3.0) (2023-01-16) + + +### Features + +* **git:** some debugging tools for git ([208f91b](https://github.com/folke/lazy.nvim/commit/208f91b52fff5f7b6120b19b80e529821d70d009)) +* **keys:** allow overriding a keys value to `vim.NIL` to not add the key ([fdf0332](https://github.com/folke/lazy.nvim/commit/fdf0332fe17d9c01f92a8464c04213123a025a07)) +* **spec:** overriding keys with an rhs of `false` will remove the key instead ([870af80](https://github.com/folke/lazy.nvim/commit/870af80c68f3834ffcbced1528cce6197ec2b4ae)) +* **spec:** you can now override specs using only the plugin name instead of the short url ([0cbd91d](https://github.com/folke/lazy.nvim/commit/0cbd91d2cd942cc448b4648dbc7ba57515a2867c)) + + +### Bug Fixes + +* **build:** make sure `rplugin.vim` is loaded when doing a build. Fixes [#382](https://github.com/folke/lazy.nvim/issues/382) ([666ed7b](https://github.com/folke/lazy.nvim/commit/666ed7bf73eb5895253c1155bd29270b066cbdac)) +* **loader:** load plugin opts inside a `try` clause to report errors ([7160ca4](https://github.com/folke/lazy.nvim/commit/7160ca419e7be36536dd8fe90ad0bf26cdd773ae)) +* **util:** rever ([e8cb863](https://github.com/folke/lazy.nvim/commit/e8cb863703276c579d781b7e4e0b27052df8fc68)) + + +### Performance Improvements + +* **util:** dont trigger VeryLazy autocmds when exiting ([1e67dc0](https://github.com/folke/lazy.nvim/commit/1e67dc0d56b8e7cf6befdc7176a4a54e17afc244)) +* **util:** properly check that Neovim is exiting. Dont run VeryLazy when that's the case ([efe72d9](https://github.com/folke/lazy.nvim/commit/efe72d98e6fb71252bd9a904c00a40ccd54ebf05)) + ## [9.2.0](https://github.com/folke/lazy.nvim/compare/v9.1.3...v9.2.0) (2023-01-13) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5f56dc1..270dede 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -139,7 +139,7 @@ M.defaults = { debug = false, } -M.version = "9.2.0" -- x-release-please-version +M.version = "9.3.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From bd37afc96e4d64a41744298f24772dddb5286fd5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Jan 2023 13:14:25 +0100 Subject: [PATCH 0714/1610] fix(git): when a `Plugin.branch` is set, don't use `config.defaults.version`. Fixes #409 --- lua/lazy/manage/git.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 5d431ae..116c5fe 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -131,7 +131,8 @@ function M.get_target(plugin) commit = M.ref(plugin.dir, "tags/" .. plugin.tag), } end - local version = plugin.version == nil and Config.options.defaults.version or plugin.version + + local version = (plugin.version == nil and plugin.branch == nil) and Config.options.defaults.version or plugin.version if version then local last = Semver.last(M.get_versions(plugin.dir, version)) if last then From f95d97a91ceb0faf6dcd5756099c4707727a741a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Jan 2023 12:15:13 +0000 Subject: [PATCH 0715/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 323a4e6..1668cce 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 16 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 17 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From baaf8ddfff6cf0c2b8729c2b76b2b140cb40d382 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Jan 2023 13:54:34 +0100 Subject: [PATCH 0716/1610] fix(spec): when overriding a spec by name that has not been imported yet, show an error when needed --- lua/lazy/core/plugin.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index bbc68ad..3bb6ee5 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -57,7 +57,7 @@ end function Spec:add(plugin, results, is_dep) -- check if we already processed this spec. Can happen when a user uses the same instance of a spec in multiple specs -- see https://github.com/folke/lazy.nvim/issues/45 - if plugin._ then + if rawget(plugin, "_") then if results then table.insert(results, plugin.name) end @@ -119,6 +119,9 @@ function Spec:add(plugin, results, is_dep) plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil if self.plugins[plugin.name] then plugin = self:merge(self.plugins[plugin.name], plugin) + elseif is_ref then + self:error("Plugin spec for **" .. plugin.name .. "** not found.\n```lua\n" .. vim.inspect(plugin) .. "\n```") + return end self.plugins[plugin.name] = plugin if results then From da4e8cc2450ec428d370032b5b3790b01889c4a4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Jan 2023 13:55:04 +0100 Subject: [PATCH 0717/1610] fix(spec): dont copy dep and super state from existing plugins --- lua/lazy/core/plugin.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 3bb6ee5..baf63ef 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -363,7 +363,11 @@ function M.load() -- copy state. This wont do anything during startup for name, plugin in pairs(existing) do if Config.plugins[name] then + local dep = Config.plugins[name]._.dep + local super = Config.plugins[name]._.super Config.plugins[name]._ = plugin._ + Config.plugins[name]._.dep = dep + Config.plugins[name]._.super = super end end Util.track() From 1b2a6f631c9b2ef98005acec8369c7298fe7a751 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Jan 2023 14:00:33 +0100 Subject: [PATCH 0718/1610] perf(plugin): de-duplicate dependencies, keys, ft, event and cmd --- lua/lazy/core/plugin.lua | 4 ++-- lua/lazy/core/util.lua | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index baf63ef..b7179c9 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -287,7 +287,7 @@ function Spec:merge(old, new) end if new.dependencies and old.dependencies then - vim.list_extend(new.dependencies, old.dependencies) + Util.extend(new.dependencies, old.dependencies) end new._.super = old @@ -424,7 +424,7 @@ function M.values(plugin, prop, is_list) end values = type(values) == "table" and values or { values } - return is_list and vim.list_extend(ret, values) or Util.merge(ret, values) + return is_list and Util.extend(ret, values) or Util.merge(ret, values) end return M diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 3a27a8f..9a81d28 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -222,6 +222,23 @@ function M.lsmod(modname, fn) end) end +---@generic T +---@param list T[] +---@param add T[] +---@return T[] +function M.extend(list, add) + local idx = {} + for _, v in ipairs(list) do + idx[v] = v + end + for _, a in ipairs(add) do + if not idx[a] then + table.insert(list, a) + end + end + return list +end + ---@alias LazyNotifyOpts {lang?:string, title?:string, level?:number} ---@param msg string|string[] From c791c0ed7d7bbcdc06a58b79eb4625682c60964c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Jan 2023 14:35:21 +0100 Subject: [PATCH 0719/1610] fix: work-around for libuv issue where fs_scandir_next sometimes fails to return a file type --- lua/lazy/core/util.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 9a81d28..7411664 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -175,13 +175,16 @@ function M.ls(path, fn) local handle = vim.loop.fs_scandir(path) while handle do local name, t = vim.loop.fs_scandir_next(handle) - -- HACK: assume type is a file if no type returned - -- see https://github.com/folke/lazy.nvim/issues/306 - t = t or "file" if not name then break end - if fn(path .. "/" .. name, name, t) == false then + + local fname = path .. "/" .. name + + -- HACK: type is not always returned due to a bug in luv, + -- so fecth it with fs_stat instead when needed. + -- see https://github.com/folke/lazy.nvim/issues/306 + if fn(fname, name, t or vim.loop.fs_stat(fname).type) == false then break end end From 4f60facf18b34ae06d164485aa2ce879e21e44fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Jan 2023 14:37:11 +0100 Subject: [PATCH 0720/1610] chore(main): release 9.3.1 (#410) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 15 +++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b01a57e..2093139 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## [9.3.1](https://github.com/folke/lazy.nvim/compare/v9.3.0...v9.3.1) (2023-01-17) + + +### Bug Fixes + +* **git:** when a `Plugin.branch` is set, don't use `config.defaults.version`. Fixes [#409](https://github.com/folke/lazy.nvim/issues/409) ([bd37afc](https://github.com/folke/lazy.nvim/commit/bd37afc96e4d64a41744298f24772dddb5286fd5)) +* **spec:** dont copy dep and super state from existing plugins ([da4e8cc](https://github.com/folke/lazy.nvim/commit/da4e8cc2450ec428d370032b5b3790b01889c4a4)) +* **spec:** when overriding a spec by name that has not been imported yet, show an error when needed ([baaf8dd](https://github.com/folke/lazy.nvim/commit/baaf8ddfff6cf0c2b8729c2b76b2b140cb40d382)) +* work-around for libuv issue where fs_scandir_next sometimes fails to return a file type ([c791c0e](https://github.com/folke/lazy.nvim/commit/c791c0ed7d7bbcdc06a58b79eb4625682c60964c)) + + +### Performance Improvements + +* **plugin:** de-duplicate dependencies, keys, ft, event and cmd ([1b2a6f6](https://github.com/folke/lazy.nvim/commit/1b2a6f631c9b2ef98005acec8369c7298fe7a751)) + ## [9.3.0](https://github.com/folke/lazy.nvim/compare/v9.2.0...v9.3.0) (2023-01-16) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 270dede..c1290c1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -139,7 +139,7 @@ M.defaults = { debug = false, } -M.version = "9.3.0" -- x-release-please-version +M.version = "9.3.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 27ca918bc3d02ea20b3fd901c8919e9925555444 Mon Sep 17 00:00:00 2001 From: Hans Chen <hanswchen@gmail.com> Date: Tue, 17 Jan 2023 22:03:23 +0100 Subject: [PATCH 0721/1610] fix(render): get profile_{sort,filter} key bindings from ViewConfig (#416) --- lua/lazy/view/render.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 1c0bd3c..d0cf458 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -583,12 +583,12 @@ function M:profile() self:append("Profile", "LazyH2"):nl():nl() self :append("You can press ") - :append("<C-s>", "LazySpecial") + :append(ViewConfig.keys.profile_sort, "LazySpecial") :append(" to change sorting between chronological order & time taken.") :nl() self :append("Press ") - :append("<C-f>", "LazySpecial") + :append(ViewConfig.keys.profile_filter, "LazySpecial") :append(" to filter profiling entries that took more time than a given threshold") :nl() From c3a0d444f6a6995ccb16a386feafc949fabc4b50 Mon Sep 17 00:00:00 2001 From: "Daniel M. Capella" <polyzen@users.noreply.github.com> Date: Wed, 18 Jan 2023 07:34:29 +0000 Subject: [PATCH 0722/1610] docs: fix indentation (#419) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 79602a5..b5c7b9a 100644 --- a/README.md +++ b/README.md @@ -650,8 +650,8 @@ require("lazy").setup("plugins") ```lua return { "folke/neodev.nvim", - "folke/which-key.nvim", - { "folke/neoconf.nvim", cmd = "Neoconf" }, + "folke/which-key.nvim", + { "folke/neoconf.nvim", cmd = "Neoconf" }, } ``` From 835731f102fd495380c3b5d7def5ea6ebc3ed3df Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Jan 2023 07:35:12 +0000 Subject: [PATCH 0723/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1668cce..b9b7c0b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 17 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 18 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -708,8 +708,8 @@ Example: >lua return { "folke/neodev.nvim", - "folke/which-key.nvim", - { "folke/neoconf.nvim", cmd = "Neoconf" }, + "folke/which-key.nvim", + { "folke/neoconf.nvim", cmd = "Neoconf" }, } < From 813fc944d797fe1b43abe12866a9ef7af403c35c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 18 Jan 2023 08:24:43 +0100 Subject: [PATCH 0724/1610] feat(checker): checker will now save last check time and only check at configured frequency even after restarting Neovim --- lua/lazy/core/config.lua | 1 + lua/lazy/manage/checker.lua | 16 ++++++++++--- lua/lazy/state.lua | 45 +++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 lua/lazy/state.lua diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c1290c1..c2d4cda 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -136,6 +136,7 @@ M.defaults = { -- only generate markdown helptags for plugins that dont have docs skip_if_doc_exists = true, }, + state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things debug = false, } diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 477c63d..7622812 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -3,6 +3,7 @@ local Manage = require("lazy.manage") local Util = require("lazy.util") local Plugin = require("lazy.core.plugin") local Git = require("lazy.manage.git") +local State = require("lazy.state") local M = {} @@ -12,7 +13,14 @@ M.reported = {} function M.start() M.fast_check() - M.check() + M.schedule() +end + +function M.schedule() + State.read() -- update state + local next_check = State.checker.last_check + Config.options.checker.frequency - os.time() + next_check = math.max(next_check, 0) + vim.defer_fn(M.check, next_check * 1000) end ---@param opts? {report:boolean} report defaults to true @@ -32,6 +40,8 @@ function M.fast_check(opts) end function M.check() + State.checker.last_check = os.time() + State.write() -- update state local errors = false for _, plugin in pairs(Config.plugins) do if Plugin.has_errors(plugin) then @@ -40,14 +50,14 @@ function M.check() end end if errors then - vim.defer_fn(M.check, Config.options.checker.frequency * 1000) + M.schedule() else Manage.check({ show = false, concurrency = Config.options.checker.concurrency, }):wait(function() M.report() - vim.defer_fn(M.check, Config.options.checker.frequency * 1000) + M.schedule() end) end end diff --git a/lua/lazy/state.lua b/lua/lazy/state.lua new file mode 100644 index 0000000..80e4c2e --- /dev/null +++ b/lua/lazy/state.lua @@ -0,0 +1,45 @@ +local Util = require("lazy.util") +local Config = require("lazy.core.config") + +---@type LazyState +local M = {} + +---@class LazyState +local defaults = { + checker = { + last_check = 0, + }, +} + +---@type LazyState +local data = nil + +function M.read() + pcall(function() + ---@diagnostic disable-next-line: cast-local-type + data = vim.json.decode(Util.read_file(Config.options.state)) + end) + data = vim.tbl_deep_extend("force", {}, defaults, data or {}) +end + +function M.write() + vim.fn.mkdir(vim.fn.fnamemodify(Config.options.state, ":p:h"), "p") + Util.write_file(Config.options.state, vim.json.encode(data)) +end + +function M.__index(_, key) + if not data then + M.read() + end + return data[key] +end + +function M.__setindex(_, key, value) + if not data then + M.read() + end + ---@diagnostic disable-next-line: no-unknown + data[key] = value +end + +return setmetatable(M, M) From c389ad552bd5c2050783ac6cd6e54f5fbba3c7bc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 18 Jan 2023 08:31:55 +0100 Subject: [PATCH 0725/1610] fix(spec): dont complain about an invalid short url, when a full url is set. Fixes #421 --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index b7179c9..4873249 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -119,7 +119,7 @@ function Spec:add(plugin, results, is_dep) plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil if self.plugins[plugin.name] then plugin = self:merge(self.plugins[plugin.name], plugin) - elseif is_ref then + elseif is_ref and not plugin.url then self:error("Plugin spec for **" .. plugin.name .. "** not found.\n```lua\n" .. vim.inspect(plugin) .. "\n```") return end From d6fc848067d603800b9e63a7b22b7e5853c6bd7a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 19 Jan 2023 08:45:27 +0100 Subject: [PATCH 0726/1610] feat: added `config.ui.wrap` and improved wrapping when wrap=true. Fixes #422 --- lua/lazy/core/config.lua | 1 + lua/lazy/view/init.lua | 9 +++++++++ lua/lazy/view/render.lua | 6 +++--- lua/lazy/view/text.lua | 10 ++++++++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c2d4cda..0140c53 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -37,6 +37,7 @@ M.defaults = { 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", icons = { diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index ac64e74..efdb75e 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -52,6 +52,15 @@ function M.create() ---@cast self LazyView Float.init(self) + if Config.options.ui.wrap then + vim.wo[self.win].wrap = true + vim.wo[self.win].linebreak = true + vim.wo[self.win].breakindent = true + -- vim.wo[self.win].breakindentopt = "shift:8" + else + vim.wo[self.win].wrap = false + end + require("lazy.view.colors").setup() self.state = vim.deepcopy(default_state) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index d0cf458..e4f4529 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -127,13 +127,13 @@ function M:title() if self.view.state.mode == mode.name then if mode.name == "home" then - self:append(title, "LazyH1") + self:append(title, "LazyH1", { wrap = true }) else - self:append(title, "LazyButtonActive") + self:append(title, "LazyButtonActive", { wrap = true }) self:highlight({ ["%(.%)"] = "LazySpecial" }) end else - self:append(title, "LazyButton") + self:append(title, "LazyButton", { wrap = true }) self:highlight({ ["%(.%)"] = "LazySpecial" }) end self:append(" ") diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index 00c081a..5351db4 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -21,7 +21,7 @@ end ---@param str string ---@param hl? string|Extmark ----@param opts? {indent?: number, prefix?: string} +---@param opts? {indent?: number, prefix?: string, wrap?: boolean} function Text:append(str, hl, opts) opts = opts or {} if #self._lines == 0 then @@ -39,7 +39,13 @@ function Text:append(str, hl, opts) if l > 1 then self:nl() end - if str ~= "" and self:col() > 0 and self:col() + vim.fn.strwidth(line) + self.padding > self.wrap then + if + Config.options.ui.wrap + and opts.wrap + and str ~= "" + and self:col() > 0 + and self:col() + vim.fn.strwidth(line) + self.padding > self.wrap + then self:nl() end table.insert(self._lines[#self._lines], { From 4739c2d95af17acb786ed33445f59b7b13671417 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:46:21 +0000 Subject: [PATCH 0727/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b9b7c0b..caee52f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 18 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 19 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 3f8cc2c0dfa46849c472f4e22247991f2c26db7b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 19 Jan 2023 22:08:58 +0100 Subject: [PATCH 0728/1610] docs: generated docs --- README.md | 54 ++++++++++++++++++++++++----------------------- lua/lazy/docs.lua | 14 ++++++++---- 2 files changed, 38 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index b5c7b9a..b5a197d 100644 --- a/README.md +++ b/README.md @@ -79,32 +79,32 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | -| **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 | -| **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 `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | -| **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. | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require("plugin").setup(opts)`. `"plugin"` will default to `name` if specified, otherwise `lazy.nvim` will do its best to guess the correct plugin name. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | -| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | -| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | -| **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | -| **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | -| **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. | +| Property | Type | Description | +| ---------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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` | +| **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 | +| **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 `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | +| **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. | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require("plugin").setup(opts)`. `"plugin"` will default to `name` if specified, otherwise `lazy.nvim` will do its best to guess the correct plugin name. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | +| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | +| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | +| **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | +| **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| **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. | ### Lazy Loading @@ -330,6 +330,7 @@ return { 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", icons = { @@ -438,6 +439,7 @@ return { -- only generate markdown helptags for plugins that dont have docs skip_if_doc_exists = true, }, + state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things } ``` diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 44bddfa..da3a166 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -14,21 +14,27 @@ end function M.fix_indent(str) local lines = vim.split(str, "\n") + local first = table.remove(lines, 1) + local width = 120 for _, line in ipairs(lines) do - width = math.min(width, #line:match("^%s*")) + if not line:find("^%s*$") then + width = math.min(width, #line:match("^%s*")) + end end for l, line in ipairs(lines) do lines[l] = line:sub(width + 1) end + table.insert(lines, 1, first) return table.concat(lines, "\n") end ---@alias ReadmeBlock {content:string, lang?:string} ---@param contents table<string, ReadmeBlock|string> -function M.save(contents) - local readme = Util.read_file("README.md") +---@param readme_file? string +function M.save(contents, readme_file) + local readme = Util.read_file(readme_file or "README.md") for tag, block in pairs(contents) do if type(block) == "string" then block = { content = block, lang = "lua" } @@ -48,7 +54,7 @@ function M.save(contents) end end - Util.write_file("README.md", readme) + Util.write_file(readme_file or "README.md", readme) vim.cmd.checktime() end From 75dcd5741d76e09b1a41c771fbc8b010a109b5cb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 19 Jan 2023 21:09:52 +0000 Subject: [PATCH 0729/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index caee52f..4e6f21d 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -374,6 +374,7 @@ CONFIGURATION *lazy.nvim-configuration* 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", icons = { @@ -482,6 +483,7 @@ CONFIGURATION *lazy.nvim-configuration* -- only generate markdown helptags for plugins that dont have docs skip_if_doc_exists = true, }, + state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things } < From 9858001c3cdb5713e8d1aeb0f47c23038084fd7c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 20 Jan 2023 20:41:29 +0100 Subject: [PATCH 0730/1610] fix(git): unset GIT_DIR when spawning a process. Fixes #434 --- lua/lazy/manage/process.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 79279a0..2ddcff1 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -68,7 +68,9 @@ function M.spawn(cmd, opts) for key, value in pairs(uv.os_environ() --[[@as string[] ]]) do - table.insert(env, key .. "=" .. value) + if key ~= "GIT_DIR" then + table.insert(env, key .. "=" .. value) + end end local stdout = uv.new_pipe() From 96d759d1cbd8b0bd0ea0a0c2987f99410272f348 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 20 Jan 2023 19:42:27 +0000 Subject: [PATCH 0731/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4e6f21d..c09b21e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 19 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 20 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 4008b57d882065814ce27a0f32609d5ea437a6e9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 22 Jan 2023 14:30:12 +0100 Subject: [PATCH 0732/1610] fix(checker): make sure we show logs when only doing a fast check --- lua/lazy/manage/checker.lua | 9 ++++++++- lua/lazy/manage/init.lua | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 7622812..5798b4f 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -13,7 +13,13 @@ M.reported = {} function M.start() M.fast_check() - M.schedule() + if M.schedule() > 0 then + Manage.log({ + show = false, + check = true, + concurrency = Config.options.checker.concurrency, + }) + end end function M.schedule() @@ -21,6 +27,7 @@ function M.schedule() local next_check = State.checker.last_check + Config.options.checker.frequency - os.time() next_check = math.max(next_check, 0) vim.defer_fn(M.check, next_check * 1000) + return next_check end ---@param opts? {report:boolean} report defaults to true diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 9ffda73..c4a4da0 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -136,13 +136,13 @@ function M.check(opts) }, opts) end ----@param opts? ManagerOpts +---@param opts? ManagerOpts | {check?:boolean} function M.log(opts) opts = M.opts(opts, { mode = "log" }) return M.run({ pipeline = { { "git.origin", check = true }, - "git.log", + { "git.log", check = opts.check }, }, plugins = function(plugin) return plugin.url and plugin._.installed From fc3104c44b9a140381daf4bdf8d0454988317a93 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 22 Jan 2023 13:31:18 +0000 Subject: [PATCH 0733/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c09b21e..06c47a8 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 20 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 22 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 7674ee6254279cd5df7db92b41d3a2ca027bde55 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 22 Jan 2023 15:18:43 +0100 Subject: [PATCH 0734/1610] chore(main): release 9.4.0 (#417) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 16 ++++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2093139..a84145b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [9.4.0](https://github.com/folke/lazy.nvim/compare/v9.3.1...v9.4.0) (2023-01-22) + + +### Features + +* added `config.ui.wrap` and improved wrapping when wrap=true. Fixes [#422](https://github.com/folke/lazy.nvim/issues/422) ([d6fc848](https://github.com/folke/lazy.nvim/commit/d6fc848067d603800b9e63a7b22b7e5853c6bd7a)) +* **checker:** checker will now save last check time and only check at configured frequency even after restarting Neovim ([813fc94](https://github.com/folke/lazy.nvim/commit/813fc944d797fe1b43abe12866a9ef7af403c35c)) + + +### Bug Fixes + +* **checker:** make sure we show logs when only doing a fast check ([4008b57](https://github.com/folke/lazy.nvim/commit/4008b57d882065814ce27a0f32609d5ea437a6e9)) +* **git:** unset GIT_DIR when spawning a process. Fixes [#434](https://github.com/folke/lazy.nvim/issues/434) ([9858001](https://github.com/folke/lazy.nvim/commit/9858001c3cdb5713e8d1aeb0f47c23038084fd7c)) +* **render:** get profile_{sort,filter} key bindings from ViewConfig ([#416](https://github.com/folke/lazy.nvim/issues/416)) ([27ca918](https://github.com/folke/lazy.nvim/commit/27ca918bc3d02ea20b3fd901c8919e9925555444)) +* **spec:** dont complain about an invalid short url, when a full url is set. Fixes [#421](https://github.com/folke/lazy.nvim/issues/421) ([c389ad5](https://github.com/folke/lazy.nvim/commit/c389ad552bd5c2050783ac6cd6e54f5fbba3c7bc)) + ## [9.3.1](https://github.com/folke/lazy.nvim/compare/v9.3.0...v9.3.1) (2023-01-17) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 0140c53..035714e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -141,7 +141,7 @@ M.defaults = { debug = false, } -M.version = "9.3.1" -- x-release-please-version +M.version = "9.4.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 21871f2269b7121da2aa5683d9de06ab00a05ba2 Mon Sep 17 00:00:00 2001 From: Sizhe Zhao <prc.zhao@outlook.com> Date: Sun, 22 Jan 2023 22:23:26 +0800 Subject: [PATCH 0735/1610] docs: Fix typo in README.md (#433) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b5a197d..a3a2972 100644 --- a/README.md +++ b/README.md @@ -416,7 +416,7 @@ return { 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 indluce in the rtp + paths = {}, -- add any custom paths here that you want to include in the rtp ---@type string[] list any plugins you want to disable here disabled_plugins = { -- "gzip", @@ -622,7 +622,7 @@ In practice this means that step 10 of [Neovim Initialization](https://neovim.io 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 you rtp are sourced (excluding `/after`) -4. all `/after/plugin` files are sourced (this inludes `/after` from plugins) +4. all `/after/plugin` files are sourced (this includes `/after` from plugins) Files from runtime directories are always sourced in alphabetical order. From 908d71872b4b783e8d80eb13ad5b07212a9731df Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 22 Jan 2023 15:24:13 +0100 Subject: [PATCH 0736/1610] docs: typo --- lua/lazy/core/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 035714e..ec30ee0 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -114,7 +114,7 @@ M.defaults = { 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 indluce in the rtp + 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", From cab4682d22a0451bc36a648694235621b5dd808e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 22 Jan 2023 14:25:05 +0000 Subject: [PATCH 0737/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 06c47a8..86345f5 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -460,7 +460,7 @@ CONFIGURATION *lazy.nvim-configuration* 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 indluce in the rtp + paths = {}, -- add any custom paths here that you want to include in the rtp ---@type string[] list any plugins you want to disable here disabled_plugins = { -- "gzip", @@ -671,7 +671,7 @@ 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 you rtp are sourced (excluding `/after`) -4. all `/after/plugin` files are sourced (this inludes `/after` from plugins) +4. all `/after/plugin` files are sourced (this includes `/after` from plugins) Files from runtime directories are always sourced in alphabetical order. From ed210702f5dc8c24ec6531c0f2484881d9ebe6b6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 23 Jan 2023 19:17:11 +0100 Subject: [PATCH 0738/1610] fix(checker): dont clear tasks when running update check --- lua/lazy/manage/checker.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 5798b4f..d45d513 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -15,6 +15,7 @@ function M.start() M.fast_check() if M.schedule() > 0 then Manage.log({ + clear = false, show = false, check = true, concurrency = Config.options.checker.concurrency, @@ -60,6 +61,7 @@ function M.check() M.schedule() else Manage.check({ + clear = false, show = false, concurrency = Config.options.checker.concurrency, }):wait(function() From c32a6185ace7cb04572db1637a3010b729a7601e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 23 Jan 2023 19:17:30 +0100 Subject: [PATCH 0739/1610] fix(checker): dont check for updates when there's tasks with errors --- lua/lazy/manage/checker.lua | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index d45d513..1cc5322 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -13,7 +13,7 @@ M.reported = {} function M.start() M.fast_check() - if M.schedule() > 0 then + if M.schedule() > 0 and not M.has_errors() then Manage.log({ clear = false, show = false, @@ -47,17 +47,19 @@ function M.fast_check(opts) M.report(opts.report ~= false) end +function M.has_errors() + for _, plugin in pairs(Config.plugins) do + if Plugin.has_errors(plugin) then + return true + end + end + return false +end + function M.check() State.checker.last_check = os.time() State.write() -- update state - local errors = false - for _, plugin in pairs(Config.plugins) do - if Plugin.has_errors(plugin) then - errors = true - break - end - end - if errors then + if M.has_errors() then M.schedule() else Manage.check({ From 26a67e3c48951ca3ce47d208c3216143749b0768 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 23 Jan 2023 19:18:15 +0100 Subject: [PATCH 0740/1610] feat(config): added option to disable git filter. NOT recommended. Fixes #442 --- lua/lazy/core/config.lua | 4 ++++ lua/lazy/manage/task/git.lua | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index ec30ee0..dd1bdae 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -21,6 +21,10 @@ M.defaults = { log = { "--since=3 days ago" }, -- show commits from the last 3 days 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 is should work, but is NOT supported and will + -- increase downloads a lot. + filter = true, }, dev = { -- directory where you store your local plugin projects diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index c314c90..f07fce0 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -64,10 +64,16 @@ M.clone = { local args = { "clone", self.plugin.url, - "--filter=blob:none", + } + + if Config.options.git.filter then + args[#args + 1] = "--filter=blob:none" + end + + vim.list_extend(args, { "--recurse-submodules", "--progress", - } + }) if self.plugin.branch then vim.list_extend(args, { "-b", self.plugin.branch }) From 5d9d35404f39de5d7c9365cbc2aa39858929cbfc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 23 Jan 2023 19:18:48 +0100 Subject: [PATCH 0741/1610] feat(util): utility method to walk over all modules in a directory --- lua/lazy/core/util.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 7411664..fd2cce4 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -201,6 +201,22 @@ function M.walk(path, fn) end) end +---@param root string +---@param fn fun(modname:string, modpath:string) +---@param modname? string +function M.walkmods(root, fn, modname) + modname = modname and (modname:gsub("%.$", "") .. ".") or "" + M.ls(root, function(path, name, type) + if name == "init.lua" then + fn(modname:gsub("%.$", ""), path) + elseif (type == "file" or type == "link") and name:sub(-4) == ".lua" then + fn(modname .. name:sub(1, -5), path) + elseif type == "directory" then + M.walkmods(path, fn, modname .. name .. ".") + end + end) +end + ---@param modname string ---@param fn fun(modname:string, modpath:string) function M.lsmod(modname, fn) From 9e0b8c399f54d9853abea85ed737e6476917e96c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 23 Jan 2023 18:19:49 +0000 Subject: [PATCH 0742/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 86345f5..403c7f8 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 22 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 23 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 809d67fcf0f6dd5dabdd1c2b88d451cef4695880 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 23 Jan 2023 20:49:44 +0100 Subject: [PATCH 0743/1610] ci: update actions/checkout to v3 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8046e5a..94b6d15 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,7 +57,7 @@ jobs: package-name: lazy.nvim extra-files: | lua/lazy/core/config.lua - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: tag stable versions if: ${{ steps.release.outputs.release_created }} run: | From 772d8888cc6f8e4371c31001197431b24311af48 Mon Sep 17 00:00:00 2001 From: Null Chilly <56817415+nullchilly@users.noreply.github.com> Date: Wed, 25 Jan 2023 04:55:34 +0700 Subject: [PATCH 0744/1610] feat(dev): optionally fallback to git when local plugin doesn't exist (#446) * feat: fallback to git when local plugin isn't found * feat(option): fallback to git when local plugin doesn't exist --- README.md | 1 + lua/lazy/core/config.lua | 1 + lua/lazy/core/plugin.lua | 5 ++++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a3a2972..20f0134 100644 --- a/README.md +++ b/README.md @@ -320,6 +320,7 @@ return { 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. diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index dd1bdae..e0b50f0 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -31,6 +31,7 @@ M.defaults = { 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. diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 4873249..b79cc6b 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -91,7 +91,10 @@ function Spec:add(plugin, results, is_dep) end end -- dev plugins - if plugin.dev then + if + plugin.dev + and (not Config.options.dev.fallback or vim.fn.isdirectory(Config.options.dev.path .. "/" .. plugin.name) == 1) + then plugin.dir = Config.options.dev.path .. "/" .. plugin.name else -- remote plugin From 39c4770d8137e9cb304e68b779396c7d0a3c8ec2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 24 Jan 2023 21:56:22 +0000 Subject: [PATCH 0745/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 403c7f8..86a2198 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 23 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 24 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -364,6 +364,7 @@ CONFIGURATION *lazy.nvim-configuration* 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. From 9b5cc1bf53f344c8ad829f33c3ac77f5e3ea8da1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 24 Jan 2023 08:48:14 +0100 Subject: [PATCH 0746/1610] feat(health): check for git in health checks --- lua/lazy/health.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 59fa139..31fbd50 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -5,6 +5,12 @@ local M = {} function M.check() vim.health.report_start("lazy.nvim") + if vim.fn.executable("git") == 1 then + vim.health.report_ok("Git installed") + else + vim.health.report_error("Git not installd?") + end + local sites = vim.opt.packpath:get() local default_site = vim.fn.stdpath("data") .. "/site" if not vim.tbl_contains(sites, default_site) then From 31dd419aaa0bfbab1c827465aa153efbe6b95e1f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 24 Jan 2023 23:01:11 +0100 Subject: [PATCH 0747/1610] docs: updated --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 20f0134..40ffda8 100644 --- a/README.md +++ b/README.md @@ -314,6 +314,10 @@ return { log = { "--since=3 days ago" }, -- show commits from the last 3 days 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 is should work, but is NOT supported and will + -- increase downloads a lot. + filter = true, }, dev = { -- directory where you store your local plugin projects @@ -417,7 +421,7 @@ return { 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 include in the rtp + 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", From a24331762cc41df636d9d3541aafa301f958cf4a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 24 Jan 2023 22:01:59 +0000 Subject: [PATCH 0748/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 86a2198..357cc29 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -358,6 +358,10 @@ CONFIGURATION *lazy.nvim-configuration* log = { "--since=3 days ago" }, -- show commits from the last 3 days 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 is should work, but is NOT supported and will + -- increase downloads a lot. + filter = true, }, dev = { -- directory where you store your local plugin projects @@ -461,7 +465,7 @@ CONFIGURATION *lazy.nvim-configuration* 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 include in the rtp + 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", From 9b208696e139a404d159963b975a5b90af38439b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 25 Jan 2023 09:10:46 +0100 Subject: [PATCH 0749/1610] chore(main): release 9.5.0 (#444) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 16 ++++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a84145b..c7949e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [9.5.0](https://github.com/folke/lazy.nvim/compare/v9.4.0...v9.5.0) (2023-01-24) + + +### Features + +* **config:** added option to disable git filter. NOT recommended. Fixes [#442](https://github.com/folke/lazy.nvim/issues/442) ([26a67e3](https://github.com/folke/lazy.nvim/commit/26a67e3c48951ca3ce47d208c3216143749b0768)) +* **dev:** optionally fallback to git when local plugin doesn't exist ([#446](https://github.com/folke/lazy.nvim/issues/446)) ([772d888](https://github.com/folke/lazy.nvim/commit/772d8888cc6f8e4371c31001197431b24311af48)) +* **health:** check for git in health checks ([9b5cc1b](https://github.com/folke/lazy.nvim/commit/9b5cc1bf53f344c8ad829f33c3ac77f5e3ea8da1)) +* **util:** utility method to walk over all modules in a directory ([5d9d354](https://github.com/folke/lazy.nvim/commit/5d9d35404f39de5d7c9365cbc2aa39858929cbfc)) + + +### Bug Fixes + +* **checker:** dont check for updates when there's tasks with errors ([c32a618](https://github.com/folke/lazy.nvim/commit/c32a6185ace7cb04572db1637a3010b729a7601e)) +* **checker:** dont clear tasks when running update check ([ed21070](https://github.com/folke/lazy.nvim/commit/ed210702f5dc8c24ec6531c0f2484881d9ebe6b6)) + ## [9.4.0](https://github.com/folke/lazy.nvim/compare/v9.3.1...v9.4.0) (2023-01-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index e0b50f0..79bef28 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -146,7 +146,7 @@ M.defaults = { debug = false, } -M.version = "9.4.0" -- x-release-please-version +M.version = "9.5.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From b64ebb71d4e573a34b0b83801eee60cc6d86a06e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 25 Jan 2023 08:27:21 +0000 Subject: [PATCH 0750/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 357cc29..f4674d6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 24 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 25 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 07fda7bb9808b4848aaabd9400357c56cfbda6d7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 25 Jan 2023 22:33:45 +0100 Subject: [PATCH 0751/1610] docs: use another bug emoji. #452 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 40ffda8..c272438 100644 --- a/README.md +++ b/README.md @@ -610,7 +610,7 @@ The profiling view shows you why and how long it took to load your plugins. ![image](https://user-images.githubusercontent.com/292349/208301766-5c400561-83c3-4811-9667-1ec4bb3c43b8.png) -## 🪲 Debug +## 🐛 Debug See an overview of active lazy-loading handlers and what's in the module cache From 15fe46a728b7473d4cae368838bbc1c79c3a3f48 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 25 Jan 2023 21:34:44 +0000 Subject: [PATCH 0752/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f4674d6..05b1beb 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -12,7 +12,7 @@ Table of Contents *lazy.nvim-table-of-contents* - Usage |lazy.nvim-usage| - Lockfile `lazy-lock.json` |lazy.nvim-lockfile-`lazy-lock.json`| - Performance |lazy.nvim-performance| - - 🪲 Debug |lazy.nvim-🪲-debug| + - Debug |lazy.nvim-debug| - Startup Sequence |lazy.nvim-startup-sequence| - Structuring Your Plugins |lazy.nvim-structuring-your-plugins| - Migration Guide |lazy.nvim-migration-guide| @@ -654,7 +654,7 @@ load your plugins. <p class="caption">image</p> </div> -🪲 DEBUG *lazy.nvim-🪲-debug* +DEBUG *lazy.nvim-debug* See an overview of active lazy-loading handlers and what’s in the module cache From 0c980312fd6bce744db499acfa5af47871287151 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 1 Feb 2023 08:06:48 +0100 Subject: [PATCH 0753/1610] fix(commands): sync with plugins list should not delete those plugins. Fixes #475 --- lua/lazy/manage/init.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index c4a4da0..34fc065 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -174,7 +174,10 @@ function M.sync(opts) end) opts.show = false end - local clean = M.clean(opts) + + local clean_opts = vim.deepcopy(opts) + clean_opts.plugins = nil + local clean = M.clean(clean_opts) local install = M.install(opts) local update = M.update(opts) clean:wait(function() From c83563d34acd20cbd5180e40442f2e0f095fb3ff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 1 Feb 2023 07:08:28 +0000 Subject: [PATCH 0754/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 05b1beb..c4b8119 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 January 25 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 01 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 527f83cae50b99d16327447eb813b4f73e09ec0d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 1 Feb 2023 08:08:44 +0100 Subject: [PATCH 0755/1610] fix(health): existing packages on windows. Fixes #474 --- lua/lazy/health.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 31fbd50..75a85a6 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -20,7 +20,7 @@ function M.check() local existing = false for _, site in pairs(sites) do for _, packs in ipairs(vim.fn.expand(site .. "/pack/*", false, true)) do - if not packs:find("/dist$") and vim.loop.fs_stat(packs) then + if not packs:find("[/\\]dist$") and vim.loop.fs_stat(packs) then existing = true vim.health.report_warn("found existing packages at `" .. packs .. "`") end From 3d2dcb2d5ef99106c5ff412da88c6f59a9f8a693 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 1 Feb 2023 08:26:20 +0100 Subject: [PATCH 0756/1610] fix(log): properly check if plugin dir is a git repo before running git log --- lua/lazy/manage/task/git.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index f07fce0..377b3ef 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -15,7 +15,7 @@ M.log = { return true end local stat = vim.loop.fs_stat(plugin.dir .. "/.git") - return stat and stat.type ~= "directory" + return not (stat and stat.type == "directory") end, ---@param opts {args?: string[], updated?:boolean, check?:boolean} run = function(self, opts) From 452d4eb719c5067f0bae497dc870554cd300758f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 6 Feb 2023 09:16:49 +0100 Subject: [PATCH 0757/1610] fix(process): allow overriding GIT_SSH_COMMAND. Fixes #491. Fixes #492 --- lua/lazy/manage/process.lua | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 2ddcff1..fd5f898 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -49,7 +49,7 @@ local uv = vim.loop ---@field on_line? fun(string) ---@field on_exit? fun(ok:boolean, output:string) ---@field timeout? number ----@field env? string[] +---@field env? table<string,string> ---@param opts? ProcessOpts ---@param cmd string @@ -57,20 +57,15 @@ function M.spawn(cmd, opts) opts = opts or {} opts.timeout = opts.timeout or (Config.options.git and Config.options.git.timeout * 1000) - local env = { - "GIT_TERMINAL_PROMPT=0", - "GIT_SSH_COMMAND=ssh -oBatchMode=yes", - } - if opts.env then - vim.list_extend(env, opts.env) - end + local env = vim.tbl_extend("force", { + GIT_SSH_COMMAND = "ssh -oBatchMode=yes", + }, uv.os_environ(), opts.env or {}) + env.GIT_DIR = nil + env.GIT_TERMINAL_PROMPT = "0" - for key, value in - pairs(uv.os_environ() --[[@as string[] ]]) - do - if key ~= "GIT_DIR" then - table.insert(env, key .. "=" .. value) - end + local env_flat = {} + for k, v in pairs(env) do + env_flat[#env_flat + 1] = k .. "=" .. v end local stdout = uv.new_pipe() @@ -95,7 +90,7 @@ function M.spawn(cmd, opts) stdio = { nil, stdout, stderr }, args = opts.args, cwd = opts.cwd, - env = env, + env = env_flat, }, function(exit_code, signal) M.running[handle] = nil if timeout then From 2e8f6e6e8f1543ee9762525bd150c1b1e319555b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 08:17:59 +0000 Subject: [PATCH 0758/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c4b8119..dd94667 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 01 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 812ffcf21c314e2fddc3ac84aca6b22627a49a36 Mon Sep 17 00:00:00 2001 From: Maurice Mertens <maurice@mdotmertens.dev> Date: Mon, 6 Feb 2023 09:24:24 +0100 Subject: [PATCH 0759/1610] docs: clarifies install step (#495) Co-authored-by: Maurice Mertens <m.mertens@simplicity.ag> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c272438..b2fa8a3 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ vim.opt.rtp:prepend(lazypath) <!-- bootstrap:end --> -Next step is to add **lazy.nvim** to the top of your `init.lua` +Next step is to add **lazy.nvim** below the code added in the last step in `init.lua` ```lua require("lazy").setup(plugins, opts) From 326556008a1574389be7fa9d670abada10ce1323 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 08:25:32 +0000 Subject: [PATCH 0760/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index dd94667..b3a3fcd 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -81,7 +81,8 @@ You can add the following Lua code to your `init.lua` to bootstrap < -Next step is to add **lazy.nvim** to the top of your `init.lua` +Next step is to add **lazy.nvim** below the code added in the last step in +`init.lua` >lua require("lazy").setup(plugins, opts) From 0e4017152d90cff89232713a5baca24e8411dbaa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Feb 2023 17:09:39 +0100 Subject: [PATCH 0761/1610] chore(main): release 9.5.1 (#478) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 10 ++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7949e7..1f1b1a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [9.5.1](https://github.com/folke/lazy.nvim/compare/v9.5.0...v9.5.1) (2023-02-06) + + +### Bug Fixes + +* **commands:** sync with plugins list should not delete those plugins. Fixes [#475](https://github.com/folke/lazy.nvim/issues/475) ([0c98031](https://github.com/folke/lazy.nvim/commit/0c980312fd6bce744db499acfa5af47871287151)) +* **health:** existing packages on windows. Fixes [#474](https://github.com/folke/lazy.nvim/issues/474) ([527f83c](https://github.com/folke/lazy.nvim/commit/527f83cae50b99d16327447eb813b4f73e09ec0d)) +* **log:** properly check if plugin dir is a git repo before running git log ([3d2dcb2](https://github.com/folke/lazy.nvim/commit/3d2dcb2d5ef99106c5ff412da88c6f59a9f8a693)) +* **process:** allow overriding GIT_SSH_COMMAND. Fixes [#491](https://github.com/folke/lazy.nvim/issues/491). Fixes [#492](https://github.com/folke/lazy.nvim/issues/492) ([452d4eb](https://github.com/folke/lazy.nvim/commit/452d4eb719c5067f0bae497dc870554cd300758f)) + ## [9.5.0](https://github.com/folke/lazy.nvim/compare/v9.4.0...v9.5.0) (2023-01-24) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 79bef28..8b0a124 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -146,7 +146,7 @@ M.defaults = { debug = false, } -M.version = "9.5.0" -- x-release-please-version +M.version = "9.5.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 0dcc9071dfc98a3b9ea2585019073fb90a84a616 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Feb 2023 16:10:30 +0000 Subject: [PATCH 0762/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b3a3fcd..849e3b4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 06 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 07 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 3c29f196f4b0f083f2b94c3337599a189f4eef84 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 7 Feb 2023 20:56:54 +0100 Subject: [PATCH 0763/1610] feat(cmd): use cmd table instead of trying to create the cmd string. Fixes #472 --- lua/lazy/core/handler/cmd.lua | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index a4913e0..142eda8 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -14,16 +14,22 @@ end ---@param cmd string function M:_add(cmd) vim.api.nvim_create_user_command(cmd, function(event) + local command = { + cmd = cmd, + bang = event.bang or nil, + mods = event.smods, + args = event.fargs, + count = event.count >= 0 and event.count or nil, + } + + if event.range == 1 then + command.range = { event.line1 } + elseif event.range == 2 then + command.range = { event.line1, event.line2 } + end + self:_load(cmd) - vim.cmd( - ("%s %s%s%s %s"):format( - event.mods or "", - event.line1 == event.line2 and "" or event.line1 .. "," .. event.line2, - cmd, - event.bang and "!" or "", - event.args or "" - ) - ) + vim.cmd(command) end, { bang = true, range = true, From 48c9b37294f31e3875435bca41d0c923fdd6eea4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Feb 2023 22:02:20 +0100 Subject: [PATCH 0764/1610] chore(main): release 9.6.0 (#504) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f1b1a2..8e66b59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.6.0](https://github.com/folke/lazy.nvim/compare/v9.5.1...v9.6.0) (2023-02-07) + + +### Features + +* **cmd:** use cmd table instead of trying to create the cmd string. Fixes [#472](https://github.com/folke/lazy.nvim/issues/472) ([3c29f19](https://github.com/folke/lazy.nvim/commit/3c29f196f4b0f083f2b94c3337599a189f4eef84)) + ## [9.5.1](https://github.com/folke/lazy.nvim/compare/v9.5.0...v9.5.1) (2023-02-06) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 8b0a124..62ff3d7 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -146,7 +146,7 @@ M.defaults = { debug = false, } -M.version = "9.5.1" -- x-release-please-version +M.version = "9.6.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 49b43def14f7e130cc27c7041ca2942142a881ed Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 7 Feb 2023 22:59:05 +0100 Subject: [PATCH 0765/1610] fix(install): dont load the colorscheme again if a `config()` of the colorscheme also loads it. Fixes #488 --- lua/lazy/core/loader.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 68f05e8..4d00a5e 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -63,7 +63,8 @@ function M.install_missing() for _, plugin in pairs(Config.plugins) do if not (plugin._.installed or Plugin.has_errors(plugin)) then for _, colorscheme in ipairs(Config.options.install.colorscheme) do - if pcall(vim.cmd.colorscheme, colorscheme) then + M.colorscheme(colorscheme) + if vim.g.colors_name or pcall(vim.cmd.colorscheme, colorscheme) then break end end From 57a3960fafc210f240a07439d1adfaba09d6ff59 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 7 Feb 2023 23:52:02 +0100 Subject: [PATCH 0766/1610] feat: deactivate WIP --- lua/lazy/core/loader.lua | 109 ++++++++++++++++++++++++++++++++++----- lua/lazy/types.lua | 2 + 2 files changed, 97 insertions(+), 14 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 4d00a5e..6c369c6 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -181,6 +181,78 @@ function M.load(plugins, reason, opts) end end +---@param plugin LazyPlugin +function M.deactivate(plugin) + local main = M.get_main(plugin) + + if main then + Util.try(function() + local mod = require(main) + if mod.deactivate then + mod.deactivate(plugin) + end + end, "Failed to deactivate plugin " .. plugin.name) + end + + -- execute deactivate when needed + if plugin._.loaded and plugin.deactivate then + Util.try(function() + plugin.deactivate(plugin) + end, "Failed to deactivate plugin " .. plugin.name) + end + + -- disable handlers + Handler.disable(plugin) + + -- remove loaded lua modules + Util.walkmods(plugin.dir .. "/lua", function(modname) + package.loaded[modname] = nil + package.preload[modname] = nil + end) + + -- clear vim.g.loaded_ for plugins + Util.ls(plugin.dir .. "/plugin", function(_, name, type) + if type == "file" then + vim.g["loaded_" .. name:gsub("%..*", "")] = nil + end + end) + -- set as not loaded + plugin._.loaded = nil +end + +--- reload a plugin +---@param plugin LazyPlugin +function M.reload(plugin) + M.deactivate(plugin) + local load = false -- plugin._.loaded ~= nil + + -- enable handlers + Handler.enable(plugin) + + -- run init + if plugin.init then + Util.try(function() + plugin.init(plugin) + end, "Failed to run `init` for **" .. plugin.name .. "**") + end + + -- if this is a start plugin, load it now + if plugin.lazy == false then + load = true + end + + for _, event in ipairs(plugin.event or {}) do + if event == "VimEnter" or event == "UIEnter" or event:find("VeryLazy") then + load = true + break + end + end + + if load then + M.load(plugin, { start = "reload" }) + end +end + ---@param plugin LazyPlugin ---@param reason {[string]:string} ---@param opts? {force:boolean} when force is true, we skip the cond check @@ -242,22 +314,11 @@ function M.config(plugin) plugin.config(plugin, opts) end else - local normname = Util.normname(plugin.name) - ---@type string[] - local mods = {} - for _, modname in ipairs(Cache.get_topmods(plugin.dir)) do - mods[#mods + 1] = modname - local modnorm = Util.normname(modname) - -- if we found an exact match, then use that - if modnorm == normname then - mods = { modname } - break - end - end - if #mods == 1 then + local main = M.get_main(plugin) + if main then fn = function() local opts = Plugin.values(plugin, "opts", false) - require(mods[1]).setup(opts) + require(main).setup(opts) end else return Util.error( @@ -268,6 +329,26 @@ function M.config(plugin) Util.try(fn, "Failed to run `config` for " .. plugin.name) end +---@param plugin LazyPlugin +function M.get_main(plugin) + if plugin.main then + return plugin.main + end + local normname = Util.normname(plugin.name) + ---@type string[] + local mods = {} + for _, modname in ipairs(Cache.get_topmods(plugin.dir)) do + mods[#mods + 1] = modname + local modnorm = Util.normname(modname) + -- if we found an exact match, then use that + if modnorm == normname then + mods = { modname } + break + end + end + return #mods == 1 and mods[1] or nil +end + ---@param path string function M.packadd(path) M.source_runtime(path, "plugin") diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 6a0c055..5f77ae1 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -19,6 +19,7 @@ ---@class LazyPluginHooks ---@field init? fun(self:LazyPlugin) Will always be run +---@field deactivate? fun(self:LazyPlugin) Unload/Stop a plugin ---@field config? fun(self:LazyPlugin, opts:table)|true Will be executed when loading the plugin ---@field build? string|fun(self:LazyPlugin)|(string|fun(self:LazyPlugin))[] ---@field opts? PluginOpts @@ -40,6 +41,7 @@ ---@class LazyPluginBase ---@field [1] string? ---@field name string display name and name used for plugin config files +---@field main? string Entry module that has setup & deactivate ---@field url string? ---@field dir string ---@field enabled? boolean|(fun():boolean) From 4272d2100af2384f4b8aba08aef4a7b9a296bce6 Mon Sep 17 00:00:00 2001 From: MurdeRM3L0DY <95099980+MurdeRM3L0DY@users.noreply.github.com> Date: Wed, 8 Feb 2023 00:45:28 +0100 Subject: [PATCH 0767/1610] fix(keys): refactor retrigger mechanism (#428) * fix keymap retrigger in operator mode * remove unnecessary retrigger logic we can just eval `"<Ignore>" .. lhs` to retrigger the mapping * remove unused function --------- Co-authored-by: MurdeRM3L0DY <> --- lua/lazy/core/handler/keys.lua | 41 ++++------------------------------ 1 file changed, 4 insertions(+), 37 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index dd78581..bf7f4e2 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -14,42 +14,6 @@ local Loader = require("lazy.core.loader") ---@class LazyKeysHandler:LazyHandler local M = {} ----@param feed string -function M.replace_special(feed) - for special, key in pairs({ leader = vim.g.mapleader or "\\", localleader = vim.g.maplocalleader or "\\" }) do - local pattern = "<" - for i = 1, #special do - pattern = pattern .. "[" .. special:sub(i, i) .. special:upper():sub(i, i) .. "]" - end - pattern = pattern .. ">" - feed = feed:gsub(pattern, key) - end - return feed -end - -function M.retrigger(keys) - local pending = "" - while true do - ---@type number|string - local c = vim.fn.getchar(0) - if c == 0 then - break - end - c = type(c) == "number" and vim.fn.nr2char(c) or c - pending = pending .. c - end - local op = vim.v.operator - if op and op ~= "" and vim.api.nvim_get_mode().mode:find("o") then - keys = "<esc>" .. op .. keys - end - local feed = keys .. pending - feed = M.replace_special(feed) - if vim.v.count ~= 0 then - feed = vim.v.count .. feed - end - vim.api.nvim_input(feed) -end - ---@param value string|LazyKeys function M.parse(value) local ret = vim.deepcopy(value) @@ -99,6 +63,8 @@ end function M:_add(keys) local lhs = keys[1] local opts = M.opts(keys) + opts.remap = true + opts.expr = true vim.keymap.set(keys.mode, lhs, function() local plugins = self.active[keys.id] @@ -108,8 +74,9 @@ function M:_add(keys) Util.track({ keys = lhs }) Loader.load(plugins, { keys = lhs }) - M.retrigger(lhs) Util.track() + + return "<Ignore>" .. lhs end, opts) end From 2451ea4e655bc60ef639ad284e69c6fca15da352 Mon Sep 17 00:00:00 2001 From: kyoh86 <me@kyoh86.dev> Date: Wed, 8 Feb 2023 15:32:29 +0900 Subject: [PATCH 0768/1610] feat: use "wslview" instead of "xsl-open" if it exsits (#509) --- lua/lazy/util.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 456ad83..23e32b5 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -25,6 +25,8 @@ function M.open(uri) else if vim.fn.executable("xdg-open") then cmd = { "xdg-open", uri } + elseif vim.fn.executable("wslview") then + cmd = { "wslview", uri } else cmd = { "open", uri } end From 382c8fac56cc6c3d054736861b17c42f1a640e89 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 06:33:17 +0000 Subject: [PATCH 0769/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 849e3b4..86afc22 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 07 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 08 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From ddaffa07156a090383bd32ef88669eea1b22c11a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 8 Feb 2023 09:33:38 +0100 Subject: [PATCH 0770/1610] fix(keys): replace keycodes manually --- lua/lazy/core/handler/keys.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index bf7f4e2..f398127 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -65,6 +65,7 @@ function M:_add(keys) local opts = M.opts(keys) opts.remap = true opts.expr = true + opts.replace_keycodes = false vim.keymap.set(keys.mode, lhs, function() local plugins = self.active[keys.id] @@ -75,8 +76,7 @@ function M:_add(keys) Util.track({ keys = lhs }) Loader.load(plugins, { keys = lhs }) Util.track() - - return "<Ignore>" .. lhs + return vim.api.nvim_replace_termcodes("<Ignore>" .. lhs, false, true, true) end, opts) end From c734d941b47312baafe3e0429a5fecd25da95f5f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 8 Feb 2023 16:00:56 +0100 Subject: [PATCH 0771/1610] fix(keys): feed keys instead of returning expr for Neovim 0.8.x. Fixes #511 --- lua/lazy/core/handler/keys.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index f398127..8285240 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -63,9 +63,6 @@ end function M:_add(keys) local lhs = keys[1] local opts = M.opts(keys) - opts.remap = true - opts.expr = true - opts.replace_keycodes = false vim.keymap.set(keys.mode, lhs, function() local plugins = self.active[keys.id] @@ -76,8 +73,15 @@ function M:_add(keys) Util.track({ keys = lhs }) Loader.load(plugins, { keys = lhs }) Util.track() - return vim.api.nvim_replace_termcodes("<Ignore>" .. lhs, false, true, true) - end, opts) + + local feed = vim.api.nvim_replace_termcodes("<Ignore>" .. lhs, true, true, true) + -- insert instead of append the lhs + vim.api.nvim_feedkeys(feed, "i", false) + end, { + desc = opts.desc, + -- we do not return anything, but this is still needed to make operator pending mappings work + expr = true, + }) end ---@param keys LazyKeys From d13fe9353594bce58a5b9fc6d7166d183e0fc035 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 14:44:13 +0100 Subject: [PATCH 0772/1610] chore(main): release 9.7.0 (#505) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 16 ++++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e66b59..a2ed41b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [9.7.0](https://github.com/folke/lazy.nvim/compare/v9.6.0...v9.7.0) (2023-02-08) + + +### Features + +* deactivate WIP ([57a3960](https://github.com/folke/lazy.nvim/commit/57a3960fafc210f240a07439d1adfaba09d6ff59)) +* use "wslview" instead of "xsl-open" if it exsits ([#509](https://github.com/folke/lazy.nvim/issues/509)) ([2451ea4](https://github.com/folke/lazy.nvim/commit/2451ea4e655bc60ef639ad284e69c6fca15da352)) + + +### Bug Fixes + +* **install:** dont load the colorscheme again if a `config()` of the colorscheme also loads it. Fixes [#488](https://github.com/folke/lazy.nvim/issues/488) ([49b43de](https://github.com/folke/lazy.nvim/commit/49b43def14f7e130cc27c7041ca2942142a881ed)) +* **keys:** feed keys instead of returning expr for Neovim 0.8.x. Fixes [#511](https://github.com/folke/lazy.nvim/issues/511) ([c734d94](https://github.com/folke/lazy.nvim/commit/c734d941b47312baafe3e0429a5fecd25da95f5f)) +* **keys:** refactor retrigger mechanism ([#428](https://github.com/folke/lazy.nvim/issues/428)) ([4272d21](https://github.com/folke/lazy.nvim/commit/4272d2100af2384f4b8aba08aef4a7b9a296bce6)) +* **keys:** replace keycodes manually ([ddaffa0](https://github.com/folke/lazy.nvim/commit/ddaffa07156a090383bd32ef88669eea1b22c11a)) + ## [9.6.0](https://github.com/folke/lazy.nvim/compare/v9.5.1...v9.6.0) (2023-02-07) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 62ff3d7..4d9523f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -146,7 +146,7 @@ M.defaults = { debug = false, } -M.version = "9.6.0" -- x-release-please-version +M.version = "9.7.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 273081443471cbc52c327bcb99614c32f247998d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 13:45:04 +0000 Subject: [PATCH 0773/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 86afc22..c872dec 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 08 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 09 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From a1471103902a9836d88732eeeeabd11d00a2cb3e Mon Sep 17 00:00:00 2001 From: Yahir Eduardo Bravo Tafur <yahir.eduardo.bravo@gmail.com> Date: Thu, 9 Feb 2023 12:02:40 -0500 Subject: [PATCH 0774/1610] fix(cmd): fix Error when trigger on range defined command that doesn't support count (#519) --- lua/lazy/core/handler/cmd.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index 142eda8..6ee52ad 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -19,7 +19,7 @@ function M:_add(cmd) bang = event.bang or nil, mods = event.smods, args = event.fargs, - count = event.count >= 0 and event.count or nil, + count = event.count >= 0 and event.range == 0 and event.count or nil, } if event.range == 1 then From e28555950f8ceb52e86533df6df333dcd55fba04 Mon Sep 17 00:00:00 2001 From: dundargoc <33953936+dundargoc@users.noreply.github.com> Date: Thu, 9 Feb 2023 22:10:36 +0100 Subject: [PATCH 0775/1610] ci: fix typo. (#523) --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index c7a92d3..4a77601 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -16,7 +16,7 @@ body: required: true - label: I have searched the existing issues of lazy.nvim required: true - - label: I have searched the exsiting issues of plugins related to this issue + - label: I have searched the existing issues of plugins related to this issue required: true - type: input attributes: From c83d2aeb27fce9cf9f14e779e77a85c63fc3d2c9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 10 Feb 2023 17:47:25 +0100 Subject: [PATCH 0776/1610] fix(loader): don't deactivate when not loaded --- lua/lazy/core/loader.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 6c369c6..e826654 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -183,6 +183,10 @@ end ---@param plugin LazyPlugin function M.deactivate(plugin) + if not plugin._.loaded then + return + end + local main = M.get_main(plugin) if main then @@ -195,7 +199,7 @@ function M.deactivate(plugin) end -- execute deactivate when needed - if plugin._.loaded and plugin.deactivate then + if plugin.deactivate then Util.try(function() plugin.deactivate(plugin) end, "Failed to deactivate plugin " .. plugin.name) From bab744565e9d8d743b1889c66707aa2e8018ae86 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Feb 2023 16:48:16 +0000 Subject: [PATCH 0777/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c872dec..d46aa7e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 09 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 10 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From bc978ca9be96b75330336a0427771addaa1ccd50 Mon Sep 17 00:00:00 2001 From: ryuryu-ymj <33318253+ryuryu-ymj@users.noreply.github.com> Date: Sat, 11 Feb 2023 17:03:10 +0900 Subject: [PATCH 0778/1610] fix(icons): replace an obsolete Nerd icon (#529) --- lua/lazy/core/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4d9523f..c1a236f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -53,7 +53,7 @@ M.defaults = { init = " ", import = " ", keys = " ", - lazy = "鈴 ", + lazy = "󰒲 ", loaded = "●", not_loaded = "○", plugin = " ", From b5eb07e728fb17d6e2a469b5032b920ec7bd470d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 11 Feb 2023 08:03:55 +0000 Subject: [PATCH 0779/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d46aa7e..60087b6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 10 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 11 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 4917222c7e5c924bf7471b72a5e2d3e661530b40 Mon Sep 17 00:00:00 2001 From: kyoh86 <me@kyoh86.dev> Date: Sat, 11 Feb 2023 17:04:59 +0900 Subject: [PATCH 0780/1610] fix(util): executable checks for `Util.open` (#528) --- lua/lazy/util.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 23e32b5..743a679 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -23,9 +23,9 @@ function M.open(uri) elseif vim.fn.has("macunix") == 1 then cmd = { "open", uri } else - if vim.fn.executable("xdg-open") then + if vim.fn.executable("xdg-open") == 1 then cmd = { "xdg-open", uri } - elseif vim.fn.executable("wslview") then + elseif vim.fn.executable("wslview") == 1 then cmd = { "wslview", uri } else cmd = { "open", uri } From 0d3f2c40421f4774c70f631d7b7023f57cba66cd Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 12 Feb 2023 12:56:42 +0100 Subject: [PATCH 0781/1610] feat(git): `Plugin.submodules = false` will now skip fetching git submodules --- README.md | 1 + lua/lazy/manage/task/git.lua | 17 +++++++++++++---- lua/lazy/types.lua | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b2fa8a3..450d8f0 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,7 @@ require("lazy").setup({ | **commit** | `string?` | Commit of the repository | | **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/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` | | **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | | **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | | **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 377b3ef..3882362 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -70,10 +70,11 @@ M.clone = { args[#args + 1] = "--filter=blob:none" end - vim.list_extend(args, { - "--recurse-submodules", - "--progress", - }) + if self.plugin.submodules ~= false then + args[#args + 1] = "--recurse-submodules" + end + + args[#args + 1] = "--progress" if self.plugin.branch then vim.list_extend(args, { "-b", self.plugin.branch }) @@ -158,6 +159,10 @@ M.fetch = { "--progress", } + if self.plugin.submodules == false then + table.remove(args, 2) + end + self:spawn("git", { args = args, cwd = self.plugin.dir, @@ -209,6 +214,10 @@ M.checkout = { "--recurse-submodules", } + if self.plugin.submodules == false then + table.remove(args, 3) + end + if lock then table.insert(args, lock.commit) elseif target.tag then diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 5f77ae1..067450a 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -37,6 +37,7 @@ ---@field commit? string ---@field version? string ---@field pin? boolean +---@field submodules? boolean Defaults to true ---@class LazyPluginBase ---@field [1] string? From 06f835d0b4b62d9d26fe0ec4190b981f2f5632d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 12 Feb 2023 11:57:29 +0000 Subject: [PATCH 0782/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 60087b6..ce6590e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 11 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 12 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -131,6 +131,7 @@ PLUGIN SPEC *lazy.nvim-plugin-spec* │**commit** │string? │Commit of the repository │ │**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/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 │ │**event** │string? or string[] or fun(self:LazyPlugin, event:string[]):string[] │Lazy-load on event. Events can be specified as BufEnter or with a pattern like BufEnter .lua │ │**cmd** │string? or string[] or fun(self:LazyPlugin, cmd:string[]):string[] │Lazy-load on command │ │**ft** │string? or string[] or fun(self:LazyPlugin, ft:string[]):string[] │Lazy-load on filetype │ From 462633bae11255133f099163dda17180b3a6dc27 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 13 Feb 2023 12:01:56 +0100 Subject: [PATCH 0783/1610] perf: new file-based cache that ensures correct rtp order (#532) * perf: new file-based cache that ensures rtp is alweays correct and will cache all files, including those after startup * refactor: new cache * test: fix tests * fix(cache): cache file names on Windows * feat(cache): allow to disable the cache * docs: updated cache settings --- README.md | 10 +- lua/lazy/core/cache.lua | 728 ++++++++++++----------------------- lua/lazy/core/config.lua | 6 +- lua/lazy/core/loader.lua | 28 +- lua/lazy/core/util.lua | 39 +- lua/lazy/docs.lua | 5 - lua/lazy/init.lua | 5 +- lua/lazy/manage/reloader.lua | 15 +- lua/lazy/view/render.lua | 31 +- tests/core/util_spec.lua | 36 +- 10 files changed, 354 insertions(+), 549 deletions(-) diff --git a/README.md b/README.md index 450d8f0..37fa84f 100644 --- a/README.md +++ b/README.md @@ -347,7 +347,7 @@ return { init = " ", import = " ", keys = " ", - lazy = "鈴 ", + lazy = "󰒲 ", loaded = "●", not_loaded = "○", plugin = " ", @@ -409,14 +409,6 @@ return { performance = { cache = { enabled = true, - path = vim.fn.stdpath("cache") .. "/lazy/cache", - -- Once one of the following events triggers, caching will be disabled. - -- To cache all modules, set this to `{}`, but that is not recommended. - -- The default is to disable on: - -- * VimEnter: not useful to cache anything else beyond startup - -- * BufReadPre: this will be triggered early when opening a file from the command line directly - disable_events = { "UIEnter", "BufReadPre" }, - ttl = 3600 * 24 * 5, -- keep unused modules for up to 5 days }, reset_packpath = true, -- reset the package path to improve startup time rtp = { diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 3f30ff2..89d5a4a 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -1,240 +1,264 @@ local ffi = require("ffi") ----@diagnostic disable-next-line: no-unknown local uv = vim.loop local M = {} -M.dirty = false -M.VERSION = "1" .. jit.version - ----@class LazyCacheConfig -M.config = { - enabled = true, - path = vim.fn.stdpath("cache") .. "/lazy/cache", - -- Once one of the following events triggers, caching will be disabled. - -- To cache all modules, set this to `{}`, but that is not recommended. - -- The default is to disable on: - -- * VimEnter: not useful to cache anything else beyond startup - -- * BufReadPre: this will be triggered early when opening a file from the command line directly - disable_events = { "UIEnter", "BufReadPre" }, - ttl = 3600 * 24 * 5, -- keep unused modules for up to 5 days -} -M.debug = false - ----@type CacheHash -local cache_hash ---@alias CacheHash {mtime: {sec:number, nsec:number}, size:number} ----@alias CacheEntry {hash:CacheHash, modpath:string, chunk:string, used:number} ----@type table<string,CacheEntry?> -M.cache = {} -M.enabled = true ----@type string[] -M.rtp = nil -M.rtp_total = 0 -M.stats = { - find = { total = 0, time = 0, rtp = 0, unloaded = 0, index = 0, stat = 0, not_found = 0 }, - autoload = { total = 0, time = 0 }, +---@alias CacheEntry {hash:CacheHash, modpath:string, chunk:string} + +---@class CacheFindOpts +---@field rtp? boolean Search for modname in the runtime path (defaults to `true`) +---@field patterns? string[] Paterns to use (defaults to `{"/init.lua", ".lua"}`) +---@field paths? string[] Extra paths to search for modname + +M.VERSION = 1 +M.path = vim.fn.stdpath("cache") .. "/lazy/luac" +M.enabled = false +M.stats = { total = 0, time = 0, index = 0, stat = 0, not_found = 0 } + +---@class ModuleCache +---@field _rtp string[] +---@field _rtp_key string +local Cache = { + ---@type table<string, table<string,true>> + _topmods = {}, + _loadfile = loadfile, } -M.me = debug.getinfo(1, "S").source:sub(2) -M.me = vim.fn.fnamemodify(M.me, ":p:h:h:h:h"):gsub("\\", "/") ----@type table<string, string[]> -M.topmods = { lazy = { M.me } } ----@type table<string, string[]> -M.indexed = { [M.me] = { "lazy" } } -M.indexed_unloaded = false -M.indexed_rtp = 0 --- selene:allow(global_usage) -M._loadfile = _G.loadfile --- checks whether the cached modpath is still valid -function M.check_path(modname, modpath) - -- HACK: never return packer paths - if modpath:find("/site/pack/packer/", 1, true) then - return false - end - - -- check rtp excluding plugins. This is a very small list, so should be fast - for _, path in ipairs(M.get_rtp()) do - if modpath:find(path .. "/", 1, true) == 1 then - return true +-- slightly faster/different version than vim.fs.normalize +-- we also need to have it here, since the cache will load vim.fs +---@private +function Cache.normalize(path) + if path:sub(1, 1) == "~" then + local home = vim.loop.os_homedir() + if home:sub(-1) == "\\" or home:sub(-1) == "/" then + home = home:sub(1, -2) end + path = home .. path:sub(2) end - - -- the correct lazy path should be part of rtp. - -- so if we get here, this is folke using the local dev instance ;) - if modname and (modname == "lazy" or modname:sub(1, 5) == "lazy.") then - return false - end - - return modname and M.check_autoload(modname, modpath) + path = path:gsub("\\", "/"):gsub("/+", "/") + return path:sub(-1) == "/" and path:sub(1, -2) or path end -function M.check_autoload(modname, modpath) - local start = uv.hrtime() - M.stats.autoload.total = M.stats.autoload.total + 1 - - -- check plugins. Again fast, since we check the plugin name from the path. - -- only needed when the plugin mod has been loaded - ---@type LazyCorePlugin - local Plugin = package.loaded["lazy.core.plugin"] - if Plugin then - local plugin = Plugin.find(modpath) - if plugin and modpath:find(plugin.dir, 1, true) == 1 then - -- we're not interested in loader time, so calculate delta here - M.stats.autoload.time = M.stats.autoload.time + uv.hrtime() - start - -- don't load if we're loading specs or if the plugin is already loaded - if not (Plugin.loading or plugin._.loaded) then - if plugin.module == false then - error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") - end - require("lazy.core.loader").load(plugin, { require = modname }) +---@private +function Cache.get_rtp() + if vim.in_fast_event() then + return Cache._rtp or {} + end + local key = vim.go.rtp + if key ~= Cache._rtp_key then + Cache._rtp = {} + for _, path in ipairs(vim.api.nvim_get_runtime_file("", true)) do + path = Cache.normalize(path) + -- skip after directories + if path:sub(-6, -1) ~= "/after" then + Cache._rtp[#Cache._rtp + 1] = path end - return true + end + Cache._rtp_key = key + end + return Cache._rtp +end + +---@param name string can be a module name, or a file name +---@private +function Cache.cache_file(name) + return M.path .. "/" .. name:gsub("[/\\:]", "%%") .. "c" +end + +---@param entry CacheEntry +---@private +function Cache.write(name, entry) + local cname = Cache.cache_file(name) + local f = assert(uv.fs_open(cname, "w", 438)) + local header = { + M.VERSION, + entry.hash.size, + entry.hash.mtime.sec, + entry.hash.mtime.nsec, + #entry.modpath, + } + uv.fs_write(f, ffi.string(ffi.new("const uint32_t[5]", header), 20)) + uv.fs_write(f, entry.modpath) + uv.fs_write(f, entry.chunk) + uv.fs_close(f) +end + +---@return CacheEntry? +---@private +function Cache.read(name) + local cname = Cache.cache_file(name) + local f = uv.fs_open(cname, "r", 438) + if f then + local hash = uv.fs_fstat(f) --[[@as CacheHash]] + local data = uv.fs_read(f, hash.size, 0) --[[@as string]] + uv.fs_close(f) + + ---@type integer[]|{[0]:integer} + local header = ffi.cast("uint32_t*", ffi.new("const char[20]", data:sub(1, 20))) + if header[0] ~= M.VERSION then + return + end + local modpath = data:sub(21, 20 + header[4]) + return { + hash = { size = header[1], mtime = { sec = header[2], nsec = header[3] } }, + chunk = data:sub(20 + header[4] + 1), + modpath = modpath, + } + end +end + +---@param modname string +---@private +function Cache.loader(modname) + modname = modname:gsub("/", ".") + local modpath, hash = Cache.find(modname) + if modpath then + return Cache.load(modpath, { hash = hash }) + end + return "module " .. modname .. " not found" +end + +---@param filename? string +---@param mode? "b"|"t"|"bt" +---@param env? table +---@return function?, string? error_message +---@private +function Cache.loadfile(filename, mode, env) + filename = Cache.normalize(filename) + return Cache.load(filename, { mode = mode, env = env }) +end + +---@param h1 CacheHash +---@param h2 CacheHash +---@private +function Cache.eq(h1, h2) + return h1 and h2 and h1.size == h2.size and h1.mtime.sec == h2.mtime.sec and h1.mtime.nsec == h2.mtime.nsec +end + +---@param modpath string +---@param opts? {hash?: CacheHash, mode?: "b"|"t"|"bt", env?:table} +---@return function?, string? error_message +---@private +function Cache.load(modpath, opts) + opts = opts or {} + local hash = opts.hash or uv.fs_stat(modpath) + if not hash then + -- trigger correct error + return Cache._loadfile(modpath) + end + + ---@type function?, string? + local chunk, err + local entry = Cache.read(modpath) + if entry and Cache.eq(entry.hash, hash) then + -- found in cache and up to date + chunk, err = loadstring(entry.chunk --[[@as string]], "@" .. entry.modpath) + if not (err and err:find("cannot load incompatible bytecode", 1, true)) then + return chunk, err end end - M.stats.autoload.time = M.stats.autoload.time + uv.hrtime() - start - return false + entry = { hash = hash, modpath = modpath } + + chunk, err = Cache._loadfile(entry.modpath) + if chunk then + entry.chunk = string.dump(chunk) + Cache.write(modpath, entry) + end + return chunk, err +end + +---@param modname string +---@param opts? CacheFindOpts +---@return string? modpath, CacheHash? hash +function Cache.find(modname, opts) + opts = opts or {} + local start = uv.hrtime() + M.stats.total = M.stats.total + 1 + modname = modname:gsub("/", ".") + local basename = modname:gsub("%.", "/") + local idx = modname:find(".", 1, true) + local topmod = idx and modname:sub(1, idx - 1) or modname + + -- OPTIM: search for a directory first when topmod == modname + local patterns = opts.patterns or (topmod == modname and { "/init.lua", ".lua" } or { ".lua", "/init.lua" }) + local rtp = opts.rtp ~= false and Cache.get_rtp() or {} + if opts.paths then + rtp = vim.deepcopy(rtp) + for _, dir in ipairs(opts.paths) do + rtp[#rtp + 1] = Cache.normalize(dir) + end + end + for p, pattern in ipairs(patterns) do + patterns[p] = "/lua/" .. basename .. pattern + end + + for _, path in ipairs(rtp) do + if M.lsmod(path)[topmod] then + for _, pattern in ipairs(patterns) do + local modpath = path .. pattern + M.stats.stat = M.stats.stat + 1 + local hash = uv.fs_stat(modpath) + if hash then + M.stats.time = M.stats.time + uv.hrtime() - start + return modpath, hash + end + end + end + end + + -- module not found + M.stats.not_found = M.stats.not_found + 1 + M.stats.time = M.stats.time + uv.hrtime() - start +end + +--- Resets the topmods cache for the path +---@param path string +function M.reset(path) + Cache._topmods[Cache.normalize(path)] = nil +end + +function M.enable() + if M.enabled then + return + end + M.enabled = true + vim.fn.mkdir(vim.fn.fnamemodify(M.path, ":p"), "p") + -- selene: allow(global_usage) + _G.loadfile = Cache.loadfile + table.insert(package.loaders, 2, Cache.loader) end function M.disable() if not M.enabled then return end - -- selene:allow(global_usage) - _G.loadfile = M._loadfile M.enabled = false - if M.debug and vim.tbl_count(M.topmods) > 1 then - M.log(M.topmods, { level = vim.log.levels.WARN, title = "topmods" }) - end - if M.debug and false then - local stats = vim.deepcopy(M.stats) - stats.time = (stats.time or 0) / 1e6 - stats.find.time = (stats.find.time or 0) / 1e6 - stats.autoload.time = (stats.autoload.time or 0) / 1e6 - M.log(stats, { title = "stats" }) - end -end - ----@param msg string|table ----@param opts? LazyNotifyOpts -function M.log(msg, opts) - if M.debug then - msg = vim.deepcopy(msg) - vim.schedule(function() - require("lazy.core.util").debug(msg, opts) - end) - end -end - -function M.check_loaded(modname) + -- selene: allow(global_usage) + _G.loadfile = Cache._loadfile ---@diagnostic disable-next-line: no-unknown - local mod = package.loaded[modname] - if type(mod) == "table" then - return function() - return mod + for l, loader in ipairs(package.loaders) do + if loader == Cache.loader then + table.remove(package.loaders, l) end end end ----@param modname string ----@return fun()|string -function M.loader(modname) - modname = modname:gsub("/", ".") - local entry = M.cache[modname] - - local chunk, err - if entry then - if M.check_path(modname, entry.modpath) then - M.stats.find.total = M.stats.find.total + 1 - chunk, err = M.load(modname, entry.modpath) - else - M.cache[modname] = nil - M.dirty = true - end - end - if not chunk then - -- find the modpath and load the module - local modpath = M.find(modname) - if modpath then - M.check_autoload(modname, modpath) - if M.enabled then - chunk, err = M.load(modname, modpath) - else - chunk = M.check_loaded(modname) - if not chunk then - chunk, err = M._loadfile(modpath) - end +-- Return the top-level `/lua/*` modules for this path +---@return string[] +function M.lsmod(path) + if not Cache._topmods[path] then + M.stats.index = M.stats.index + 1 + Cache._topmods[path] = {} + local handle = vim.loop.fs_scandir(path .. "/lua") + while handle do + local name, t = vim.loop.fs_scandir_next(handle) + if not name then + break end - end - end - return chunk or err or ("module " .. modname .. " not found") -end - ----@param modpath string ----@return any, string? -function M.loadfile(modpath) - modpath = modpath:gsub("\\", "/") - return M.load(modpath, modpath) -end - ----@param modkey string ----@param modpath string ----@return function?, string? error_message -function M.load(modkey, modpath) - local chunk, err - chunk = M.check_loaded(modkey) - if chunk then - return chunk - end - modpath = modpath:gsub("\\", "/") - local hash = M.hash(modpath) - if not hash then - -- trigger correct error - return M._loadfile(modpath) - end - - local entry = M.cache[modkey] - if entry then - entry.modpath = modpath - entry.used = os.time() - if M.eq(entry.hash, hash) then - -- found in cache and up to date - chunk, err = loadstring(entry.chunk --[[@as string]], "@" .. entry.modpath) - if not (err and err:find("cannot load incompatible bytecode", 1, true)) then - return chunk, err - end - end - else - entry = { hash = hash, modpath = modpath, used = os.time() } - M.cache[modkey] = entry - end - entry.hash = hash - - if M.debug then - M.log("`" .. modpath .. "`", { level = vim.log.levels.WARN, title = "Cache.load" }) - end - - chunk, err = M._loadfile(entry.modpath) - M.dirty = true - if chunk then - entry.chunk = string.dump(chunk) - else - M.cache[modkey] = nil - end - return chunk, err -end - --- index the top-level lua modules for this path -function M._index(path) - if not M.indexed[path] and path:sub(-6, -1) ~= "/after" then - M.stats.find.index = M.stats.find.index + 1 - ---@type LazyUtilCore - local Util = package.loaded["lazy.core.util"] - if not Util then - return false - end - M.indexed[path] = {} - Util.ls(path .. "/lua", function(_, name, t) + -- HACK: type is not always returned due to a bug in luv + t = t or vim.loop.fs_stat(path .. "/" .. name).type + ---@type string local topname if name:sub(-4) == ".lua" then topname = name:sub(1, -5) @@ -242,283 +266,41 @@ function M._index(path) topname = name end if topname then - M.topmods[topname] = M.topmods[topname] or {} - if not vim.tbl_contains(M.topmods[topname], path) then - table.insert(M.topmods[topname], path) - end - if not vim.tbl_contains(M.indexed[path], topname) then - table.insert(M.indexed[path], topname) - end - end - end) - return true - end - return false -end - -function M.get_topmods(path) - M._index(path) - return M.indexed[path] or {} -end - ----@param modname string ----@return string? -function M.find_root(modname) - if M.cache[modname] then - -- check if modname is in cache - local modpath = M.cache[modname].modpath - if M.check_path(modname, modpath) and uv.fs_stat(modpath) then - local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - return root - end - else - -- in case modname is just a directory and not a real mod, - -- check for any children in the cache - for child, entry in pairs(M.cache) do - if child:find(modname, 1, true) == 1 then - if M.check_path(child, entry.modpath) and uv.fs_stat(entry.modpath) then - local basename = modname:gsub("%.", "/") - local childbase = child:gsub("%.", "/") - local ret = entry.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - local idx = assert(ret:find(childbase, 1, true)) - return ret:sub(1, idx - 1) .. basename - end + Cache._topmods[path][topname] = true end end end - - -- not found in cache, so find the root with the special pattern - local modpath = M.find(modname, { patterns = { "" } }) - if modpath then - local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - return root - end + return Cache._topmods[path] end ---@param modname string ----@param opts? {patterns?:string[]} ----@return string? +---@param opts? CacheFindOpts +---@return string? modpath function M.find(modname, opts) - opts = opts or {} - - M.stats.find.total = M.stats.find.total + 1 - local start = uv.hrtime() - local basename = modname:gsub("%.", "/") - local idx = modname:find(".", 1, true) - local topmod = idx and modname:sub(1, idx - 1) or modname - - -- search for a directory first when topmod == modname - local patterns = topmod == modname and { "/init.lua", ".lua" } or { ".lua", "/init.lua" } - - if opts.patterns then - vim.list_extend(patterns, opts.patterns) - end - - -- check top-level mods to find the module - local function _find() - for _, toppath in ipairs(M.topmods[topmod] or {}) do - for _, pattern in ipairs(patterns) do - local path = toppath .. "/lua/" .. basename .. pattern - M.stats.find.stat = M.stats.find.stat + 1 - if uv.fs_stat(path) then - return path - end - end - end - end - - local modpath = _find() - if not modpath then - -- update rtp - local rtp = M.list_rtp() - if #rtp ~= M.indexed_rtp then - M.indexed_rtp = #rtp - local updated = false - for _, path in ipairs(rtp) do - updated = M._index(path) or updated - end - if updated then - modpath = _find() - end - end - - -- update unloaded - if not modpath and not M.indexed_unloaded then - M.indexed_unloaded = true - local updated = false - ---@type LazyCoreConfig - local Config = package.loaded["lazy.core.config"] - if Config and Config.spec then - for _, plugin in pairs(Config.spec.plugins) do - if not (M.indexed[plugin.dir] or plugin._.loaded or plugin.module == false) then - updated = M._index(plugin.dir) or updated - end - end - end - if updated then - modpath = _find() - end - end - - -- module not found - if not modpath then - M.stats.find.not_found = M.stats.find.not_found + 1 - end - end - - M.stats.find.time = M.stats.find.time + uv.hrtime() - start + local modpath = Cache.find(modname, opts) return modpath end --- returns the cached RTP excluding plugin dirs -function M.get_rtp() - local rtp = M.list_rtp() - if not M.rtp or #rtp ~= M.rtp_total then - M.rtp_total = #rtp - M.rtp = {} - ---@type table<string,true> - local skip = {} - -- only skip plugins once Config has been setup - ---@type LazyCoreConfig - local Config = package.loaded["lazy.core.config"] - if Config then - for _, plugin in pairs(Config.plugins) do - if plugin.name ~= "lazy.nvim" then - skip[plugin.dir] = true - end - end - end - for _, path in ipairs(rtp) do - ---@type string - path = path:gsub("\\", "/") - if not skip[path] and not path:find("after/?$") then - M.rtp[#M.rtp + 1] = path - end - end +function M.inspect() + local function ms(nsec) + return math.floor(nsec / 1e6 * 1000 + 0.5) / 1000 .. "ms" end - return M.rtp -end - -function M.list_rtp() - return vim.api.nvim_get_runtime_file("", true) -end - ----@param opts? LazyConfig -function M.setup(opts) - -- no fancy deep extend here. just set the options - if opts and opts.performance and opts.performance.cache then - ---@diagnostic disable-next-line: no-unknown - for k, v in pairs(opts.performance.cache) do - ---@diagnostic disable-next-line: no-unknown - M.config[k] = v - end + local props = { + { "total", M.stats.total, "Number" }, + { "time", ms(M.stats.time), "Bold" }, + { "avg time", ms(M.stats.time / M.stats.total), "Bold" }, + { "index", M.stats.index, "Number" }, + { "fs_stat", M.stats.stat, "Number" }, + { "not found", M.stats.not_found, "Number" }, + } + local chunks = {} ---@type string[][] + for _, prop in ipairs(props) do + chunks[#chunks + 1] = { "* " .. prop[1] .. ": " } + chunks[#chunks + 1] = { tostring(prop[2]) .. "\n", prop[3] } end - M.debug = opts and opts.debug - M.enabled = M.config.enabled - - if M.enabled then - table.insert(package.loaders, 2, M.loader) - M.load_cache() - -- selene:allow(global_usage) - _G.loadfile = M.loadfile - if #M.config.disable_events > 0 then - vim.api.nvim_create_autocmd(M.config.disable_events, { once = true, callback = M.disable }) - end - else - -- we need to always add the loader since this will autoload unloaded modules - table.insert(package.loaders, M.loader) - end - - return M + vim.api.nvim_echo(chunks, true, {}) end ----@return CacheHash? -function M.hash(file) - local ok, ret = pcall(uv.fs_stat, file) - return ok and ret or nil -end - ----@param h1 CacheHash ----@param h2 CacheHash -function M.eq(h1, h2) - return h1 and h2 and h1.size == h2.size and h1.mtime.sec == h2.mtime.sec and h1.mtime.nsec == h2.mtime.nsec -end - -function M.save_cache() - vim.fn.mkdir(vim.fn.fnamemodify(M.config.path, ":p:h"), "p") - local f = assert(uv.fs_open(M.config.path, "w", 438)) - uv.fs_write(f, M.VERSION) - uv.fs_write(f, "\0") - for modname, entry in pairs(M.cache) do - if entry.used > os.time() - M.config.ttl then - entry.modname = modname - local header = { - entry.hash.size, - entry.hash.mtime.sec, - entry.hash.mtime.nsec, - #modname, - #entry.chunk, - #entry.modpath, - entry.used, - } - uv.fs_write(f, ffi.string(ffi.new("const uint32_t[7]", header), 28)) - uv.fs_write(f, modname) - uv.fs_write(f, entry.chunk) - uv.fs_write(f, entry.modpath) - end - end - uv.fs_close(f) -end - -function M.load_cache() - M.cache = {} - local f = uv.fs_open(M.config.path, "r", 438) - if f then - cache_hash = uv.fs_fstat(f) --[[@as CacheHash]] - local data = uv.fs_read(f, cache_hash.size, 0) --[[@as string]] - uv.fs_close(f) - - local zero = data:find("\0", 1, true) - if not zero then - return - end - - if M.VERSION ~= data:sub(1, zero - 1) then - return - end - - local offset = zero + 1 - while offset + 1 < #data do - local header = ffi.cast("uint32_t*", ffi.new("const char[28]", data:sub(offset, offset + 27))) - offset = offset + 28 - local modname = data:sub(offset, offset + header[3] - 1) - offset = offset + header[3] - local chunk = data:sub(offset, offset + header[4] - 1) - offset = offset + header[4] - local file = data:sub(offset, offset + header[5] - 1) - offset = offset + header[5] - M.cache[modname] = { - hash = { size = header[0], mtime = { sec = header[1], nsec = header[2] } }, - chunk = chunk, - modpath = file, - used = header[6], - } - end - end -end - -function M.autosave() - vim.api.nvim_create_autocmd("VimLeavePre", { - callback = function() - if M.dirty then - local hash = M.hash(M.config.path) - -- abort when the file was changed in the meantime - if hash == nil or M.eq(cache_hash, hash) then - M.save_cache() - end - end - end, - }) -end +M._Cache = Cache return M diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c1a236f..bc8257b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -113,8 +113,9 @@ M.defaults = { notify = true, -- get a notification when changes are found }, performance = { - ---@type LazyCacheConfig - cache = nil, + 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 @@ -226,7 +227,6 @@ function M.setup(opts) pattern = "VeryLazy", once = true, callback = function() - require("lazy.core.cache").autosave() require("lazy.view.commands").setup() if M.options.change_detection.enabled then require("lazy.manage.reloader").enable() diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index e826654..0f1b977 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -72,7 +72,7 @@ function M.install_missing() -- remove and installed plugins from indexed, so cache will index again for _, p in pairs(Config.plugins) do if p._.installed then - Cache.indexed[p.dir] = nil + Cache.reset(p.dir) end end -- reload plugins @@ -341,7 +341,7 @@ function M.get_main(plugin) local normname = Util.normname(plugin.name) ---@type string[] local mods = {} - for _, modname in ipairs(Cache.get_topmods(plugin.dir)) do + for modname, _ in pairs(Cache.lsmod(plugin.dir)) do mods[#mods + 1] = modname local modnorm = Util.normname(modname) -- if we found an exact match, then use that @@ -450,4 +450,28 @@ function M.colorscheme(name) end end +---@param modname string +function M.loader(modname) + local modpath = Cache.find(modname, { rtp = false, paths = Util.get_unloaded_rtp(modname) }) + if modpath then + local plugin = Plugin.find(modpath) + if plugin and modpath:find(plugin.dir, 1, true) == 1 then + -- don't load if we're loading specs or if the plugin is already loaded + if not (Plugin.loading or plugin._.loaded) then + if plugin.module == false then + error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") + end + M.load(plugin, { require = modname }) + end + local mod = package.loaded[modname] + if type(mod) == "table" then + return function() + return mod + end + end + return loadfile(modpath) + end + end +end + return M diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index fd2cce4..42325dd 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -217,11 +217,46 @@ function M.walkmods(root, fn, modname) end) end +---@param modname string +function M.get_unloaded_rtp(modname) + modname = modname:gsub("/", ".") + local idx = modname:find(".", 1, true) + local topmod = idx and modname:sub(1, idx - 1) or modname + topmod = M.normname(topmod) + + local rtp = {} + 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 topmod == M.normname(plugin.name) then + table.insert(rtp, 1, plugin.dir) + else + table.insert(rtp, plugin.dir) + end + end + end + end + return rtp +end + +function M.find_root(modname) + local Cache = require("lazy.core.cache") + local modpath = Cache.find(modname, { + rtp = true, + paths = M.get_unloaded_rtp(modname), + patterns = { "", ".lua" }, + }) + if modpath then + local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") + return root + end +end + ---@param modname string ---@param fn fun(modname:string, modpath:string) function M.lsmod(modname, fn) - local Cache = require("lazy.core.cache") - local root = Cache.find_root(modname) + local root = M.find_root(modname) if not root then return end diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index da3a166..bf42e98 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -131,12 +131,7 @@ function M.colors() end function M.update() - local cache_config = M.extract("lua/lazy/core/cache.lua", "\nM%.config = ({.-\n})") local config = M.extract("lua/lazy/core/config.lua", "\nM%.defaults = ({.-\n})") - config = config:gsub( - "\n%s*%-%-%-@type LazyCacheConfig.*cache = nil,", - "\n" .. M.indent("cache = " .. cache_config .. ",", 4) - ) config = config:gsub("%s*debug = false.\n", "\n") M.save({ bootstrap = M.extract("lua/lazy/init.lua", "function M%.bootstrap%(%)\n(.-)\nend"), diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index a0b073a..e81c4ec 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -34,13 +34,16 @@ function M.setup(spec, opts) local start = vim.loop.hrtime() -- load module cache before anything else - require("lazy.core.cache").setup(opts) + if not (opts and opts.performance and opts.performance.cache and opts.performance.cache.enabled == false) then + require("lazy.core.cache").enable() + end require("lazy.stats").track("LazyStart") local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") + table.insert(package.loaders, 3, Loader.loader) Util.track({ plugin = "lazy.nvim" }) -- setup start Util.track("module", vim.loop.hrtime() - start) diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index 7d30d3d..b6e1f1e 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -1,4 +1,3 @@ -local Cache = require("lazy.core.cache") local Config = require("lazy.core.config") local Util = require("lazy.util") local Plugin = require("lazy.core.plugin") @@ -6,12 +5,11 @@ local Loader = require("lazy.core.loader") local M = {} ----@type table<string, CacheHash> +---@type table<string, vim.loop.Stat> M.files = {} ---@type vim.loop.Timer M.timer = nil -M.root = nil function M.enable() if M.timer then @@ -19,7 +17,6 @@ function M.enable() end if #Config.spec.modules > 0 then M.timer = vim.loop.new_timer() - M.root = vim.fn.stdpath("config") .. "/lua" M.check(true) M.timer:start(2000, 2000, M.check) end @@ -32,6 +29,12 @@ function M.disable() end end +---@param h1 vim.loop.Stat +---@param h2 vim.loop.Stat +function M.eq(h1, h2) + return h1 and h2 and h1.size == h2.size and h1.mtime.sec == h2.mtime.sec and h1.mtime.nsec == h2.mtime.nsec +end + function M.check(start) ---@type table<string,true> local checked = {} @@ -41,10 +44,10 @@ function M.check(start) -- spec is a module local function check(_, modpath) checked[modpath] = true - local hash = Cache.hash(modpath) + local hash = vim.loop.fs_stat(modpath) if hash then if M.files[modpath] then - if not Cache.eq(M.files[modpath], hash) then + if not M.eq(M.files[modpath], hash) then M.files[modpath] = hash table.insert(changes, { file = modpath, what = "changed" }) end diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index e4f4529..6f6f857 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -672,33 +672,14 @@ function M:debug() self:append("Cache.find()", "LazyH2"):nl() self:props({ - { "total", Cache.stats.find.total, "Number" }, - { "time", self:ms(Cache.stats.find.time, 3), "Bold" }, - { "avg time", self:ms(Cache.stats.find.time / Cache.stats.find.total, 3), "Bold" }, - { "index", Cache.stats.find.index, "Number" }, - { "fs_stat", Cache.stats.find.stat, "Number" }, - { "not found", Cache.stats.find.not_found, "Number" }, + { "total", Cache.stats.total, "Number" }, + { "time", self:ms(Cache.stats.time, 3), "Bold" }, + { "avg time", self:ms(Cache.stats.time / Cache.stats.total, 3), "Bold" }, + { "index", Cache.stats.index, "Number" }, + { "fs_stat", Cache.stats.stat, "Number" }, + { "not found", Cache.stats.not_found, "Number" }, }, { indent = 2 }) self:nl() - - self:append("Cache.autoload()", "LazyH2"):nl() - self:props({ - { "total", Cache.stats.autoload.total, "Number" }, - { "time", self:ms(Cache.stats.autoload.time, 3), "Bold" }, - { "avg time", self:ms(Cache.stats.autoload.time / Cache.stats.autoload.total, 3), "Bold" }, - }, { indent = 2 }) - self:nl() - - self:append("Cache", "LazyH2"):nl() - local Cache = require("lazy.core.cache") - Util.foreach(Cache.cache, function(modname, entry) - local kb = math.floor(#entry.chunk / 10.24) / 100 - self:append("● ", "LazySpecial", { indent = 2 }):append(modname):append(" " .. kb .. "Kb", "Bold") - if entry.modpath ~= modname then - self:append(" " .. vim.fn.fnamemodify(entry.modpath, ":p:~:."), "LazyComment") - end - self:nl() - end) end return M diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index 87102d3..86b9f06 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -51,10 +51,8 @@ describe("util", function() local files = Helpers.fs_create(test.files) -- test with empty cache - Cache.cache = {} - Cache.indexed = {} - Cache.indexed_rtp = false - local root = Cache.find_root(test.mod) + package.loaded["lazy.core.cache"] = nil + local root = Util.find_root(test.mod) assert(root, "no root found for " .. test.mod .. " (test " .. t .. ")") assert.same(Helpers.path(test.root), root) local mods = {} @@ -65,13 +63,8 @@ describe("util", function() assert.same(expected, mods) -- fill the cache - Cache.cache = {} - for i, file in ipairs(files) do - Cache.cache[test.mods[i]] = { modpath = file } - end - Cache.indexed = {} - Cache.indexed_rtp = false - root = Cache.find_root(test.mod) + package.loaded["lazy.core.cache"] = nil + root = Util.find_root(test.mod) assert(root, "no root found for " .. test.mod .. " (test " .. t .. ")") assert.same(Helpers.path(test.root), root) mods = {} @@ -85,12 +78,12 @@ describe("util", function() it("find the correct root with dels", function() Cache.cache = {} - Cache.indexed = {} - Cache.indexed_rtp = false + Cache._topmods = {} + Cache.topmods_rtp = false vim.opt.rtp:append(Helpers.path("old")) Helpers.fs_create({ "old/lua/foobar/init.lua" }) Cache.cache["foobar"] = { modpath = Helpers.path("old/lua/foobar/init.lua") } - local root = Cache.find_root("foobar") + local root = Util.find_root("foobar") assert(root, "foobar root not found") assert.same(Helpers.path("old/lua/foobar"), root) @@ -98,24 +91,22 @@ describe("util", function() assert(not vim.loop.fs_stat(Helpers.path("old/lua/foobar")), "old/lua/foobar should not exist") -- vim.opt.rtp = rtp - Cache.indexed = {} - Cache.indexed_rtp = false + Cache._topmods = {} vim.opt.rtp:append(Helpers.path("new")) Helpers.fs_create({ "new/lua/foobar/init.lua" }) - root = Cache.find_root("foobar") + root = Util.find_root("foobar") assert(root, "foobar root not found") assert.same(Helpers.path("new/lua/foobar"), root) end) it("find the correct root with mod dels", function() Cache.cache = {} - Cache.indexed = {} - Cache.indexed_rtp = false + Cache._topmods = {} Cache.enabled = true vim.opt.rtp:append(Helpers.path("old")) Helpers.fs_create({ "old/lua/foobar/test.lua" }) Cache.cache["foobar.test"] = { modpath = Helpers.path("old/lua/foobar/test.lua") } - local root = Cache.find_root("foobar") + local root = Util.find_root("foobar") assert(root, "foobar root not found") assert.same(Helpers.path("old/lua/foobar"), root) assert(not Cache.cache["foobar"], "foobar should not be in cache") @@ -124,11 +115,10 @@ describe("util", function() Helpers.fs_rm("old") -- vim.opt.rtp = rtp - Cache.indexed = {} - Cache.indexed_rtp = false + Cache._topmods = {} vim.opt.rtp:append(Helpers.path("new")) Helpers.fs_create({ "new/lua/foobar/test.lua" }) - root = Cache.find_root("foobar") + root = Util.find_root("foobar") assert(root, "foobar root not found") assert.same(Helpers.path("new/lua/foobar"), root) end) From 27fdb9b468e8c757dd02444738ae9bc2f3ec655e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 11:02:38 +0000 Subject: [PATCH 0784/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ce6590e..d54890f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 12 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 13 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -392,7 +392,7 @@ CONFIGURATION *lazy.nvim-configuration* init = " ", import = " ", keys = " ", - lazy = " ", + lazy = "󰒲 ", loaded = "", not_loaded = "", plugin = " ", @@ -454,14 +454,6 @@ CONFIGURATION *lazy.nvim-configuration* performance = { cache = { enabled = true, - path = vim.fn.stdpath("cache") .. "/lazy/cache", - -- Once one of the following events triggers, caching will be disabled. - -- To cache all modules, set this to `{}`, but that is not recommended. - -- The default is to disable on: - -- VimEnter: not useful to cache anything else beyond startup - -- BufReadPre: this will be triggered early when opening a file from the command line directly - disable_events = { "UIEnter", "BufReadPre" }, - ttl = 3600 24 5, -- keep unused modules for up to 5 days }, reset_packpath = true, -- reset the package path to improve startup time rtp = { From c778b7aa04c484e1536ba219e71f2fd0f05302aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 12:07:52 +0100 Subject: [PATCH 0785/1610] chore(main): release 9.8.0 (#520) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 20 ++++++++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2ed41b..a8d9d82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## [9.8.0](https://github.com/folke/lazy.nvim/compare/v9.7.0...v9.8.0) (2023-02-13) + + +### Features + +* **git:** `Plugin.submodules = false` will now skip fetching git submodules ([0d3f2c4](https://github.com/folke/lazy.nvim/commit/0d3f2c40421f4774c70f631d7b7023f57cba66cd)) + + +### Bug Fixes + +* **cmd:** fix Error when trigger on range defined command that doesn't support count ([#519](https://github.com/folke/lazy.nvim/issues/519)) ([a147110](https://github.com/folke/lazy.nvim/commit/a1471103902a9836d88732eeeeabd11d00a2cb3e)) +* **icons:** replace an obsolete Nerd icon ([#529](https://github.com/folke/lazy.nvim/issues/529)) ([bc978ca](https://github.com/folke/lazy.nvim/commit/bc978ca9be96b75330336a0427771addaa1ccd50)) +* **loader:** don't deactivate when not loaded ([c83d2ae](https://github.com/folke/lazy.nvim/commit/c83d2aeb27fce9cf9f14e779e77a85c63fc3d2c9)) +* **util:** executable checks for `Util.open` ([#528](https://github.com/folke/lazy.nvim/issues/528)) ([4917222](https://github.com/folke/lazy.nvim/commit/4917222c7e5c924bf7471b72a5e2d3e661530b40)) + + +### Performance Improvements + +* new file-based cache that ensures correct rtp order ([#532](https://github.com/folke/lazy.nvim/issues/532)) ([462633b](https://github.com/folke/lazy.nvim/commit/462633bae11255133f099163dda17180b3a6dc27)) + ## [9.7.0](https://github.com/folke/lazy.nvim/compare/v9.6.0...v9.7.0) (2023-02-08) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index bc8257b..14be512 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.7.0" -- x-release-please-version +M.version = "9.8.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From b1f7ae68a75401152eb23edbd5827b69761e9bc7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 13 Feb 2023 17:22:00 +0100 Subject: [PATCH 0786/1610] perf: use modkey instead of modpath --- lua/lazy/core/cache.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 89d5a4a..0101ba0 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -113,8 +113,10 @@ end function Cache.loader(modname) modname = modname:gsub("/", ".") local modpath, hash = Cache.find(modname) + local modpath, hash + modpath, hash = Cache.find(modname) if modpath then - return Cache.load(modpath, { hash = hash }) + return Cache.load(modname, modpath, { hash = hash }) end return "module " .. modname .. " not found" end @@ -126,7 +128,7 @@ end ---@private function Cache.loadfile(filename, mode, env) filename = Cache.normalize(filename) - return Cache.load(filename, { mode = mode, env = env }) + return Cache.load(filename, filename, { mode = mode, env = env }) end ---@param h1 CacheHash @@ -137,10 +139,10 @@ function Cache.eq(h1, h2) end ---@param modpath string ----@param opts? {hash?: CacheHash, mode?: "b"|"t"|"bt", env?:table} +---@param opts? {hash?: CacheHash, mode?: "b"|"t"|"bt", env?:table, entry?: CacheEntry} ---@return function?, string? error_message ---@private -function Cache.load(modpath, opts) +function Cache.load(modkey, modpath, opts) opts = opts or {} local hash = opts.hash or uv.fs_stat(modpath) if not hash then @@ -150,10 +152,10 @@ function Cache.load(modpath, opts) ---@type function?, string? local chunk, err - local entry = Cache.read(modpath) + local entry = opts.entry or Cache.read(modkey) if entry and Cache.eq(entry.hash, hash) then -- found in cache and up to date - chunk, err = loadstring(entry.chunk --[[@as string]], "@" .. entry.modpath) + chunk, err = load(entry.chunk --[[@as string]], "@" .. entry.modpath) if not (err and err:find("cannot load incompatible bytecode", 1, true)) then return chunk, err end @@ -163,7 +165,7 @@ function Cache.load(modpath, opts) chunk, err = Cache._loadfile(entry.modpath) if chunk then entry.chunk = string.dump(chunk) - Cache.write(modpath, entry) + Cache.write(modkey, entry) end return chunk, err end From 6351a2e8f32ff32652d13491de3aa21203d2a893 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 13 Feb 2023 17:24:15 +0100 Subject: [PATCH 0787/1610] refactor: Cache.stats -> Cache.stats.find --- lua/lazy/core/cache.lua | 26 +++++++++++++------------- lua/lazy/view/render.lua | 12 ++++++------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 0101ba0..adf1bfc 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -14,7 +14,7 @@ local M = {} M.VERSION = 1 M.path = vim.fn.stdpath("cache") .. "/lazy/luac" M.enabled = false -M.stats = { total = 0, time = 0, index = 0, stat = 0, not_found = 0 } +M.stats = { find = { total = 0, time = 0, index = 0, stat = 0, not_found = 0 } } ---@class ModuleCache ---@field _rtp string[] @@ -176,7 +176,7 @@ end function Cache.find(modname, opts) opts = opts or {} local start = uv.hrtime() - M.stats.total = M.stats.total + 1 + M.stats.find.total = M.stats.find.total + 1 modname = modname:gsub("/", ".") local basename = modname:gsub("%.", "/") local idx = modname:find(".", 1, true) @@ -199,10 +199,10 @@ function Cache.find(modname, opts) if M.lsmod(path)[topmod] then for _, pattern in ipairs(patterns) do local modpath = path .. pattern - M.stats.stat = M.stats.stat + 1 + M.stats.find.stat = M.stats.find.stat + 1 local hash = uv.fs_stat(modpath) if hash then - M.stats.time = M.stats.time + uv.hrtime() - start + M.stats.find.time = M.stats.find.time + uv.hrtime() - start return modpath, hash end end @@ -210,8 +210,8 @@ function Cache.find(modname, opts) end -- module not found - M.stats.not_found = M.stats.not_found + 1 - M.stats.time = M.stats.time + uv.hrtime() - start + M.stats.find.not_found = M.stats.find.not_found + 1 + M.stats.find.time = M.stats.find.time + uv.hrtime() - start end --- Resets the topmods cache for the path @@ -250,7 +250,7 @@ end ---@return string[] function M.lsmod(path) if not Cache._topmods[path] then - M.stats.index = M.stats.index + 1 + M.stats.find.index = M.stats.find.index + 1 Cache._topmods[path] = {} local handle = vim.loop.fs_scandir(path .. "/lua") while handle do @@ -288,12 +288,12 @@ function M.inspect() return math.floor(nsec / 1e6 * 1000 + 0.5) / 1000 .. "ms" end local props = { - { "total", M.stats.total, "Number" }, - { "time", ms(M.stats.time), "Bold" }, - { "avg time", ms(M.stats.time / M.stats.total), "Bold" }, - { "index", M.stats.index, "Number" }, - { "fs_stat", M.stats.stat, "Number" }, - { "not found", M.stats.not_found, "Number" }, + { "total", M.stats.find.total, "Number" }, + { "time", ms(M.stats.find.time), "Bold" }, + { "avg time", ms(M.stats.find.time / M.stats.find.total), "Bold" }, + { "index", M.stats.find.index, "Number" }, + { "fs_stat", M.stats.find.stat, "Number" }, + { "not found", M.stats.find.not_found, "Number" }, } local chunks = {} ---@type string[][] for _, prop in ipairs(props) do diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 6f6f857..ec5570e 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -672,12 +672,12 @@ function M:debug() self:append("Cache.find()", "LazyH2"):nl() self:props({ - { "total", Cache.stats.total, "Number" }, - { "time", self:ms(Cache.stats.time, 3), "Bold" }, - { "avg time", self:ms(Cache.stats.time / Cache.stats.total, 3), "Bold" }, - { "index", Cache.stats.index, "Number" }, - { "fs_stat", Cache.stats.stat, "Number" }, - { "not found", Cache.stats.not_found, "Number" }, + { "total", Cache.stats.find.total, "Number" }, + { "time", self:ms(Cache.stats.find.time, 3), "Bold" }, + { "avg time", self:ms(Cache.stats.find.time / Cache.stats.find.total, 3), "Bold" }, + { "index", Cache.stats.find.index, "Number" }, + { "fs_stat", Cache.stats.find.stat, "Number" }, + { "not found", Cache.stats.find.not_found, "Number" }, }, { indent = 2 }) self:nl() end From 17a3c3acea400679027e675cc19b738e842a5ea0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Feb 2023 11:00:56 +0100 Subject: [PATCH 0788/1610] perf: more cache optims --- .neoconf.json | 2 +- lua/lazy/core/cache.lua | 241 +++++++++++++++++++++++++++------------ lua/lazy/core/loader.lua | 41 ++++--- lua/lazy/init.lua | 13 ++- lua/lazy/view/render.lua | 25 ++-- 5 files changed, 224 insertions(+), 98 deletions(-) diff --git a/.neoconf.json b/.neoconf.json index 67828bb..f0c23f8 100644 --- a/.neoconf.json +++ b/.neoconf.json @@ -7,7 +7,7 @@ } }, "lspconfig": { - "sumneko_lua": { + "lua_ls": { "Lua.runtime.version": "LuaJIT", "Lua.workspace.checkThirdParty": false } diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index adf1bfc..3b3d824 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -4,33 +4,44 @@ local uv = vim.loop local M = {} ---@alias CacheHash {mtime: {sec:number, nsec:number}, size:number} ----@alias CacheEntry {hash:CacheHash, modpath:string, chunk:string} +---@alias CacheEntry {hash:CacheHash, chunk:string} ---@class CacheFindOpts ---@field rtp? boolean Search for modname in the runtime path (defaults to `true`) ---@field patterns? string[] Paterns to use (defaults to `{"/init.lua", ".lua"}`) ---@field paths? string[] Extra paths to search for modname -M.VERSION = 1 +M.VERSION = 2 M.path = vim.fn.stdpath("cache") .. "/lazy/luac" M.enabled = false -M.stats = { find = { total = 0, time = 0, index = 0, stat = 0, not_found = 0 } } +M.stats = { + find = { total = 0, time = 0, not_found = 0 }, +} ---@class ModuleCache ---@field _rtp string[] +---@field _rtp_pure string[] ---@field _rtp_key string local Cache = { ---@type table<string, table<string,true>> + _indexed = {}, + ---@type table<string, string[]> _topmods = {}, _loadfile = loadfile, } +function M.track(stat, start) + M.stats[stat] = M.stats[stat] or { total = 0, time = 0 } + M.stats[stat].total = M.stats[stat].total + 1 + M.stats[stat].time = M.stats[stat].time + uv.hrtime() - start +end + -- slightly faster/different version than vim.fs.normalize -- we also need to have it here, since the cache will load vim.fs ---@private function Cache.normalize(path) if path:sub(1, 1) == "~" then - local home = vim.loop.os_homedir() + local home = vim.loop.os_homedir() or "~" if home:sub(-1) == "\\" or home:sub(-1) == "/" then home = home:sub(1, -2) end @@ -42,28 +53,34 @@ end ---@private function Cache.get_rtp() + local start = uv.hrtime() if vim.in_fast_event() then - return Cache._rtp or {} + M.track("get_rtp", start) + return (Cache._rtp or {}), false end + local updated = false local key = vim.go.rtp if key ~= Cache._rtp_key then Cache._rtp = {} for _, path in ipairs(vim.api.nvim_get_runtime_file("", true)) do path = Cache.normalize(path) -- skip after directories - if path:sub(-6, -1) ~= "/after" then + if path:sub(-6, -1) ~= "/after" and not (Cache._indexed[path] and vim.tbl_isempty(Cache._indexed[path])) then Cache._rtp[#Cache._rtp + 1] = path end end + updated = true Cache._rtp_key = key end - return Cache._rtp + M.track("get_rtp", start) + return Cache._rtp, updated end ---@param name string can be a module name, or a file name ---@private function Cache.cache_file(name) - return M.path .. "/" .. name:gsub("[/\\:]", "%%") .. "c" + local ret = M.path .. "/" .. name:gsub("[/\\:]", "%%") + return ret:sub(-4) == ".lua" and (ret .. "c") or (ret .. ".luac") end ---@param entry CacheEntry @@ -76,10 +93,8 @@ function Cache.write(name, entry) entry.hash.size, entry.hash.mtime.sec, entry.hash.mtime.nsec, - #entry.modpath, } - uv.fs_write(f, ffi.string(ffi.new("const uint32_t[5]", header), 20)) - uv.fs_write(f, entry.modpath) + uv.fs_write(f, ffi.string(ffi.new("const uint32_t[4]", header), 16)) uv.fs_write(f, entry.chunk) uv.fs_close(f) end @@ -87,6 +102,7 @@ end ---@return CacheEntry? ---@private function Cache.read(name) + local start = uv.hrtime() local cname = Cache.cache_file(name) local f = uv.fs_open(cname, "r", 438) if f then @@ -95,29 +111,52 @@ function Cache.read(name) uv.fs_close(f) ---@type integer[]|{[0]:integer} - local header = ffi.cast("uint32_t*", ffi.new("const char[20]", data:sub(1, 20))) + local header = ffi.cast("uint32_t*", ffi.new("const char[16]", data:sub(1, 16))) if header[0] ~= M.VERSION then return end - local modpath = data:sub(21, 20 + header[4]) + M.track("read", start) return { hash = { size = header[1], mtime = { sec = header[2], nsec = header[3] } }, - chunk = data:sub(20 + header[4] + 1), - modpath = modpath, + chunk = data:sub(16 + 1), } end + M.track("read", start) end ---@param modname string ---@private function Cache.loader(modname) - modname = modname:gsub("/", ".") + local start = uv.hrtime() local modpath, hash = Cache.find(modname) - local modpath, hash - modpath, hash = Cache.find(modname) + ---@type function?, string? + local chunk, err if modpath then - return Cache.load(modname, modpath, { hash = hash }) + chunk, err = M.load(modpath, { hash = hash }) end + M.track("loader", start) + return chunk or err or "module " .. modname .. " not found" +end + +---@param modname string +---@private +function Cache.loader_lib(modname) + local start = uv.hrtime() + local modpath = Cache.find(modname, { patterns = jit.os:find("Windows") and { ".dll" } or { ".so" } }) + ---@type function?, string? + if modpath then + -- Making function name in Lua 5.1 (see src/loadlib.c:mkfuncname) is + -- a) strip prefix up to and including the first dash, if any + -- b) replace all dots by underscores + -- c) prepend "luaopen_" + -- So "foo-bar.baz" should result in "luaopen_bar_baz" + local dash = modname:find("-", 1, true) + local funcname = dash and modname:sub(dash + 1) or modname + local chunk, err = package.loadlib(modpath, "luaopen_" .. funcname:gsub("%.", "_")) + M.track("loader_lib", start) + return chunk or err + end + M.track("loader_lib", start) return "module " .. modname .. " not found" end @@ -127,8 +166,11 @@ end ---@return function?, string? error_message ---@private function Cache.loadfile(filename, mode, env) + local start = uv.hrtime() filename = Cache.normalize(filename) - return Cache.load(filename, filename, { mode = mode, env = env }) + local chunk, err = M.load(filename, { mode = mode, env = env }) + M.track("loadfile", start) + return chunk, err end ---@param h1 CacheHash @@ -139,44 +181,52 @@ function Cache.eq(h1, h2) end ---@param modpath string ----@param opts? {hash?: CacheHash, mode?: "b"|"t"|"bt", env?:table, entry?: CacheEntry} +---@param opts? {hash?: CacheHash, mode?: "b"|"t"|"bt", env?:table} ---@return function?, string? error_message ---@private -function Cache.load(modkey, modpath, opts) +function M.load(modpath, opts) + local start = uv.hrtime() + opts = opts or {} local hash = opts.hash or uv.fs_stat(modpath) - if not hash then - -- trigger correct error - return Cache._loadfile(modpath) - end - ---@type function?, string? local chunk, err - local entry = opts.entry or Cache.read(modkey) + + if not hash then + -- trigger correct error + chunk, err = Cache._loadfile(modpath, opts.mode, opts.env) + M.track("load", start) + return chunk, err + end + + local entry = Cache.read(modpath) if entry and Cache.eq(entry.hash, hash) then -- found in cache and up to date - chunk, err = load(entry.chunk --[[@as string]], "@" .. entry.modpath) + -- selene: allow(incorrect_standard_library_use) + chunk, err = load(entry.chunk --[[@as string]], "@" .. modpath, opts.mode, opts.env) if not (err and err:find("cannot load incompatible bytecode", 1, true)) then + M.track("load", start) return chunk, err end end entry = { hash = hash, modpath = modpath } - chunk, err = Cache._loadfile(entry.modpath) + chunk, err = Cache._loadfile(modpath, opts.mode, opts.env) if chunk then entry.chunk = string.dump(chunk) - Cache.write(modkey, entry) + Cache.write(modpath, entry) end + M.track("load", start) return chunk, err end ---@param modname string ---@param opts? CacheFindOpts ----@return string? modpath, CacheHash? hash +---@return string? modpath, CacheHash? hash, CacheEntry? entry function Cache.find(modname, opts) - opts = opts or {} local start = uv.hrtime() - M.stats.find.total = M.stats.find.total + 1 + opts = opts or {} + modname = modname:gsub("/", ".") local basename = modname:gsub("%.", "/") local idx = modname:find(".", 1, true) @@ -184,40 +234,54 @@ function Cache.find(modname, opts) -- OPTIM: search for a directory first when topmod == modname local patterns = opts.patterns or (topmod == modname and { "/init.lua", ".lua" } or { ".lua", "/init.lua" }) - local rtp = opts.rtp ~= false and Cache.get_rtp() or {} - if opts.paths then - rtp = vim.deepcopy(rtp) - for _, dir in ipairs(opts.paths) do - rtp[#rtp + 1] = Cache.normalize(dir) - end - end for p, pattern in ipairs(patterns) do patterns[p] = "/lua/" .. basename .. pattern end - for _, path in ipairs(rtp) do - if M.lsmod(path)[topmod] then - for _, pattern in ipairs(patterns) do - local modpath = path .. pattern - M.stats.find.stat = M.stats.find.stat + 1 - local hash = uv.fs_stat(modpath) - if hash then - M.stats.find.time = M.stats.find.time + uv.hrtime() - start - return modpath, hash + ---@param paths string[] + local function _find(paths) + for _, path in ipairs(paths) do + if M.lsmod(path)[topmod] then + for _, pattern in ipairs(patterns) do + local modpath = path .. pattern + M.stats.find.stat = (M.stats.find.stat or 0) + 1 + local hash = uv.fs_stat(modpath) + if hash then + return modpath, hash + end end end end end + ---@type string, CacheHash + local modpath, hash + + if opts.rtp ~= false then + modpath, hash = _find(Cache._rtp or {}) + if not modpath then + local rtp, updated = Cache.get_rtp() + if updated then + modpath, hash = _find(rtp) + end + end + end + if (not modpath) and opts.paths then + modpath, hash = _find(opts.paths) + end + + M.track("find", start) + if modpath then + return modpath, hash + end -- module not found M.stats.find.not_found = M.stats.find.not_found + 1 - M.stats.find.time = M.stats.find.time + uv.hrtime() - start end --- Resets the topmods cache for the path ---@param path string function M.reset(path) - Cache._topmods[Cache.normalize(path)] = nil + Cache._indexed[Cache.normalize(path)] = nil end function M.enable() @@ -228,7 +292,17 @@ function M.enable() vim.fn.mkdir(vim.fn.fnamemodify(M.path, ":p"), "p") -- selene: allow(global_usage) _G.loadfile = Cache.loadfile + -- add lua loader table.insert(package.loaders, 2, Cache.loader) + -- add libs loader + table.insert(package.loaders, 3, Cache.loader_lib) + -- remove Neovim loader + for l, loader in ipairs(package.loaders) do + if loader == vim._load_package then + table.remove(package.loaders, l) + break + end + end end function M.disable() @@ -240,18 +314,19 @@ function M.disable() _G.loadfile = Cache._loadfile ---@diagnostic disable-next-line: no-unknown for l, loader in ipairs(package.loaders) do - if loader == Cache.loader then + if loader == Cache.loader or loader == Cache.loader_lib then table.remove(package.loaders, l) end end + table.insert(package.loaders, 2, vim._load_package) end -- Return the top-level `/lua/*` modules for this path ---@return string[] function M.lsmod(path) - if not Cache._topmods[path] then - M.stats.find.index = M.stats.find.index + 1 - Cache._topmods[path] = {} + if not Cache._indexed[path] then + local start = uv.hrtime() + Cache._indexed[path] = {} local handle = vim.loop.fs_scandir(path .. "/lua") while handle do local name, t = vim.loop.fs_scandir_next(handle) @@ -259,7 +334,7 @@ function M.lsmod(path) break end -- HACK: type is not always returned due to a bug in luv - t = t or vim.loop.fs_stat(path .. "/" .. name).type + t = t or uv.fs_stat(path .. "/" .. name).type ---@type string local topname if name:sub(-4) == ".lua" then @@ -268,11 +343,16 @@ function M.lsmod(path) topname = name end if topname then - Cache._topmods[path][topname] = true + Cache._indexed[path][topname] = true + Cache._topmods[topname] = Cache._topmods[topname] or {} + if not vim.tbl_contains(Cache._topmods[topname], path) then + table.insert(Cache._topmods[topname], path) + end end end + M.track("lsmod", start) end - return Cache._topmods[path] + return Cache._indexed[path] end ---@param modname string @@ -283,22 +363,43 @@ function M.find(modname, opts) return modpath end +function M.profile_loaders() + for l, loader in pairs(package.loaders) do + local loc = debug.getinfo(loader, "Sn").source:sub(2) + package.loaders[l] = function(modname) + local start = vim.loop.hrtime() + local ret = loader(modname) + M.track("loader " .. l .. ": " .. loc, start) + M.track("loader_all", start) + return ret + end + end +end + function M.inspect() local function ms(nsec) return math.floor(nsec / 1e6 * 1000 + 0.5) / 1000 .. "ms" end - local props = { - { "total", M.stats.find.total, "Number" }, - { "time", ms(M.stats.find.time), "Bold" }, - { "avg time", ms(M.stats.find.time / M.stats.find.total), "Bold" }, - { "index", M.stats.find.index, "Number" }, - { "fs_stat", M.stats.find.stat, "Number" }, - { "not found", M.stats.find.not_found, "Number" }, - } local chunks = {} ---@type string[][] - for _, prop in ipairs(props) do - chunks[#chunks + 1] = { "* " .. prop[1] .. ": " } - chunks[#chunks + 1] = { tostring(prop[2]) .. "\n", prop[3] } + ---@type string[] + local stats = vim.tbl_keys(M.stats) + table.sort(stats) + for _, stat in ipairs(stats) do + vim.list_extend(chunks, { + { "\n" .. stat .. "\n", "Title" }, + { "* total: " }, + { tostring(M.stats[stat].total) .. "\n", "Number" }, + { "* time: " }, + { ms(M.stats[stat].time) .. "\n", "Bold" }, + { "* avg time: " }, + { ms(M.stats[stat].time / M.stats[stat].total) .. "\n", "Bold" }, + }) + for k, v in pairs(M.stats[stat]) do + if not vim.tbl_contains({ "time", "total" }, k) then + chunks[#chunks + 1] = { "* " .. k .. ":" .. string.rep(" ", 9 - #k) } + chunks[#chunks + 1] = { tostring(v) .. "\n", "Number" } + end + end end vim.api.nvim_echo(chunks, true, {}) end diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 0f1b977..833b432 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -4,6 +4,7 @@ local Handler = require("lazy.core.handler") local Cache = require("lazy.core.cache") local Plugin = require("lazy.core.plugin") +---@class LazyCoreLoader local M = {} local DEFAULT_PRIORITY = 50 @@ -450,27 +451,35 @@ function M.colorscheme(name) end end +function M.auto_load(modname, modpath) + local plugin = Plugin.find(modpath) + if plugin and modpath:find(plugin.dir, 1, true) == 1 then + -- don't load if we're loading specs or if the plugin is already loaded + if not (Plugin.loading or plugin._.loaded) then + if plugin.module == false then + error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") + end + M.load(plugin, { require = modname }) + end + return true + end + return false +end + ---@param modname string function M.loader(modname) - local modpath = Cache.find(modname, { rtp = false, paths = Util.get_unloaded_rtp(modname) }) + local paths = Util.get_unloaded_rtp(modname) + local modpath, hash = Cache._Cache.find(modname, { rtp = false, paths = paths }) + -- print(modname .. " " .. paths[1]) if modpath then - local plugin = Plugin.find(modpath) - if plugin and modpath:find(plugin.dir, 1, true) == 1 then - -- don't load if we're loading specs or if the plugin is already loaded - if not (Plugin.loading or plugin._.loaded) then - if plugin.module == false then - error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") - end - M.load(plugin, { require = modname }) + M.auto_load(modname, modpath) + local mod = package.loaded[modname] + if type(mod) == "table" then + return function() + return mod end - local mod = package.loaded[modname] - if type(mod) == "table" then - return function() - return mod - end - end - return loadfile(modpath) end + return Cache.load(modpath, { hash = hash }) end end diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index e81c4ec..cb6b732 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -34,7 +34,13 @@ function M.setup(spec, opts) local start = vim.loop.hrtime() -- load module cache before anything else - if not (opts and opts.performance and opts.performance.cache and opts.performance.cache.enabled == false) then + local enable_cache = not ( + opts + and opts.performance + and opts.performance.cache + and opts.performance.cache.enabled == false + ) + if enable_cache then require("lazy.core.cache").enable() end @@ -43,8 +49,13 @@ function M.setup(spec, opts) local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") + table.insert(package.loaders, 3, Loader.loader) + if vim.g.profile_loaders then + require("lazy.core.cache").profile_loaders() + end + Util.track({ plugin = "lazy.nvim" }) -- setup start Util.track("module", vim.loop.hrtime() - start) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index ec5570e..56ac095 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -670,16 +670,21 @@ function M:debug() end) self:nl() - self:append("Cache.find()", "LazyH2"):nl() - self:props({ - { "total", Cache.stats.find.total, "Number" }, - { "time", self:ms(Cache.stats.find.time, 3), "Bold" }, - { "avg time", self:ms(Cache.stats.find.time / Cache.stats.find.total, 3), "Bold" }, - { "index", Cache.stats.find.index, "Number" }, - { "fs_stat", Cache.stats.find.stat, "Number" }, - { "not found", Cache.stats.find.not_found, "Number" }, - }, { indent = 2 }) - self:nl() + Util.foreach(Cache.stats, function(name, stats) + self:append(name, "LazyH2"):nl() + local props = { + { "total", stats.total or 0, "Number" }, + { "time", self:ms(stats.time or 0, 3), "Bold" }, + { "avg time", self:ms((stats.time or 0) / (stats.total or 0), 3), "Bold" }, + } + for k, v in pairs(stats) do + if k ~= "total" and k ~= "time" then + props[#props + 1] = { k, v, "Number" } + end + end + self:props(props, { indent = 2 }) + self:nl() + end) end return M From 8aa90c34233f7de420b326de361137a571827d8c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Feb 2023 10:01:58 +0000 Subject: [PATCH 0789/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d54890f..5478a10 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 13 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 14 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 6a18404b7d1c05f0d1f35f7b78bd5c282dff7a89 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Feb 2023 12:19:49 +0100 Subject: [PATCH 0790/1610] fix(keys): fixed keys types. rhs can be `false` --- lua/lazy/core/handler/keys.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 8285240..b1fbc6d 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -3,7 +3,7 @@ local Loader = require("lazy.core.loader") ---@class LazyKeys ---@field [1] string lhs ----@field [2]? string|fun() rhs +---@field [2]? string|fun()|false rhs ---@field desc? string ---@field mode? string|string[] ---@field noremap? boolean From c249ea376bcd3e5d121b79eac595837b7d0c73a4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Feb 2023 22:05:14 +0100 Subject: [PATCH 0791/1610] chore(main): release 9.8.1 (#538) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8d9d82..6a8fd45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [9.8.1](https://github.com/folke/lazy.nvim/compare/v9.8.0...v9.8.1) (2023-02-14) + + +### Bug Fixes + +* **keys:** fixed keys types. rhs can be `false` ([6a18404](https://github.com/folke/lazy.nvim/commit/6a18404b7d1c05f0d1f35f7b78bd5c282dff7a89)) + + +### Performance Improvements + +* more cache optims ([17a3c3a](https://github.com/folke/lazy.nvim/commit/17a3c3acea400679027e675cc19b738e842a5ea0)) +* use modkey instead of modpath ([b1f7ae6](https://github.com/folke/lazy.nvim/commit/b1f7ae68a75401152eb23edbd5827b69761e9bc7)) + ## [9.8.0](https://github.com/folke/lazy.nvim/compare/v9.7.0...v9.8.0) (2023-02-13) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 14be512..4c8c071 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.8.0" -- x-release-please-version +M.version = "9.8.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 78264fb9350814c32ca9442ff3113e15a8218dad Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 15 Feb 2023 17:07:57 +0100 Subject: [PATCH 0792/1610] style: added proper types to process --- lua/lazy/manage/process.lua | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index fd5f898..530aeaa 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -2,7 +2,7 @@ local Config = require("lazy.core.config") local M = {} ----@type table<vim.loop.Process, true> +---@type table<uv.uv_process_t, true> M.running = {} M.signals = { @@ -57,28 +57,31 @@ function M.spawn(cmd, opts) opts = opts or {} opts.timeout = opts.timeout or (Config.options.git and Config.options.git.timeout * 1000) + ---@type table<string, string> local env = vim.tbl_extend("force", { GIT_SSH_COMMAND = "ssh -oBatchMode=yes", }, uv.os_environ(), opts.env or {}) env.GIT_DIR = nil env.GIT_TERMINAL_PROMPT = "0" + ---@type string[] local env_flat = {} for k, v in pairs(env) do env_flat[#env_flat + 1] = k .. "=" .. v end - local stdout = uv.new_pipe() - local stderr = uv.new_pipe() + local stdout = assert(uv.new_pipe()) + local stderr = assert(uv.new_pipe()) local output = "" - ---@type vim.loop.Process + ---@type uv.uv_process_t local handle = nil + ---@type uv.uv_timer_t local timeout local killed = false if opts.timeout then - timeout = uv.new_timer() + timeout = assert(uv.new_timer()) timeout:start(opts.timeout, 0, function() if M.kill(handle) then killed = true @@ -100,7 +103,7 @@ function M.spawn(cmd, opts) handle:close() stdout:close() stderr:close() - local check = uv.new_check() + local check = assert(uv.new_check()) check:start(function() if not stdout:is_closing() or not stderr:is_closing() then return From 9ca3222061fcc07a7ac5f685d80b49944b347a03 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 15 Feb 2023 17:08:36 +0100 Subject: [PATCH 0793/1610] fix(cache): lsmod now also supports lua libs. Fixes #544 --- lua/lazy/core/cache.lua | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 3b3d824..12515ec 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -129,13 +129,13 @@ end function Cache.loader(modname) local start = uv.hrtime() local modpath, hash = Cache.find(modname) - ---@type function?, string? - local chunk, err if modpath then - chunk, err = M.load(modpath, { hash = hash }) + local chunk, err = M.load(modpath, { hash = hash }) + M.track("loader", start) + return chunk or error(err) end M.track("loader", start) - return chunk or err or "module " .. modname .. " not found" + return "\nlazy_loader: module " .. modname .. " not found" end ---@param modname string @@ -154,10 +154,10 @@ function Cache.loader_lib(modname) local funcname = dash and modname:sub(dash + 1) or modname local chunk, err = package.loadlib(modpath, "luaopen_" .. funcname:gsub("%.", "_")) M.track("loader_lib", start) - return chunk or err + return chunk or error(err) end M.track("loader_lib", start) - return "module " .. modname .. " not found" + return "\nlazy_loader_lib: module " .. modname .. " not found" end ---@param filename? string @@ -337,8 +337,11 @@ function M.lsmod(path) t = t or uv.fs_stat(path .. "/" .. name).type ---@type string local topname - if name:sub(-4) == ".lua" then + local ext = name:sub(-4) + if ext == ".lua" or ext == ".dll" then topname = name:sub(1, -5) + elseif name:sub(-3) == ".so" then + topname = name:sub(1, -4) elseif t == "link" or t == "directory" then topname = name end From 8f752bb28836829387a21a8afb7ad41f0c93bda7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:09:23 +0000 Subject: [PATCH 0794/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5478a10..388f622 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 14 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 15 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 4a0857cc232ddb31f64d1e5f42fd19e09a490f83 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 17:14:00 +0100 Subject: [PATCH 0795/1610] chore(main): release 9.8.2 (#548) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a8fd45..d568692 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.8.2](https://github.com/folke/lazy.nvim/compare/v9.8.1...v9.8.2) (2023-02-15) + + +### Bug Fixes + +* **cache:** lsmod now also supports lua libs. Fixes [#544](https://github.com/folke/lazy.nvim/issues/544) ([9ca3222](https://github.com/folke/lazy.nvim/commit/9ca3222061fcc07a7ac5f685d80b49944b347a03)) + ## [9.8.1](https://github.com/folke/lazy.nvim/compare/v9.8.0...v9.8.1) (2023-02-14) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4c8c071..befd3bc 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.8.1" -- x-release-please-version +M.version = "9.8.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From e916f41df26e33b01f1b3ebe28881090da3a7281 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 15 Feb 2023 18:19:57 +0100 Subject: [PATCH 0796/1610] fix(cache): hack to work around plugins trying to load relatve modules. Fixes #543 --- lua/lazy/core/cache.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 12515ec..8a02711 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -230,6 +230,14 @@ function Cache.find(modname, opts) modname = modname:gsub("/", ".") local basename = modname:gsub("%.", "/") local idx = modname:find(".", 1, true) + + -- HACK: some plugins try to load invalid relative paths (see #543) + if idx == 1 then + modname = modname:gsub("^%.+", "") + basename = modname:gsub("%.", "/") + idx = modname:find(".", 1, true) + end + local topmod = idx and modname:sub(1, idx - 1) or modname -- OPTIM: search for a directory first when topmod == modname From 6771c7e23c3ecdb50a9510c4cd5e1e0d2db9e5ca Mon Sep 17 00:00:00 2001 From: vanppo <vanppo@hotmail.com> Date: Thu, 16 Feb 2023 19:33:53 +0800 Subject: [PATCH 0797/1610] fix(ui): disable folding of floating window (#550) --- lua/lazy/view/float.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 2a2cc5f..f0e719a 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -107,6 +107,7 @@ function M:mount() local function opts() vim.bo[self.buf].bufhidden = "wipe" vim.wo[self.win].conceallevel = 3 + vim.wo[self.win].foldenable = false vim.wo[self.win].spell = false vim.wo[self.win].wrap = true vim.wo[self.win].winhighlight = "Normal:LazyNormal" From 258ee6b30dd842bdd486da1ea8873644ed536a73 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 11:34:49 +0000 Subject: [PATCH 0798/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 388f622..07f69c8 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 15 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 16 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 8186cc5db31bd5968b5be838a30c4cf1465cb3f9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 13:29:23 +0100 Subject: [PATCH 0799/1610] chore(main): release 9.8.3 (#549) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d568692..0ac92d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [9.8.3](https://github.com/folke/lazy.nvim/compare/v9.8.2...v9.8.3) (2023-02-16) + + +### Bug Fixes + +* **cache:** hack to work around plugins trying to load relatve modules. Fixes [#543](https://github.com/folke/lazy.nvim/issues/543) ([e916f41](https://github.com/folke/lazy.nvim/commit/e916f41df26e33b01f1b3ebe28881090da3a7281)) +* **ui:** disable folding of floating window ([#550](https://github.com/folke/lazy.nvim/issues/550)) ([6771c7e](https://github.com/folke/lazy.nvim/commit/6771c7e23c3ecdb50a9510c4cd5e1e0d2db9e5ca)) + ## [9.8.2](https://github.com/folke/lazy.nvim/compare/v9.8.1...v9.8.2) (2023-02-15) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index befd3bc..f1e5f3f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.8.2" -- x-release-please-version +M.version = "9.8.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 5cfe1560c551720bdc125e68431bacb836eb28d3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 17 Feb 2023 13:41:16 +0100 Subject: [PATCH 0800/1610] fix(ui): return abort key instead of `<c-c>` --- lua/lazy/view/init.lua | 2 +- lua/lazy/view/render.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index efdb75e..b661d5a 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -77,7 +77,7 @@ function M.create() vim.keymap.set("n", ViewConfig.keys.abort, function() require("lazy.manage.process").abort() - return "<c-c>" + return ViewConfig.keys.abort end, { silent = true, buffer = self.buf, expr = true }) -- plugin details diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 56ac095..6cf424c 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -160,7 +160,7 @@ end function M:help() self:append("Help", "LazyH2"):nl():nl() - self:append("Use "):append("<C-c>", "LazySpecial"):append(" to abort all running tasks."):nl():nl() + self:append("Use "):append(ViewConfig.keys.abort, "LazySpecial"):append(" to abort all running tasks."):nl():nl() self:append("You can press "):append("<CR>", "LazySpecial"):append(" on a plugin to show its details."):nl():nl() From e5ba4434164f8ae9f88d5150018f229e3d0aa9a7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 12:42:16 +0000 Subject: [PATCH 0801/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 07f69c8..5753584 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 16 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 17 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From ff76e58961509038e3e0365c47580e595977a3a2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 17 Feb 2023 13:58:16 +0100 Subject: [PATCH 0802/1610] fix(spec): make sure imported specs are sorted alphabetically --- lua/lazy/core/plugin.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index b79cc6b..edd8ff0 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -254,7 +254,15 @@ function Spec:import(spec) self.modules[#self.modules + 1] = spec.import local imported = 0 + + ---@type string[] + local modnames = {} Util.lsmod(spec.import, function(modname) + modnames[#modnames + 1] = modname + end) + table.sort(modnames) + + for _, modname in ipairs(modnames) do imported = imported + 1 Util.track({ import = modname }) self.importing = modname @@ -273,7 +281,7 @@ function Spec:import(spec) Util.track() end, }) - end) + end if imported == 0 then self:error("No specs found for module " .. spec.import) end From f2cc9ef6acc7367c001b7507c82cab3ab7c29cae Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 17:06:19 +0100 Subject: [PATCH 0803/1610] chore(main): release 9.8.4 (#557) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ac92d0..5ed8af5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [9.8.4](https://github.com/folke/lazy.nvim/compare/v9.8.3...v9.8.4) (2023-02-17) + + +### Bug Fixes + +* **spec:** make sure imported specs are sorted alphabetically ([ff76e58](https://github.com/folke/lazy.nvim/commit/ff76e58961509038e3e0365c47580e595977a3a2)) +* **ui:** return abort key instead of `<c-c>` ([5cfe156](https://github.com/folke/lazy.nvim/commit/5cfe1560c551720bdc125e68431bacb836eb28d3)) + ## [9.8.3](https://github.com/folke/lazy.nvim/compare/v9.8.2...v9.8.3) (2023-02-16) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f1e5f3f..310e11c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.8.3" -- x-release-please-version +M.version = "9.8.4" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 7339145a223dab7e7ddccf0986ffbf9d2cb804e8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 17 Feb 2023 21:08:46 +0100 Subject: [PATCH 0804/1610] fix(ui): don't close on BufLeave. Fixes #561 --- lua/lazy/view/float.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index f0e719a..c87ac53 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -53,7 +53,7 @@ function M:init(opts) } self:mount() self:on_key(ViewConfig.keys.close, self.close) - self:on({ "BufDelete", "BufLeave", "BufHidden" }, self.close, { once = true }) + self:on({ "BufDelete", "BufHidden" }, self.close, { once = true }) return self end From 43496fa82cd4d68523754c3492660a9883e747d9 Mon Sep 17 00:00:00 2001 From: Lucas Tavares <tavares.lassuncao@gmail.com> Date: Mon, 20 Feb 2023 04:31:03 -0300 Subject: [PATCH 0805/1610] fix(ui): disable colorcolumn on floating window (#575) --- lua/lazy/view/float.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index c87ac53..974fb8e 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -111,6 +111,7 @@ function M:mount() vim.wo[self.win].spell = false vim.wo[self.win].wrap = true vim.wo[self.win].winhighlight = "Normal:LazyNormal" + vim.wo[self.win].colorcolumn = "" end opts() From 8d5553d11b22754f7b2e091c8579eff3b477c7bc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Feb 2023 07:31:46 +0000 Subject: [PATCH 0806/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 488 +++++++++++++++++++++++++++------------------- 1 file changed, 285 insertions(+), 203 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5753584..ffe7a2a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,36 +1,32 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 17 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 20 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* 1. lazy.nvim |lazy.nvim-lazy.nvim| - - Features |lazy.nvim-features| - - Requirements |lazy.nvim-requirements| - - Installation |lazy.nvim-installation| - - Plugin Spec |lazy.nvim-plugin-spec| - - Configuration |lazy.nvim-configuration| - - Usage |lazy.nvim-usage| - - Lockfile `lazy-lock.json` |lazy.nvim-lockfile-`lazy-lock.json`| - - Performance |lazy.nvim-performance| - - Debug |lazy.nvim-debug| - - Startup Sequence |lazy.nvim-startup-sequence| - - Structuring Your Plugins |lazy.nvim-structuring-your-plugins| - - Migration Guide |lazy.nvim-migration-guide| - - Uninstalling |lazy.nvim-uninstalling| - - Highlight Groups |lazy.nvim-highlight-groups| - - Other Neovim Plugin Managers in Lua|lazy.nvim-other-neovim-plugin-managers-in-lua| + - Features |lazy.nvim-lazy.nvim-features| + - Requirements |lazy.nvim-lazy.nvim-requirements| + - Installation |lazy.nvim-lazy.nvim-installation| + - Plugin Spec |lazy.nvim-lazy.nvim-plugin-spec| + - Configuration |lazy.nvim-lazy.nvim-configuration| + - Usage |lazy.nvim-lazy.nvim-usage| + - Lockfile lazy-lock.json |lazy.nvim-lazy.nvim-lockfile-lazy-lock.json| + - Performance |lazy.nvim-lazy.nvim-performance| + - Debug |lazy.nvim-lazy.nvim-debug| + - Startup Sequence |lazy.nvim-lazy.nvim-startup-sequence| + - Structuring Your Plugins |lazy.nvim-lazy.nvim-structuring-your-plugins| + - Migration Guide |lazy.nvim-lazy.nvim-migration-guide| + - Uninstalling |lazy.nvim-lazy.nvim-uninstalling| + - Highlight Groups |lazy.nvim-lazy.nvim-highlight-groups| + - Other Neovim Plugin Managers in Lua|lazy.nvim-lazy.nvim-other-neovim-plugin-managers-in-lua| ============================================================================== 1. lazy.nvim *lazy.nvim-lazy.nvim* **lazy.nvim** is a modern plugin manager for Neovim. -<div class="figure"> -<img src="https://user-images.githubusercontent.com/292349/208301737-68fb279c-ba70-43ef-a369-8c3e8367d6b1.png" title="fig:"/> -<p class="caption">image</p> -</div> -FEATURES *lazy.nvim-features* +FEATURES *lazy.nvim-lazy.nvim-features* - Manage all your Neovim plugins with a powerful UI @@ -52,15 +48,15 @@ FEATURES *lazy.nvim-features* - Automatically lazy-loads colorschemes -REQUIREMENTS *lazy.nvim-requirements* +REQUIREMENTS *lazy.nvim-lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) -- a Nerd Font <https://www.nerdfonts.com/> **_(optional)_** +- a Nerd Font <https://www.nerdfonts.com/> **(optional)** -INSTALLATION *lazy.nvim-installation* +INSTALLATION *lazy.nvim-lazy.nvim-installation* You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim** @@ -80,7 +76,6 @@ You can add the following Lua code to your `init.lua` to bootstrap vim.opt.rtp:prepend(lazypath) < - Next step is to add **lazy.nvim** below the code added in the last step in `init.lua` @@ -89,12 +84,10 @@ Next step is to add **lazy.nvim** below the code added in the last step in < - -- **plugins**: this should be a `table` or a `string` - - `table`: a list with your |lazy.nvim-plugin-spec| - - `string`: a Lua module name that contains your |lazy.nvim-plugin-spec|. See |lazy.nvim-structuring-your-plugins| -- **opts**: see |lazy.nvim-configuration| **_(optional)_** - +- **plugins**this should be a `table` or a `string` + - `table`a list with your |lazy.nvim-plugin-spec| + - `string`a Lua module name that contains your |lazy.nvim-plugin-spec|. See |lazy.nvim-structuring-your-plugins| +- **opts**see |lazy.nvim-configuration| **(optional)** >lua -- example using a list of specs with the default options @@ -107,38 +100,102 @@ Next step is to add **lazy.nvim** below the code added in the last step in }) < - It is recommended to run `:checkhealth lazy` after installation -PLUGIN SPEC *lazy.nvim-plugin-spec* -│ Property │ Type │ Description │ -│[1] │string? │Short plugin url. Will be expanded using config.git.url_format │ -│**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 │ -│**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 │ -│**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 fun():boolean │When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. │ -│**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. │ -│**init** │fun(LazyPlugin) │init functions are always executed during startup │ -│**opts** │table or fun(LazyPlugin, opts:table) │opts should be a table (will be merged with parent 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) or true │config is executed when the plugin loads. The default implementation will automatically run require("plugin").setup(opts). "plugin" will default to name if specified, otherwise lazy.nvim will do its best to guess the correct plugin name. See also opts. To use the default implementation without opts set config to true. │ -│**build** │fun(LazyPlugin) or string or a list of build commands │build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands │ -│**branch** │string? │Branch of the repository │ -│**tag** │string? │Tag of the repository │ -│**commit** │string? │Commit of the repository │ -│**version** │string? │Version to use from the repository. Full Semver <https://devhints.io/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 │ -│**event** │string? or string[] or fun(self:LazyPlugin, event:string[]):string[] │Lazy-load on event. Events can be specified as BufEnter or with a pattern like BufEnter .lua │ -│**cmd** │string? or string[] or fun(self:LazyPlugin, cmd:string[]):string[] │Lazy-load on command │ -│**ft** │string? or string[] or fun(self:LazyPlugin, ft:string[]):string[] │Lazy-load on filetype │ -│**keys** │string? or string[] or LazyKeys[] or fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[] │Lazy-load on key mapping │ -│**module** │false? │Do not automatically load this Lua module when it’s required somewhere │ -│**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. │ +PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* + -------------------------------------------------------------------------------------------------------------------------------- + Property Type Description + -------------- ------------------------------------------------------------ ---------------------------------------------------- + [1] string? Short plugin url. Will be expanded using + config.git.url_format + + 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 + + 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 + + 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 fun():boolean When false, or if the function returns false, then + this plugin will not be loaded. Useful to disable + some plugins in vscode, or firenvim for example. + + 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. + + init fun(LazyPlugin) init functions are always executed during startup + + opts table or fun(LazyPlugin, opts:table) opts should be a table (will be merged with parent + 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) or true config is executed when the plugin loads. The + default implementation will automatically run + require("plugin").setup(opts). "plugin" will default + to name if specified, otherwise lazy.nvim will do + its best to guess the correct plugin name. See also + opts. To use the default implementation without opts + set config to true. + + build fun(LazyPlugin) or string or a list of build commands build is executed when a plugin is installed or + updated. If it’s a string it will be ran as a shell + command. When prefixed with it is a Neovim command. + You can also specify a list to executed multiple + build commands + + branch string? Branch of the repository + + tag string? Tag of the repository + + commit string? Commit of the repository + + version string? Version to use from the repository. Full 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 + + event string? or string[] or Lazy-load on event. Events can be specified as + fun(self:LazyPlugin, event:string[]):string[] BufEnter or with a pattern 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 LazyKeys[] or Lazy-load on key mapping + fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[] + + module false? Do not automatically load this Lua module when it’s + required somewhere + + 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. + -------------------------------------------------------------------------------------------------------------------------------- LAZY LOADING ~ @@ -157,45 +214,36 @@ You can configure **lazy.nvim** to lazy-load all plugins by default with 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`: +Plugins will be lazy-loaded when one of the following is `true` -- the plugin only exists as a dependency in your spec +- theplugin only exists as a dependency in your spec - it has an `event`, `cmd`, `ft` or `keys` key - `config.defaults.lazy == true` - *lazy.nvim-Colorschemes* - -Colorschemes Colorscheme plugins can be configured - with `lazy=true`. The plugin will - automagically load when doing - `colorscheme foobar`. +COLORSCHEMES +Colorscheme plugins can be configured with `lazy=true`. The plugin will +automagically load when doing `colorscheme foobar`. **NOTE:** since **start** plugins can possibly change existing highlight groups, it’s important to make sure that your main **colorscheme** is loaded - first. To ensure this you can use the `priority=1000` field. **_(see the - examples)_** + first. To ensure this you can use the `priority=1000` field. **(see the + examples)** + +LAZY KEY MAPPINGS + +The `keys` property can be a `string` or `string[]` for simple normal-mode +mappings, or it can be a `LazyKeys` table with the following key-value pairs: - *lazy.nvim-Lazy-Key-Mappings* - -Lazy Key Mappings The `keys` property can be a `string` or - `string[]` for simple normal-mode - mappings, or it can be a `LazyKeys` - table with the following key-value - pairs: - - - -- **[1]**: (`string`) lhs **_(required)_** -- **[2]**: (`string|fun()`) rhs **_(optional)_** -- **mode**: (`string|string[]`) mode **_(optional, defaults to `"n"`)_** +- **[1]**(`string`) lhs **(required)** +- **[2]**(`string|fun()`) rhs **(optional)** +- **mode**(`string|string[]`) mode **(optional, defaults to "n")** - 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()` @@ -222,22 +270,22 @@ If you want to install a specific revision of a plugin, you can use `commit`, The `version` property supports Semver <https://semver.org/> ranges. -Click to see some examples +Click to see some 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 - +- 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 You can set `config.defaults.version = ""` to install the latest stable version of plugins that support Semver. + EXAMPLES ~ >lua @@ -338,7 +386,7 @@ EXAMPLES ~ < -CONFIGURATION *lazy.nvim-configuration* +CONFIGURATION *lazy.nvim-lazy.nvim-configuration* **lazy.nvim** comes with the following defaults: @@ -486,8 +534,7 @@ CONFIGURATION *lazy.nvim-configuration* } < - -If you don’t want to use a Nerd Font, you can replace the icons with Unicode symbols. +If you don’t want to use a Nerd Font, you can replace the icons with Unicode symbols. ~ >lua { @@ -511,7 +558,7 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s < -USAGE *lazy.nvim-usage* +USAGE *lazy.nvim-lazy.nvim-usage* Plugins are managed with the `:Lazy` command. Open the help with `<?>` to see all the key mappings. @@ -526,24 +573,43 @@ 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 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 │ + -------------------------------------------------------------------------------------------------------------- + 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 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: @@ -551,15 +617,13 @@ example, if you want to sync lazy from the cmdline, you can use: $ 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 - +- **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()`): @@ -578,12 +642,11 @@ Stats API (`require("lazy").stats()`): } < - **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 <a href="https://github.com/nvim-lualine/lualine.nvim">lualine.nvim</a> +Example of configuring lualine.nvim ~ >lua require("lualine").setup({ @@ -605,20 +668,20 @@ 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 -- **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. +- **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 +- **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. -LOCKFILE `LAZY-LOCK.JSON` *lazy.nvim-lockfile-`lazy-lock.json`* +LOCKFILE LAZY-LOCK.JSON *lazy.nvim-lazy.nvim-lockfile-lazy-lock.json* After every **update**, the local lockfile is updated with the installed revisions. It is recommended to have this file under version control. @@ -629,7 +692,8 @@ 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. -PERFORMANCE *lazy.nvim-performance* + +PERFORMANCE *lazy.nvim-lazy.nvim-performance* 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 @@ -643,22 +707,14 @@ lazy-loading though :) improve performance. The profiling view shows you why and how long it took to load your plugins. -<div class="figure"> -<img src="https://user-images.githubusercontent.com/292349/208301766-5c400561-83c3-4811-9667-1ec4bb3c43b8.png" title="fig:"/> -<p class="caption">image</p> -</div> -DEBUG *lazy.nvim-debug* +DEBUG *lazy.nvim-lazy.nvim-debug* See an overview of active lazy-loading handlers and what’s in the module cache -<div class="figure"> -<img src="https://user-images.githubusercontent.com/292349/208301790-7eedbfa5-d202-4e70-852e-de68aa47233b.png" title="fig:"/> -<p class="caption">image</p> -</div> -STARTUP SEQUENCE *lazy.nvim-startup-sequence* +STARTUP SEQUENCE *lazy.nvim-lazy.nvim-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 @@ -667,15 +723,12 @@ 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 you rtp are sourced (excluding `/after`) -4. all `/after/plugin` files are sourced (this includes `/after` from plugins) - +1. all the plugins’ `init()` functions are executed2. 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 you 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. -STRUCTURING YOUR PLUGINS *lazy.nvim-structuring-your-plugins* + +STRUCTURING YOUR PLUGINS *lazy.nvim-lazy.nvim-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 @@ -690,21 +743,17 @@ The benefits of using this approach: - 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)_** - +- `~/.config/nvim/lua/plugins.lua` or `~/.config/nvim/lua/plugins/init.lua` **(this file is optional)** >lua return { @@ -715,10 +764,8 @@ Example: < - - 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 <https://github.com/LazyVim/LazyVim> and more specifically: @@ -726,7 +773,7 @@ For a real-life example, you can check LazyVim - lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/plugins> contains all the plugin specs that will be loaded -IMPORTING SPECS, `CONFIG` & `OPTS` ~ +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: @@ -738,7 +785,6 @@ modules. Both of the `setup()` calls are equivalent: require("lazy").setup({{import = "plugins"}}) < - 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. @@ -746,9 +792,11 @@ same plugin to your local specs, adding any keys you want to override / merge. the parent spec. Any other property will override the property from the parent spec. -MIGRATION GUIDE *lazy.nvim-migration-guide* -PACKER.NVIM <HTTPS://GITHUB.COM/WBTHOMASON/PACKER.NVIM> ~ +MIGRATION GUIDE *lazy.nvim-lazy.nvim-migration-guide* + + +PACKER.NVIM ~ - `setup` `init` @@ -759,21 +807,19 @@ PACKER.NVIM <HTTPS://GITHUB.COM/WBTHOMASON/PACKER.NVIM> ~ - `lock` `pin` - `disable=true` `enabled = false` - `tag=''` `version=""` -- `after` **_not needed_** for most use-cases. Use `dependencies` otherwise. -- `wants` **_not needed_** for most use-cases. Use `dependencies` otherwise. +- `after` **not needed** for most use-cases. Use `dependencies` otherwise. +- `wants` **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 @@ -782,7 +828,8 @@ 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 <HTTPS://GITHUB.COM/SAVQ/PAQ-NVIM> ~ + +PAQ-NVIM ~ - `as` `name` @@ -790,58 +837,87 @@ PAQ-NVIM <HTTPS://GITHUB.COM/SAVQ/PAQ-NVIM> ~ - `run` `build` -UNINSTALLING *lazy.nvim-uninstalling* +UNINSTALLING *lazy.nvim-lazy.nvim-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` - +- **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. +HIGHLIGHT GROUPS *lazy.nvim-lazy.nvim-highlight-groups* -HIGHLIGHT GROUPS *lazy.nvim-highlight-groups* +Click to see all highlight groups ~ -Click to see all highlight groups + --------------------------------------------------------------------------------- + Highlight Group Default Group Description + ------------------- ------------------------ ------------------------------------ + LazyButton CursorLine -│ Highlight Group │ Default Group │ Description │ -│**LazyButton** │**_CursorLine_** │ │ -│**LazyButtonActive** │**_Visual_** │ │ -│**LazyComment** │**_Comment_** │ │ -│**LazyCommit** │_variable.builtin │commitref │ -│**LazyCommitIssue** │**_Number_** │ │ -│**LazyCommitScope** │**_Italic_** │conventional commit scope │ -│**LazyCommitType** │**_Title_** │conventional commit type │ -│**LazyDir** │_text.reference │directory │ -│**LazyH1** │**_IncSearch_** │homebutton │ -│**LazyH2** │**_Bold_** │titles │ -│**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_** │ │ -│**LazyReasonRuntime**│_macro │ │ -│**LazyReasonSource** │**_Character_** │ │ -│**LazyReasonStart** │_field │ │ -│**LazySpecial** │_punctuation.special│ │ -│**LazyTaskError** │**_ErrorMsg_** │taskerrors │ -│**LazyTaskOutput** │**_MsgArea_** │task output │ -│**LazyUrl** │_text.reference │url │ -│**LazyValue** │_string │valueof a property │ + LazyButtonActive Visual + LazyComment Comment -OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-other-neovim-plugin-managers-in-lua* + LazyCommit _@variable.builtin_ commitref + + LazyCommitIssue Number + + LazyCommitScope Italic conventional commit scope + + LazyCommitType Title conventional commit type + + LazyDir _@text.reference_ directory + + LazyH1 IncSearch homebutton + + LazyH2 Bold titles + + 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 + + LazyReasonRuntime _@macro_ + + LazyReasonSource Character + + LazyReasonStart _@field_ + + LazySpecial _@punctuation.special_ + + LazyTaskError ErrorMsg taskerrors + + LazyTaskOutput MsgArea task output + + LazyUrl _@text.reference_ url + + LazyValue _@string_ valueof a property + --------------------------------------------------------------------------------- + +OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-lazy.nvim-other-neovim-plugin-managers-in-lua* - packer.nvim <https://github.com/wbthomason/packer.nvim> @@ -851,6 +927,12 @@ OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-other-neovim-plugin-managers-in-lu - optpack.nvim <https://github.com/notomo/optpack.nvim> - pact.nvim <https://github.com/rktjmp/pact.nvim> +============================================================================== +2. 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 <https://github.com/kdheepak/panvimdoc> From 8077428e63feb0f3bf795d53b23ba1695b28ab0e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Feb 2023 09:06:09 +0100 Subject: [PATCH 0807/1610] chore(main): release 9.8.5 (#563) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ed8af5..c4ad0b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [9.8.5](https://github.com/folke/lazy.nvim/compare/v9.8.4...v9.8.5) (2023-02-20) + + +### Bug Fixes + +* **ui:** disable colorcolumn on floating window ([#575](https://github.com/folke/lazy.nvim/issues/575)) ([43496fa](https://github.com/folke/lazy.nvim/commit/43496fa82cd4d68523754c3492660a9883e747d9)) +* **ui:** don't close on BufLeave. Fixes [#561](https://github.com/folke/lazy.nvim/issues/561) ([7339145](https://github.com/folke/lazy.nvim/commit/7339145a223dab7e7ddccf0986ffbf9d2cb804e8)) + ## [9.8.4](https://github.com/folke/lazy.nvim/compare/v9.8.3...v9.8.4) (2023-02-17) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 310e11c..bb974f7 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.8.4" -- x-release-please-version +M.version = "9.8.5" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 1657ae9b8c86d672517ac7f573eb180d3f5ecb79 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 27 Feb 2023 09:59:47 +0100 Subject: [PATCH 0808/1610] fix(keys): set nowait for lazy keymaps when needed. Fixes #600 --- lua/lazy/core/handler/keys.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index b1fbc6d..91ece7a 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -79,6 +79,7 @@ function M:_add(keys) vim.api.nvim_feedkeys(feed, "i", false) end, { desc = opts.desc, + nowait = opts.nowait, -- we do not return anything, but this is still needed to make operator pending mappings work expr = true, }) From 8cbd95bd059f791e7e9c8cbbf03c368a8bcad9f0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 09:00:46 +0000 Subject: [PATCH 0809/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ffe7a2a..b977a14 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 20 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 27 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 5694483e8782f4d9a01ea8822166998924df5f00 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 27 Feb 2023 13:42:52 +0100 Subject: [PATCH 0810/1610] fix(health): whitelist deactivate prop --- lua/lazy/health.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 75a85a6..39df32d 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -94,6 +94,7 @@ M.valid = { "commit", "cond", "config", + "deactivate", "dependencies", "dev", "dir", From b814d870897a12b636580e397a78acf242a85e93 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 27 Feb 2023 20:25:03 +0100 Subject: [PATCH 0811/1610] style(cache): removed hack for relative paths --- lua/lazy/core/cache.lua | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 8a02711..6f7c4f5 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -231,13 +231,6 @@ function Cache.find(modname, opts) local basename = modname:gsub("%.", "/") local idx = modname:find(".", 1, true) - -- HACK: some plugins try to load invalid relative paths (see #543) - if idx == 1 then - modname = modname:gsub("^%.+", "") - basename = modname:gsub("%.", "/") - idx = modname:find(".", 1, true) - end - local topmod = idx and modname:sub(1, idx - 1) or modname -- OPTIM: search for a directory first when topmod == modname From 9bd1c946d6114affebb57dbe3e33741ded566559 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 27 Feb 2023 20:38:05 +0100 Subject: [PATCH 0812/1610] feat(health): check for paths on the rtp from plugged or packer --- lua/lazy/health.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 39df32d..c982a37 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -30,6 +30,15 @@ function M.check() vim.health.report_ok("no existing packages found by other package managers") end + for _, name in ipairs({ "packer", "plugged", "paq" }) do + for _, path in ipairs(vim.opt.rtp:get()) do + if path:find(name, 1, true) then + vim.health.report_error("Found paths on the rtp from another plugin manager `" .. name .. "`") + break + end + end + end + local packer_compiled = vim.fn.stdpath("config") .. "/plugin/packer_compiled.lua" if vim.loop.fs_stat(packer_compiled) then vim.health.report_error("please remove the file `" .. packer_compiled .. "`") From c7a8e702f7342a592c8e88e516c206e3226400b4 Mon Sep 17 00:00:00 2001 From: adrian5 <adrian5@users.noreply.github.com> Date: Tue, 28 Feb 2023 07:27:19 +0100 Subject: [PATCH 0813/1610] docs: update some wording and capitalization (#576) --- README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 37fa84f..e0ecbd4 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ ## ✨ Features - 📦 Manage all your Neovim plugins with a powerful UI -- 🚀 Fast startup times thanks to automatic caching and bytecode compilation of lua modules +- 🚀 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 +- 🔌 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 @@ -32,7 +32,7 @@ ## 📦 Installation -You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim** +You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim**: <!-- bootstrap:start --> @@ -53,7 +53,7 @@ vim.opt.rtp:prepend(lazypath) <!-- bootstrap:end --> -Next step is to add **lazy.nvim** below the code added in the last step in `init.lua` +Next step is to add **lazy.nvim** below the code added in the prior step in `init.lua`: ```lua require("lazy").setup(plugins, opts) @@ -65,8 +65,8 @@ require("lazy").setup(plugins, opts) - **opts**: see [Configuration](#%EF%B8%8F-configuration) **_(optional)_** ```lua --- example using a list of specs with the default options -vim.g.mapleader = " " -- make sure to set `mapleader` before lazy so your mappings are correct +-- Example using a list of specs with the default options +vim.g.mapleader = " " -- Make sure to set `mapleader` before lazy so your mappings are correct require("lazy").setup({ "folke/which-key.nvim", @@ -75,7 +75,7 @@ require("lazy").setup({ }) ``` -ℹ️ It is recommended to run `:checkhealth lazy` after installation +ℹ️ It is recommended to run `:checkhealth lazy` after installation. ## 🔌 Plugin Spec @@ -110,7 +110,7 @@ require("lazy").setup({ ### Lazy Loading **lazy.nvim** automagically lazy-loads Lua modules, so it is not needed to -specify `module=...` everywhere in your plugin specification. This mean that if +specify `module=...` everywhere in your plugin specification. 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. @@ -124,8 +124,8 @@ Additionally, you can also lazy-load on **events**, **commands**, 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 +- The plugin only exists as a dependency in your spec +- It has an `event`, `cmd`, `ft` or `keys` key - `config.defaults.lazy == true` #### 🌈 Colorschemes @@ -605,7 +605,7 @@ 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 +See an overview of active lazy-loading handlers and what's in the module cache. ![image](https://user-images.githubusercontent.com/292349/208301790-7eedbfa5-d202-4e70-852e-de68aa47233b.png) @@ -617,10 +617,10 @@ startup sequence for more flexibility and better performance. In practice this means that step 10 of [Neovim Initialization](https://neovim.io/doc/user/starting.html#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 you rtp are sourced (excluding `/after`) -4. all `/after/plugin` files are sourced (this includes `/after` from plugins) +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 you 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. @@ -633,9 +633,9 @@ so it is not needed to add `require` calls in your main plugin file to the other 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 +- 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: @@ -655,7 +655,7 @@ return { } ``` -- any lua file in `~/.config/nvim/lua/plugins/*.lua` will be automatically merged in the main plugin spec +- 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](https://github.com/LazyVim/LazyVim) and more specifically: @@ -669,7 +669,7 @@ Both of the `setup()` calls are equivalent: ```lua require("lazy").setup("plugins") --- same as: +-- Same as: require("lazy").setup({{import = "plugins"}}) ``` @@ -705,7 +705,7 @@ 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 +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. @@ -724,7 +724,7 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori - **state**: `~/.local/state/nvim/lazy` - **lockfile**: `~/.config/nvim/lazy-lock.json` -> paths can differ if you changed `XDG` environment variables. +> Paths can differ if you changed `XDG` environment variables. ## 🌈 Highlight Groups From 25132fc08f6c0c68068be19680f8b6d9d6149985 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Feb 2023 06:28:08 +0000 Subject: [PATCH 0814/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b977a14..ecd4f9b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 27 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 28 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -30,9 +30,9 @@ FEATURES *lazy.nvim-lazy.nvim-features* - Manage all your Neovim plugins with a powerful UI -- Fast startup times thanks to automatic caching and bytecode compilation of lua modules +- 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 +- 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 @@ -76,7 +76,7 @@ You can add the following Lua code to your `init.lua` to bootstrap vim.opt.rtp:prepend(lazypath) < -Next step is to add **lazy.nvim** below the code added in the last step in +Nextstep is to add **lazy.nvim** below the code added in the prior step in `init.lua` >lua @@ -90,8 +90,8 @@ Next step is to add **lazy.nvim** below the code added in the last step in - **opts**see |lazy.nvim-configuration| **(optional)** >lua - -- example using a list of specs with the default options - vim.g.mapleader = " " -- make sure to set `mapleader` before lazy so your mappings are correct + -- Example using a list of specs with the default options + vim.g.mapleader = " " -- Make sure to set `mapleader` before lazy so your mappings are correct require("lazy").setup({ "folke/which-key.nvim", @@ -100,7 +100,7 @@ Next step is to add **lazy.nvim** below the code added in the last step in }) < -It is recommended to run `:checkhealth lazy` after installation +It is recommended to run `:checkhealth lazy` after installation. PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* @@ -200,8 +200,8 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* LAZY LOADING ~ **lazy.nvim** automagically lazy-loads Lua modules, so it is not needed to -specify `module=...` everywhere in your plugin specification. This mean that if -you have a plugin `A` that is lazy-loaded and a plugin `B` that requires a +specify `module=...` everywhere in your plugin specification. 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. If you don’t want this behavior for a certain plugin, you can specify that @@ -217,8 +217,8 @@ types** and **key mappings**. Plugins will be lazy-loaded when one of the following is `true` -- theplugin only exists as a dependency in your spec -- it has an `event`, `cmd`, `ft` or `keys` key +- Theplugin only exists as a dependency in your spec +- It has an `event`, `cmd`, `ft` or `keys` key - `config.defaults.lazy == true` @@ -711,7 +711,7 @@ load your plugins. DEBUG *lazy.nvim-lazy.nvim-debug* See an overview of active lazy-loading handlers and what’s in the module -cache +cache. STARTUP SEQUENCE *lazy.nvim-lazy.nvim-startup-sequence* @@ -723,7 +723,7 @@ 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 executed2. 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 you rtp are sourced (excluding `/after`)4. all `/after/plugin` files are sourced (this includes `/after` from plugins) +1. All the plugins’ `init()` functions are executed2. 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 you 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. @@ -739,9 +739,9 @@ 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 +- 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: @@ -764,7 +764,7 @@ Example: < -- any lua file in `~/.config/nvim/lua/plugins/.lua` will be automatically merged in the main plugin spec +- 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 <https://github.com/LazyVim/LazyVim> and more specifically: @@ -781,7 +781,7 @@ modules. Both of the `setup()` calls are equivalent: >lua require("lazy").setup("plugins") - -- same as: + -- Same as: require("lazy").setup({{import = "plugins"}}) < @@ -821,7 +821,7 @@ PACKER.NVIM ~ < 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 +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 @@ -848,7 +848,7 @@ directories: - **lockfile**`~/.config/nvim/lazy-lock.json` - paths can differ if you changed `XDG` environment variables. + Paths can differ if you changed `XDG` environment variables. HIGHLIGHT GROUPS *lazy.nvim-lazy.nvim-highlight-groups* From 0f713b2958b8a2e624fa0e2615418bd6c8fb8e10 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 28 Feb 2023 09:55:16 +0100 Subject: [PATCH 0815/1610] fix(ui): always show diagnostics virtual text --- lua/lazy/view/render.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 6cf424c..b84fb0f 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -84,7 +84,7 @@ function M:update() diag.lnum = diag.row - 1 return diag end, self._diagnostics), - { signs = false } + { signs = false, virtual_text = true } ) end From 5af93806aaa33fd9e8b4a7a32e9f847a3ad64c2a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 28 Feb 2023 10:51:17 +0100 Subject: [PATCH 0816/1610] fix(git): honor clone.defaultRemoteName. Fixes #602 --- lua/lazy/manage/git.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 116c5fe..2f37456 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -196,7 +196,9 @@ end ---@param repo string function M.get_origin(repo) - return M.get_config(repo)["remote.origin.url"] + local config = M.get_config(repo) + local remote = config["clone.defaultRemoteName"] or "origin" + return config["remote." .. remote .. ".url"] or config["remote.origin.url"] end ---@param repo string From 77223786aaa91446649d0dbdc3eabc2e53f9de6d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 28 Feb 2023 11:51:16 +0100 Subject: [PATCH 0817/1610] fix(git): properly deal with failed clones. Fixes #571 --- lua/lazy/core/config.lua | 2 ++ lua/lazy/core/plugin.lua | 10 ++++++++++ lua/lazy/manage/task/git.lua | 10 ++++++++++ 3 files changed, 22 insertions(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index bb974f7..94f1bf0 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -188,6 +188,8 @@ function M.setup(opts) M.options.lockfile = Util.norm(M.options.lockfile) M.options.readme.root = Util.norm(M.options.readme.root) + vim.fn.mkdir(M.options.root, "p") + if M.options.performance.reset_packpath then vim.go.packpath = vim.env.VIMRUNTIME end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index edd8ff0..f562da4 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -308,14 +308,24 @@ function Spec:merge(old, new) end function M.update_state() + ---@type string[] + local cloning = {} + ---@type table<string,FileType> local installed = {} Util.ls(Config.options.root, function(_, name, type) if type == "directory" and name ~= "readme" then installed[name] = type + elseif type == "file" and name:sub(-8) == ".cloning" then + name = name:sub(1, -9) + cloning[#cloning + 1] = name end end) + for _, failed in ipairs(cloning) do + installed[failed] = nil + end + for _, plugin in pairs(Config.plugins) do plugin._ = plugin._ or {} if plugin.lazy == nil then diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 3882362..cc1d3c4 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -1,6 +1,7 @@ local Git = require("lazy.manage.git") local Lock = require("lazy.manage.lock") local Config = require("lazy.core.config") +local Util = require("lazy.util") ---@type table<string, LazyTaskDef> local M = {} @@ -81,6 +82,14 @@ M.clone = { end table.insert(args, self.plugin.dir) + + if vim.fn.isdirectory(self.plugin.dir) == 1 then + require("lazy.manage.task.fs").clean.run(self, {}) + end + + local marker = self.plugin.dir .. ".cloning" + Util.write_file(marker, "") + self:spawn("git", { args = args, on_exit = function(ok) @@ -88,6 +97,7 @@ M.clone = { self.plugin._.cloned = true self.plugin._.installed = true self.plugin._.dirty = true + vim.loop.fs_unlink(marker) end end, }) From 79f85e5fed3ea020b09720e273c8b626f699b19a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 28 Feb 2023 12:38:10 +0100 Subject: [PATCH 0818/1610] fix(cache): add hack to work-around incorrect requires back. Not a fan of this. Fixes #603 --- lua/lazy/core/cache.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 6f7c4f5..c9313cd 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -231,6 +231,12 @@ function Cache.find(modname, opts) local basename = modname:gsub("%.", "/") local idx = modname:find(".", 1, true) + -- HACK: fix incorrect require statements. Really not a fan of keeping this + if idx == 1 then + modname = modname:gsub("^%.+", "") + basename = modname:gsub("%.", "/") + idx = modname:find(".", 1, true) + end local topmod = idx and modname:sub(1, idx - 1) or modname -- OPTIM: search for a directory first when topmod == modname From 26d121ea13bee96b079403cee6598f04969d4983 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Feb 2023 12:59:22 +0100 Subject: [PATCH 0819/1610] chore(main): release 9.9.0 (#601) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 17 +++++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4ad0b7..404489b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## [9.9.0](https://github.com/folke/lazy.nvim/compare/v9.8.5...v9.9.0) (2023-02-28) + + +### Features + +* **health:** check for paths on the rtp from plugged or packer ([9bd1c94](https://github.com/folke/lazy.nvim/commit/9bd1c946d6114affebb57dbe3e33741ded566559)) + + +### Bug Fixes + +* **cache:** add hack to work-around incorrect requires back. Not a fan of this. Fixes [#603](https://github.com/folke/lazy.nvim/issues/603) ([79f85e5](https://github.com/folke/lazy.nvim/commit/79f85e5fed3ea020b09720e273c8b626f699b19a)) +* **git:** honor clone.defaultRemoteName. Fixes [#602](https://github.com/folke/lazy.nvim/issues/602) ([5af9380](https://github.com/folke/lazy.nvim/commit/5af93806aaa33fd9e8b4a7a32e9f847a3ad64c2a)) +* **git:** properly deal with failed clones. Fixes [#571](https://github.com/folke/lazy.nvim/issues/571) ([7722378](https://github.com/folke/lazy.nvim/commit/77223786aaa91446649d0dbdc3eabc2e53f9de6d)) +* **health:** whitelist deactivate prop ([5694483](https://github.com/folke/lazy.nvim/commit/5694483e8782f4d9a01ea8822166998924df5f00)) +* **keys:** set nowait for lazy keymaps when needed. Fixes [#600](https://github.com/folke/lazy.nvim/issues/600) ([1657ae9](https://github.com/folke/lazy.nvim/commit/1657ae9b8c86d672517ac7f573eb180d3f5ecb79)) +* **ui:** always show diagnostics virtual text ([0f713b2](https://github.com/folke/lazy.nvim/commit/0f713b2958b8a2e624fa0e2615418bd6c8fb8e10)) + ## [9.8.5](https://github.com/folke/lazy.nvim/compare/v9.8.4...v9.8.5) (2023-02-20) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 94f1bf0..5015bf9 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.8.5" -- x-release-please-version +M.version = "9.9.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 1f7ffec177656ac806706097d23f288e3a5e0b51 Mon Sep 17 00:00:00 2001 From: kylo252 <59826753+kylo252@users.noreply.github.com> Date: Thu, 2 Mar 2023 14:25:50 +0100 Subject: [PATCH 0820/1610] feat(render): dim housekeeping commits by default (#612) * feat(render): dim housekeeping commits by default use `LazyComment` highlight group for commits with housekeeping types, i.e. chore/ci/doc * refactor: some small improvments to unimportant commits --------- Co-authored-by: Folke Lemaitre <folke.lemaitre@gmail.com> --- lua/lazy/view/colors.lua | 1 + lua/lazy/view/config.lua | 2 ++ lua/lazy/view/render.lua | 12 +++++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index 550ed09..333af82 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -9,6 +9,7 @@ M.colors = { CommitIssue = "Number", CommitType = "Title", -- conventional commit type CommitScope = "Italic", -- conventional commit scope + Dimmed = "Conceal", -- property Prop = "Conceal", -- property Value = "@string", -- value of a property NoCond = "DiagnosticWarn", -- unloaded icon for a plugin where `cond()` was false diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index 1f38540..6c73d40 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -24,6 +24,8 @@ function M.get_commands() return ret end +M.dimmed_commits = { "build", "ci", "chore", "doc" } + M.keys = { hover = "K", diff = "d", diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index b84fb0f..00f4072 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -456,15 +456,21 @@ function M:log(task) self:diagnostic({ message = "Breaking Changes", severity = vim.diagnostic.severity.WARN }) end self:append(ref:sub(1, 7) .. " ", "LazyCommit", { indent = 6 }) - self:append(vim.trim(msg)):highlight({ + + local dimmed = false + for _, dim in ipairs(ViewConfig.dimmed_commits) do + if msg:find("^" .. dim) then + dimmed = true + end + end + self:append(vim.trim(msg), dimmed and "LazyDimmed" or nil):highlight({ ["#%d+"] = "LazyCommitIssue", - ["^%S+:"] = "LazyCommitType", + ["^%S+:"] = dimmed and "Bold" or "LazyCommitType", ["^%S+(%(.*%)):"] = "LazyCommitScope", ["`.-`"] = "@text.literal.markdown_inline", ["%*.-%*"] = "Italic", ["%*%*.-%*%*"] = "Bold", }) - -- string.gsub self:append(" " .. time, "LazyComment") self:nl() end From 2691c8f7a5ed329a639a994b0e9570b798813192 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 2 Mar 2023 13:26:43 +0000 Subject: [PATCH 0821/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ecd4f9b..5769704 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 February 28 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 02 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 8d18ef44e769e98a8dc974ca85275de1d8cc7c04 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 Mar 2023 14:29:16 +0100 Subject: [PATCH 0822/1610] chore(main): release 9.10.0 (#613) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 404489b..221f603 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.10.0](https://github.com/folke/lazy.nvim/compare/v9.9.0...v9.10.0) (2023-03-02) + + +### Features + +* **render:** dim housekeeping commits by default ([#612](https://github.com/folke/lazy.nvim/issues/612)) ([1f7ffec](https://github.com/folke/lazy.nvim/commit/1f7ffec177656ac806706097d23f288e3a5e0b51)) + ## [9.9.0](https://github.com/folke/lazy.nvim/compare/v9.8.5...v9.9.0) (2023-02-28) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5015bf9..edf50a4 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.9.0" -- x-release-please-version +M.version = "9.10.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From c60f7ea985c488192a38bb3ddf7705f958bd3674 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 4 Mar 2023 18:20:27 +0100 Subject: [PATCH 0823/1610] fix(process): unset GIT_WORK_TREE --- lua/lazy/manage/process.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 530aeaa..04b31bb 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -62,6 +62,7 @@ function M.spawn(cmd, opts) GIT_SSH_COMMAND = "ssh -oBatchMode=yes", }, uv.os_environ(), opts.env or {}) env.GIT_DIR = nil + env.GIT_WORK_TREE = nil env.GIT_TERMINAL_PROMPT = "0" ---@type string[] From b5667ec94df71736084655cdf3288d76b19ec224 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 4 Mar 2023 17:21:19 +0000 Subject: [PATCH 0824/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5769704..7255c80 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 02 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 04 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 14075657131b9a19883a8845c47f1ab65461cd6f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 4 Mar 2023 18:28:10 +0100 Subject: [PATCH 0825/1610] chore(main): release 9.10.1 (#619) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 221f603..b9b0d68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.10.1](https://github.com/folke/lazy.nvim/compare/v9.10.0...v9.10.1) (2023-03-04) + + +### Bug Fixes + +* **process:** unset GIT_WORK_TREE ([c60f7ea](https://github.com/folke/lazy.nvim/commit/c60f7ea985c488192a38bb3ddf7705f958bd3674)) + ## [9.10.0](https://github.com/folke/lazy.nvim/compare/v9.9.0...v9.10.0) (2023-03-02) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index edf50a4..f762df2 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.10.0" -- x-release-please-version +M.version = "9.10.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 53be2c0ee1848fee2a47b89d184ad02410d3c319 Mon Sep 17 00:00:00 2001 From: Sean Baildon <sean@baildon.co> Date: Sun, 5 Mar 2023 13:09:15 +0000 Subject: [PATCH 0826/1610] fix(git): always set origin name when cloning (#622) * fix(git): force origin name * Revert "fix(git): honor clone.defaultRemoteName. Fixes #602" This reverts commit 5af93806aaa33fd9e8b4a7a32e9f847a3ad64c2a. --- lua/lazy/manage/git.lua | 4 +--- lua/lazy/manage/task/git.lua | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 2f37456..116c5fe 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -196,9 +196,7 @@ end ---@param repo string function M.get_origin(repo) - local config = M.get_config(repo) - local remote = config["clone.defaultRemoteName"] or "origin" - return config["remote." .. remote .. ".url"] or config["remote.origin.url"] + return M.get_config(repo)["remote.origin.url"] end ---@param repo string diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index cc1d3c4..bcecfec 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -75,6 +75,8 @@ M.clone = { args[#args + 1] = "--recurse-submodules" end + args[#args + 1] = "--origin=origin" + args[#args + 1] = "--progress" if self.plugin.branch then From f9ddb2d41b129516faa8ff144f368b1b76f6d48d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 5 Mar 2023 13:09:59 +0000 Subject: [PATCH 0827/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 7255c80..e53d566 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 04 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 05 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 47fc27e3f18ffa74cc542c5605558132e76bb00d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 6 Mar 2023 07:39:56 +0100 Subject: [PATCH 0828/1610] style: typo. Fixes #625 --- README.md | 3 ++- lua/lazy/core/config.lua | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e0ecbd4..4d26ae2 100644 --- a/README.md +++ b/README.md @@ -316,7 +316,7 @@ return { 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 is 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. filter = true, }, @@ -742,6 +742,7 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori | **LazyCommitIssue** | **_Number_** | | | **LazyCommitScope** | **_Italic_** | conventional commit scope | | **LazyCommitType** | **_Title_** | conventional commit type | +| **LazyDimmed** | **_Conceal_** | property | | **LazyDir** | **_@text.reference_** | directory | | **LazyH1** | **_IncSearch_** | home button | | **LazyH2** | **_Bold_** | titles | diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f762df2..4a89d17 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -22,7 +22,7 @@ M.defaults = { 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 is 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. filter = true, }, From e89acede13f46a5db229133cf0c87aee74938c56 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Mar 2023 06:41:03 +0000 Subject: [PATCH 0829/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e53d566..cbdd161 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 05 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -409,7 +409,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* 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 is 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. filter = true, }, @@ -871,6 +871,8 @@ Click to see all highlight groups ~ LazyCommitType Title conventional commit type + LazyDimmed Conceal property + LazyDir _@text.reference_ directory LazyH1 IncSearch homebutton From 355312eb514b58b79e93753d46b2612a21949aa4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 7 Mar 2023 19:11:33 +0100 Subject: [PATCH 0830/1610] fix(plugin): properly pass is_list for recursively merging props --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f562da4..220b70a 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -434,7 +434,7 @@ end ---@param is_list? boolean function M.values(plugin, prop, is_list) ---@type table - local ret = plugin._.super and M.values(plugin._.super, prop) or {} + local ret = plugin._.super and M.values(plugin._.super, prop, is_list) or {} local values = rawget(plugin, prop) if not values then From 3efcb149cf54ddb5b4dadeda8b6b39a4d25e5db3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 18:12:25 +0000 Subject: [PATCH 0831/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index cbdd161..994314c 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 06 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 07 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 5b4444f0d7e556deba3f7ca949a2ba0e2c3369fb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 19:13:36 +0100 Subject: [PATCH 0832/1610] chore(main): release 9.10.2 (#623) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9b0d68..a078bb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [9.10.2](https://github.com/folke/lazy.nvim/compare/v9.10.1...v9.10.2) (2023-03-07) + + +### Bug Fixes + +* **git:** always set origin name when cloning ([#622](https://github.com/folke/lazy.nvim/issues/622)) ([53be2c0](https://github.com/folke/lazy.nvim/commit/53be2c0ee1848fee2a47b89d184ad02410d3c319)) +* **plugin:** properly pass is_list for recursively merging props ([355312e](https://github.com/folke/lazy.nvim/commit/355312eb514b58b79e93753d46b2612a21949aa4)) + ## [9.10.1](https://github.com/folke/lazy.nvim/compare/v9.10.0...v9.10.1) (2023-03-04) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4a89d17..ddd2ef8 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.10.1" -- x-release-please-version +M.version = "9.10.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 8d73b9bccd1fef7a7d3f5cc990c79b2dafcd9a3a Mon Sep 17 00:00:00 2001 From: tobiaslieber <14908876+tobiaslieber@users.noreply.github.com> Date: Mon, 13 Mar 2023 22:50:50 +0100 Subject: [PATCH 0833/1610] fix(cache): path (#645) --- lua/lazy/core/cache.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index c9313cd..22e09c3 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -341,7 +341,7 @@ function M.lsmod(path) break end -- HACK: type is not always returned due to a bug in luv - t = t or uv.fs_stat(path .. "/" .. name).type + t = t or uv.fs_stat(path .. "/lua/" .. name).type ---@type string local topname local ext = name:sub(-4) From 82793099347ed91a74fa265077f5e60119999722 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Mar 2023 21:51:35 +0000 Subject: [PATCH 0834/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 994314c..654a13e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 07 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 13 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 623e00cabbc908f635150e73d4250cf4f241d919 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Mar 2023 22:56:12 +0100 Subject: [PATCH 0835/1610] chore(main): release 9.10.3 (#646) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a078bb0..8faad58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.10.3](https://github.com/folke/lazy.nvim/compare/v9.10.2...v9.10.3) (2023-03-13) + + +### Bug Fixes + +* **cache:** path ([#645](https://github.com/folke/lazy.nvim/issues/645)) ([8d73b9b](https://github.com/folke/lazy.nvim/commit/8d73b9bccd1fef7a7d3f5cc990c79b2dafcd9a3a)) + ## [9.10.2](https://github.com/folke/lazy.nvim/compare/v9.10.1...v9.10.2) (2023-03-07) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index ddd2ef8..5b43d72 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -147,7 +147,7 @@ M.defaults = { debug = false, } -M.version = "9.10.2" -- x-release-please-version +M.version = "9.10.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 10f5844abf30eb9b180efece36639b6eecb33e86 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 11:17:54 +0100 Subject: [PATCH 0836/1610] fix(loader): never load lua files from a plugin where cond=false. Show error instead --- lua/lazy/core/loader.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 833b432..6ac898c 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -460,6 +460,9 @@ function M.auto_load(modname, modpath) error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") end M.load(plugin, { require = modname }) + if plugin._.cond == false then + error("You're trying to load `" .. plugin.name .. "` for which `cond==false`") + end end return true end @@ -470,7 +473,6 @@ end function M.loader(modname) local paths = Util.get_unloaded_rtp(modname) local modpath, hash = Cache._Cache.find(modname, { rtp = false, paths = paths }) - -- print(modname .. " " .. paths[1]) if modpath then M.auto_load(modname, modpath) local mod = package.loaded[modname] From 9afba388facee5ce45d244c0e10ce650d42d9495 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 11:19:51 +0100 Subject: [PATCH 0837/1610] feat(plugin): added config.defaults.cond. Fixes #640 --- README.md | 5 ++++- lua/lazy/core/config.lua | 3 +++ lua/lazy/core/loader.lua | 8 ++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4d26ae2..0dfc7c6 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ require("lazy").setup({ | **dev** | `boolean?` | When `true`, a local plugin directory will be used instead. See `config.dev` | | **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 | | **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 `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | +| **cond** | `boolean?` or `fun(LazyPlugin):boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | | **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. | | **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | | **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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()` | @@ -303,6 +303,9 @@ return { defaults = { lazy = false, -- should plugins be lazy-loaded? version = nil, + -- 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 -- version = "*", -- enable this to try installing the latest stable versions of plugins }, -- leave nil when passing the spec as the first argument to setup() diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5b43d72..043cac8 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -9,6 +9,9 @@ M.defaults = { defaults = { lazy = false, -- should plugins be lazy-loaded? version = nil, + -- 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 -- version = "*", -- enable this to try installing the latest stable versions of plugins }, -- leave nil when passing the spec as the first argument to setup() diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 6ac898c..118a61f 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -266,8 +266,12 @@ function M._load(plugin, reason, opts) return Util.error("Plugin " .. plugin.name .. " is not installed") end - if plugin.cond ~= nil and not (opts and opts.force) then - if plugin.cond == false or (type(plugin.cond) == "function" and not plugin.cond()) then + local cond = plugin.cond + if cond == nil then + cond = Config.options.defaults.cond + end + if cond ~= nil and not (opts and opts.force) then + if cond == false or (type(cond) == "function" and not cond(plugin)) then plugin._.cond = false return end From 51c07f734f9854187429f9fa25ade8bff4e271d8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Mar 2023 10:20:47 +0000 Subject: [PATCH 0838/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 654a13e..f4b96cb 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 13 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 14 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -129,7 +129,7 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* 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 fun():boolean When false, or if the function returns false, then + cond boolean? or fun(LazyPlugin):boolean When false, or if the function returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. @@ -396,6 +396,9 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* defaults = { lazy = false, -- should plugins be lazy-loaded? version = nil, + -- 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 -- version = "", -- enable this to try installing the latest stable versions of plugins }, -- leave nil when passing the spec as the first argument to setup() From 5550f9927195dee9444eee4f26b1a22fcd88a191 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Mar 2023 11:27:31 +0100 Subject: [PATCH 0839/1610] chore(main): release 9.11.0 (#652) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8faad58..902c3e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [9.11.0](https://github.com/folke/lazy.nvim/compare/v9.10.3...v9.11.0) (2023-03-14) + + +### Features + +* **plugin:** added config.defaults.cond. Fixes [#640](https://github.com/folke/lazy.nvim/issues/640) ([9afba38](https://github.com/folke/lazy.nvim/commit/9afba388facee5ce45d244c0e10ce650d42d9495)) + + +### Bug Fixes + +* **loader:** never load lua files from a plugin where cond=false. Show error instead ([10f5844](https://github.com/folke/lazy.nvim/commit/10f5844abf30eb9b180efece36639b6eecb33e86)) + ## [9.10.3](https://github.com/folke/lazy.nvim/compare/v9.10.2...v9.10.3) (2023-03-13) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 043cac8..531ad99 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -150,7 +150,7 @@ M.defaults = { debug = false, } -M.version = "9.10.3" -- x-release-please-version +M.version = "9.11.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 1a34636094f105c6c7d55b15149ed5e8e168e248 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 12:56:58 +0100 Subject: [PATCH 0840/1610] refactor(cache): documented the cache in preparation to upstream --- lua/lazy/core/cache.lua | 67 ++++++++++++++++++++++++++++++---------- lua/lazy/core/loader.lua | 2 +- lua/lazy/core/plugin.lua | 1 - 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 22e09c3..0da32d0 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -51,6 +51,10 @@ function Cache.normalize(path) return path:sub(-1) == "/" and path:sub(1, -2) or path end +-- Gets the rtp excluding after directories. +-- The result is cached, and will be updated if the runtime path changes. +-- When called from a fast event, the cached value will be returned. +--- @return string[] rtp, boolean updated ---@private function Cache.get_rtp() local start = uv.hrtime() @@ -76,13 +80,17 @@ function Cache.get_rtp() return Cache._rtp, updated end +-- Returns the cache file name ---@param name string can be a module name, or a file name +---@return string file_name ---@private function Cache.cache_file(name) local ret = M.path .. "/" .. name:gsub("[/\\:]", "%%") return ret:sub(-4) == ".lua" and (ret .. "c") or (ret .. ".luac") end +-- Saves the cache entry for a given module or file +---@param name string module name or filename ---@param entry CacheEntry ---@private function Cache.write(name, entry) @@ -99,6 +107,8 @@ function Cache.write(name, entry) uv.fs_close(f) end +-- Loads the cache entry for a given module or file +---@param name string module name or filename ---@return CacheEntry? ---@private function Cache.read(name) @@ -124,11 +134,13 @@ function Cache.read(name) M.track("read", start) end ----@param modname string +-- The `package.loaders` loader for lua files using the cache. +---@param modname string module name +---@return string|function ---@private function Cache.loader(modname) local start = uv.hrtime() - local modpath, hash = Cache.find(modname) + local modpath, hash = M.find(modname) if modpath then local chunk, err = M.load(modpath, { hash = hash }) M.track("loader", start) @@ -138,11 +150,13 @@ function Cache.loader(modname) return "\nlazy_loader: module " .. modname .. " not found" end ----@param modname string +-- The `package.loaders` loader for libs +---@param modname string module name +---@return string|function ---@private function Cache.loader_lib(modname) local start = uv.hrtime() - local modpath = Cache.find(modname, { patterns = jit.os:find("Windows") and { ".dll" } or { ".so" } }) + local modpath = M.find(modname, { patterns = jit.os:find("Windows") and { ".dll" } or { ".so" } }) ---@type function?, string? if modpath then -- Making function name in Lua 5.1 (see src/loadlib.c:mkfuncname) is @@ -160,6 +174,7 @@ function Cache.loader_lib(modname) return "\nlazy_loader_lib: module " .. modname .. " not found" end +-- `loadfile` using the cache ---@param filename? string ---@param mode? "b"|"t"|"bt" ---@param env? table @@ -168,11 +183,16 @@ end function Cache.loadfile(filename, mode, env) local start = uv.hrtime() filename = Cache.normalize(filename) + mode = nil -- ignore mode, since we byte-compile the lua source files local chunk, err = M.load(filename, { mode = mode, env = env }) M.track("loadfile", start) return chunk, err end +-- Checks whether two cache hashes are the same based on: +-- * file size +-- * mtime in seconds +-- * mtime in nanoseconds ---@param h1 CacheHash ---@param h2 CacheHash ---@private @@ -180,6 +200,7 @@ function Cache.eq(h1, h2) return h1 and h2 and h1.size == h2.size and h1.mtime.sec == h2.mtime.sec and h1.mtime.nsec == h2.mtime.nsec end +-- Loads the given module path using the cache ---@param modpath string ---@param opts? {hash?: CacheHash, mode?: "b"|"t"|"bt", env?:table} ---@return function?, string? error_message @@ -220,10 +241,11 @@ function M.load(modpath, opts) return chunk, err end +-- Finds the module path for the given module name ---@param modname string ---@param opts? CacheFindOpts ----@return string? modpath, CacheHash? hash, CacheEntry? entry -function Cache.find(modname, opts) +---@return string? modpath, CacheHash? hash +function M.find(modname, opts) local start = uv.hrtime() opts = opts or {} @@ -231,12 +253,15 @@ function Cache.find(modname, opts) local basename = modname:gsub("%.", "/") local idx = modname:find(".", 1, true) - -- HACK: fix incorrect require statements. Really not a fan of keeping this + -- HACK: fix incorrect require statements. Really not a fan of keeping this, + -- but apparently the regular lua loader also allows this if idx == 1 then modname = modname:gsub("^%.+", "") basename = modname:gsub("%.", "/") idx = modname:find(".", 1, true) end + + -- get the top-level module name local topmod = idx and modname:sub(1, idx - 1) or modname -- OPTIM: search for a directory first when topmod == modname @@ -245,7 +270,11 @@ function Cache.find(modname, opts) patterns[p] = "/lua/" .. basename .. pattern end + -- Checks if the given paths contain the top-level module. + -- If so, it tries to find the module path for the given module name. ---@param paths string[] + ---@return string? modpath, CacheHash? hash + ---@private local function _find(paths) for _, path in ipairs(paths) do if M.lsmod(path)[topmod] then @@ -261,9 +290,10 @@ function Cache.find(modname, opts) end end - ---@type string, CacheHash + ---@type string?, CacheHash? local modpath, hash + -- always check the rtp first if opts.rtp ~= false then modpath, hash = _find(Cache._rtp or {}) if not modpath then @@ -273,6 +303,8 @@ function Cache.find(modname, opts) end end end + + -- check any additional paths if (not modpath) and opts.paths then modpath, hash = _find(opts.paths) end @@ -291,6 +323,11 @@ function M.reset(path) Cache._indexed[Cache.normalize(path)] = nil end +-- Enables the cache: +-- * override loadfile +-- * adds the lua loader +-- * adds the libs loader +-- * remove the Neovim loader function M.enable() if M.enabled then return @@ -312,6 +349,9 @@ function M.enable() end end +-- Disables the cache: +-- * removes the cache loaders +-- * adds the Neovim loader function M.disable() if not M.enabled then return @@ -365,14 +405,7 @@ function M.lsmod(path) return Cache._indexed[path] end ----@param modname string ----@param opts? CacheFindOpts ----@return string? modpath -function M.find(modname, opts) - local modpath = Cache.find(modname, opts) - return modpath -end - +-- Debug function that wrapps all loaders and tracks stats function M.profile_loaders() for l, loader in pairs(package.loaders) do local loc = debug.getinfo(loader, "Sn").source:sub(2) @@ -386,7 +419,9 @@ function M.profile_loaders() end end +-- Prints all cache stats function M.inspect() + ---@private local function ms(nsec) return math.floor(nsec / 1e6 * 1000 + 0.5) / 1000 .. "ms" end diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 118a61f..86bb692 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -476,7 +476,7 @@ end ---@param modname string function M.loader(modname) local paths = Util.get_unloaded_rtp(modname) - local modpath, hash = Cache._Cache.find(modname, { rtp = false, paths = paths }) + local modpath, hash = Cache.find(modname, { rtp = false, paths = paths }) if modpath then M.auto_load(modname, modpath) local mod = package.loaded[modname] diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 220b70a..e942753 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -250,7 +250,6 @@ function Spec:import(spec) return end - Cache.indexed_unloaded = false self.modules[#self.modules + 1] = spec.import local imported = 0 From 49dda8751e99aae2ae7073c6374bc1b8c38d0649 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 13:07:56 +0100 Subject: [PATCH 0841/1610] feat(cache): remove any mentions of lazy. Move the cache to cache/luac instead of cache/lazy/luac --- lua/lazy/core/cache.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 0da32d0..64eca69 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -12,8 +12,9 @@ local M = {} ---@field paths? string[] Extra paths to search for modname M.VERSION = 2 -M.path = vim.fn.stdpath("cache") .. "/lazy/luac" +M.path = vim.fn.stdpath("cache") .. "/luac" M.enabled = false +---@type table<string, {total:number, time:number, [string]:number?}?> M.stats = { find = { total = 0, time = 0, not_found = 0 }, } @@ -147,7 +148,7 @@ function Cache.loader(modname) return chunk or error(err) end M.track("loader", start) - return "\nlazy_loader: module " .. modname .. " not found" + return "\ncache_loader: module " .. modname .. " not found" end -- The `package.loaders` loader for libs @@ -171,7 +172,7 @@ function Cache.loader_lib(modname) return chunk or error(err) end M.track("loader_lib", start) - return "\nlazy_loader_lib: module " .. modname .. " not found" + return "\ncache_loader_lib: module " .. modname .. " not found" end -- `loadfile` using the cache @@ -347,6 +348,9 @@ function M.enable() break end end + -- TODO: add an autocmd on BufWritePost that checks if its in a /lua folder + -- if thats the case, then reset the plugin path. + -- This will make sure we can properly load new top-level lua modules end -- Disables the cache: From d0db9f83efd8f5761b8b464ff37d38a9833698c3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 14:07:41 +0100 Subject: [PATCH 0842/1610] docs(cache): more code comments --- lua/lazy/core/cache.lua | 80 ++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 64eca69..7a8c3c0 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -1,3 +1,8 @@ +-- interop with the native Neovim cache +if type(package.loaded["vim.cache"]) == "table" then + return package.loaded["vim.cache"] +end + local ffi = require("ffi") local uv = vim.loop @@ -31,14 +36,16 @@ local Cache = { _loadfile = loadfile, } +--- Tracks the time spent in a function +---@private function M.track(stat, start) M.stats[stat] = M.stats[stat] or { total = 0, time = 0 } M.stats[stat].total = M.stats[stat].total + 1 M.stats[stat].time = M.stats[stat].time + uv.hrtime() - start end --- slightly faster/different version than vim.fs.normalize --- we also need to have it here, since the cache will load vim.fs +--- slightly faster/different version than vim.fs.normalize +--- we also need to have it here, since the cache will load vim.fs ---@private function Cache.normalize(path) if path:sub(1, 1) == "~" then @@ -52,9 +59,9 @@ function Cache.normalize(path) return path:sub(-1) == "/" and path:sub(1, -2) or path end --- Gets the rtp excluding after directories. --- The result is cached, and will be updated if the runtime path changes. --- When called from a fast event, the cached value will be returned. +--- Gets the rtp excluding after directories. +--- The result is cached, and will be updated if the runtime path changes. +--- When called from a fast event, the cached value will be returned. --- @return string[] rtp, boolean updated ---@private function Cache.get_rtp() @@ -81,7 +88,7 @@ function Cache.get_rtp() return Cache._rtp, updated end --- Returns the cache file name +--- Returns the cache file name ---@param name string can be a module name, or a file name ---@return string file_name ---@private @@ -90,7 +97,7 @@ function Cache.cache_file(name) return ret:sub(-4) == ".lua" and (ret .. "c") or (ret .. ".luac") end --- Saves the cache entry for a given module or file +--- Saves the cache entry for a given module or file ---@param name string module name or filename ---@param entry CacheEntry ---@private @@ -108,7 +115,7 @@ function Cache.write(name, entry) uv.fs_close(f) end --- Loads the cache entry for a given module or file +--- Loads the cache entry for a given module or file ---@param name string module name or filename ---@return CacheEntry? ---@private @@ -135,7 +142,7 @@ function Cache.read(name) M.track("read", start) end --- The `package.loaders` loader for lua files using the cache. +--- The `package.loaders` loader for lua files using the cache. ---@param modname string module name ---@return string|function ---@private @@ -151,7 +158,7 @@ function Cache.loader(modname) return "\ncache_loader: module " .. modname .. " not found" end --- The `package.loaders` loader for libs +--- The `package.loaders` loader for libs ---@param modname string module name ---@return string|function ---@private @@ -175,7 +182,7 @@ function Cache.loader_lib(modname) return "\ncache_loader_lib: module " .. modname .. " not found" end --- `loadfile` using the cache +--- `loadfile` using the cache ---@param filename? string ---@param mode? "b"|"t"|"bt" ---@param env? table @@ -190,10 +197,10 @@ function Cache.loadfile(filename, mode, env) return chunk, err end --- Checks whether two cache hashes are the same based on: --- * file size --- * mtime in seconds --- * mtime in nanoseconds +--- Checks whether two cache hashes are the same based on: +--- * file size +--- * mtime in seconds +--- * mtime in nanoseconds ---@param h1 CacheHash ---@param h2 CacheHash ---@private @@ -201,11 +208,14 @@ function Cache.eq(h1, h2) return h1 and h2 and h1.size == h2.size and h1.mtime.sec == h2.mtime.sec and h1.mtime.nsec == h2.mtime.nsec end --- Loads the given module path using the cache +--- Loads the given module path using the cache ---@param modpath string ----@param opts? {hash?: CacheHash, mode?: "b"|"t"|"bt", env?:table} +---@param opts? {hash?: CacheHash, mode?: "b"|"t"|"bt", env?:table} (table|nil) Options for loading the module: +--- - hash: (table) the hash of the file to load if it is already known. (defaults to `vim.loop.fs_stat({modpath})`) +--- - mode: (string) the mode to load the module with. "b"|"t"|"bt" (defaults to `nil`) +--- - env: (table) the environment to load the module in. (defaults to `nil`) +---@see |luaL_loadfile()| ---@return function?, string? error_message ----@private function M.load(modpath, opts) local start = uv.hrtime() @@ -242,10 +252,13 @@ function M.load(modpath, opts) return chunk, err end --- Finds the module path for the given module name +--- Finds the module path for the given module name ---@param modname string ----@param opts? CacheFindOpts ----@return string? modpath, CacheHash? hash +---@param opts? CacheFindOpts (table|nil) Options for finding a module: +--- - rtp: (boolean) Search for modname in the runtime path (defaults to `true`) +--- - patterns: (string[]) Paterns to use (defaults to `{"/init.lua", ".lua"}`) +--- - paths: (string[]) Extra paths to search for modname (defaults to `{}`) +---@return string? modpath, CacheHash? hash (string|nil) modpath for the module function M.find(modname, opts) local start = uv.hrtime() opts = opts or {} @@ -319,16 +332,16 @@ function M.find(modname, opts) end --- Resets the topmods cache for the path ----@param path string +---@param path string path to reset function M.reset(path) Cache._indexed[Cache.normalize(path)] = nil end --- Enables the cache: --- * override loadfile --- * adds the lua loader --- * adds the libs loader --- * remove the Neovim loader +--- Enables the cache: +--- * override loadfile +--- * adds the lua loader +--- * adds the libs loader +--- * remove the Neovim loader function M.enable() if M.enabled then return @@ -353,9 +366,9 @@ function M.enable() -- This will make sure we can properly load new top-level lua modules end --- Disables the cache: --- * removes the cache loaders --- * adds the Neovim loader +--- Disables the cache: +--- * removes the cache loaders +--- * adds the Neovim loader function M.disable() if not M.enabled then return @@ -372,7 +385,8 @@ function M.disable() table.insert(package.loaders, 2, vim._load_package) end --- Return the top-level `/lua/*` modules for this path +--- Return the top-level `/lua/*` modules for this path +---@param path string path to check for top-level lua modules ---@return string[] function M.lsmod(path) if not Cache._indexed[path] then @@ -409,7 +423,7 @@ function M.lsmod(path) return Cache._indexed[path] end --- Debug function that wrapps all loaders and tracks stats +--- Debug function that wrapps all loaders and tracks stats function M.profile_loaders() for l, loader in pairs(package.loaders) do local loc = debug.getinfo(loader, "Sn").source:sub(2) @@ -423,7 +437,7 @@ function M.profile_loaders() end end --- Prints all cache stats +--- Prints all cache stats function M.inspect() ---@private local function ms(nsec) From 0b7596f609c4f2620240c6ba8218e065610255e6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 18:31:43 +0100 Subject: [PATCH 0843/1610] style(cache): disable duplicate warnings --- lua/lazy/core/cache.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 7a8c3c0..7ca5a35 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -1,3 +1,7 @@ +---@diagnostic disable: duplicate-doc-alias +---@diagnostic disable: duplicate-doc-field +---@diagnostic disable: duplicate-set-field + -- interop with the native Neovim cache if type(package.loaded["vim.cache"]) == "table" then return package.loaded["vim.cache"] From da295017e423b1a1ab81d7234b887a841218093c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 18:32:29 +0100 Subject: [PATCH 0844/1610] refactor(cache): Cache.track => Cache._track --- lua/lazy/core/cache.lua | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 7ca5a35..ff7785f 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -42,7 +42,7 @@ local Cache = { --- Tracks the time spent in a function ---@private -function M.track(stat, start) +function M._track(stat, start) M.stats[stat] = M.stats[stat] or { total = 0, time = 0 } M.stats[stat].total = M.stats[stat].total + 1 M.stats[stat].time = M.stats[stat].time + uv.hrtime() - start @@ -71,7 +71,7 @@ end function Cache.get_rtp() local start = uv.hrtime() if vim.in_fast_event() then - M.track("get_rtp", start) + M._track("get_rtp", start) return (Cache._rtp or {}), false end local updated = false @@ -88,7 +88,7 @@ function Cache.get_rtp() updated = true Cache._rtp_key = key end - M.track("get_rtp", start) + M._track("get_rtp", start) return Cache._rtp, updated end @@ -143,7 +143,7 @@ function Cache.read(name) chunk = data:sub(16 + 1), } end - M.track("read", start) + M._track("read", start) end --- The `package.loaders` loader for lua files using the cache. @@ -155,10 +155,10 @@ function Cache.loader(modname) local modpath, hash = M.find(modname) if modpath then local chunk, err = M.load(modpath, { hash = hash }) - M.track("loader", start) + M._track("loader", start) return chunk or error(err) end - M.track("loader", start) + M._track("loader", start) return "\ncache_loader: module " .. modname .. " not found" end @@ -179,10 +179,10 @@ function Cache.loader_lib(modname) local dash = modname:find("-", 1, true) local funcname = dash and modname:sub(dash + 1) or modname local chunk, err = package.loadlib(modpath, "luaopen_" .. funcname:gsub("%.", "_")) - M.track("loader_lib", start) + M._track("loader_lib", start) return chunk or error(err) end - M.track("loader_lib", start) + M._track("loader_lib", start) return "\ncache_loader_lib: module " .. modname .. " not found" end @@ -197,7 +197,7 @@ function Cache.loadfile(filename, mode, env) filename = Cache.normalize(filename) mode = nil -- ignore mode, since we byte-compile the lua source files local chunk, err = M.load(filename, { mode = mode, env = env }) - M.track("loadfile", start) + M._track("loadfile", start) return chunk, err end @@ -231,7 +231,7 @@ function M.load(modpath, opts) if not hash then -- trigger correct error chunk, err = Cache._loadfile(modpath, opts.mode, opts.env) - M.track("load", start) + M._track("load", start) return chunk, err end @@ -241,7 +241,7 @@ function M.load(modpath, opts) -- selene: allow(incorrect_standard_library_use) chunk, err = load(entry.chunk --[[@as string]], "@" .. modpath, opts.mode, opts.env) if not (err and err:find("cannot load incompatible bytecode", 1, true)) then - M.track("load", start) + M._track("load", start) return chunk, err end end @@ -252,7 +252,7 @@ function M.load(modpath, opts) entry.chunk = string.dump(chunk) Cache.write(modpath, entry) end - M.track("load", start) + M._track("load", start) return chunk, err end @@ -327,7 +327,7 @@ function M.find(modname, opts) modpath, hash = _find(opts.paths) end - M.track("find", start) + M._track("find", start) if modpath then return modpath, hash end @@ -422,7 +422,7 @@ function M.lsmod(path) end end end - M.track("lsmod", start) + M._track("lsmod", start) end return Cache._indexed[path] end @@ -434,8 +434,8 @@ function M.profile_loaders() package.loaders[l] = function(modname) local start = vim.loop.hrtime() local ret = loader(modname) - M.track("loader " .. l .. ": " .. loc, start) - M.track("loader_all", start) + M._track("loader " .. l .. ": " .. loc, start) + M._track("loader_all", start) return ret end end From 810acc1e86180403308e1cf650ed9fb0c5d27a44 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 18:33:16 +0100 Subject: [PATCH 0845/1610] feat(cache): drop dependency on ffi --- lua/lazy/core/cache.lua | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index ff7785f..d164f9a 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -7,7 +7,6 @@ if type(package.loaded["vim.cache"]) == "table" then return package.loaded["vim.cache"] end -local ffi = require("ffi") local uv = vim.loop local M = {} @@ -20,7 +19,7 @@ local M = {} ---@field patterns? string[] Paterns to use (defaults to `{"/init.lua", ".lua"}`) ---@field paths? string[] Extra paths to search for modname -M.VERSION = 2 +M.VERSION = 3 M.path = vim.fn.stdpath("cache") .. "/luac" M.enabled = false ---@type table<string, {total:number, time:number, [string]:number?}?> @@ -114,7 +113,7 @@ function Cache.write(name, entry) entry.hash.mtime.sec, entry.hash.mtime.nsec, } - uv.fs_write(f, ffi.string(ffi.new("const uint32_t[4]", header), 16)) + uv.fs_write(f, table.concat(header, ",") .. "\0") uv.fs_write(f, entry.chunk) uv.fs_close(f) end @@ -132,15 +131,17 @@ function Cache.read(name) local data = uv.fs_read(f, hash.size, 0) --[[@as string]] uv.fs_close(f) + local zero = data:find("\0", 1, true) + ---@type integer[]|{[0]:integer} - local header = ffi.cast("uint32_t*", ffi.new("const char[16]", data:sub(1, 16))) - if header[0] ~= M.VERSION then + local header = vim.split(data:sub(1, zero - 1), ",") + if tonumber(header[1]) ~= M.VERSION then return end - M.track("read", start) + M._track("read", start) return { - hash = { size = header[1], mtime = { sec = header[2], nsec = header[3] } }, - chunk = data:sub(16 + 1), + hash = { size = tonumber(header[2]), mtime = { sec = tonumber(header[3]), nsec = tonumber(header[4]) } }, + chunk = data:sub(zero + 1), } end M._track("read", start) From 2a88a73acea8cc7988e5114097213528f7c510f3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 18:33:39 +0100 Subject: [PATCH 0846/1610] style(cache): ignore a luacheck error --- lua/lazy/core/cache.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index d164f9a..a856db6 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -193,6 +193,7 @@ end ---@param env? table ---@return function?, string? error_message ---@private +-- luacheck: ignore 312 function Cache.loadfile(filename, mode, env) local start = uv.hrtime() filename = Cache.normalize(filename) @@ -332,6 +333,7 @@ function M.find(modname, opts) if modpath then return modpath, hash end + -- module not found M.stats.find.not_found = M.stats.find.not_found + 1 end From 4446d69c28aa27c2621bdb185e4a0afef355987e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 18:37:27 +0100 Subject: [PATCH 0847/1610] build(cache): added script to sync cache implementation with Neovim --- lua/lazy/core/cache.lua | 1 + scripts/update-neovim-cache | 4 ++++ 2 files changed, 5 insertions(+) create mode 100755 scripts/update-neovim-cache diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index a856db6..d96875a 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -7,6 +7,7 @@ if type(package.loaded["vim.cache"]) == "table" then return package.loaded["vim.cache"] end +-- NEOVIM local uv = vim.loop local M = {} diff --git a/scripts/update-neovim-cache b/scripts/update-neovim-cache new file mode 100755 index 0000000..89b5665 --- /dev/null +++ b/scripts/update-neovim-cache @@ -0,0 +1,4 @@ +#!/bin/env bash +cd ~/projects/neovim || exit +sed -n '/NEOVIM/,$p' ~/projects/lazy.nvim/lua/lazy/core/cache.lua | sed '1d' | rg -v "selene" >./runtime/lua/vim/cache.lua +stylua ./runtime/lua/vim/cache.lua From ea1a044e3c819693565e0d73994587023b8e5e90 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 19:45:22 +0100 Subject: [PATCH 0848/1610] feat(cache): use `vim.cache` everywhere. poly-fill when needed --- lua/lazy/core/config.lua | 1 - lua/lazy/core/loader.lua | 9 ++++----- lua/lazy/core/plugin.lua | 2 -- lua/lazy/core/util.lua | 3 +-- lua/lazy/init.lua | 11 ++++++++--- lua/lazy/view/render.lua | 3 +-- 6 files changed, 14 insertions(+), 15 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 531ad99..84af79f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -183,7 +183,6 @@ function M.setup(opts) if type(M.options.spec) == "string" then M.options.spec = { import = M.options.spec } end - M.options.performance.cache = require("lazy.core.cache").config table.insert(M.options.install.colorscheme, "habamax") M.options.root = Util.norm(M.options.root) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 86bb692..1d4e745 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -1,7 +1,6 @@ local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Handler = require("lazy.core.handler") -local Cache = require("lazy.core.cache") local Plugin = require("lazy.core.plugin") ---@class LazyCoreLoader @@ -73,7 +72,7 @@ function M.install_missing() -- remove and installed plugins from indexed, so cache will index again for _, p in pairs(Config.plugins) do if p._.installed then - Cache.reset(p.dir) + vim.cache.reset(p.dir) end end -- reload plugins @@ -346,7 +345,7 @@ function M.get_main(plugin) local normname = Util.normname(plugin.name) ---@type string[] local mods = {} - for modname, _ in pairs(Cache.lsmod(plugin.dir)) do + for modname, _ in pairs(vim.cache.lsmod(plugin.dir)) do mods[#mods + 1] = modname local modnorm = Util.normname(modname) -- if we found an exact match, then use that @@ -476,7 +475,7 @@ end ---@param modname string function M.loader(modname) local paths = Util.get_unloaded_rtp(modname) - local modpath, hash = Cache.find(modname, { rtp = false, paths = paths }) + local modpath, hash = vim.cache.find(modname, { rtp = false, paths = paths }) if modpath then M.auto_load(modname, modpath) local mod = package.loaded[modname] @@ -485,7 +484,7 @@ function M.loader(modname) return mod end end - return Cache.load(modpath, { hash = hash }) + return vim.cache.load(modpath, { hash = hash }) end end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index e942753..a0b1428 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,7 +1,6 @@ local Config = require("lazy.core.config") local Util = require("lazy.core.util") local Handler = require("lazy.core.handler") -local Cache = require("lazy.core.cache") ---@class LazyCorePlugin local M = {} @@ -395,7 +394,6 @@ function M.load() Util.track("state") M.update_state() Util.track() - require("lazy.core.cache").indexed_unloaded = false M.loading = false end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 42325dd..0450cb0 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -241,8 +241,7 @@ function M.get_unloaded_rtp(modname) end function M.find_root(modname) - local Cache = require("lazy.core.cache") - local modpath = Cache.find(modname, { + local modpath = vim.cache.find(modname, { rtp = true, paths = M.get_unloaded_rtp(modname), patterns = { "", ".lua" }, diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index cb6b732..9b29adb 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -33,15 +33,20 @@ function M.setup(spec, opts) end local start = vim.loop.hrtime() - -- load module cache before anything else + -- poly-fill vim.cache + if not vim.cache then + vim.cache = require("lazy.core.cache") + end + local enable_cache = not ( opts and opts.performance and opts.performance.cache and opts.performance.cache.enabled == false ) + -- load module cache before anything else if enable_cache then - require("lazy.core.cache").enable() + vim.cache.enable() end require("lazy.stats").track("LazyStart") @@ -53,7 +58,7 @@ function M.setup(spec, opts) table.insert(package.loaders, 3, Loader.loader) if vim.g.profile_loaders then - require("lazy.core.cache").profile_loaders() + vim.cache.profile_loaders() end Util.track({ plugin = "lazy.nvim" }) -- setup start diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 00f4072..9735bb9 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -5,7 +5,6 @@ local Handler = require("lazy.core.handler") local Git = require("lazy.manage.git") local Plugin = require("lazy.core.plugin") local ViewConfig = require("lazy.view.config") -local Cache = require("lazy.core.cache") local Text = require("lazy.view.text") @@ -676,7 +675,7 @@ function M:debug() end) self:nl() - Util.foreach(Cache.stats, function(name, stats) + Util.foreach(vim.cache.stats, function(name, stats) self:append(name, "LazyH2"):nl() local props = { { "total", stats.total or 0, "Number" }, From 5b7b8c51495de8ced973cc23f0a58cadd21de875 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 14 Mar 2023 19:54:44 +0100 Subject: [PATCH 0849/1610] feat(cache): automatically reset topmods when a user changes a file for a path on the rtp --- lua/lazy/core/cache.lua | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index d96875a..522b2ac 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -369,9 +369,19 @@ function M.enable() break end end - -- TODO: add an autocmd on BufWritePost that checks if its in a /lua folder - -- if thats the case, then reset the plugin path. - -- This will make sure we can properly load new top-level lua modules + + -- this will reset the top-mods in case someone adds a new + -- top-level lua module to a path already on the rtp + vim.api.nvim_create_autocmd("BufWritePost", { + group = vim.api.nvim_create_augroup("cache_topmods_reset", { clear = true }), + callback = function(event) + local bufname = event.match ---@type string + local idx = bufname:find("/lua/", 1, true) + if idx then + M.reset(bufname:sub(1, idx - 1)) + end + end, + }) end --- Disables the cache: @@ -391,6 +401,7 @@ function M.disable() end end table.insert(package.loaders, 2, vim._load_package) + vim.api.nvim_del_augroup_by_name("cache_topmods_reset") end --- Return the top-level `/lua/*` modules for this path From 942c805b8427e3b4b9586e27702eeceacf967549 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 15 Mar 2023 08:53:19 +0100 Subject: [PATCH 0850/1610] fix(cache): remove dependency on jit --- lua/lazy/core/cache.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 522b2ac..fac7262 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -170,7 +170,8 @@ end ---@private function Cache.loader_lib(modname) local start = uv.hrtime() - local modpath = M.find(modname, { patterns = jit.os:find("Windows") and { ".dll" } or { ".so" } }) + local is_win = uv.os_uname().sysname:lower():find("win", 1, true) + local modpath = M.find(modname, { patterns = is_win and { ".dll" } or { ".so" } }) ---@type function?, string? if modpath then -- Making function name in Lua 5.1 (see src/loadlib.c:mkfuncname) is From 21a219a825cd9d9b049471ccd7831d117d7cede3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 15 Mar 2023 09:01:00 +0100 Subject: [PATCH 0851/1610] refactor(cache): revert all `vim.cache` changes and disable it if it would ever exist --- lua/lazy/core/cache.lua | 10 ---------- lua/lazy/core/loader.lua | 9 +++++---- lua/lazy/core/util.lua | 2 +- lua/lazy/init.lua | 12 +++++++----- lua/lazy/view/render.lua | 2 +- scripts/update-neovim-cache | 4 ---- 6 files changed, 14 insertions(+), 25 deletions(-) delete mode 100755 scripts/update-neovim-cache diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index fac7262..7a4c0d7 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -1,13 +1,3 @@ ----@diagnostic disable: duplicate-doc-alias ----@diagnostic disable: duplicate-doc-field ----@diagnostic disable: duplicate-set-field - --- interop with the native Neovim cache -if type(package.loaded["vim.cache"]) == "table" then - return package.loaded["vim.cache"] -end - --- NEOVIM local uv = vim.loop local M = {} diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 1d4e745..85954f6 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -2,6 +2,7 @@ local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Handler = require("lazy.core.handler") local Plugin = require("lazy.core.plugin") +local Cache = require("lazy.core.cache") ---@class LazyCoreLoader local M = {} @@ -72,7 +73,7 @@ function M.install_missing() -- remove and installed plugins from indexed, so cache will index again for _, p in pairs(Config.plugins) do if p._.installed then - vim.cache.reset(p.dir) + Cache.reset(p.dir) end end -- reload plugins @@ -345,7 +346,7 @@ function M.get_main(plugin) local normname = Util.normname(plugin.name) ---@type string[] local mods = {} - for modname, _ in pairs(vim.cache.lsmod(plugin.dir)) do + for modname, _ in pairs(Cache.lsmod(plugin.dir)) do mods[#mods + 1] = modname local modnorm = Util.normname(modname) -- if we found an exact match, then use that @@ -475,7 +476,7 @@ end ---@param modname string function M.loader(modname) local paths = Util.get_unloaded_rtp(modname) - local modpath, hash = vim.cache.find(modname, { rtp = false, paths = paths }) + local modpath, hash = Cache.find(modname, { rtp = false, paths = paths }) if modpath then M.auto_load(modname, modpath) local mod = package.loaded[modname] @@ -484,7 +485,7 @@ function M.loader(modname) return mod end end - return vim.cache.load(modpath, { hash = hash }) + return Cache.load(modpath, { hash = hash }) end end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 0450cb0..10c5c0a 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -241,7 +241,7 @@ function M.get_unloaded_rtp(modname) end function M.find_root(modname) - local modpath = vim.cache.find(modname, { + local modpath = require("lazy.core.cache").find(modname, { rtp = true, paths = M.get_unloaded_rtp(modname), patterns = { "", ".lua" }, diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 9b29adb..14a8de5 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -33,11 +33,13 @@ function M.setup(spec, opts) end local start = vim.loop.hrtime() - -- poly-fill vim.cache - if not vim.cache then - vim.cache = require("lazy.core.cache") + -- disable the Neovim cache if it would ever be added + if vim.cache and vim.cache.disable then + vim.cache.disable() end + local Cache = require("lazy.core.cache") + local enable_cache = not ( opts and opts.performance @@ -46,7 +48,7 @@ function M.setup(spec, opts) ) -- load module cache before anything else if enable_cache then - vim.cache.enable() + Cache.enable() end require("lazy.stats").track("LazyStart") @@ -58,7 +60,7 @@ function M.setup(spec, opts) table.insert(package.loaders, 3, Loader.loader) if vim.g.profile_loaders then - vim.cache.profile_loaders() + Cache.profile_loaders() end Util.track({ plugin = "lazy.nvim" }) -- setup start diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 9735bb9..0a1cd80 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -675,7 +675,7 @@ function M:debug() end) self:nl() - Util.foreach(vim.cache.stats, function(name, stats) + Util.foreach(require("lazy.core.cache").stats, function(name, stats) self:append(name, "LazyH2"):nl() local props = { { "total", stats.total or 0, "Number" }, diff --git a/scripts/update-neovim-cache b/scripts/update-neovim-cache deleted file mode 100755 index 89b5665..0000000 --- a/scripts/update-neovim-cache +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/env bash -cd ~/projects/neovim || exit -sed -n '/NEOVIM/,$p' ~/projects/lazy.nvim/lua/lazy/core/cache.lua | sed '1d' | rg -v "selene" >./runtime/lua/vim/cache.lua -stylua ./runtime/lua/vim/cache.lua From 6014f8de311d85866b453a7d8fbe6eac54f6ff4e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Mar 2023 08:01:46 +0000 Subject: [PATCH 0852/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f4b96cb..5e5fcb0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 14 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 15 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From e27c9df5fe039e9d2833ef4fcf7305595d5ccda7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Mar 2023 09:04:59 +0100 Subject: [PATCH 0853/1610] chore(main): release 9.12.0 (#653) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 15 +++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 902c3e6..4532af5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## [9.12.0](https://github.com/folke/lazy.nvim/compare/v9.11.0...v9.12.0) (2023-03-15) + + +### Features + +* **cache:** automatically reset topmods when a user changes a file for a path on the rtp ([5b7b8c5](https://github.com/folke/lazy.nvim/commit/5b7b8c51495de8ced973cc23f0a58cadd21de875)) +* **cache:** drop dependency on ffi ([810acc1](https://github.com/folke/lazy.nvim/commit/810acc1e86180403308e1cf650ed9fb0c5d27a44)) +* **cache:** remove any mentions of lazy. Move the cache to cache/luac instead of cache/lazy/luac ([49dda87](https://github.com/folke/lazy.nvim/commit/49dda8751e99aae2ae7073c6374bc1b8c38d0649)) +* **cache:** use `vim.cache` everywhere. poly-fill when needed ([ea1a044](https://github.com/folke/lazy.nvim/commit/ea1a044e3c819693565e0d73994587023b8e5e90)) + + +### Bug Fixes + +* **cache:** remove dependency on jit ([942c805](https://github.com/folke/lazy.nvim/commit/942c805b8427e3b4b9586e27702eeceacf967549)) + ## [9.11.0](https://github.com/folke/lazy.nvim/compare/v9.10.3...v9.11.0) (2023-03-14) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 84af79f..4a26b0a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -150,7 +150,7 @@ M.defaults = { debug = false, } -M.version = "9.11.0" -- x-release-please-version +M.version = "9.12.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 6b55862d2d264f0b48e0b9e42cc2d14f136bed55 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 15 Mar 2023 15:10:44 +0100 Subject: [PATCH 0854/1610] refactor(cache): refactor for upstreaming to `vim.loader` --- lua/lazy/core/cache.lua | 215 +++++++++++++++++++++++---------------- lua/lazy/core/loader.lua | 12 ++- lua/lazy/core/util.lua | 8 +- lua/lazy/init.lua | 6 +- 4 files changed, 144 insertions(+), 97 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 7a4c0d7..8f9bb59 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -1,3 +1,13 @@ +---@diagnostic disable: duplicate-doc-alias +---@diagnostic disable: duplicate-doc-field +---@diagnostic disable: duplicate-set-field + +-- interop with the native Neovim loader +if vim.loader then + return vim.loader +end + +-- NEOVIM local uv = vim.loop local M = {} @@ -5,11 +15,17 @@ local M = {} ---@alias CacheHash {mtime: {sec:number, nsec:number}, size:number} ---@alias CacheEntry {hash:CacheHash, chunk:string} ----@class CacheFindOpts +---@class ModuleFindOpts +---@field all? boolean Search for all matches (defaults to `false`) ---@field rtp? boolean Search for modname in the runtime path (defaults to `true`) ---@field patterns? string[] Paterns to use (defaults to `{"/init.lua", ".lua"}`) ---@field paths? string[] Extra paths to search for modname +---@class ModuleInfo +---@field modpath string Path of the module +---@field modname string Name of the module +---@field stat? uv_fs_t File stat of the module path + M.VERSION = 3 M.path = vim.fn.stdpath("cache") .. "/luac" M.enabled = false @@ -18,12 +34,12 @@ M.stats = { find = { total = 0, time = 0, not_found = 0 }, } ----@class ModuleCache +---@class Loader ---@field _rtp string[] ---@field _rtp_pure string[] ---@field _rtp_key string -local Cache = { - ---@type table<string, table<string,true>> +local Loader = { + ---@type table<string, table<string,ModuleInfo>> _indexed = {}, ---@type table<string, string[]> _topmods = {}, @@ -39,9 +55,9 @@ function M._track(stat, start) end --- slightly faster/different version than vim.fs.normalize ---- we also need to have it here, since the cache will load vim.fs +--- we also need to have it here, since the loader will load vim.fs ---@private -function Cache.normalize(path) +function Loader.normalize(path) if path:sub(1, 1) == "~" then local home = vim.loop.os_homedir() or "~" if home:sub(-1) == "\\" or home:sub(-1) == "/" then @@ -58,35 +74,35 @@ end --- When called from a fast event, the cached value will be returned. --- @return string[] rtp, boolean updated ---@private -function Cache.get_rtp() +function Loader.get_rtp() local start = uv.hrtime() if vim.in_fast_event() then M._track("get_rtp", start) - return (Cache._rtp or {}), false + return (Loader._rtp or {}), false end local updated = false local key = vim.go.rtp - if key ~= Cache._rtp_key then - Cache._rtp = {} + if key ~= Loader._rtp_key then + Loader._rtp = {} for _, path in ipairs(vim.api.nvim_get_runtime_file("", true)) do - path = Cache.normalize(path) + path = Loader.normalize(path) -- skip after directories - if path:sub(-6, -1) ~= "/after" and not (Cache._indexed[path] and vim.tbl_isempty(Cache._indexed[path])) then - Cache._rtp[#Cache._rtp + 1] = path + if path:sub(-6, -1) ~= "/after" and not (Loader._indexed[path] and vim.tbl_isempty(Loader._indexed[path])) then + Loader._rtp[#Loader._rtp + 1] = path end end updated = true - Cache._rtp_key = key + Loader._rtp_key = key end M._track("get_rtp", start) - return Cache._rtp, updated + return Loader._rtp, updated end --- Returns the cache file name ---@param name string can be a module name, or a file name ---@return string file_name ---@private -function Cache.cache_file(name) +function Loader.cache_file(name) local ret = M.path .. "/" .. name:gsub("[/\\:]", "%%") return ret:sub(-4) == ".lua" and (ret .. "c") or (ret .. ".luac") end @@ -95,8 +111,8 @@ end ---@param name string module name or filename ---@param entry CacheEntry ---@private -function Cache.write(name, entry) - local cname = Cache.cache_file(name) +function Loader.write(name, entry) + local cname = Loader.cache_file(name) local f = assert(uv.fs_open(cname, "w", 438)) local header = { M.VERSION, @@ -113,9 +129,9 @@ end ---@param name string module name or filename ---@return CacheEntry? ---@private -function Cache.read(name) +function Loader.read(name) local start = uv.hrtime() - local cname = Cache.cache_file(name) + local cname = Loader.cache_file(name) local f = uv.fs_open(cname, "r", 438) if f then local hash = uv.fs_fstat(f) --[[@as CacheHash]] @@ -142,11 +158,11 @@ end ---@param modname string module name ---@return string|function ---@private -function Cache.loader(modname) +function Loader.loader(modname) local start = uv.hrtime() - local modpath, hash = M.find(modname) - if modpath then - local chunk, err = M.load(modpath, { hash = hash }) + local ret = M.find(modname)[1] + if ret then + local chunk, err = Loader.load(ret.modpath, { hash = ret.stat }) M._track("loader", start) return chunk or error(err) end @@ -158,12 +174,12 @@ end ---@param modname string module name ---@return string|function ---@private -function Cache.loader_lib(modname) +function Loader.loader_lib(modname) local start = uv.hrtime() local is_win = uv.os_uname().sysname:lower():find("win", 1, true) - local modpath = M.find(modname, { patterns = is_win and { ".dll" } or { ".so" } }) + local ret = M.find(modname, { patterns = is_win and { ".dll" } or { ".so" } })[1] ---@type function?, string? - if modpath then + if ret then -- Making function name in Lua 5.1 (see src/loadlib.c:mkfuncname) is -- a) strip prefix up to and including the first dash, if any -- b) replace all dots by underscores @@ -171,7 +187,7 @@ function Cache.loader_lib(modname) -- So "foo-bar.baz" should result in "luaopen_bar_baz" local dash = modname:find("-", 1, true) local funcname = dash and modname:sub(dash + 1) or modname - local chunk, err = package.loadlib(modpath, "luaopen_" .. funcname:gsub("%.", "_")) + local chunk, err = package.loadlib(ret.modpath, "luaopen_" .. funcname:gsub("%.", "_")) M._track("loader_lib", start) return chunk or error(err) end @@ -183,14 +199,15 @@ end ---@param filename? string ---@param mode? "b"|"t"|"bt" ---@param env? table +---@param hash? CacheHash ---@return function?, string? error_message ---@private -- luacheck: ignore 312 -function Cache.loadfile(filename, mode, env) +function Loader.loadfile(filename, mode, env, hash) local start = uv.hrtime() - filename = Cache.normalize(filename) + filename = Loader.normalize(filename) mode = nil -- ignore mode, since we byte-compile the lua source files - local chunk, err = M.load(filename, { mode = mode, env = env }) + local chunk, err = Loader.load(filename, { mode = mode, env = env, hash = hash }) M._track("loadfile", start) return chunk, err end @@ -202,7 +219,7 @@ end ---@param h1 CacheHash ---@param h2 CacheHash ---@private -function Cache.eq(h1, h2) +function Loader.eq(h1, h2) return h1 and h2 and h1.size == h2.size and h1.mtime.sec == h2.mtime.sec and h1.mtime.nsec == h2.mtime.nsec end @@ -214,7 +231,8 @@ end --- - env: (table) the environment to load the module in. (defaults to `nil`) ---@see |luaL_loadfile()| ---@return function?, string? error_message -function M.load(modpath, opts) +---@private +function Loader.load(modpath, opts) local start = uv.hrtime() opts = opts or {} @@ -224,13 +242,13 @@ function M.load(modpath, opts) if not hash then -- trigger correct error - chunk, err = Cache._loadfile(modpath, opts.mode, opts.env) + chunk, err = Loader._loadfile(modpath, opts.mode, opts.env) M._track("load", start) return chunk, err end - local entry = Cache.read(modpath) - if entry and Cache.eq(entry.hash, hash) then + local entry = Loader.read(modpath) + if entry and Loader.eq(entry.hash, hash) then -- found in cache and up to date -- selene: allow(incorrect_standard_library_use) chunk, err = load(entry.chunk --[[@as string]], "@" .. modpath, opts.mode, opts.env) @@ -241,22 +259,26 @@ function M.load(modpath, opts) end entry = { hash = hash, modpath = modpath } - chunk, err = Cache._loadfile(modpath, opts.mode, opts.env) + chunk, err = Loader._loadfile(modpath, opts.mode, opts.env) if chunk then entry.chunk = string.dump(chunk) - Cache.write(modpath, entry) + Loader.write(modpath, entry) end M._track("load", start) return chunk, err end ---- Finds the module path for the given module name ----@param modname string ----@param opts? CacheFindOpts (table|nil) Options for finding a module: +--- Finds lua modules for the given module name. +---@param modname string Module name, or `"*"` to find the top-level modules instead +---@param opts? ModuleFindOpts (table|nil) Options for finding a module: --- - rtp: (boolean) Search for modname in the runtime path (defaults to `true`) ---- - patterns: (string[]) Paterns to use (defaults to `{"/init.lua", ".lua"}`) --- - paths: (string[]) Extra paths to search for modname (defaults to `{}`) ----@return string? modpath, CacheHash? hash (string|nil) modpath for the module +--- - patterns: (string[]) Paterns to use (defaults to `{"/init.lua", ".lua"}`) +-- - all: (boolean) Return all matches instead of just the first one (defaults to `false`) +---@return ModuleInfo[] (list) A list of results with the following properties: +--- - modpath: (string) the path to the module +--- - modname: (string) the name of the module +--- - stat: (table|nil) the fs_stat of the module path. Won't be returned for `modname="*"` function M.find(modname, opts) local start = uv.hrtime() opts = opts or {} @@ -282,65 +304,85 @@ function M.find(modname, opts) patterns[p] = "/lua/" .. basename .. pattern end + ---@type ModuleInfo[] + local results = {} + + -- Only continue if we haven't found anything yet or we want to find all + ---@private + local function continue() + return #results == 0 or opts.all + end + -- Checks if the given paths contain the top-level module. -- If so, it tries to find the module path for the given module name. ---@param paths string[] - ---@return string? modpath, CacheHash? hash ---@private local function _find(paths) for _, path in ipairs(paths) do - if M.lsmod(path)[topmod] then + if topmod == "*" then + for _, r in pairs(Loader.lsmod(path)) do + results[#results + 1] = r + if not continue() then + return + end + end + elseif Loader.lsmod(path)[topmod] then for _, pattern in ipairs(patterns) do local modpath = path .. pattern M.stats.find.stat = (M.stats.find.stat or 0) + 1 local hash = uv.fs_stat(modpath) if hash then - return modpath, hash + results[#results + 1] = { modpath = modpath, stat = hash, modname = modname } + if not continue() then + return + end end end end end end - ---@type string?, CacheHash? - local modpath, hash - -- always check the rtp first if opts.rtp ~= false then - modpath, hash = _find(Cache._rtp or {}) - if not modpath then - local rtp, updated = Cache.get_rtp() + _find(Loader._rtp or {}) + if continue() then + local rtp, updated = Loader.get_rtp() if updated then - modpath, hash = _find(rtp) + _find(rtp) end end end -- check any additional paths - if (not modpath) and opts.paths then - modpath, hash = _find(opts.paths) + if continue() and opts.paths then + _find(opts.paths) end M._track("find", start) - if modpath then - return modpath, hash + if #results == 0 then + -- module not found + M.stats.find.not_found = M.stats.find.not_found + 1 end - -- module not found - M.stats.find.not_found = M.stats.find.not_found + 1 + return results end ---- Resets the topmods cache for the path ----@param path string path to reset +--- Resets the topmods cache for the path, or all the paths +--- if path is nil. +---@param path string? path to reset function M.reset(path) - Cache._indexed[Cache.normalize(path)] = nil + if path then + Loader._indexed[Loader.normalize(path)] = nil + else + Loader._indexed = {} + end end ---- Enables the cache: ---- * override loadfile ---- * adds the lua loader +--- Enables the experimental Lua module loader: +--- * overrides loadfile +--- * adds the lua loader using the byte-compilation cache --- * adds the libs loader ---- * remove the Neovim loader +--- * removes the default Neovim loader function M.enable() if M.enabled then return @@ -348,11 +390,11 @@ function M.enable() M.enabled = true vim.fn.mkdir(vim.fn.fnamemodify(M.path, ":p"), "p") -- selene: allow(global_usage) - _G.loadfile = Cache.loadfile + _G.loadfile = Loader.loadfile -- add lua loader - table.insert(package.loaders, 2, Cache.loader) + table.insert(package.loaders, 2, Loader.loader) -- add libs loader - table.insert(package.loaders, 3, Cache.loader_lib) + table.insert(package.loaders, 3, Loader.loader_lib) -- remove Neovim loader for l, loader in ipairs(package.loaders) do if loader == vim._load_package then @@ -375,19 +417,19 @@ function M.enable() }) end ---- Disables the cache: ---- * removes the cache loaders ---- * adds the Neovim loader +--- Disables the experimental Lua module loader: +--- * removes the loaders +--- * adds the default Neovim loader function M.disable() if not M.enabled then return end M.enabled = false -- selene: allow(global_usage) - _G.loadfile = Cache._loadfile + _G.loadfile = Loader._loadfile ---@diagnostic disable-next-line: no-unknown for l, loader in ipairs(package.loaders) do - if loader == Cache.loader or loader == Cache.loader_lib then + if loader == Loader.loader or loader == Loader.loader_lib then table.remove(package.loaders, l) end end @@ -397,19 +439,20 @@ end --- Return the top-level `/lua/*` modules for this path ---@param path string path to check for top-level lua modules ----@return string[] -function M.lsmod(path) - if not Cache._indexed[path] then +---@private +function Loader.lsmod(path) + if not Loader._indexed[path] then local start = uv.hrtime() - Cache._indexed[path] = {} + Loader._indexed[path] = {} local handle = vim.loop.fs_scandir(path .. "/lua") while handle do local name, t = vim.loop.fs_scandir_next(handle) if not name then break end + local modpath = path .. "/lua/" .. name -- HACK: type is not always returned due to a bug in luv - t = t or uv.fs_stat(path .. "/lua/" .. name).type + t = t or uv.fs_stat(modpath).type ---@type string local topname local ext = name:sub(-4) @@ -421,19 +464,20 @@ function M.lsmod(path) topname = name end if topname then - Cache._indexed[path][topname] = true - Cache._topmods[topname] = Cache._topmods[topname] or {} - if not vim.tbl_contains(Cache._topmods[topname], path) then - table.insert(Cache._topmods[topname], path) + Loader._indexed[path][topname] = { modpath = modpath, modname = topname } + Loader._topmods[topname] = Loader._topmods[topname] or {} + if not vim.tbl_contains(Loader._topmods[topname], path) then + table.insert(Loader._topmods[topname], path) end end end M._track("lsmod", start) end - return Cache._indexed[path] + return Loader._indexed[path] end --- Debug function that wrapps all loaders and tracks stats +---@private function M.profile_loaders() for l, loader in pairs(package.loaders) do local loc = debug.getinfo(loader, "Sn").source:sub(2) @@ -448,6 +492,7 @@ function M.profile_loaders() end --- Prints all cache stats +---@private function M.inspect() ---@private local function ms(nsec) @@ -477,6 +522,6 @@ function M.inspect() vim.api.nvim_echo(chunks, true, {}) end -M._Cache = Cache +M._Cache = Loader return M diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 85954f6..6e3b653 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -346,7 +346,8 @@ function M.get_main(plugin) local normname = Util.normname(plugin.name) ---@type string[] local mods = {} - for modname, _ in pairs(Cache.lsmod(plugin.dir)) do + for _, mod in ipairs(Cache.find("*", { all = true, rtp = false, paths = { plugin.dir } })) do + local modname = mod.modname mods[#mods + 1] = modname local modnorm = Util.normname(modname) -- if we found an exact match, then use that @@ -476,16 +477,17 @@ end ---@param modname string function M.loader(modname) local paths = Util.get_unloaded_rtp(modname) - local modpath, hash = Cache.find(modname, { rtp = false, paths = paths }) - if modpath then - M.auto_load(modname, modpath) + local ret = Cache.find(modname, { rtp = false, paths = paths })[1] + if ret then + M.auto_load(modname, ret.modpath) local mod = package.loaded[modname] if type(mod) == "table" then return function() return mod end end - return Cache.load(modpath, { hash = hash }) + -- selene: allow(incorrect_standard_library_use) + return loadfile(ret.modpath, nil, nil, ret.stat) end end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 10c5c0a..3e0042e 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -241,13 +241,13 @@ function M.get_unloaded_rtp(modname) end function M.find_root(modname) - local modpath = require("lazy.core.cache").find(modname, { + local ret = require("lazy.core.cache").find(modname, { rtp = true, paths = M.get_unloaded_rtp(modname), patterns = { "", ".lua" }, - }) - if modpath then - local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") + })[1] + if ret then + local root = ret.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") return root end end diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 14a8de5..2f015b6 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -33,9 +33,9 @@ function M.setup(spec, opts) end local start = vim.loop.hrtime() - -- disable the Neovim cache if it would ever be added - if vim.cache and vim.cache.disable then - vim.cache.disable() + -- use the NEovim cache if available + if vim.loader then + package.loaded["lazy.core.cache"] = vim.loader end local Cache = require("lazy.core.cache") From 2e3c16e5265050e7b5752df208490deb9a4245ec Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 16 Mar 2023 14:13:18 +0100 Subject: [PATCH 0855/1610] docs: better comments for Cache.find --- lua/lazy/core/cache.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 8f9bb59..0e6daa2 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -273,7 +273,9 @@ end ---@param opts? ModuleFindOpts (table|nil) Options for finding a module: --- - rtp: (boolean) Search for modname in the runtime path (defaults to `true`) --- - paths: (string[]) Extra paths to search for modname (defaults to `{}`) ---- - patterns: (string[]) Paterns to use (defaults to `{"/init.lua", ".lua"}`) +--- - patterns: (string[]) List of patterns to use when searching for modules. +-- A pattern is a string added to the basename of the Lua module being searched. +-- (defaults to `{"/init.lua", ".lua"}`) -- - all: (boolean) Return all matches instead of just the first one (defaults to `false`) ---@return ModuleInfo[] (list) A list of results with the following properties: --- - modpath: (string) the path to the module From b4b11f48aad26c6ad10d04d8969f234980a87922 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 16 Mar 2023 23:53:36 +0100 Subject: [PATCH 0856/1610] style: better comments for cache.find --- lua/lazy/core/cache.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 0e6daa2..13770f4 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -274,9 +274,9 @@ end --- - rtp: (boolean) Search for modname in the runtime path (defaults to `true`) --- - paths: (string[]) Extra paths to search for modname (defaults to `{}`) --- - patterns: (string[]) List of patterns to use when searching for modules. --- A pattern is a string added to the basename of the Lua module being searched. --- (defaults to `{"/init.lua", ".lua"}`) --- - all: (boolean) Return all matches instead of just the first one (defaults to `false`) +--- A pattern is a string added to the basename of the Lua module being searched. +--- (defaults to `{"/init.lua", ".lua"}`) +--- - all: (boolean) Return all matches instead of just the first one (defaults to `false`) ---@return ModuleInfo[] (list) A list of results with the following properties: --- - modpath: (string) the path to the module --- - modname: (string) the name of the module From efe36bdfda47256dbc223945a7f35eea52b1d736 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 16 Mar 2023 23:54:09 +0100 Subject: [PATCH 0857/1610] =?UTF-8?q?fix(cmd):=20properly=20deal=20with=20?= =?UTF-8?q?commands=20with=20nargs=3D=3F=20or=20nargs=3D1.=20Fixes=20#659?= --- lua/lazy/core/handler/cmd.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index 6ee52ad..86711de 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -29,6 +29,13 @@ function M:_add(cmd) end self:_load(cmd) + + local info = vim.api.nvim_get_commands({})[cmd] + command.nargs = info.nargs + if event.args and event.args ~= "" and info.nargs and info.nargs:find("[1?]") then + command.args = { event.args } + end + vim.cmd(command) end, { bang = true, From aacaa600cf1e7e1b1f250f9b138f0ae73168f64b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 22:54:54 +0000 Subject: [PATCH 0858/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5e5fcb0..327fb3d 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 15 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 16 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From e2102c3a3a66ee89a2afaf779e439490eada75e3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 08:16:47 +0100 Subject: [PATCH 0859/1610] chore(main): release 9.12.1 (#660) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4532af5..935e011 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.12.1](https://github.com/folke/lazy.nvim/compare/v9.12.0...v9.12.1) (2023-03-16) + + +### Bug Fixes + +* **cmd:** properly deal with commands with nargs=? or nargs=1. Fixes [#659](https://github.com/folke/lazy.nvim/issues/659) ([efe36bd](https://github.com/folke/lazy.nvim/commit/efe36bdfda47256dbc223945a7f35eea52b1d736)) + ## [9.12.0](https://github.com/folke/lazy.nvim/compare/v9.11.0...v9.12.0) (2023-03-15) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4a26b0a..db2abd8 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -150,7 +150,7 @@ M.defaults = { debug = false, } -M.version = "9.12.0" -- x-release-please-version +M.version = "9.12.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From b3eca0c3fb4ef5e547f70c571b8cd27688db83bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 07:17:33 +0000 Subject: [PATCH 0860/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 327fb3d..dd9b8ed 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 16 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 17 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From e5759d202afe80aeb192e7eb02d28b74cc2d66eb Mon Sep 17 00:00:00 2001 From: abal <github@abal.moe> Date: Fri, 17 Mar 2023 08:18:02 -0700 Subject: [PATCH 0861/1610] feat(help): allow disabling README magic (#663) --- README.md | 1 + lua/lazy/core/config.lua | 1 + lua/lazy/help.lua | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 0dfc7c6..7fb8de3 100644 --- a/README.md +++ b/README.md @@ -435,6 +435,7 @@ return { -- 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 dont have docs diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index db2abd8..bcf1f39 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -141,6 +141,7 @@ M.defaults = { -- 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 dont have docs diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index 599e2b4..4a289eb 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -41,6 +41,10 @@ function M.update() if Config.plugins["lazy.nvim"] then vim.cmd.helptags(Config.plugins["lazy.nvim"].dir .. "/doc") end + if Config.options.readme.enabled == false then + return + end + local docs = Config.options.readme.root .. "/doc" vim.fn.mkdir(docs, "p") From 357893a2880abecfc8704ef8874620b088189531 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 15:18:52 +0000 Subject: [PATCH 0862/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index dd9b8ed..8fbaaeb 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -528,6 +528,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* -- 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 dont have docs From fdb41229ca39cf2795cbf4e6d04a52b73e6225f5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 16:44:19 +0100 Subject: [PATCH 0863/1610] chore(main): release 9.13.0 (#664) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 935e011..dfa76aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.13.0](https://github.com/folke/lazy.nvim/compare/v9.12.1...v9.13.0) (2023-03-17) + + +### Features + +* **help:** allow disabling README magic ([#663](https://github.com/folke/lazy.nvim/issues/663)) ([e5759d2](https://github.com/folke/lazy.nvim/commit/e5759d202afe80aeb192e7eb02d28b74cc2d66eb)) + ## [9.12.1](https://github.com/folke/lazy.nvim/compare/v9.12.0...v9.12.1) (2023-03-16) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index bcf1f39..8cf0903 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.12.1" -- x-release-please-version +M.version = "9.13.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 959f8c36bc1744db2745b18135f2fb822b382cfb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 18 Mar 2023 08:36:01 +0100 Subject: [PATCH 0864/1610] fix(health): allow overriding `1` --- lua/lazy/health.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index c982a37..f8e691e 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -84,7 +84,7 @@ function M.check_override(plugin) end local Handler = require("lazy.core.handler") - local skip = { "dependencies", "_", "opts" } + local skip = { "dependencies", "_", "opts", 1 } vim.list_extend(skip, vim.tbl_values(Handler.types)) for key, value in pairs(plugin._.super) do From 7d81994529b820ffb7b272a82898f1334271ee67 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 18 Mar 2023 07:36:54 +0000 Subject: [PATCH 0865/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 8fbaaeb..9da6e82 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 17 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 18 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 37541e57e42da6001f698e3f01aaa6615070730e Mon Sep 17 00:00:00 2001 From: Will Norris <will@willnorris.com> Date: Sat, 18 Mar 2023 00:38:31 -0700 Subject: [PATCH 0866/1610] docs(plugins): add example of multiple imports (#669) --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 7fb8de3..064e710 100644 --- a/README.md +++ b/README.md @@ -677,6 +677,18 @@ require("lazy").setup("plugins") 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. From f4d53dc18af4631a787eb72497a97afc2de8625f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 18 Mar 2023 07:39:22 +0000 Subject: [PATCH 0867/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9da6e82..5c36a3b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -789,6 +789,18 @@ modules. Both of the `setup()` calls are equivalent: 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. From 67cc8dc07ca2372922ffd5e5cf05f92872adacf7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 18 Mar 2023 08:57:20 +0100 Subject: [PATCH 0868/1610] docs: updated docs. Fixes #667 --- README.md | 100 ++++++++++++++++++++----------------------- lua/lazy/example.lua | 45 ++++++++----------- 2 files changed, 66 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index 064e710..7292e4a 100644 --- a/README.md +++ b/README.md @@ -79,33 +79,34 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | -| **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 | -| **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 `fun(LazyPlugin):boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | -| **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. | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require("plugin").setup(opts)`. `"plugin"` will default to `name` if specified, otherwise `lazy.nvim` will do its best to guess the correct plugin name. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | -| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/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` | -| **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | -| **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | -| **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. | +| Property | Type | Description | +| ---------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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` | +| **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 | +| **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 `fun(LazyPlugin):boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | +| **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. | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require(MAIN).setup(opts)`. Lazy uses several heuristics to determine the plugin's `MAIN` module automatically based on the plugin's **name**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | +| **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 a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/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` | +| **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | +| **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| **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. | ### Lazy Loading @@ -213,30 +214,22 @@ return { "nvim-neorg/neorg", -- lazy-load on filetype ft = "norg", - -- custom config that will be executed when loading the plugin - config = function() - require("neorg").setup() - end, - }, - - -- the above could also be written as: - { - "nvim-neorg/neorg", - ft = "norg", - config = true, -- run require("neorg").setup() - }, - - -- or set custom options: - { - "nvim-neorg/neorg", - ft = "norg", - opts = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) + -- 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, }, { @@ -254,19 +247,20 @@ return { 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" }, { - "cshuaimin/ssr.nvim", - -- init is always executed during startup, but doesn't load the plugin yet. - init = function() - vim.keymap.set({ "n", "x" }, "<leader>cR", function() - -- this require will automatically load the plugin - require("ssr").open() - end, { desc = "Structural Replace" }) - end, + "Wansmer/treesj", + keys = { + { "J", "<cmd>TSJToggle<cr>", desc = "Join Toggle" }, + }, + opts = { use_default_keymaps = false, max_join_length = 150 }, }, { diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua index 18c1ca9..df52faf 100644 --- a/lua/lazy/example.lua +++ b/lua/lazy/example.lua @@ -18,30 +18,22 @@ return { "nvim-neorg/neorg", -- lazy-load on filetype ft = "norg", - -- custom config that will be executed when loading the plugin - config = function() - require("neorg").setup() - end, - }, - - -- the above could also be written as: - { - "nvim-neorg/neorg", - ft = "norg", - config = true, -- run require("neorg").setup() - }, - - -- or set custom options: - { - "nvim-neorg/neorg", - ft = "norg", - opts = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) + -- 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, }, { @@ -59,19 +51,20 @@ return { 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" }, { - "cshuaimin/ssr.nvim", - -- init is always executed during startup, but doesn't load the plugin yet. - init = function() - vim.keymap.set({ "n", "x" }, "<leader>cR", function() - -- this require will automatically load the plugin - require("ssr").open() - end, { desc = "Structural Replace" }) - end, + "Wansmer/treesj", + keys = { + { "J", "<cmd>TSJToggle<cr>", desc = "Join Toggle" }, + }, + opts = { use_default_keymaps = false, max_join_length = 150 }, }, { From 8456a867f79e3fb3b5390659c5d11a1e35793372 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 18 Mar 2023 07:58:04 +0000 Subject: [PATCH 0869/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 55 ++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5c36a3b..6bb0db9 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -149,12 +149,16 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* config fun(LazyPlugin, opts:table) or true config is executed when the plugin loads. The default implementation will automatically run - require("plugin").setup(opts). "plugin" will default - to name if specified, otherwise lazy.nvim will do - its best to guess the correct plugin name. See also + require(MAIN).setup(opts). Lazy uses several + heuristics to determine the plugin’s MAIN module + automatically based on the plugin’s name. See also opts. To use the default implementation without opts set config to true. + 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 a list of build commands build is executed when a plugin is installed or updated. If it’s a string it will be ran as a shell command. When prefixed with it is a Neovim command. @@ -309,30 +313,22 @@ EXAMPLES ~ "nvim-neorg/neorg", -- lazy-load on filetype ft = "norg", - -- custom config that will be executed when loading the plugin - config = function() - require("neorg").setup() - end, - }, - - -- the above could also be written as: - { - "nvim-neorg/neorg", - ft = "norg", - config = true, -- run require("neorg").setup() - }, - - -- or set custom options: - { - "nvim-neorg/neorg", - ft = "norg", - opts = { foo = "bar" }, -- run require("neorg").setup({foo = "bar"}) + -- 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, }, { @@ -350,19 +346,20 @@ EXAMPLES ~ 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" }, { - "cshuaimin/ssr.nvim", - -- init is always executed during startup, but doesn't load the plugin yet. - init = function() - vim.keymap.set({ "n", "x" }, "<leader>cR", function() - -- this require will automatically load the plugin - require("ssr").open() - end, { desc = "Structural Replace" }) - end, + "Wansmer/treesj", + keys = { + { "J", "<cmd>TSJToggle<cr>", desc = "Join Toggle" }, + }, + opts = { use_default_keymaps = false, max_join_length = 150 }, }, { From 29b3bf9535f83bb774df81e3cc0381cc9c2934ed Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 19 Mar 2023 20:57:12 +0100 Subject: [PATCH 0870/1610] ci: update templates --- .github/workflows/ci.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 94b6d15..1e290ce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,12 @@ jobs: - name: Install Neovim shell: bash run: | - wget -q https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.deb -O /tmp/nvim.deb - sudo dpkg -i /tmp/nvim.deb + mkdir -p /tmp/nvim + wget -q https://github.com/neovim/neovim/releases/download/nightly/nvim.appimage -O /tmp/nvim/nvim.appimage + cd /tmp/nvim + chmod a+x ./nvim.appimage + ./nvim.appimage --appimage-extract + echo "/tmp/nvim/squashfs-root/usr/bin/" >> $GITHUB_PATH - name: Run Tests run: | nvim --version From b306eb3d0f32b792929735c6d528c38d0f1dc0cd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 19 Mar 2023 19:58:05 +0000 Subject: [PATCH 0871/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6bb0db9..a1e9390 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 18 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 19 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 236f8517bae70516a3f89fe154e3e18294eb862a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 20 Mar 2023 08:01:30 +0100 Subject: [PATCH 0872/1610] fix(cache): fix loading libs on Darwin --- lua/lazy/core/cache.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 13770f4..619c746 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -176,7 +176,8 @@ end ---@private function Loader.loader_lib(modname) local start = uv.hrtime() - local is_win = uv.os_uname().sysname:lower():find("win", 1, true) + local sysname = uv.os_uname().sysname:lower() or "" + local is_win = sysname:find("win", 1, true) and not sysname:find("darwin", 1, true) local ret = M.find(modname, { patterns = is_win and { ".dll" } or { ".so" } })[1] ---@type function?, string? if ret then From c9aeaae6999f702afee24375600fe1d189d6d51c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 07:02:15 +0000 Subject: [PATCH 0873/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a1e9390..be37db2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 19 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 20 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From e7622b78f6addaeb93debf43041235c16fc74a57 Mon Sep 17 00:00:00 2001 From: Andy Dirnberger <andy.dirnberger@gmail.com> Date: Mon, 20 Mar 2023 03:02:24 -0400 Subject: [PATCH 0874/1610] fix(health): add `main` key (#679) --- lua/lazy/health.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index f8e691e..83096c0 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -114,6 +114,7 @@ M.valid = { "init", "keys", "lazy", + "main", "module", "name", "opts", From 887eb75591520a01548134c4623617b639289d0b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 08:06:14 +0100 Subject: [PATCH 0875/1610] chore(main): release 9.13.1 (#671) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 9 +++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfa76aa..493b7a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [9.13.1](https://github.com/folke/lazy.nvim/compare/v9.13.0...v9.13.1) (2023-03-20) + + +### Bug Fixes + +* **cache:** fix loading libs on Darwin ([236f851](https://github.com/folke/lazy.nvim/commit/236f8517bae70516a3f89fe154e3e18294eb862a)) +* **health:** add `main` key ([#679](https://github.com/folke/lazy.nvim/issues/679)) ([e7622b7](https://github.com/folke/lazy.nvim/commit/e7622b78f6addaeb93debf43041235c16fc74a57)) +* **health:** allow overriding `1` ([959f8c3](https://github.com/folke/lazy.nvim/commit/959f8c36bc1744db2745b18135f2fb822b382cfb)) + ## [9.13.0](https://github.com/folke/lazy.nvim/compare/v9.12.1...v9.13.0) (2023-03-17) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 8cf0903..4185c4e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.13.0" -- x-release-please-version +M.version = "9.13.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 690f9e88e2a7dc92bcb0cca85f778a3e99fe1f7e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 20 Mar 2023 16:42:11 +0100 Subject: [PATCH 0876/1610] refactor: prepping for vim.loader --- lua/lazy/core/cache.lua | 117 ++++++++++++++++++++------------------- lua/lazy/view/render.lua | 2 +- 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 619c746..e988dae 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -26,32 +26,34 @@ local M = {} ---@field modname string Name of the module ---@field stat? uv_fs_t File stat of the module path -M.VERSION = 3 +---@alias LoaderStats table<string, {total:number, time:number, [string]:number?}?> + M.path = vim.fn.stdpath("cache") .. "/luac" M.enabled = false ----@type table<string, {total:number, time:number, [string]:number?}?> -M.stats = { - find = { total = 0, time = 0, not_found = 0 }, -} ---@class Loader ---@field _rtp string[] ---@field _rtp_pure string[] ---@field _rtp_key string local Loader = { + VERSION = 3, ---@type table<string, table<string,ModuleInfo>> _indexed = {}, ---@type table<string, string[]> _topmods = {}, _loadfile = loadfile, + ---@type LoaderStats + _stats = { + find = { total = 0, time = 0, not_found = 0 }, + }, } --- Tracks the time spent in a function ---@private -function M._track(stat, start) - M.stats[stat] = M.stats[stat] or { total = 0, time = 0 } - M.stats[stat].total = M.stats[stat].total + 1 - M.stats[stat].time = M.stats[stat].time + uv.hrtime() - start +function Loader.track(stat, start) + Loader._stats[stat] = Loader._stats[stat] or { total = 0, time = 0 } + Loader._stats[stat].total = Loader._stats[stat].total + 1 + Loader._stats[stat].time = Loader._stats[stat].time + uv.hrtime() - start end --- slightly faster/different version than vim.fs.normalize @@ -77,7 +79,7 @@ end function Loader.get_rtp() local start = uv.hrtime() if vim.in_fast_event() then - M._track("get_rtp", start) + Loader.track("get_rtp", start) return (Loader._rtp or {}), false end local updated = false @@ -94,7 +96,7 @@ function Loader.get_rtp() updated = true Loader._rtp_key = key end - M._track("get_rtp", start) + Loader.track("get_rtp", start) return Loader._rtp, updated end @@ -115,7 +117,7 @@ function Loader.write(name, entry) local cname = Loader.cache_file(name) local f = assert(uv.fs_open(cname, "w", 438)) local header = { - M.VERSION, + Loader.VERSION, entry.hash.size, entry.hash.mtime.sec, entry.hash.mtime.nsec, @@ -142,16 +144,16 @@ function Loader.read(name) ---@type integer[]|{[0]:integer} local header = vim.split(data:sub(1, zero - 1), ",") - if tonumber(header[1]) ~= M.VERSION then + if tonumber(header[1]) ~= Loader.VERSION then return end - M._track("read", start) + Loader.track("read", start) return { hash = { size = tonumber(header[2]), mtime = { sec = tonumber(header[3]), nsec = tonumber(header[4]) } }, chunk = data:sub(zero + 1), } end - M._track("read", start) + Loader.track("read", start) end --- The `package.loaders` loader for lua files using the cache. @@ -163,10 +165,10 @@ function Loader.loader(modname) local ret = M.find(modname)[1] if ret then local chunk, err = Loader.load(ret.modpath, { hash = ret.stat }) - M._track("loader", start) + Loader.track("loader", start) return chunk or error(err) end - M._track("loader", start) + Loader.track("loader", start) return "\ncache_loader: module " .. modname .. " not found" end @@ -189,10 +191,10 @@ function Loader.loader_lib(modname) local dash = modname:find("-", 1, true) local funcname = dash and modname:sub(dash + 1) or modname local chunk, err = package.loadlib(ret.modpath, "luaopen_" .. funcname:gsub("%.", "_")) - M._track("loader_lib", start) + Loader.track("loader_lib", start) return chunk or error(err) end - M._track("loader_lib", start) + Loader.track("loader_lib", start) return "\ncache_loader_lib: module " .. modname .. " not found" end @@ -209,7 +211,7 @@ function Loader.loadfile(filename, mode, env, hash) filename = Loader.normalize(filename) mode = nil -- ignore mode, since we byte-compile the lua source files local chunk, err = Loader.load(filename, { mode = mode, env = env, hash = hash }) - M._track("loadfile", start) + Loader.track("loadfile", start) return chunk, err end @@ -244,7 +246,7 @@ function Loader.load(modpath, opts) if not hash then -- trigger correct error chunk, err = Loader._loadfile(modpath, opts.mode, opts.env) - M._track("load", start) + Loader.track("load", start) return chunk, err end @@ -254,7 +256,7 @@ function Loader.load(modpath, opts) -- selene: allow(incorrect_standard_library_use) chunk, err = load(entry.chunk --[[@as string]], "@" .. modpath, opts.mode, opts.env) if not (err and err:find("cannot load incompatible bytecode", 1, true)) then - M._track("load", start) + Loader.track("load", start) return chunk, err end end @@ -265,7 +267,7 @@ function Loader.load(modpath, opts) entry.chunk = string.dump(chunk) Loader.write(modpath, entry) end - M._track("load", start) + Loader.track("load", start) return chunk, err end @@ -332,7 +334,7 @@ function M.find(modname, opts) elseif Loader.lsmod(path)[topmod] then for _, pattern in ipairs(patterns) do local modpath = path .. pattern - M.stats.find.stat = (M.stats.find.stat or 0) + 1 + Loader._stats.find.stat = (Loader._stats.find.stat or 0) + 1 local hash = uv.fs_stat(modpath) if hash then results[#results + 1] = { modpath = modpath, stat = hash, modname = modname } @@ -361,10 +363,10 @@ function M.find(modname, opts) _find(opts.paths) end - M._track("find", start) + Loader.track("find", start) if #results == 0 then -- module not found - M.stats.find.not_found = M.stats.find.not_found + 1 + Loader._stats.find.not_found = Loader._stats.find.not_found + 1 end return results @@ -474,57 +476,60 @@ function Loader.lsmod(path) end end end - M._track("lsmod", start) + Loader.track("lsmod", start) end return Loader._indexed[path] end --- Debug function that wrapps all loaders and tracks stats ---@private -function M.profile_loaders() +function M._profile_loaders() for l, loader in pairs(package.loaders) do local loc = debug.getinfo(loader, "Sn").source:sub(2) package.loaders[l] = function(modname) local start = vim.loop.hrtime() local ret = loader(modname) - M._track("loader " .. l .. ": " .. loc, start) - M._track("loader_all", start) + Loader.track("loader " .. l .. ": " .. loc, start) + Loader.track("loader_all", start) return ret end end end --- Prints all cache stats +---@param opts? {print?:boolean} +---@return LoaderStats ---@private -function M.inspect() - ---@private - local function ms(nsec) - return math.floor(nsec / 1e6 * 1000 + 0.5) / 1000 .. "ms" - end - local chunks = {} ---@type string[][] - ---@type string[] - local stats = vim.tbl_keys(M.stats) - table.sort(stats) - for _, stat in ipairs(stats) do - vim.list_extend(chunks, { - { "\n" .. stat .. "\n", "Title" }, - { "* total: " }, - { tostring(M.stats[stat].total) .. "\n", "Number" }, - { "* time: " }, - { ms(M.stats[stat].time) .. "\n", "Bold" }, - { "* avg time: " }, - { ms(M.stats[stat].time / M.stats[stat].total) .. "\n", "Bold" }, - }) - for k, v in pairs(M.stats[stat]) do - if not vim.tbl_contains({ "time", "total" }, k) then - chunks[#chunks + 1] = { "* " .. k .. ":" .. string.rep(" ", 9 - #k) } - chunks[#chunks + 1] = { tostring(v) .. "\n", "Number" } +function M._inspect(opts) + if opts and opts.print then + ---@private + local function ms(nsec) + return math.floor(nsec / 1e6 * 1000 + 0.5) / 1000 .. "ms" + end + local chunks = {} ---@type string[][] + ---@type string[] + local stats = vim.tbl_keys(Loader._stats) + table.sort(stats) + for _, stat in ipairs(stats) do + vim.list_extend(chunks, { + { "\n" .. stat .. "\n", "Title" }, + { "* total: " }, + { tostring(Loader._stats[stat].total) .. "\n", "Number" }, + { "* time: " }, + { ms(Loader._stats[stat].time) .. "\n", "Bold" }, + { "* avg time: " }, + { ms(Loader._stats[stat].time / Loader._stats[stat].total) .. "\n", "Bold" }, + }) + for k, v in pairs(Loader._stats[stat]) do + if not vim.tbl_contains({ "time", "total" }, k) then + chunks[#chunks + 1] = { "* " .. k .. ":" .. string.rep(" ", 9 - #k) } + chunks[#chunks + 1] = { tostring(v) .. "\n", "Number" } + end end end + vim.api.nvim_echo(chunks, true, {}) end - vim.api.nvim_echo(chunks, true, {}) + return Loader._stats end -M._Cache = Loader - return M diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 0a1cd80..0ff335a 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -675,7 +675,7 @@ function M:debug() end) self:nl() - Util.foreach(require("lazy.core.cache").stats, function(name, stats) + Util.foreach(require("lazy.core.cache")._inspect(), function(name, stats) self:append(name, "LazyH2"):nl() local props = { { "total", stats.total or 0, "Number" }, From 261c2d6f95f1e71480c0a573275bbe4fb2c705a2 Mon Sep 17 00:00:00 2001 From: luozhiya <luozhiya@petalmail.com> Date: Wed, 22 Mar 2023 16:04:36 +0800 Subject: [PATCH 0877/1610] fix(ui): show full reason for Not-Loaded (#683) no print --- lua/lazy/view/render.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 0ff335a..91b8756 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -401,9 +401,11 @@ function M:plugin(plugin) local reason = {} for handler in pairs(Handler.types) do if plugin[handler] then + local trigger = {} for _, value in ipairs(plugin[handler]) do - reason[handler] = value + table.insert(trigger, type(value) == 'table' and value[1] or value) end + reason[handler] = table.concat(trigger, ' ') end end for _, other in pairs(Config.plugins) do From 4cdc8aa8dbcfee5d7cef1dcbf5159af50214f005 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Mar 2023 08:05:22 +0000 Subject: [PATCH 0878/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index be37db2..bbb935a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 20 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 22 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 0e230caab9466ae352e9aaa6a4327ebd3e72302a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 22 Mar 2023 16:06:27 +0100 Subject: [PATCH 0879/1610] feat(ui): added test to dimmed commits --- lua/lazy/view/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index 6c73d40..0e7dbf6 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -24,7 +24,7 @@ function M.get_commands() return ret end -M.dimmed_commits = { "build", "ci", "chore", "doc" } +M.dimmed_commits = { "build", "ci", "chore", "doc", "test" } M.keys = { hover = "K", From be77c59bf742379b6c5ad1e70d29c5fc1ee55944 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Mar 2023 08:12:43 +0100 Subject: [PATCH 0880/1610] chore(main): release 9.14.0 (#684) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 493b7a0..238610f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [9.14.0](https://github.com/folke/lazy.nvim/compare/v9.13.1...v9.14.0) (2023-03-22) + + +### Features + +* **ui:** added test to dimmed commits ([0e230ca](https://github.com/folke/lazy.nvim/commit/0e230caab9466ae352e9aaa6a4327ebd3e72302a)) + + +### Bug Fixes + +* **ui:** show full reason for Not-Loaded ([#683](https://github.com/folke/lazy.nvim/issues/683)) ([261c2d6](https://github.com/folke/lazy.nvim/commit/261c2d6f95f1e71480c0a573275bbe4fb2c705a2)) + ## [9.13.1](https://github.com/folke/lazy.nvim/compare/v9.13.0...v9.13.1) (2023-03-20) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4185c4e..d24ce8f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.13.1" -- x-release-please-version +M.version = "9.14.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From a80422f21750fcbf0e90b26da877d4024d76f116 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Mar 2023 07:13:26 +0000 Subject: [PATCH 0881/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index bbb935a..c0d078c 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 22 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 23 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From db5b67e75c31c955e3df9a3d6781f397b9dc66e8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 24 Mar 2023 21:22:13 +0100 Subject: [PATCH 0882/1610] fix(cache): handle corrupted cache files --- lua/lazy/core/cache.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index e988dae..d60d271 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -141,6 +141,9 @@ function Loader.read(name) uv.fs_close(f) local zero = data:find("\0", 1, true) + if not zero then + return + end ---@type integer[]|{[0]:integer} local header = vim.split(data:sub(1, zero - 1), ",") From 983aad3e79e6f7e3a65e1869d4116d627a9eaf28 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 20:23:03 +0000 Subject: [PATCH 0883/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c0d078c..47e12e3 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 23 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 24 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 32d5f4af2fdc0c04d60e3d5b5da3fc19a2c3699e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 23:08:27 +0100 Subject: [PATCH 0884/1610] chore(main): release 9.14.1 (#691) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 238610f..038381d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.14.1](https://github.com/folke/lazy.nvim/compare/v9.14.0...v9.14.1) (2023-03-24) + + +### Bug Fixes + +* **cache:** handle corrupted cache files ([db5b67e](https://github.com/folke/lazy.nvim/commit/db5b67e75c31c955e3df9a3d6781f397b9dc66e8)) + ## [9.14.0](https://github.com/folke/lazy.nvim/compare/v9.13.1...v9.14.0) (2023-03-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index d24ce8f..d80d1c1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.0" -- x-release-please-version +M.version = "9.14.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 9f9d733df9644106c258709e1c910d4034bf06ce Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 25 Mar 2023 09:56:10 +0100 Subject: [PATCH 0885/1610] fix(keys): dont add (n) to keys id --- lua/lazy/core/handler/keys.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 91ece7a..73b10b7 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -25,8 +25,9 @@ function M.parse(value) if type(mode) == "table" then ---@cast mode string[] table.sort(mode) - ret.id = ret.id .. " (" .. table.concat(mode, ", ") .. ")" - elseif mode ~= "n" then + mode = table.concat(mode, ", ") + end + if mode ~= "n" then ret.id = ret.id .. " (" .. mode .. ")" end end From 37c0aef4e36045ef344d69871f059f3672e69a5b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 25 Mar 2023 08:56:55 +0000 Subject: [PATCH 0886/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 47e12e3..7653924 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 24 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 25 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 57cce98dfdb2f2dd05a0567d89811e6d0505e13b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 25 Mar 2023 09:58:08 +0100 Subject: [PATCH 0887/1610] chore(main): release 9.14.2 (#693) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 038381d..abf9bf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.14.2](https://github.com/folke/lazy.nvim/compare/v9.14.1...v9.14.2) (2023-03-25) + + +### Bug Fixes + +* **keys:** dont add (n) to keys id ([9f9d733](https://github.com/folke/lazy.nvim/commit/9f9d733df9644106c258709e1c910d4034bf06ce)) + ## [9.14.1](https://github.com/folke/lazy.nvim/compare/v9.14.0...v9.14.1) (2023-03-24) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index d80d1c1..dc922e7 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.1" -- x-release-please-version +M.version = "9.14.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From b7a1a0fbaf1bd0f394783951f16d4c9f8c9dc210 Mon Sep 17 00:00:00 2001 From: futsuuu <105504350+futsuuu@users.noreply.github.com> Date: Sun, 16 Apr 2023 05:54:10 +0900 Subject: [PATCH 0888/1610] fix(render): show message if not yet committed (#707) * fix(render): show message if not yet committed * fix(render): show commit only if it can be shown --- lua/lazy/view/render.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 91b8756..36e1f96 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -499,7 +499,9 @@ function M:details(plugin) if git.branch then table.insert(props, { "branch", git.branch }) end - table.insert(props, { "commit", git.commit:sub(1, 7), "LazyCommit" }) + if git.commit then + table.insert(props, { "commit", git.commit:sub(1, 7), "LazyCommit" }) + end end if Util.file_exists(plugin.dir .. "/README.md") then table.insert(props, { "readme", "README.md" }) From 3c14a0a279d160a9fdfec5efc7e5e92226d08970 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 16 Apr 2023 07:39:39 +0200 Subject: [PATCH 0889/1610] test: fix tests --- tests/core/util_spec.lua | 34 +++------------------------------- 1 file changed, 3 insertions(+), 31 deletions(-) diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index 86b9f06..ee829a1 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -51,7 +51,7 @@ describe("util", function() local files = Helpers.fs_create(test.files) -- test with empty cache - package.loaded["lazy.core.cache"] = nil + Cache.reset() local root = Util.find_root(test.mod) assert(root, "no root found for " .. test.mod .. " (test " .. t .. ")") assert.same(Helpers.path(test.root), root) @@ -63,7 +63,7 @@ describe("util", function() assert.same(expected, mods) -- fill the cache - package.loaded["lazy.core.cache"] = nil + Cache.reset() root = Util.find_root(test.mod) assert(root, "no root found for " .. test.mod .. " (test " .. t .. ")") assert.same(Helpers.path(test.root), root) @@ -77,12 +77,9 @@ describe("util", function() end) it("find the correct root with dels", function() - Cache.cache = {} - Cache._topmods = {} - Cache.topmods_rtp = false + Cache.reset() vim.opt.rtp:append(Helpers.path("old")) Helpers.fs_create({ "old/lua/foobar/init.lua" }) - Cache.cache["foobar"] = { modpath = Helpers.path("old/lua/foobar/init.lua") } local root = Util.find_root("foobar") assert(root, "foobar root not found") assert.same(Helpers.path("old/lua/foobar"), root) @@ -91,7 +88,6 @@ describe("util", function() assert(not vim.loop.fs_stat(Helpers.path("old/lua/foobar")), "old/lua/foobar should not exist") -- vim.opt.rtp = rtp - Cache._topmods = {} vim.opt.rtp:append(Helpers.path("new")) Helpers.fs_create({ "new/lua/foobar/init.lua" }) root = Util.find_root("foobar") @@ -99,30 +95,6 @@ describe("util", function() assert.same(Helpers.path("new/lua/foobar"), root) end) - it("find the correct root with mod dels", function() - Cache.cache = {} - Cache._topmods = {} - Cache.enabled = true - vim.opt.rtp:append(Helpers.path("old")) - Helpers.fs_create({ "old/lua/foobar/test.lua" }) - Cache.cache["foobar.test"] = { modpath = Helpers.path("old/lua/foobar/test.lua") } - local root = Util.find_root("foobar") - assert(root, "foobar root not found") - assert.same(Helpers.path("old/lua/foobar"), root) - assert(not Cache.cache["foobar"], "foobar should not be in cache") - assert(Cache.cache["foobar.test"], "foobar.test not found in cache") - - Helpers.fs_rm("old") - - -- vim.opt.rtp = rtp - Cache._topmods = {} - vim.opt.rtp:append(Helpers.path("new")) - Helpers.fs_create({ "new/lua/foobar/test.lua" }) - root = Util.find_root("foobar") - assert(root, "foobar root not found") - assert.same(Helpers.path("new/lua/foobar"), root) - end) - it("merges correctly", function() local tests = { { From 86c1a767f041edf62a068c9fe2ea912058521477 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Apr 2023 05:40:19 +0000 Subject: [PATCH 0890/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 7653924..f7205d5 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 March 25 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 16 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From c8cad548950807848de11e3710de2b560758ecb4 Mon Sep 17 00:00:00 2001 From: dundargoc <33953936+dundargoc@users.noreply.github.com> Date: Sun, 16 Apr 2023 14:07:41 +0200 Subject: [PATCH 0891/1610] fix(checkhealth): use non-deprecated versions if possible (#729) --- lua/lazy/health.lua | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 83096c0..38fa0ed 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -2,13 +2,19 @@ local Config = require("lazy.core.config") local M = {} +-- "report_" prefix has been deprecated, use the recommended replacements if they exist. +local start = vim.health.start or vim.health.report_start +local ok = vim.health.ok or vim.health.report_ok +local warn = vim.health.warn or vim.health.report_warn +local error = vim.health.error or vim.health.report_error + function M.check() - vim.health.report_start("lazy.nvim") + start("lazy.nvim") if vim.fn.executable("git") == 1 then - vim.health.report_ok("Git installed") + ok("Git installed") else - vim.health.report_error("Git not installd?") + error("Git not installd?") end local sites = vim.opt.packpath:get() @@ -22,18 +28,18 @@ function M.check() for _, packs in ipairs(vim.fn.expand(site .. "/pack/*", false, true)) do if not packs:find("[/\\]dist$") and vim.loop.fs_stat(packs) then existing = true - vim.health.report_warn("found existing packages at `" .. packs .. "`") + warn("found existing packages at `" .. packs .. "`") end end end if not existing then - vim.health.report_ok("no existing packages found by other package managers") + ok("no existing packages found by other package managers") end for _, name in ipairs({ "packer", "plugged", "paq" }) do for _, path in ipairs(vim.opt.rtp:get()) do if path:find(name, 1, true) then - vim.health.report_error("Found paths on the rtp from another plugin manager `" .. name .. "`") + error("Found paths on the rtp from another plugin manager `" .. name .. "`") break end end @@ -41,9 +47,9 @@ function M.check() local packer_compiled = vim.fn.stdpath("config") .. "/plugin/packer_compiled.lua" if vim.loop.fs_stat(packer_compiled) then - vim.health.report_error("please remove the file `" .. packer_compiled .. "`") + error("please remove the file `" .. packer_compiled .. "`") else - vim.health.report_ok("packer_compiled.lua not found") + ok("packer_compiled.lua not found") end local spec = Config.spec @@ -52,14 +58,14 @@ function M.check() M.check_override(plugin) end if #spec.notifs > 0 then - vim.health.report_error("Issues were reported when loading your specs:") + error("Issues were reported when loading your specs:") for _, notif in ipairs(spec.notifs) do local lines = vim.split(notif.msg, "\n") for _, line in ipairs(lines) do if notif.level == vim.log.levels.ERROR then - vim.health.report_error(line) + error(line) else - vim.health.report_warn(line) + warn(line) end end end @@ -71,7 +77,7 @@ function M.check_valid(plugin) for key in pairs(plugin) do if not vim.tbl_contains(M.valid, key) then if key ~= "module" or type(plugin.module) ~= "boolean" then - vim.health.report_warn("{" .. plugin.name .. "}: unknown key <" .. key .. ">") + warn("{" .. plugin.name .. "}: unknown key <" .. key .. ">") end end end @@ -89,7 +95,7 @@ function M.check_override(plugin) for key, value in pairs(plugin._.super) do if not vim.tbl_contains(skip, key) and plugin[key] and plugin[key] ~= value then - vim.health.report_warn("{" .. plugin.name .. "}: overriding <" .. key .. ">") + warn("{" .. plugin.name .. "}: overriding <" .. key .. ">") end end end From eddee830ede0f95ced9802ca9abd3f8f662e5cc5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Apr 2023 14:15:55 +0200 Subject: [PATCH 0892/1610] chore(main): release 9.14.3 (#728) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abf9bf6..9b22086 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [9.14.3](https://github.com/folke/lazy.nvim/compare/v9.14.2...v9.14.3) (2023-04-16) + + +### Bug Fixes + +* **checkhealth:** use non-deprecated versions if possible ([#729](https://github.com/folke/lazy.nvim/issues/729)) ([c8cad54](https://github.com/folke/lazy.nvim/commit/c8cad548950807848de11e3710de2b560758ecb4)) +* **render:** show message if not yet committed ([#707](https://github.com/folke/lazy.nvim/issues/707)) ([b7a1a0f](https://github.com/folke/lazy.nvim/commit/b7a1a0fbaf1bd0f394783951f16d4c9f8c9dc210)) + ## [9.14.2](https://github.com/folke/lazy.nvim/compare/v9.14.1...v9.14.2) (2023-03-25) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index dc922e7..105ea16 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.2" -- x-release-please-version +M.version = "9.14.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From b582fc554582c755c221fdcbb7dce648e971cd88 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 18 Apr 2023 10:17:22 +0200 Subject: [PATCH 0893/1610] fix(cmd): show descriptive error when command was not found after loading its plugins --- lua/lazy/core/handler/cmd.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index 86711de..28c7d9b 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -28,14 +28,20 @@ function M:_add(cmd) command.range = { event.line1, event.line2 } end + ---@type string + local plugins = "`" .. table.concat(vim.tbl_values(self.active[cmd]), ", ") .. "`" + self:_load(cmd) local info = vim.api.nvim_get_commands({})[cmd] + if not info then + return Util.error("Command `" .. cmd .. "` not found after loading " .. plugins) + end + command.nargs = info.nargs if event.args and event.args ~= "" and info.nargs and info.nargs:find("[1?]") then command.args = { event.args } end - vim.cmd(command) end, { bang = true, From a7f18f0192735f84384d929c64abe966ebdc789c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 18 Apr 2023 08:18:07 +0000 Subject: [PATCH 0894/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f7205d5..1eb33a7 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 16 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 18 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 5f13f69851d2b244891d77590db9e3370197facc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 18 Apr 2023 10:21:25 +0200 Subject: [PATCH 0895/1610] chore(main): release 9.14.4 (#734) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b22086..4ac55ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.14.4](https://github.com/folke/lazy.nvim/compare/v9.14.3...v9.14.4) (2023-04-18) + + +### Bug Fixes + +* **cmd:** show descriptive error when command was not found after loading its plugins ([b582fc5](https://github.com/folke/lazy.nvim/commit/b582fc554582c755c221fdcbb7dce648e971cd88)) + ## [9.14.3](https://github.com/folke/lazy.nvim/compare/v9.14.2...v9.14.3) (2023-04-16) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 105ea16..8ca0a16 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.3" -- x-release-please-version +M.version = "9.14.4" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 78b981b1f33c50ebc51262694bf99e32cc3012b4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 19 Apr 2023 12:59:29 +0200 Subject: [PATCH 0896/1610] fix(loader): keep using the internal lua cache till 0.9.1 --- lua/lazy/core/cache.lua | 10 ---------- lua/lazy/init.lua | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index d60d271..ea9f4d9 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -1,13 +1,3 @@ ----@diagnostic disable: duplicate-doc-alias ----@diagnostic disable: duplicate-doc-field ----@diagnostic disable: duplicate-set-field - --- interop with the native Neovim loader -if vim.loader then - return vim.loader -end - --- NEOVIM local uv = vim.loop local M = {} diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 2f015b6..2b41ffd 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -34,7 +34,7 @@ function M.setup(spec, opts) local start = vim.loop.hrtime() -- use the NEovim cache if available - if vim.loader then + if vim.loader and vim.fn.has("nvim-0.9.1") == 1 then package.loaded["lazy.core.cache"] = vim.loader end From 349af248614244e3769265eb67404b41ff965afe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:00:24 +0000 Subject: [PATCH 0897/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1eb33a7..03bbc5e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 18 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 19 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 5c89dc52f42e5058a46b0912d7d9042f564e44e0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 19 Apr 2023 13:14:15 +0200 Subject: [PATCH 0898/1610] chore(main): release 9.14.5 (#738) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ac55ad..fa52df9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.14.5](https://github.com/folke/lazy.nvim/compare/v9.14.4...v9.14.5) (2023-04-19) + + +### Bug Fixes + +* **loader:** keep using the internal lua cache till 0.9.1 ([78b981b](https://github.com/folke/lazy.nvim/commit/78b981b1f33c50ebc51262694bf99e32cc3012b4)) + ## [9.14.4](https://github.com/folke/lazy.nvim/compare/v9.14.3...v9.14.4) (2023-04-18) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 8ca0a16..cd936a1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.4" -- x-release-please-version +M.version = "9.14.5" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From dff6f07290b12a2904d9b6a00ba207f6dd68193b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 22 Apr 2023 14:10:06 +0200 Subject: [PATCH 0899/1610] style(plugins): more descriptive error when a spec module didnt return any specs --- lua/lazy/core/plugin.lua | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index a0b1428..72d5a06 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -268,7 +268,18 @@ function Spec:import(spec) ---@diagnostic disable-next-line: no-unknown package.loaded[modname] = nil Util.try(function() - self:normalize(require(modname)) + local mod = require(modname) + if type(mod) ~= "table" then + self.importing = nil + return self:error( + "Invalid spec module: `" + .. modname + .. "`\nExpected a `table` of specs, but a `" + .. type(mod) + .. "` was returned instead" + ) + end + self:normalize(mod) self.importing = nil Util.track() end, { From fe28f4b73e0df887ec20196a00a1eddd12a2cf5f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 22 Apr 2023 12:10:51 +0000 Subject: [PATCH 0900/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 03bbc5e..4d29308 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 19 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 22 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 0cbf4669138961c27566de684a0df95c01cd35ad Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 23 Apr 2023 15:59:31 +0200 Subject: [PATCH 0901/1610] fix(util): use vim.o.shell by default --- lua/lazy/util.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 743a679..b2629b1 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -101,7 +101,7 @@ function M.float_term(cmd, opts) cmd = { cmd } end if #cmd == 0 then - cmd = { vim.env.SHELL or vim.o.shell } + cmd = { vim.o.shell } end opts = opts or {} local float = M.float(opts) From f66e68c00ef65b10e5b44ac80f68dd8e09a5927f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 23 Apr 2023 14:00:22 +0000 Subject: [PATCH 0902/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4d29308..ae80ca4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 22 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 23 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From a55ab6062520a9ea13e90e90bf3e3ef3843c5b0f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 23 Apr 2023 16:35:26 +0200 Subject: [PATCH 0903/1610] chore(main): release 9.14.6 (#741) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa52df9..690e425 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.14.6](https://github.com/folke/lazy.nvim/compare/v9.14.5...v9.14.6) (2023-04-23) + + +### Bug Fixes + +* **util:** use vim.o.shell by default ([0cbf466](https://github.com/folke/lazy.nvim/commit/0cbf4669138961c27566de684a0df95c01cd35ad)) + ## [9.14.5](https://github.com/folke/lazy.nvim/compare/v9.14.4...v9.14.5) (2023-04-19) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index cd936a1..a4a9d44 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.5" -- x-release-please-version +M.version = "9.14.6" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From a7585880081a8ae3dfbecfced960dcfdc124c361 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Apr 2023 07:54:21 +0200 Subject: [PATCH 0904/1610] fix(build): make sure to properly load handlers for plugins that were built during startup. Fixes #744 --- lua/lazy/core/handler/init.lua | 7 ++++--- lua/lazy/core/loader.lua | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index 5e9074b..af85820 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -25,7 +25,7 @@ function M.setup() end for _, plugin in pairs(Config.plugins) do Util.try(function() - M.enable(plugin) + M.enable(plugin, true) end, "Failed to setup handlers for " .. plugin.name) end end @@ -40,8 +40,9 @@ function M.disable(plugin) end ---@param plugin LazyPlugin -function M.enable(plugin) - if not plugin._.loaded then +---@param force? boolean +function M.enable(plugin, force) + if force or not plugin._.loaded then for type, handler in pairs(M.handlers) do if plugin[type] then handler:add(plugin) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 6e3b653..03f1105 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -70,7 +70,7 @@ function M.install_missing() end end require("lazy.manage").install({ wait = true, lockfile = true }) - -- remove and installed plugins from indexed, so cache will index again + -- remove any installed plugins from indexed, so cache will index again for _, p in pairs(Config.plugins) do if p._.installed then Cache.reset(p.dir) From 24e8fb0f8d35b0771adc656ad8e2b8164efb16d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 05:55:04 +0000 Subject: [PATCH 0905/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ae80ca4..3c152ac 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 23 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 24 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 903f0fe542fc35b74f3c09494f9c175346dfa76d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 08:41:31 +0200 Subject: [PATCH 0906/1610] chore(main): release 9.14.7 (#745) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 690e425..312ad8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.14.7](https://github.com/folke/lazy.nvim/compare/v9.14.6...v9.14.7) (2023-04-24) + + +### Bug Fixes + +* **build:** make sure to properly load handlers for plugins that were built during startup. Fixes [#744](https://github.com/folke/lazy.nvim/issues/744) ([a758588](https://github.com/folke/lazy.nvim/commit/a7585880081a8ae3dfbecfced960dcfdc124c361)) + ## [9.14.6](https://github.com/folke/lazy.nvim/compare/v9.14.5...v9.14.6) (2023-04-23) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index a4a9d44..018c044 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.6" -- x-release-please-version +M.version = "9.14.7" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 0c7b41872ed20f12b45c41cadbccbf74554ac68e Mon Sep 17 00:00:00 2001 From: Ulibos <49131389+Ulibos@users.noreply.github.com> Date: Thu, 27 Apr 2023 19:21:02 +0300 Subject: [PATCH 0907/1610] fix(health): show error if setup didn't run * Fix back bootstrapping and healthcheck for fresh install with no packages to fetch. * Revert changes to bootstrapping, make checkhealth produce more meaningful message. --- lua/lazy/health.lua | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 38fa0ed..f0ccb22 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -53,19 +53,23 @@ function M.check() end local spec = Config.spec - for _, plugin in pairs(spec.plugins) do - M.check_valid(plugin) - M.check_override(plugin) - end - if #spec.notifs > 0 then - error("Issues were reported when loading your specs:") - for _, notif in ipairs(spec.notifs) do - local lines = vim.split(notif.msg, "\n") - for _, line in ipairs(lines) do - if notif.level == vim.log.levels.ERROR then - error(line) - else - warn(line) + if spec == nil then + error("No plugins loaded. Did you forget to run `require(\"lazy\").setup()`?") + else + for _, plugin in pairs(spec.plugins) do + M.check_valid(plugin) + M.check_override(plugin) + end + if #spec.notifs > 0 then + error("Issues were reported when loading your specs:") + for _, notif in ipairs(spec.notifs) do + local lines = vim.split(notif.msg, "\n") + for _, line in ipairs(lines) do + if notif.level == vim.log.levels.ERROR then + error(line) + else + warn(line) + end end end end From 5d3d5fb31dcf2ef6f1bda58972c5adfcbd8ff944 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 27 Apr 2023 16:21:42 +0000 Subject: [PATCH 0908/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 3c152ac..e73f957 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 24 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 27 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From d6a782c7002682f4a01b79fc3918c4584ad6e8fb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Apr 2023 10:46:45 +0200 Subject: [PATCH 0909/1610] chore(main): release 9.14.8 (#759) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 312ad8b..ad36ef0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.14.8](https://github.com/folke/lazy.nvim/compare/v9.14.7...v9.14.8) (2023-04-27) + + +### Bug Fixes + +* **health:** show error if setup didn't run ([0c7b418](https://github.com/folke/lazy.nvim/commit/0c7b41872ed20f12b45c41cadbccbf74554ac68e)) + ## [9.14.7](https://github.com/folke/lazy.nvim/compare/v9.14.6...v9.14.7) (2023-04-24) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 018c044..2805b63 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.7" -- x-release-please-version +M.version = "9.14.8" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From bb5cc9ef3bbb17541929b745f74551c900188099 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Apr 2023 08:47:28 +0000 Subject: [PATCH 0910/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e73f957..5ce7770 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 27 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 28 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From b00d6f7102a3345704edb46cbabf2dfa21d78d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl=20Yngve=20Lerv=C3=A5g?= <karl.yngve@lervag.net> Date: Tue, 2 May 2023 21:30:28 +0200 Subject: [PATCH 0911/1610] fix(ui): don't pad empty lines (#768) --- lua/lazy/view/text.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index 5351db4..f4afb6e 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -72,6 +72,9 @@ function Text:render(buf) str = str .. segment.str end + if str:match("^%s*$") then + str = "" + end table.insert(lines, str) end From 5a470ae558b7443e054ab9bed262b73231aeb47f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 2 May 2023 19:31:06 +0000 Subject: [PATCH 0912/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5ce7770..211c468 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 April 28 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 02 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 5b7b8eeceae7429cbf0d8b80c8a8375beaee3bc3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 2 May 2023 21:32:16 +0200 Subject: [PATCH 0913/1610] chore(main): release 9.14.9 (#769) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad36ef0..64e6b57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.14.9](https://github.com/folke/lazy.nvim/compare/v9.14.8...v9.14.9) (2023-05-02) + + +### Bug Fixes + +* **ui:** don't pad empty lines ([#768](https://github.com/folke/lazy.nvim/issues/768)) ([b00d6f7](https://github.com/folke/lazy.nvim/commit/b00d6f7102a3345704edb46cbabf2dfa21d78d24)) + ## [9.14.8](https://github.com/folke/lazy.nvim/compare/v9.14.7...v9.14.8) (2023-04-27) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 2805b63..f158c61 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.8" -- x-release-please-version +M.version = "9.14.9" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 98ba47efedc4a29d2258fe80434d87bf5f72baa2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 2 May 2023 21:47:29 +0200 Subject: [PATCH 0914/1610] fix(ui): issue with rendering empty lines. Fixes #770 --- lua/lazy/view/text.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index f4afb6e..edbf622 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -88,7 +88,7 @@ function Text:render(buf) local width = vim.fn.strlen(segment.str) local extmark = segment.hl - if extmark then + if extmark and width > 0 then if type(extmark) == "string" then extmark = { hl_group = extmark, end_col = col + width } end From ceb413678dfcf3d5455208959185e3db1f7892c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 2 May 2023 21:49:29 +0200 Subject: [PATCH 0915/1610] chore(main): release 9.14.10 (#772) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64e6b57..9418e04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.14.10](https://github.com/folke/lazy.nvim/compare/v9.14.9...v9.14.10) (2023-05-02) + + +### Bug Fixes + +* **ui:** issue with rendering empty lines. Fixes [#770](https://github.com/folke/lazy.nvim/issues/770) ([98ba47e](https://github.com/folke/lazy.nvim/commit/98ba47efedc4a29d2258fe80434d87bf5f72baa2)) + ## [9.14.9](https://github.com/folke/lazy.nvim/compare/v9.14.8...v9.14.9) (2023-05-02) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f158c61..3d925cc 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.9" -- x-release-please-version +M.version = "9.14.10" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From dbe0e29d85e2769be6c9738c176ba6d8b0c6817a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 5 May 2023 14:06:59 +0200 Subject: [PATCH 0916/1610] fix(ui): don' render extmarks for empty lines --- lua/lazy/view/text.lua | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index edbf622..614381a 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -82,30 +82,32 @@ function Text:render(buf) vim.api.nvim_buf_clear_namespace(buf, Config.ns, 0, -1) for l, line in ipairs(self._lines) do - local col = self.padding + if lines[l] ~= "" then + local col = self.padding - for _, segment in ipairs(line) do - local width = vim.fn.strlen(segment.str) + for _, segment in ipairs(line) do + local width = vim.fn.strlen(segment.str) - local extmark = segment.hl - if extmark and width > 0 then - if type(extmark) == "string" then - extmark = { hl_group = extmark, end_col = col + width } + local extmark = segment.hl + if extmark then + if type(extmark) == "string" then + extmark = { hl_group = extmark, end_col = col + width } + end + ---@cast extmark Extmark + + local extmark_col = extmark.col or col + extmark.col = nil + local ok = pcall(vim.api.nvim_buf_set_extmark, buf, Config.ns, l - 1, extmark_col, extmark) + if not ok then + Util.error( + "Failed to set extmark. Please report a bug with this info:\n" + .. vim.inspect({ segment = segment, line = line }) + ) + end end - ---@cast extmark Extmark - local extmark_col = extmark.col or col - extmark.col = nil - local ok = pcall(vim.api.nvim_buf_set_extmark, buf, Config.ns, l - 1, extmark_col, extmark) - if not ok then - Util.error( - "Failed to set extmark. Please report a bug with this info:\n" - .. vim.inspect({ segment = segment, line = line }) - ) - end + col = col + width end - - col = col + width end end end From 83a625f5c884a3ceee821ce54a812c8321ecba31 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 12:07:43 +0000 Subject: [PATCH 0917/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 211c468..75651e3 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 02 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 05 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 51a3873ccd59239e4dff3319561d51031f4b52d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 7 May 2023 19:32:26 +0200 Subject: [PATCH 0918/1610] chore(main): release 9.14.11 (#782) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9418e04..9fd301d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.14.11](https://github.com/folke/lazy.nvim/compare/v9.14.10...v9.14.11) (2023-05-05) + + +### Bug Fixes + +* **ui:** don' render extmarks for empty lines ([dbe0e29](https://github.com/folke/lazy.nvim/commit/dbe0e29d85e2769be6c9738c176ba6d8b0c6817a)) + ## [9.14.10](https://github.com/folke/lazy.nvim/compare/v9.14.9...v9.14.10) (2023-05-02) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 3d925cc..f92354e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.10" -- x-release-please-version +M.version = "9.14.11" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 9ac19880b677d08f416c5189ffc2dc023084a159 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 7 May 2023 17:33:12 +0000 Subject: [PATCH 0919/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 75651e3..3f4c0a3 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 05 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 07 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From d2d67b5a0ba90a33eeae0a1a661249b26754143b Mon Sep 17 00:00:00 2001 From: Fraser Hanson <fraser.hanson@gmail.com> Date: Wed, 10 May 2023 08:20:06 -0700 Subject: [PATCH 0920/1610] fix(config): use url_format for the lazy plugin (#792) Co-authored-by: Fraser Hanson <fraser.hanson@netapp.com> --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 72d5a06..f06a1ff 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -375,7 +375,7 @@ function M.load() -- load specs Util.track("spec") Config.spec = Spec.new() - Config.spec:parse({ vim.deepcopy(Config.options.spec), { url = "https://github.com/folke/lazy.nvim.git" } }) + Config.spec:parse({ vim.deepcopy(Config.options.spec), { "folke/lazy.nvim" } }) -- override some lazy props local lazy = Config.spec.plugins["lazy.nvim"] From 652b6febf8d5c99eb8cf4a1cec63da6db62e77d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 15:26:00 +0000 Subject: [PATCH 0921/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 3f4c0a3..3ea8a68 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 07 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 10 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -28,7 +28,6 @@ Table of Contents *lazy.nvim-table-of-contents* FEATURES *lazy.nvim-lazy.nvim-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 @@ -50,7 +49,6 @@ FEATURES *lazy.nvim-lazy.nvim-features* REQUIREMENTS *lazy.nvim-lazy.nvim-requirements* - - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) - a Nerd Font <https://www.nerdfonts.com/> **(optional)** @@ -83,7 +81,6 @@ Nextstep is to add **lazy.nvim** below the code added in the prior step in require("lazy").setup(plugins, opts) < - - **plugins**this should be a `table` or a `string` - `table`a list with your |lazy.nvim-plugin-spec| - `string`a Lua module name that contains your |lazy.nvim-plugin-spec|. See |lazy.nvim-structuring-your-plugins| @@ -220,7 +217,6 @@ types** and **key mappings**. Plugins will be lazy-loaded when one of the following is `true` - - Theplugin only exists as a dependency in your spec - It has an `event`, `cmd`, `ft` or `keys` key - `config.defaults.lazy == true` @@ -242,7 +238,6 @@ LAZY KEY MAPPINGS The `keys` property can be a `string` or `string[]` for simple normal-mode mappings, or it can be a `LazyKeys` table with the following key-value pairs: - - **[1]**(`string`) lhs **(required)** - **[2]**(`string|fun()`) rhs **(optional)** - **mode**(`string|string[]`) mode **(optional, defaults to "n")** @@ -276,7 +271,6 @@ The `version` property supports Semver <https://semver.org/> ranges. Click to see some 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`. @@ -620,7 +614,6 @@ example, if you want to sync lazy from the cmdline, you can use: `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 @@ -668,7 +661,6 @@ 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 @@ -723,8 +715,10 @@ 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 executed2. 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 you rtp are sourced (excluding `/after`)4. All `/after/plugin` files are sourced (this includes `/after` from plugins) +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 you 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. @@ -739,21 +733,18 @@ 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 @@ -764,13 +755,11 @@ Example: } < - - 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 <https://github.com/LazyVim/LazyVim> and more specifically: - - lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/plugins> contains all the plugin specs that will be loaded @@ -811,7 +800,6 @@ MIGRATION GUIDE *lazy.nvim-lazy.nvim-migration-guide* PACKER.NVIM ~ - - `setup` `init` - `requires` `dependencies` - `as` `name` @@ -844,7 +832,6 @@ loaded. PAQ-NVIM ~ - - `as` `name` - `opt` `lazy` - `run` `build` @@ -855,7 +842,6 @@ UNINSTALLING *lazy.nvim-lazy.nvim-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` @@ -934,7 +920,6 @@ Click to see all highlight groups ~ OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-lazy.nvim-other-neovim-plugin-managers-in-lua* - - packer.nvim <https://github.com/wbthomason/packer.nvim> - paq-nvim <https://github.com/savq/paq-nvim> - neopm <https://github.com/ii14/neopm> From 96dd2058fb5427d87589825ad6001ad017548e81 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 13 May 2023 13:24:38 +0200 Subject: [PATCH 0922/1610] feat(ui): show the loaded icon for local plugins in a different color --- lua/lazy/view/colors.lua | 1 + lua/lazy/view/render.lua | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index 333af82..6d43f1f 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -13,6 +13,7 @@ M.colors = { Prop = "Conceal", -- property Value = "@string", -- value of a property NoCond = "DiagnosticWarn", -- unloaded icon for a plugin where `cond()` was false + Local = "Constant", ProgressDone = "Constant", -- progress bar done ProgressTodo = "LineNr", -- progress bar todo Special = "@punctuation.special", diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 36e1f96..d5bc9df 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -386,12 +386,13 @@ end ---@param plugin LazyPlugin function M:plugin(plugin) + local hl = plugin._.is_local and "LazyLocal" or "LazySpecial" if plugin._.loaded then - self:append(" " .. Config.options.ui.icons.loaded .. " ", "LazySpecial"):append(plugin.name) + self:append(" " .. Config.options.ui.icons.loaded .. " ", hl):append(plugin.name) elseif plugin._.cond == false then self:append(" " .. Config.options.ui.icons.not_loaded .. " ", "LazyNoCond"):append(plugin.name) else - self:append(" " .. Config.options.ui.icons.not_loaded .. " ", "LazySpecial"):append(plugin.name) + self:append(" " .. Config.options.ui.icons.not_loaded .. " ", hl):append(plugin.name) end local plugin_start = self:row() if plugin._.loaded then @@ -403,9 +404,9 @@ function M:plugin(plugin) if plugin[handler] then local trigger = {} for _, value in ipairs(plugin[handler]) do - table.insert(trigger, type(value) == 'table' and value[1] or value) + table.insert(trigger, type(value) == "table" and value[1] or value) end - reason[handler] = table.concat(trigger, ' ') + reason[handler] = table.concat(trigger, " ") end end for _, other in pairs(Config.plugins) do From 3fef7697869bd87d53d57267b5a018580c1e99ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 13 May 2023 11:25:25 +0000 Subject: [PATCH 0923/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 3ea8a68..bab6b9e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 10 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 13 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From e9b3b83914c2adf5385111a4f163ced0b4b7f529 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 13 May 2023 15:48:53 +0200 Subject: [PATCH 0924/1610] chore(main): release 9.15.0 (#795) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fd301d..4cce9b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [9.15.0](https://github.com/folke/lazy.nvim/compare/v9.14.11...v9.15.0) (2023-05-13) + + +### Features + +* **ui:** show the loaded icon for local plugins in a different color ([96dd205](https://github.com/folke/lazy.nvim/commit/96dd2058fb5427d87589825ad6001ad017548e81)) + + +### Bug Fixes + +* **config:** use url_format for the lazy plugin ([#792](https://github.com/folke/lazy.nvim/issues/792)) ([d2d67b5](https://github.com/folke/lazy.nvim/commit/d2d67b5a0ba90a33eeae0a1a661249b26754143b)) + ## [9.14.11](https://github.com/folke/lazy.nvim/compare/v9.14.10...v9.14.11) (2023-05-05) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f92354e..5401a6a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.14.11" -- x-release-please-version +M.version = "9.15.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From dab6cd50806d6a6b0e8267f628d5fd6b112b151c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 13 May 2023 16:09:48 +0200 Subject: [PATCH 0925/1610] feat(loader): added explicit support for finding the main module for mini.nvim plugins --- lua/lazy/core/loader.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 03f1105..a6eeb55 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -343,6 +343,9 @@ function M.get_main(plugin) if plugin.main then return plugin.main end + if plugin.name ~= "mini.nvim" and plugin.name:match("^mini%..*$") then + return plugin.name + end local normname = Util.normname(plugin.name) ---@type string[] local mods = {} @@ -356,6 +359,7 @@ function M.get_main(plugin) break end end + return #mods == 1 and mods[1] or nil end From aba872ec78ffe7f7367764ab0fff6f0170421fde Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 13 May 2023 16:12:49 +0200 Subject: [PATCH 0926/1610] chore(main): release 9.16.0 (#801) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cce9b2..689efb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.16.0](https://github.com/folke/lazy.nvim/compare/v9.15.0...v9.16.0) (2023-05-13) + + +### Features + +* **loader:** added explicit support for finding the main module for mini.nvim plugins ([dab6cd5](https://github.com/folke/lazy.nvim/commit/dab6cd50806d6a6b0e8267f628d5fd6b112b151c)) + ## [9.15.0](https://github.com/folke/lazy.nvim/compare/v9.14.11...v9.15.0) (2023-05-13) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5401a6a..e50df72 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.15.0" -- x-release-please-version +M.version = "9.16.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 80c4decc3226551b433dfea5e459998a96f17822 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 17 May 2023 19:35:16 +0200 Subject: [PATCH 0927/1610] fix(loader): dont clear tasks when istalling missing plugins --- lua/lazy/core/loader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index a6eeb55..ba6a968 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -69,7 +69,7 @@ function M.install_missing() break end end - require("lazy.manage").install({ wait = true, lockfile = true }) + require("lazy.manage").install({ wait = true, lockfile = true, clear = false }) -- remove any installed plugins from indexed, so cache will index again for _, p in pairs(Config.plugins) do if p._.installed then From aecdaab6a6ce8c9fdf9f983d5f943c6cfb11bf61 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 17 May 2023 19:36:00 +0200 Subject: [PATCH 0928/1610] fix(loader): reset cache before installing plugins during startup. Fixes #803 --- lua/lazy/core/loader.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index ba6a968..32067b3 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -69,6 +69,7 @@ function M.install_missing() break end end + Cache.reset() require("lazy.manage").install({ wait = true, lockfile = true, clear = false }) -- remove any installed plugins from indexed, so cache will index again for _, p in pairs(Config.plugins) do From a4e49029b9023797ea13f43fe9161dd548138686 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 17:36:45 +0000 Subject: [PATCH 0929/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index bab6b9e..56f526d 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 13 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 17 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 53e1c49baed4009eccf103dbc77fcb06255019d8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 19:38:31 +0200 Subject: [PATCH 0930/1610] chore(main): release 9.16.1 (#804) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 689efb5..9820f48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [9.16.1](https://github.com/folke/lazy.nvim/compare/v9.16.0...v9.16.1) (2023-05-17) + + +### Bug Fixes + +* **loader:** dont clear tasks when istalling missing plugins ([80c4dec](https://github.com/folke/lazy.nvim/commit/80c4decc3226551b433dfea5e459998a96f17822)) +* **loader:** reset cache before installing plugins during startup. Fixes [#803](https://github.com/folke/lazy.nvim/issues/803) ([aecdaab](https://github.com/folke/lazy.nvim/commit/aecdaab6a6ce8c9fdf9f983d5f943c6cfb11bf61)) + ## [9.16.0](https://github.com/folke/lazy.nvim/compare/v9.15.0...v9.16.0) (2023-05-13) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index e50df72..28a6bec 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.16.0" -- x-release-please-version +M.version = "9.16.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 11131eafa165e54b08aeff3d7e35c65ef8b6e034 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 18 May 2023 19:51:14 +0200 Subject: [PATCH 0931/1610] feat(cmd): added `Lazy load all` to load all plugins --- lua/lazy/view/commands.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index f1ab877..0476400 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -69,6 +69,9 @@ function M.complete(cmd, prefix) end ---@type string[] local plugins = {} + if cmd == "load" then + plugins[#plugins + 1] = "all" + end for name, plugin in pairs(Config.plugins) do if cmd ~= "load" or not plugin._.loaded then plugins[#plugins + 1] = name @@ -86,6 +89,9 @@ function M.setup() ---@type ManagerOpts local opts = { wait = cmd.bang == true } local prefix, args = M.parse(cmd.args) + if #args == 1 and args[1] == "all" then + args = vim.tbl_keys(Config.plugins) + end if #args > 0 then ---@param plugin string opts.plugins = vim.tbl_map(function(plugin) From 6d4135d83d00f83a797dfe0f93a8d3fce08e6a2f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 18 May 2023 17:52:02 +0000 Subject: [PATCH 0932/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 56f526d..4d7454b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 17 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 18 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From c711b4f8a6211a8ea3f3c35f0962ac0b6b8550cc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 May 2023 10:23:49 +0200 Subject: [PATCH 0933/1610] chore(main): release 9.17.0 (#806) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9820f48..3fe0414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.17.0](https://github.com/folke/lazy.nvim/compare/v9.16.1...v9.17.0) (2023-05-18) + + +### Features + +* **cmd:** added `Lazy load all` to load all plugins ([11131ea](https://github.com/folke/lazy.nvim/commit/11131eafa165e54b08aeff3d7e35c65ef8b6e034)) + ## [9.16.1](https://github.com/folke/lazy.nvim/compare/v9.16.0...v9.16.1) (2023-05-17) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 28a6bec..f4f2240 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.16.1" -- x-release-please-version +M.version = "9.17.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 91564cb0a6d038d7e0eeaf68d505ed2627de625b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 19 May 2023 08:24:27 +0000 Subject: [PATCH 0934/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4d7454b..bce0050 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 18 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 19 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From cc7a764aecec11c9598ccd442a6879eed4e85558 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 20 May 2023 09:26:23 +0200 Subject: [PATCH 0935/1610] fix(ui): close ui when opening a help file. Fixes #808 --- lua/lazy/view/init.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index b661d5a..ea35347 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -172,7 +172,10 @@ function M:setup_patterns() Util.open(plugin.dir .. "/README.md") end end, - ["|(%S-)|"] = vim.cmd.help, -- vim help links + ["|(%S-)|"] = function(h) + vim.cmd.help(h) + self:close() + end, ["(https?://%S+)"] = function(url) Util.open(url) end, From 5f316cea4f0b5379e0094d6cfa5e1ee5e279f65a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 20 May 2023 07:27:08 +0000 Subject: [PATCH 0936/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index bce0050..b1f2940 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 19 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 20 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 451f217e9b2d71f08bdae0ce5ac7e8e8a6503f48 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 21 May 2023 20:51:41 +0200 Subject: [PATCH 0937/1610] fix(ui): take border into account for window position. Fixes #812 --- lua/lazy/view/float.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 974fb8e..a7054ae 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -35,7 +35,7 @@ function M:init(opts) self.opts = vim.tbl_deep_extend("force", { size = Config.options.ui.size, style = "minimal", - border = Config.options.ui.border, + border = Config.options.ui.border or "none", zindex = 50, }, opts or {}) @@ -66,6 +66,11 @@ function M:layout() self.win_opts.row = math.floor((vim.o.lines - self.win_opts.height) / 2) self.win_opts.col = math.floor((vim.o.columns - self.win_opts.width) / 2) + if self.opts.border ~= "none" then + self.win_opts.row = self.win_opts.row - 1 + self.win_opts.col = self.win_opts.col - 1 + end + if self.opts.margin then if self.opts.margin.top then self.win_opts.height = self.win_opts.height - self.opts.margin.top From b382495d512fbc6dadbeac8b806efc72db7130e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 21 May 2023 18:52:18 +0000 Subject: [PATCH 0938/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b1f2940..bdce0b7 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 20 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 21 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 8564f6d22b78a4a0fba9811faa556159b6c90a49 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 22 May 2023 14:24:18 +0200 Subject: [PATCH 0939/1610] feat(plugin): added support for `weak` specs. They will not be included in the final spec if not specified somwhere else --- lua/lazy/core/plugin.lua | 7 +++++++ lua/lazy/types.lua | 1 + 2 files changed, 8 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f06a1ff..15d5b2d 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -141,6 +141,13 @@ function Spec:warn(msg) end function Spec:fix_disabled() + -- handle weak plugins + for _, plugin in pairs(self.plugins) do + if plugin.weak and not plugin._.super then + self.plugins[plugin.name] = nil + end + end + ---@type table<string,string[]> plugin to parent plugin local dep_of = {} diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 067450a..5b3821c 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -47,6 +47,7 @@ ---@field dir string ---@field enabled? boolean|(fun():boolean) ---@field cond? boolean|(fun():boolean) +---@field weak? boolean If set, then this plugin will not be added unless it is added somewhere else ---@field lazy? boolean ---@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 From cd3802a54b8d4d3c2d1f9504b86d3a6bf190d9c8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 12:25:06 +0000 Subject: [PATCH 0940/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index bdce0b7..bf1bf52 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 21 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 22 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From af39d61d3f32683b6e9962d64ab269330b456172 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 22 May 2023 14:31:23 +0200 Subject: [PATCH 0941/1610] fix: better weak handling --- lua/lazy/core/plugin.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 15d5b2d..0f714f8 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -141,9 +141,14 @@ function Spec:warn(msg) end function Spec:fix_disabled() + ---@param plugin LazyPlugin + local function all_weak(plugin) + return (not plugin) or (rawget(plugin, "weak") and all_weak(plugin._.super)) + end + -- handle weak plugins for _, plugin in pairs(self.plugins) do - if plugin.weak and not plugin._.super then + if plugin.weak and all_weak(plugin) then self.plugins[plugin.name] = nil end end From 8cd4a596745f9e617233e80f24e8152fa72ef186 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 14:37:25 +0200 Subject: [PATCH 0942/1610] chore(main): release 9.18.0 (#809) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 14 ++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fe0414..17658a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [9.18.0](https://github.com/folke/lazy.nvim/compare/v9.17.0...v9.18.0) (2023-05-22) + + +### Features + +* **plugin:** added support for `weak` specs. They will not be included in the final spec if not specified somwhere else ([8564f6d](https://github.com/folke/lazy.nvim/commit/8564f6d22b78a4a0fba9811faa556159b6c90a49)) + + +### Bug Fixes + +* better weak handling ([af39d61](https://github.com/folke/lazy.nvim/commit/af39d61d3f32683b6e9962d64ab269330b456172)) +* **ui:** close ui when opening a help file. Fixes [#808](https://github.com/folke/lazy.nvim/issues/808) ([cc7a764](https://github.com/folke/lazy.nvim/commit/cc7a764aecec11c9598ccd442a6879eed4e85558)) +* **ui:** take border into account for window position. Fixes [#812](https://github.com/folke/lazy.nvim/issues/812) ([451f217](https://github.com/folke/lazy.nvim/commit/451f217e9b2d71f08bdae0ce5ac7e8e8a6503f48)) + ## [9.17.0](https://github.com/folke/lazy.nvim/compare/v9.16.1...v9.17.0) (2023-05-18) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f4f2240..172d827 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.17.0" -- x-release-please-version +M.version = "9.18.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 9177778891ecdf02562eeaa1a26b829e4b62bc16 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 22 May 2023 14:53:30 +0200 Subject: [PATCH 0943/1610] fix(plugin): rename weak => optional. Makes more sense :) --- lua/lazy/core/plugin.lua | 8 ++++---- lua/lazy/types.lua | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 0f714f8..00e5ecf 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -142,13 +142,13 @@ end function Spec:fix_disabled() ---@param plugin LazyPlugin - local function all_weak(plugin) - return (not plugin) or (rawget(plugin, "weak") and all_weak(plugin._.super)) + local function all_optional(plugin) + return (not plugin) or (rawget(plugin, "optional") and all_optional(plugin._.super)) end - -- handle weak plugins + -- handle optional plugins for _, plugin in pairs(self.plugins) do - if plugin.weak and all_weak(plugin) then + if plugin.optional and all_optional(plugin) then self.plugins[plugin.name] = nil end end diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 5b3821c..df8c19d 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -47,7 +47,7 @@ ---@field dir string ---@field enabled? boolean|(fun():boolean) ---@field cond? boolean|(fun():boolean) ----@field weak? boolean If set, then this plugin will not be added unless it is added somewhere else +---@field optional? boolean If set, then this plugin will not be added unless it is added somewhere else ---@field lazy? boolean ---@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 From 6610b15dfd76f7992423916e2b87f031881d7b25 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 14:58:33 +0200 Subject: [PATCH 0944/1610] chore(main): release 9.18.1 (#815) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17658a6..fe19d23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.18.1](https://github.com/folke/lazy.nvim/compare/v9.18.0...v9.18.1) (2023-05-22) + + +### Bug Fixes + +* **plugin:** rename weak => optional. Makes more sense :) ([9177778](https://github.com/folke/lazy.nvim/commit/9177778891ecdf02562eeaa1a26b829e4b62bc16)) + ## [9.18.0](https://github.com/folke/lazy.nvim/compare/v9.17.0...v9.18.0) (2023-05-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 172d827..3f3fc24 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.18.0" -- x-release-please-version +M.version = "9.18.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From f125a7d333472ada244b4564805ba11be3c269a9 Mon Sep 17 00:00:00 2001 From: tzachar <Nir.tzachar@gmail.com> Date: Tue, 23 May 2023 09:43:27 +0300 Subject: [PATCH 0945/1610] fix(commands): completion error (#819) When Lazy commands are searched in command line mode, completion fails horribly (sometime crashing nvim entirely) when the partial string to complete contains non-escape characters. For example, running `:Lazy up[` results in a crash. The fix is to instruct string.find to perform a literal search, treating the string to search not as a regular expression. --- lua/lazy/view/commands.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 0476400..3b81e6b 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -112,7 +112,7 @@ function M.setup() ---@param key string return vim.tbl_filter(function(key) - return key:find(prefix) == 1 + return key:find(prefix, 1, true) == 1 end, vim.tbl_keys(M.commands)) end, }) From b1ad64a73e33421f9ffd62be0de3070dadbf7cf1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 23 May 2023 06:44:18 +0000 Subject: [PATCH 0946/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index bf1bf52..a51115f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 22 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 23 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From b0aa5348d8c5547a23f276251fcc3aa676f41d27 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 23 May 2023 08:57:53 +0200 Subject: [PATCH 0947/1610] docs: added docs on optional --- README.md | 1 + lua/lazy/core/plugin.lua | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7292e4a..9ce2c59 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,7 @@ require("lazy").setup({ | **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | | **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | | **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. | +| **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 | ### Lazy Loading diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 00e5ecf..76b245d 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -12,16 +12,19 @@ M.loading = false ---@field modules string[] ---@field notifs {msg:string, level:number, file?:string}[] ---@field importing? string +---@field optional? boolean local Spec = {} M.Spec = Spec ---@param spec? LazySpec -function Spec.new(spec) +---@param opts? {optional?:boolean} +function Spec.new(spec, opts) local self = setmetatable({}, { __index = Spec }) self.plugins = {} self.disabled = {} self.modules = {} self.notifs = {} + self.optional = opts and opts.optional if spec then self:parse(spec) end @@ -141,15 +144,17 @@ function Spec:warn(msg) end function Spec:fix_disabled() - ---@param plugin LazyPlugin - local function all_optional(plugin) - return (not plugin) or (rawget(plugin, "optional") and all_optional(plugin._.super)) - end + if not self.optional then + ---@param plugin LazyPlugin + local function all_optional(plugin) + return (not plugin) or (rawget(plugin, "optional") and all_optional(plugin._.super)) + end - -- handle optional plugins - for _, plugin in pairs(self.plugins) do - if plugin.optional and all_optional(plugin) then - self.plugins[plugin.name] = nil + -- handle optional plugins + for _, plugin in pairs(self.plugins) do + if plugin.optional and all_optional(plugin) then + self.plugins[plugin.name] = nil + end end end From 72c3592e040f2b686a09bf70e9870609011f24a7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 23 May 2023 06:58:38 +0000 Subject: [PATCH 0948/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a51115f..b9df689 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -196,6 +196,13 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* loading certain plugins first. Default priority is 50. It’s recommended to set this to a high number for colorschemes. + + 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 -------------------------------------------------------------------------------------------------------------------------------- LAZY LOADING ~ From 761b8388af5bcb451e30d886163fcd129278e1d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 23 May 2023 09:01:50 +0200 Subject: [PATCH 0949/1610] chore(main): release 9.18.2 (#820) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe19d23..d6d86b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.18.2](https://github.com/folke/lazy.nvim/compare/v9.18.1...v9.18.2) (2023-05-23) + + +### Bug Fixes + +* **commands:** completion error ([#819](https://github.com/folke/lazy.nvim/issues/819)) ([f125a7d](https://github.com/folke/lazy.nvim/commit/f125a7d333472ada244b4564805ba11be3c269a9)) + ## [9.18.1](https://github.com/folke/lazy.nvim/compare/v9.18.0...v9.18.1) (2023-05-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 3f3fc24..1b166a2 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.18.1" -- x-release-please-version +M.version = "9.18.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 49a7f21ee37b4f8a13f6774b17ddfcae5e4f41b0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 25 May 2023 08:07:44 +0200 Subject: [PATCH 0950/1610] feat(git): change default log args to last 8 --- lua/lazy/core/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1b166a2..1d8abc4 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -21,7 +21,7 @@ M.defaults = { git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits - log = { "--since=3 days ago" }, -- show commits from the last 3 days + log = { "-8" }, -- show commits from the last 3 days 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, From 57062f3a09cad6dd5fe745389ad9f8421e3bdcd2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 25 May 2023 08:09:19 +0200 Subject: [PATCH 0951/1610] feat(plugin): trigger LazyPlugins after loading plugin specs --- lua/lazy/core/plugin.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 76b245d..840a343 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -423,6 +423,7 @@ function M.load() M.update_state() Util.track() M.loading = false + vim.api.nvim_exec_autocmds("User", { pattern = "LazyPlugins", modeline = false }) end -- Finds the plugin that has this path From 32170a88916e0f18ffaf1c32b222a5e2216bdb0e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 25 May 2023 08:10:08 +0200 Subject: [PATCH 0952/1610] fix(plugin): fix url based plugin name and added extra safety checks. Fixes #824 --- lua/lazy/core/plugin.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 840a343..c53ee72 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -49,6 +49,7 @@ end -- PERF: optimized code to get package name without using lua patterns function Spec.get_name(pkg) local name = pkg:sub(-4) == ".git" and pkg:sub(1, -5) or pkg + name = name:sub(-1) == "/" and name:sub(1, -2) or name local slash = name:reverse():find("/", 1, true) --[[@as number?]] return slash and name:sub(#name - slash + 2) or pkg:gsub("%W+", "_") end @@ -109,6 +110,11 @@ function Spec:add(plugin, results, is_dep) return end + if not plugin.name or plugin.name == "" then + self:error("Plugin spec " .. vim.inspect(plugin) .. " has no name") + return + end + if type(plugin.config) == "table" then self:warn( "{" .. plugin.name .. "}: setting a table to `Plugin.config` is deprecated. Please use `Plugin.opts` instead" From 721e37b4ddd55203b2ae70d56180109dddab4028 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 25 May 2023 06:11:00 +0000 Subject: [PATCH 0953/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b9df689..0e55b81 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 23 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 25 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From c325c50ba42572b25c08330ea10ae4743ee69280 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 25 May 2023 08:25:34 +0200 Subject: [PATCH 0954/1610] fix(plugin): check that import is a string. See #825 --- lua/lazy/core/plugin.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index c53ee72..eb132d3 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -265,6 +265,9 @@ function Spec:import(spec) if spec.import == "lazy" then return self:error("You can't name your plugins module `lazy`.") end + if type(spec.import) ~= "string" then + return self:error("Invalid import spec. `import` should be a string: " .. vim.inspect(spec)) + end if vim.tbl_contains(self.modules, spec.import) then return end From 67ae8bbbe3985e380b98abeaf6c567c422b29746 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 25 May 2023 09:13:34 +0200 Subject: [PATCH 0955/1610] chore(main): release 9.19.0 (#826) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 14 ++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6d86b0..bcf4803 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [9.19.0](https://github.com/folke/lazy.nvim/compare/v9.18.2...v9.19.0) (2023-05-25) + + +### Features + +* **git:** change default log args to last 8 ([49a7f21](https://github.com/folke/lazy.nvim/commit/49a7f21ee37b4f8a13f6774b17ddfcae5e4f41b0)) +* **plugin:** trigger LazyPlugins after loading plugin specs ([57062f3](https://github.com/folke/lazy.nvim/commit/57062f3a09cad6dd5fe745389ad9f8421e3bdcd2)) + + +### Bug Fixes + +* **plugin:** check that import is a string. See [#825](https://github.com/folke/lazy.nvim/issues/825) ([c325c50](https://github.com/folke/lazy.nvim/commit/c325c50ba42572b25c08330ea10ae4743ee69280)) +* **plugin:** fix url based plugin name and added extra safety checks. Fixes [#824](https://github.com/folke/lazy.nvim/issues/824) ([32170a8](https://github.com/folke/lazy.nvim/commit/32170a88916e0f18ffaf1c32b222a5e2216bdb0e)) + ## [9.18.2](https://github.com/folke/lazy.nvim/compare/v9.18.1...v9.18.2) (2023-05-23) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1d8abc4..9f3b604 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.18.2" -- x-release-please-version +M.version = "9.19.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 199e1004647895d5cb87911ae65e4f01418abf3b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 27 May 2023 08:45:14 +0200 Subject: [PATCH 0956/1610] fix(plugin): delay check if plugin ref exists until after loading all plugins. Fixes #833 --- lua/lazy/core/plugin.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index eb132d3..f3e87a6 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -130,9 +130,6 @@ function Spec:add(plugin, results, is_dep) plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil if self.plugins[plugin.name] then plugin = self:merge(self.plugins[plugin.name], plugin) - elseif is_ref and not plugin.url then - self:error("Plugin spec for **" .. plugin.name .. "** not found.\n```lua\n" .. vim.inspect(plugin) .. "\n```") - return end self.plugins[plugin.name] = plugin if results then @@ -150,6 +147,12 @@ function Spec:warn(msg) end function Spec:fix_disabled() + for _, plugin in pairs(self.plugins) do + if not plugin.url or not plugin.dir then + self:error("Plugin spec for **" .. plugin.name .. "** not found.\n```lua\n" .. vim.inspect(plugin) .. "\n```") + self.plugins[plugin.name] = nil + end + end if not self.optional then ---@param plugin LazyPlugin local function all_optional(plugin) From 42ff6009f67a712ab4e7c8deedb626f8243a052a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 27 May 2023 08:49:45 +0200 Subject: [PATCH 0957/1610] fix(plugin): fixup. It's fine that Plugin.url doesn't exist --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f3e87a6..c373f6d 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -148,7 +148,7 @@ end function Spec:fix_disabled() for _, plugin in pairs(self.plugins) do - if not plugin.url or not plugin.dir then + if not plugin.name or not plugin.dir then self:error("Plugin spec for **" .. plugin.name .. "** not found.\n```lua\n" .. vim.inspect(plugin) .. "\n```") self.plugins[plugin.name] = nil end From 41b64eaca2b64220ccfd11aec5e8dc659481f31e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 27 May 2023 06:51:01 +0000 Subject: [PATCH 0958/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0e55b81..c5e79b0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 25 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 27 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 97c2f8858c43bc9124b8b43369a1a5862deef817 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 27 May 2023 10:03:47 +0200 Subject: [PATCH 0959/1610] chore(main): release 9.19.1 (#835) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcf4803..f6066ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [9.19.1](https://github.com/folke/lazy.nvim/compare/v9.19.0...v9.19.1) (2023-05-27) + + +### Bug Fixes + +* **plugin:** delay check if plugin ref exists until after loading all plugins. Fixes [#833](https://github.com/folke/lazy.nvim/issues/833) ([199e100](https://github.com/folke/lazy.nvim/commit/199e1004647895d5cb87911ae65e4f01418abf3b)) +* **plugin:** fixup. It's fine that Plugin.url doesn't exist ([42ff600](https://github.com/folke/lazy.nvim/commit/42ff6009f67a712ab4e7c8deedb626f8243a052a)) + ## [9.19.0](https://github.com/folke/lazy.nvim/compare/v9.18.2...v9.19.0) (2023-05-25) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9f3b604..9b6cd23 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -151,7 +151,7 @@ M.defaults = { debug = false, } -M.version = "9.19.0" -- x-release-please-version +M.version = "9.19.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 9dce0816f15f478c864c65fce0cd55f145faad03 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 27 May 2023 14:28:09 +0200 Subject: [PATCH 0960/1610] feat(ui): added support for setting a title of the lazy window. Fixes #814 --- README.md | 7 +++++-- lua/lazy/core/config.lua | 2 ++ lua/lazy/view/float.lua | 4 ++++ lua/lazy/view/init.lua | 5 ++++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9ce2c59..f948295 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ require("lazy").setup({ | **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | | **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | | **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. | -| **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 | +| **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 | ### Lazy Loading @@ -310,7 +310,7 @@ return { git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits - log = { "--since=3 days ago" }, -- show commits from the last 3 days + log = { "-8" }, -- show commits from the last 3 days 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, @@ -337,6 +337,8 @@ return { 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", + title = nil, ---@type string only works when border is not "none" + title_pos = "center", ---@type "center" | "left" | "right" icons = { cmd = " ", config = "", @@ -757,6 +759,7 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori | **LazyDir** | **_@text.reference_** | directory | | **LazyH1** | **_IncSearch_** | home button | | **LazyH2** | **_Bold_** | titles | +| **LazyLocal** | **_Constant_** | | | **LazyNoCond** | **_DiagnosticWarn_** | unloaded icon for a plugin where `cond()` was false | | **LazyNormal** | **_NormalFloat_** | | | **LazyProgressDone** | **_Constant_** | progress bar done | diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9b6cd23..254510d 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -48,6 +48,8 @@ M.defaults = { 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", + title = nil, ---@type string only works when border is not "none" + title_pos = "center", ---@type "center" | "left" | "right" icons = { cmd = " ", config = "", diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index a7054ae..55bf750 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -9,6 +9,8 @@ local ViewConfig = require("lazy.view.config") ---@field zindex? number ---@field style? "" | "minimal" ---@field border? "none" | "single" | "double" | "rounded" | "solid" | "shadow" +---@field title? string +---@field title_pos? "center" | "left" | "right" ---@class LazyFloat ---@field buf number @@ -50,6 +52,8 @@ function M:init(opts) border = self.opts.border, zindex = self.opts.zindex, noautocmd = true, + title = self.opts.title, + title_pos = self.opts.title and self.opts.title_pos or nil, } self:mount() self:on_key(ViewConfig.keys.close, self.close) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index ea35347..12f8e48 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -50,7 +50,10 @@ end function M.create() local self = setmetatable({}, { __index = setmetatable(M, { __index = Float }) }) ---@cast self LazyView - Float.init(self) + Float.init(self, { + title = Config.options.ui.title, + title_pos = Config.options.ui.title_pos, + }) if Config.options.ui.wrap then vim.wo[self.win].wrap = true From ae7de6b56b525fd081452365cbfbff876baad97f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 27 May 2023 12:28:58 +0000 Subject: [PATCH 0961/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c5e79b0..96110b0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -406,7 +406,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits - log = { "--since=3 days ago" }, -- show commits from the last 3 days + log = { "-8" }, -- show commits from the last 3 days 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, @@ -433,6 +433,8 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* 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", + title = nil, ---@type string only works when border is not "none" + title_pos = "center", ---@type "center" | "left" | "right" icons = { cmd = " ", config = "", @@ -885,6 +887,8 @@ Click to see all highlight groups ~ LazyH2 Bold titles + LazyLocal Constant + LazyNoCond DiagnosticWarn unloaded icon for a plugin where cond() was false From 7f34cb892b985d0aecef09412380420961721786 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 27 May 2023 14:36:14 +0200 Subject: [PATCH 0962/1610] chore(main): release 9.20.0 (#836) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6066ea..68d705b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.20.0](https://github.com/folke/lazy.nvim/compare/v9.19.1...v9.20.0) (2023-05-27) + + +### Features + +* **ui:** added support for setting a title of the lazy window. Fixes [#814](https://github.com/folke/lazy.nvim/issues/814) ([9dce081](https://github.com/folke/lazy.nvim/commit/9dce0816f15f478c864c65fce0cd55f145faad03)) + ## [9.19.1](https://github.com/folke/lazy.nvim/compare/v9.19.0...v9.19.1) (2023-05-27) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 254510d..20a986f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.19.1" -- x-release-please-version +M.version = "9.20.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From d8a5829fdad1d435fd74d65743df5d53d4a845d2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 27 May 2023 15:19:11 +0200 Subject: [PATCH 0963/1610] feat(loader): when reloading, always re-source loaded vimscript files. See #445 --- lua/lazy/core/loader.lua | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 32067b3..69f2b3e 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -254,8 +254,27 @@ function M.reload(plugin) end end + -- reload any vimscript files for this plugin + local scripts = vim.fn.getscriptinfo({ name = ".vim" }) + local loaded_scripts = {} + for _, s in ipairs(scripts) do + ---@type string + local path = s.name + if + path:sub(-4) == ".vim" + and path:find(plugin.dir, 1, true) == 1 + and not path:find("/plugin/", 1, true) + and not path:find("/ftplugin/", 1, true) + then + loaded_scripts[#loaded_scripts + 1] = path + end + end + if load then M.load(plugin, { start = "reload" }) + for _, s in ipairs(loaded_scripts) do + M.source(s) + end end end From a6c8f22362dccf5416ccb108f201e9f1ddda43f1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 27 May 2023 15:19:50 +0200 Subject: [PATCH 0964/1610] feat(commands): added highly experimental `Lazy reload ...` command. See #445 --- lua/lazy/core/loader.lua | 12 ++++++++++-- lua/lazy/view/commands.lua | 6 ++++++ lua/lazy/view/config.lua | 8 +++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 69f2b3e..25f1c57 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -227,10 +227,18 @@ function M.deactivate(plugin) end --- reload a plugin ----@param plugin LazyPlugin +---@param plugin LazyPlugin|string function M.reload(plugin) + if type(plugin) == "string" then + plugin = Config.plugins[plugin] + end + + if not plugin then + error("Plugin not found") + end + + local load = plugin._.loaded ~= nil M.deactivate(plugin) - local load = false -- plugin._.loaded ~= nil -- enable handlers Handler.enable(plugin) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 3b81e6b..1fa7cc1 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -53,6 +53,12 @@ M.commands = { -- when a command is executed with a bang, wait will be set require("lazy.core.loader").load(opts.plugins, { cmd = "Lazy load" }, { force = opts.wait }) end, + reload = function(opts) + for _, plugin in pairs(opts.plugins) do + Util.warn("Reloading **" .. plugin.name .. "**") + require("lazy.core.loader").reload(plugin) + end + end, log = Manage.log, build = Manage.build, clean = Manage.clean, diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index 0e7dbf6..cf7df1c 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -143,11 +143,17 @@ M.commands = { }, build = { desc = "Rebuild a plugin", - id = 13, + id = 15, plugins = true, plugins_required = true, key_plugin = "gb", }, + reload = { + desc = "Reload a plugin (experimental!!)", + plugins = true, + plugins_required = true, + id = 16, + }, } return M From efa02ff8d37fe5809ea7826f11730a59d25533ef Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 27 May 2023 16:11:01 +0200 Subject: [PATCH 0965/1610] fix(ui): make progress bar work again --- lua/lazy/view/text.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index 614381a..3e83d5a 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -67,12 +67,16 @@ function Text:render(buf) for _, line in ipairs(self._lines) do local str = (" "):rep(self.padding) + local has_extmark = false for _, segment in ipairs(line) do str = str .. segment.str + if type(segment.hl) == "table" then + has_extmark = true + end end - if str:match("^%s*$") then + if str:match("^%s*$") and not has_extmark then str = "" end table.insert(lines, str) @@ -97,11 +101,11 @@ function Text:render(buf) local extmark_col = extmark.col or col extmark.col = nil - local ok = pcall(vim.api.nvim_buf_set_extmark, buf, Config.ns, l - 1, extmark_col, extmark) + local ok, err = pcall(vim.api.nvim_buf_set_extmark, buf, Config.ns, l - 1, extmark_col, extmark) if not ok then Util.error( "Failed to set extmark. Please report a bug with this info:\n" - .. vim.inspect({ segment = segment, line = line }) + .. vim.inspect({ segment = segment, line = line, error = err }) ) end end From a93d8983c4335b6ae7d6e7d516a191d929186d5b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 27 May 2023 16:14:24 +0200 Subject: [PATCH 0966/1610] chore(main): release 9.21.0 (#837) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68d705b..c29669b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [9.21.0](https://github.com/folke/lazy.nvim/compare/v9.20.0...v9.21.0) (2023-05-27) + + +### Features + +* **commands:** added highly experimental `Lazy reload ...` command. See [#445](https://github.com/folke/lazy.nvim/issues/445) ([a6c8f22](https://github.com/folke/lazy.nvim/commit/a6c8f22362dccf5416ccb108f201e9f1ddda43f1)) +* **loader:** when reloading, always re-source loaded vimscript files. See [#445](https://github.com/folke/lazy.nvim/issues/445) ([d8a5829](https://github.com/folke/lazy.nvim/commit/d8a5829fdad1d435fd74d65743df5d53d4a845d2)) + + +### Bug Fixes + +* **ui:** make progress bar work again ([efa02ff](https://github.com/folke/lazy.nvim/commit/efa02ff8d37fe5809ea7826f11730a59d25533ef)) + ## [9.20.0](https://github.com/folke/lazy.nvim/compare/v9.19.1...v9.20.0) (2023-05-27) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 20a986f..07261da 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.20.0" -- x-release-please-version +M.version = "9.21.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From fe9fcdb0b93f6072873b9ec652c3f82d04dfd646 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 28 May 2023 10:42:19 +0200 Subject: [PATCH 0967/1610] docs: added version=false --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f948295..9d9e079 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ require("lazy").setup({ | **branch** | `string?` | Branch of the repository | | **tag** | `string?` | Tag of the repository | | **commit** | `string?` | Commit of the repository | -| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | +| **version** | `string?` or `false` to override the default | Version to use from the repository. Full [Semver](https://devhints.io/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` | | **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | From b4e520579b1b1a31d5e4f3f632a4e54cef35d2a6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 28 May 2023 08:43:07 +0000 Subject: [PATCH 0968/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 96110b0..c303b3b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 27 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 28 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -168,7 +168,7 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* commit string? Commit of the repository - version string? Version to use from the repository. Full Semver + version string? or false to override the default Version to use from the repository. Full Semver ranges are supported pin boolean? When true, this plugin will not be included in From 36a91320f9ff4f877f09ac3a52c6a26860da047a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 28 May 2023 11:02:35 +0200 Subject: [PATCH 0969/1610] fix(loader): don't run ftdetect twice for paths already on the rtp during startup. Fixes #839 --- lua/lazy/core/loader.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 25f1c57..3065040 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -122,6 +122,9 @@ function M.startup() Util.track({ start = "rtp plugins" }) for _, path in ipairs(rtp) do if not path:find("after/?$") then + -- these paths don't will already have their ftdetect ran, + -- by sourcing filetype.lua above, so skip them + M.did_ftdetect[path] = true M.packadd(path) end end From ebdd0499551765e6a7aba220cc8ae4e0cdb6be69 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 28 May 2023 12:55:02 +0200 Subject: [PATCH 0970/1610] chore(main): release 9.21.1 (#840) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c29669b..600ab76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.21.1](https://github.com/folke/lazy.nvim/compare/v9.21.0...v9.21.1) (2023-05-28) + + +### Bug Fixes + +* **loader:** don't run ftdetect twice for paths already on the rtp during startup. Fixes [#839](https://github.com/folke/lazy.nvim/issues/839) ([36a9132](https://github.com/folke/lazy.nvim/commit/36a91320f9ff4f877f09ac3a52c6a26860da047a)) + ## [9.21.0](https://github.com/folke/lazy.nvim/compare/v9.20.0...v9.21.0) (2023-05-27) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 07261da..514e48a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.21.0" -- x-release-please-version +M.version = "9.21.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From beb5ff7f3fe7b426cc5f2b2308c53866642eb21d Mon Sep 17 00:00:00 2001 From: Zach Himsel <zach@himsel.net> Date: Tue, 30 May 2023 10:49:32 -0400 Subject: [PATCH 0971/1610] docs: Add example for non-headless sync from CLI (#847) --- doc/lazy.nvim.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c303b3b..8b24c00 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -621,6 +621,12 @@ example, if you want to sync lazy from the cmdline, you can use: $ nvim --headless "+Lazy! sync" +qa < +If you want to do the above, but with the full nvim UI (instead of headless): + +>shell + $ nvim "+autocmd User VeryLazy Lazy! sync" +qa +< + `opts` is a table with the following key-values: - **wait**when true, then the call will wait till the operation completed From e6bf3a0d9c4899dcf832270f79bb1cee8fbc506e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 14:50:20 +0000 Subject: [PATCH 0972/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 8b24c00..2f7a6e6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 28 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 30 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -621,12 +621,6 @@ example, if you want to sync lazy from the cmdline, you can use: $ nvim --headless "+Lazy! sync" +qa < -If you want to do the above, but with the full nvim UI (instead of headless): - ->shell - $ nvim "+autocmd User VeryLazy Lazy! sync" +qa -< - `opts` is a table with the following key-values: - **wait**when true, then the call will wait till the operation completed From 94472b8303f4db496ff1214a73aa8f600e375974 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 3 Jun 2023 10:45:53 +0200 Subject: [PATCH 0973/1610] feat(float): floats can now be persistent --- lua/lazy/util.lua | 2 +- lua/lazy/view/float.lua | 68 +++++++++++++++++++++++++++++++++++------ lua/lazy/view/init.lua | 1 + 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index b2629b1..11b8182 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -112,7 +112,7 @@ function M.float_term(cmd, opts) once = true, buffer = float.buf, callback = function() - float:close() + float:close({ wipe = true }) vim.cmd.checktime() end, }) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 55bf750..248334e 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -11,6 +11,9 @@ local ViewConfig = require("lazy.view.config") ---@field border? "none" | "single" | "double" | "rounded" | "solid" | "shadow" ---@field title? string ---@field title_pos? "center" | "left" | "right" +---@field persistent? boolean +---@field ft? string +---@field noautocmd? boolean ---@class LazyFloat ---@field buf number @@ -51,7 +54,7 @@ function M:init(opts) style = self.opts.style ~= "" and self.opts.style or nil, border = self.opts.border, zindex = self.opts.zindex, - noautocmd = true, + noautocmd = self.opts.noautocmd, title = self.opts.title, title_pos = self.opts.title and self.opts.title_pos or nil, } @@ -94,27 +97,32 @@ function M:layout() end function M:mount() - if self.opts.file then + if self:buf_valid() then + -- keep existing buffer + self.buf = self.buf + elseif self.opts.file then self.buf = vim.fn.bufadd(self.opts.file) vim.fn.bufload(self.buf) vim.bo[self.buf].modifiable = false elseif self.opts.buf then self.buf = self.opts.buf else - self.buf = vim.api.nvim_create_buf(false, false) + self.buf = vim.api.nvim_create_buf(false, true) end self:layout() self.win = vim.api.nvim_open_win(self.buf, true, self.win_opts) self:focus() - vim.bo[self.buf].buftype = "nofile" + if vim.bo[self.buf].buftype == "" then + vim.bo[self.buf].buftype = "nofile" + end if vim.bo[self.buf].filetype == "" then - vim.bo[self.buf].filetype = "lazy" + vim.bo[self.buf].filetype = self.opts.ft or "lazy" end local function opts() - vim.bo[self.buf].bufhidden = "wipe" + vim.bo[self.buf].bufhidden = self.opts.persistent and "hide" or "wipe" vim.wo[self.win].conceallevel = 3 vim.wo[self.win].foldenable = false vim.wo[self.win].spell = false @@ -179,22 +187,64 @@ function M:on_key(key, fn, desc) }) end -function M:close() +---@param opts? {wipe:boolean} +function M:close(opts) local buf = self.buf local win = self.win + local wipe = opts and opts.wipe + if wipe == nil then + wipe = not self.opts.persistent + end + self.win = nil - self.buf = nil + if wipe then + self.buf = nil + end vim.schedule(function() if win and vim.api.nvim_win_is_valid(win) then vim.api.nvim_win_close(win, true) end - if buf and vim.api.nvim_buf_is_valid(buf) then + if wipe and buf and vim.api.nvim_buf_is_valid(buf) then vim.diagnostic.reset(Config.ns, buf) vim.api.nvim_buf_delete(buf, { force = true }) end end) end +function M:win_valid() + return self.win and vim.api.nvim_win_is_valid(self.win) +end + +function M:buf_valid() + return self.buf and vim.api.nvim_buf_is_valid(self.buf) +end + +function M:hide() + if self:win_valid() then + self:close({ wipe = false }) + end +end + +function M:toggle() + if self:win_valid() then + self:hide() + return false + else + self:show() + return true + end +end + +function M:show() + if self:win_valid() then + self:focus() + elseif self:buf_valid() then + self:mount() + else + error("LazyFloat: buffer closed") + end +end + function M:focus() vim.api.nvim_set_current_win(self.win) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 12f8e48..998c531 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -53,6 +53,7 @@ function M.create() Float.init(self, { title = Config.options.ui.title, title_pos = Config.options.ui.title_pos, + noautocmd = true, }) if Config.options.ui.wrap then From 33448b968bda7c2ef36f015bcfd68f481c8158d5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 08:46:32 +0000 Subject: [PATCH 0974/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 2f7a6e6..f1be10f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 May 30 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 03 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 9223c1aa200a8c329053f9e2ca0980ead56059d6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 10:55:15 +0200 Subject: [PATCH 0975/1610] chore(main): release 9.22.0 (#852) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 600ab76..7d9b040 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.22.0](https://github.com/folke/lazy.nvim/compare/v9.21.1...v9.22.0) (2023-06-03) + + +### Features + +* **float:** floats can now be persistent ([94472b8](https://github.com/folke/lazy.nvim/commit/94472b8303f4db496ff1214a73aa8f600e375974)) + ## [9.21.1](https://github.com/folke/lazy.nvim/compare/v9.21.0...v9.21.1) (2023-05-28) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 514e48a..d9f6600 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.21.1" -- x-release-please-version +M.version = "9.22.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From d65a3d6755bd3f1ca7bc4c15a8acf57687b1ca51 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 3 Jun 2023 13:45:18 +0200 Subject: [PATCH 0976/1610] fix(keys): replace term codes to calculate ids --- lua/lazy/core/handler/keys.lua | 2 +- tests/handlers/keys_spec.lua | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/handlers/keys_spec.lua diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 73b10b7..cdf2243 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -19,7 +19,7 @@ function M.parse(value) local ret = vim.deepcopy(value) ret = type(ret) == "string" and { ret } or ret --[[@as LazyKeys]] ret.mode = ret.mode or "n" - ret.id = (ret[1] or "") + ret.id = vim.api.nvim_replace_termcodes(ret[1] or "", true, true, true) if ret.mode then local mode = ret.mode if type(mode) == "table" then diff --git a/tests/handlers/keys_spec.lua b/tests/handlers/keys_spec.lua new file mode 100644 index 0000000..6254db8 --- /dev/null +++ b/tests/handlers/keys_spec.lua @@ -0,0 +1,18 @@ +local Keys = require("lazy.core.handler.keys") + +describe("keys", function() + it("parses ids correctly", function() + local tests = { + { "<C-/>", "<c-/>", true }, + { "<C-h>", "<c-H>", true }, + { "<C-h>k", "<c-H>K", false }, + } + for _, test in ipairs(tests) do + if test[3] then + assert.same(Keys.parse(test[1]).id, Keys.parse(test[2]).id) + else + assert.is_not.same(Keys.parse(test[1]).id, Keys.parse(test[2]).id) + end + end + end) +end) From 6ad76ecc263d334d7cb967472fc4e110f3018351 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 13:47:20 +0200 Subject: [PATCH 0977/1610] chore(main): release 9.22.1 (#853) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d9b040..9a3af1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.22.1](https://github.com/folke/lazy.nvim/compare/v9.22.0...v9.22.1) (2023-06-03) + + +### Bug Fixes + +* **keys:** replace term codes to calculate ids ([d65a3d6](https://github.com/folke/lazy.nvim/commit/d65a3d6755bd3f1ca7bc4c15a8acf57687b1ca51)) + ## [9.22.0](https://github.com/folke/lazy.nvim/compare/v9.21.1...v9.22.0) (2023-06-03) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index d9f6600..5ed9cd0 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.22.0" -- x-release-please-version +M.version = "9.22.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From dbb2b609f66486251b51c79a7a1d275887413e8e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 3 Jun 2023 14:40:14 +0200 Subject: [PATCH 0978/1610] fix(ui): setup colors when loading a float --- lua/lazy/view/float.lua | 1 + lua/lazy/view/init.lua | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 248334e..cddcfa6 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -37,6 +37,7 @@ end ---@param opts? LazyFloatOptions function M:init(opts) + require("lazy.view.colors").setup() self.opts = vim.tbl_deep_extend("force", { size = Config.options.ui.size, style = "minimal", diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 998c531..b7e7a84 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -65,8 +65,6 @@ function M.create() vim.wo[self.win].wrap = false end - require("lazy.view.colors").setup() - self.state = vim.deepcopy(default_state) self.render = Render.new(self) From f145e6f42a56306c5536e9efbfe41f7efbec285d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Jun 2023 15:39:09 +0200 Subject: [PATCH 0979/1610] chore(main): release 9.22.2 (#854) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a3af1d..639084b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.22.2](https://github.com/folke/lazy.nvim/compare/v9.22.1...v9.22.2) (2023-06-03) + + +### Bug Fixes + +* **ui:** setup colors when loading a float ([dbb2b60](https://github.com/folke/lazy.nvim/commit/dbb2b609f66486251b51c79a7a1d275887413e8e)) + ## [9.22.1](https://github.com/folke/lazy.nvim/compare/v9.22.0...v9.22.1) (2023-06-03) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5ed9cd0..6685a52 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.22.1" -- x-release-please-version +M.version = "9.22.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From bc895023573e76f8567d2375bbd3ea8be4f00ca7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 6 Jun 2023 14:29:38 +0200 Subject: [PATCH 0980/1610] fix(event): dont use autocmd pattern to detect event retriggering. Fixes #858 --- lua/lazy/core/handler/event.lua | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 8c64231..4303d9d 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -28,11 +28,11 @@ function M:_add(value) return end Util.track({ [self.type] = value }) - local groups = M.get_augroups(event, pattern) + local groups = M.get_augroups(event) -- load the plugins Loader.load(self.active[value], { [self.type] = value }) -- check if any plugin created an event handler for this event and fire the group - self:trigger(event, pattern, groups) + self:trigger(event, groups) Util.track() end, }) @@ -45,12 +45,11 @@ end -- Get all augroups for the events ---@param event string ----@param pattern? string -function M.get_augroups(event, pattern) +function M.get_augroups(event) local events = M.trigger_events[event] or { event } ---@type table<string,true> local groups = {} - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events, pattern = pattern })) do + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events })) do if autocmd.group then groups[autocmd.group] = true end @@ -61,18 +60,17 @@ end ---@param event string|string[] ---@param pattern? string ---@param groups table<string,true> -function M:trigger(event, pattern, groups) +function M:trigger(event, groups) local events = M.trigger_events[event] or { event } ---@cast events string[] for _, e in ipairs(events) do - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = e, pattern = pattern })) do + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = e })) do if autocmd.event == e and autocmd.group and not groups[autocmd.group] then if Config.options.debug then Util.info({ "# Firing Events", " - **group:** `" .. autocmd.group_name .. "`", " - **event:** " .. autocmd.event, - pattern and (" - **pattern:** " .. pattern), }) end Util.track({ event = autocmd.group_name }) From 27c12ff0a980e5bab982a730158b4220148a54b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 12:30:22 +0000 Subject: [PATCH 0981/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f1be10f..25cf154 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 03 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From ae25448d39fb2bdc38a139339233270edec44484 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 6 Jun 2023 15:05:51 +0200 Subject: [PATCH 0982/1610] Revert "fix(event): dont use autocmd pattern to detect event retriggering. Fixes #858" This reverts commit bc895023573e76f8567d2375bbd3ea8be4f00ca7. --- lua/lazy/core/handler/event.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 4303d9d..8c64231 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -28,11 +28,11 @@ function M:_add(value) return end Util.track({ [self.type] = value }) - local groups = M.get_augroups(event) + local groups = M.get_augroups(event, pattern) -- load the plugins Loader.load(self.active[value], { [self.type] = value }) -- check if any plugin created an event handler for this event and fire the group - self:trigger(event, groups) + self:trigger(event, pattern, groups) Util.track() end, }) @@ -45,11 +45,12 @@ end -- Get all augroups for the events ---@param event string -function M.get_augroups(event) +---@param pattern? string +function M.get_augroups(event, pattern) local events = M.trigger_events[event] or { event } ---@type table<string,true> local groups = {} - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events })) do + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events, pattern = pattern })) do if autocmd.group then groups[autocmd.group] = true end @@ -60,17 +61,18 @@ end ---@param event string|string[] ---@param pattern? string ---@param groups table<string,true> -function M:trigger(event, groups) +function M:trigger(event, pattern, groups) local events = M.trigger_events[event] or { event } ---@cast events string[] for _, e in ipairs(events) do - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = e })) do + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = e, pattern = pattern })) do if autocmd.event == e and autocmd.group and not groups[autocmd.group] then if Config.options.debug then Util.info({ "# Firing Events", " - **group:** `" .. autocmd.group_name .. "`", " - **event:** " .. autocmd.event, + pattern and (" - **pattern:** " .. pattern), }) end Util.track({ event = autocmd.group_name }) From f131606190535b0d0b35406e8573b973b48e55b1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 8 Jun 2023 17:23:02 +0200 Subject: [PATCH 0983/1610] feat(startup): added data/site to the rtp. Will be used by upcoming treesitter version --- lua/lazy/core/config.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 6685a52..12fa8f7 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -204,6 +204,7 @@ function M.setup(opts) if M.options.performance.rtp.reset then vim.opt.rtp = { vim.fn.stdpath("config"), + vim.fn.stdpath("data") .. "/site", M.me, vim.env.VIMRUNTIME, vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib/nvim", From d1b02c2dda88422ca573f2a1ebdfb213ce0124d6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 8 Jun 2023 15:23:54 +0000 Subject: [PATCH 0984/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 25cf154..526dcf6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 06 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 08 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 6b2311a46a3808e366bb251270f4cc04afb421ed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Jun 2023 12:56:48 +0200 Subject: [PATCH 0985/1610] chore(main): release 9.23.0 (#859) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 639084b..c771d31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [9.23.0](https://github.com/folke/lazy.nvim/compare/v9.22.2...v9.23.0) (2023-06-08) + + +### Features + +* **startup:** added data/site to the rtp. Will be used by upcoming treesitter version ([f131606](https://github.com/folke/lazy.nvim/commit/f131606190535b0d0b35406e8573b973b48e55b1)) + + +### Bug Fixes + +* **event:** dont use autocmd pattern to detect event retriggering. Fixes [#858](https://github.com/folke/lazy.nvim/issues/858) ([bc89502](https://github.com/folke/lazy.nvim/commit/bc895023573e76f8567d2375bbd3ea8be4f00ca7)) + ## [9.22.2](https://github.com/folke/lazy.nvim/compare/v9.22.1...v9.22.2) (2023-06-03) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 12fa8f7..15ce7d0 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.22.2" -- x-release-please-version +M.version = "9.23.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 678179543e0d27650c328d8659f2c2cab4d854ef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Jun 2023 10:57:36 +0000 Subject: [PATCH 0986/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 526dcf6..dba7c2e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 08 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 09 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 7f4da7d511b05f4571ea96c67a5988b6389e12e1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 12 Jun 2023 08:28:10 +0200 Subject: [PATCH 0987/1610] fix(ui): set wo options with local. don't use `vim.wo`. See #829 --- lua/lazy/util.lua | 14 +++++++++++--- lua/lazy/view/float.lua | 13 +++++++------ lua/lazy/view/init.lua | 9 ++++----- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 11b8182..c5c64a1 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -10,6 +10,14 @@ function M.float(opts) return require("lazy.view.float")(opts) end +function M.wo(win, k, v) + if vim.api.nvim_set_option_value then + vim.api.nvim_set_option_value(k, v, { scope = "local", win = win }) + else + vim.wo[win][k] = v + end +end + function M.open(uri) if M.file_exists(uri) then return M.float({ style = "", file = uri }) @@ -180,9 +188,9 @@ function M.markdown(msg, opts) vim.tbl_deep_extend("force", { title = "lazy.nvim", on_open = function(win) - vim.wo[win].conceallevel = 3 - vim.wo[win].concealcursor = "n" - vim.wo[win].spell = false + M.wo(win, "conceallevel", 3) + M.wo(win, "concealcursor", "n") + M.wo(win, "spell", false) vim.treesitter.start(vim.api.nvim_win_get_buf(win), "markdown") end, diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index cddcfa6..a879640 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -1,5 +1,6 @@ local Config = require("lazy.core.config") local ViewConfig = require("lazy.view.config") +local Util = require("lazy.util") ---@class LazyFloatOptions ---@field buf? number @@ -124,12 +125,12 @@ function M:mount() local function opts() vim.bo[self.buf].bufhidden = self.opts.persistent and "hide" or "wipe" - vim.wo[self.win].conceallevel = 3 - vim.wo[self.win].foldenable = false - vim.wo[self.win].spell = false - vim.wo[self.win].wrap = true - vim.wo[self.win].winhighlight = "Normal:LazyNormal" - vim.wo[self.win].colorcolumn = "" + Util.wo(self.win, "conceallevel", 3) + Util.wo(self.win, "foldenable", false) + Util.wo(self.win, "spell", false) + Util.wo(self.win, "wrap", true) + Util.wo(self.win, "winhighlight", "Normal:LazyNormal") + Util.wo(self.win, "colorcolumn", "") end opts() diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index b7e7a84..93611e2 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -57,12 +57,11 @@ function M.create() }) if Config.options.ui.wrap then - vim.wo[self.win].wrap = true - vim.wo[self.win].linebreak = true - vim.wo[self.win].breakindent = true - -- vim.wo[self.win].breakindentopt = "shift:8" + Util.wo(self.win, "wrap", true) + Util.wo(self.win, "linebreak", true) + Util.wo(self.win, "breakindent", true) else - vim.wo[self.win].wrap = false + Util.wo(self.win, "wrap", false) end self.state = vim.deepcopy(default_state) From 10d4371745f88837c78c8daab00c5be6e48abea4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 06:29:01 +0000 Subject: [PATCH 0988/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index dba7c2e..9de69b2 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 09 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 12 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 0bca18de5d005c700c29da580c20c762c2f9e9e0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 17 Jun 2023 08:37:33 +0200 Subject: [PATCH 0989/1610] feat: added `Pre` events. Fixes #856. Fixes #877 --- README.md | 6 ++++++ lua/lazy/manage/init.lua | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9d9e079..f6cee6b 100644 --- a/README.md +++ b/README.md @@ -575,6 +575,12 @@ The following user events will be triggered: - **LazyClean**: after a clean - **LazyCheck**: after checking for updates - **LazyLog**: after running log +- **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. diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 34fc065..2c19b64 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -18,6 +18,13 @@ local M = {} function M.run(ropts, opts) opts = opts or {} + local mode = opts.mode + local event = mode and ("Lazy" .. mode:sub(1, 1):upper() .. mode:sub(2)) + + if event then + vim.api.nvim_exec_autocmds("User", { pattern = event .. "Pre", modeline = false }) + end + if opts.plugins then ---@param plugin string|LazyPlugin opts.plugins = vim.tbl_map(function(plugin) @@ -49,9 +56,7 @@ function M.run(ropts, opts) vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) Plugin.update_state() require("lazy.manage.checker").fast_check({ report = false }) - local mode = opts.mode - if mode then - local event = "Lazy" .. mode:sub(1, 1):upper() .. mode:sub(2) + if event then vim.api.nvim_exec_autocmds("User", { pattern = event, modeline = false }) end end) From 15cdefee465b02ad3492da50e271c8eab56cdbbc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 17 Jun 2023 06:38:16 +0000 Subject: [PATCH 0990/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9de69b2..1ea1acb 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 12 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 17 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -677,6 +677,12 @@ The following user events will be triggered: - **LazyClean**after a clean - **LazyCheck**after checking for updates - **LazyLog**after running log +- **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. From 67af46a7f53e06322753cdd8cfd524bbb8ca30a2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 17 Jun 2023 08:40:02 +0200 Subject: [PATCH 0991/1610] chore(main): release 9.24.0 (#870) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c771d31..9cc66f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [9.24.0](https://github.com/folke/lazy.nvim/compare/v9.23.0...v9.24.0) (2023-06-17) + + +### Features + +* added `Pre` events. Fixes [#856](https://github.com/folke/lazy.nvim/issues/856). Fixes [#877](https://github.com/folke/lazy.nvim/issues/877) ([0bca18d](https://github.com/folke/lazy.nvim/commit/0bca18de5d005c700c29da580c20c762c2f9e9e0)) + + +### Bug Fixes + +* **ui:** set wo options with local. don't use `vim.wo`. See [#829](https://github.com/folke/lazy.nvim/issues/829) ([7f4da7d](https://github.com/folke/lazy.nvim/commit/7f4da7d511b05f4571ea96c67a5988b6389e12e1)) + ## [9.23.0](https://github.com/folke/lazy.nvim/compare/v9.22.2...v9.23.0) (2023-06-08) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 15ce7d0..eccf807 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.23.0" -- x-release-please-version +M.version = "9.24.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 616341372d1908bb2a11e3bf9ed55e74bf605e40 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 18 Jun 2023 22:38:05 +0200 Subject: [PATCH 0992/1610] fix(manage): trigger LazySyncPre. Fixes #881 --- lua/lazy/manage/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 2c19b64..05ffa88 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -180,6 +180,8 @@ function M.sync(opts) opts.show = false end + vim.api.nvim_exec_autocmds("User", { pattern = "LazySyncPre", modeline = false }) + local clean_opts = vim.deepcopy(opts) clean_opts.plugins = nil local clean = M.clean(clean_opts) From 3b0632977ec04cb2eb7707cab0ced8e254405cb9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 18 Jun 2023 20:38:52 +0000 Subject: [PATCH 0993/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1ea1acb..d7dc696 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 17 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 18 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 56b1f7715ed536a3e9ebfbf0d26e615d211a0cd8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 19 Jun 2023 08:10:36 +0200 Subject: [PATCH 0994/1610] fix(debug): show original keymaps instead of ids for the keys handler --- lua/lazy/view/render.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index d5bc9df..9021af2 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -669,6 +669,14 @@ function M:debug() plugins = vim.tbl_values(plugins) table.sort(plugins) self:append("● ", "LazySpecial", { indent = 2 }) + if handler_type == "keys" then + for k, v in pairs(Handler.handlers.keys:values(Config.plugins[plugins[1]])) do + if k == value then + value = v + break + end + end + end self:reason({ [handler_type] = value }) for _, plugin in pairs(plugins) do self:append(" ") From 410a7360c1b8df2053ae7ba906ff74c9072e1505 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 19 Jun 2023 10:21:37 +0200 Subject: [PATCH 0995/1610] fix(ui): trailing space in button row. Fixes #884 --- lua/lazy/view/render.lua | 43 ++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 9021af2..19a6feb 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -113,30 +113,35 @@ end function M:title() self:nl():nl() - for _, mode in ipairs(ViewConfig.get_commands()) do - if mode.button then - local title = " " .. mode.name:sub(1, 1):upper() .. mode.name:sub(2) .. " (" .. mode.key .. ") " - 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 + local modes = vim.tbl_filter(function(c) + return c.button + end, ViewConfig.get_commands()) - if self.view.state.mode == mode.name then - if mode.name == "home" then - self:append(title, "LazyH1", { wrap = true }) - else - self:append(title, "LazyButtonActive", { wrap = true }) - self:highlight({ ["%(.%)"] = "LazySpecial" }) - end + for c, mode in ipairs(modes) do + local title = " " .. mode.name:sub(1, 1):upper() .. mode.name:sub(2) .. " (" .. mode.key .. ") " + if mode.name == "home" then + if self.view.state.mode == "home" then + title = " lazy.nvim " .. Config.options.ui.icons.lazy else - self:append(title, "LazyButton", { wrap = true }) + title = " lazy.nvim (H) " + end + end + + if self.view.state.mode == mode.name then + if mode.name == "home" then + self:append(title, "LazyH1", { wrap = true }) + else + self:append(title, "LazyButtonActive", { wrap = true }) self:highlight({ ["%(.%)"] = "LazySpecial" }) end - self:append(" ") + else + self:append(title, "LazyButton", { wrap = true }) + self:highlight({ ["%(.%)"] = "LazySpecial" }) end + if c == #modes then + break + end + self:append(" ") end self:nl() if self.progress.done < self.progress.total then From bf11e4907bf00a58788053c3fecbbf4b1b63b27b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 08:22:30 +0000 Subject: [PATCH 0996/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d7dc696..bc80956 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 18 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 19 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From c1aad95243f0d180f41348be26b2417547fb168b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 11:28:26 +0200 Subject: [PATCH 0997/1610] chore(main): release 9.24.1 (#882) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 9 +++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cc66f2..573f6c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [9.24.1](https://github.com/folke/lazy.nvim/compare/v9.24.0...v9.24.1) (2023-06-19) + + +### Bug Fixes + +* **debug:** show original keymaps instead of ids for the keys handler ([56b1f77](https://github.com/folke/lazy.nvim/commit/56b1f7715ed536a3e9ebfbf0d26e615d211a0cd8)) +* **manage:** trigger LazySyncPre. Fixes [#881](https://github.com/folke/lazy.nvim/issues/881) ([6163413](https://github.com/folke/lazy.nvim/commit/616341372d1908bb2a11e3bf9ed55e74bf605e40)) +* **ui:** trailing space in button row. Fixes [#884](https://github.com/folke/lazy.nvim/issues/884) ([410a736](https://github.com/folke/lazy.nvim/commit/410a7360c1b8df2053ae7ba906ff74c9072e1505)) + ## [9.24.0](https://github.com/folke/lazy.nvim/compare/v9.23.0...v9.24.0) (2023-06-17) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index eccf807..ed1009d 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.24.0" -- x-release-please-version +M.version = "9.24.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 6c42a305b71449d8ef26b39c1f6e0566114c8636 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 22 Jun 2023 10:23:54 +0200 Subject: [PATCH 0998/1610] docs: make it clear that a plugin is loaded before build. Fixes #888 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f6cee6b..15a3f54 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ require("lazy").setup({ | **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require(MAIN).setup(opts)`. Lazy uses several heuristics to determine the plugin's `MAIN` module automatically based on the plugin's **name**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | | **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 a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | +| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. Before running `build`, a plugin is first loaded. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | | **branch** | `string?` | Branch of the repository | | **tag** | `string?` | Tag of the repository | | **commit** | `string?` | Commit of the repository | From ccd96bfa2e2cbae09edcc13fb6695fd0a8680f98 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 22 Jun 2023 08:24:44 +0000 Subject: [PATCH 0999/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index bc80956..e51bd9a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 19 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 22 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -157,7 +157,8 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* automatically. See config() build fun(LazyPlugin) or string or a list of build commands build is executed when a plugin is installed or - updated. If it’s a string it will be ran as a shell + updated. Before running build, a plugin is first + loaded. If it’s a string it will be ran as a shell command. When prefixed with it is a Neovim command. You can also specify a list to executed multiple build commands From 3867a81bb2e475c93c744ac39ac76d442d85aa1e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 22 Jun 2023 10:47:48 +0200 Subject: [PATCH 1000/1610] style: better uv annotations --- lua/lazy/manage/process.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 04b31bb..9b7fef4 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -2,7 +2,7 @@ local Config = require("lazy.core.config") local M = {} ----@type table<uv.uv_process_t, true> +---@type table<uv_process_t, true> M.running = {} M.signals = { @@ -75,10 +75,10 @@ function M.spawn(cmd, opts) local stderr = assert(uv.new_pipe()) local output = "" - ---@type uv.uv_process_t + ---@type uv_process_t? local handle = nil - ---@type uv.uv_timer_t + ---@type uv_timer_t local timeout local killed = false if opts.timeout then @@ -96,6 +96,7 @@ function M.spawn(cmd, opts) cwd = opts.cwd, env = env_flat, }, function(exit_code, signal) + ---@cast handle uv_process_t M.running[handle] = nil if timeout then timeout:stop() From d7d5842d1c9a566d480db8b4a5aaf00054b99bb5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 22 Jun 2023 11:04:17 +0200 Subject: [PATCH 1001/1610] fix(config): on windows default concurrency is now set to 2*available parallelism. See #887 --- lua/lazy/core/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index ed1009d..ccad780 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -17,7 +17,7 @@ M.defaults = { -- leave nil when passing the spec as the first argument to setup() spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. - concurrency = nil, ---@type number limit the maximum amount of concurrent tasks + concurrency = jit.os:find("Windows") and (vim.loop.available_parallelism() * 2) or nil, ---@type number limit the maximum amount of concurrent tasks git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits From b7043f2983d7aead78ca902f3f2053907081859a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 22 Jun 2023 11:17:54 +0200 Subject: [PATCH 1002/1610] chore(main): release 9.24.2 (#890) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 573f6c1..7370853 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.24.2](https://github.com/folke/lazy.nvim/compare/v9.24.1...v9.24.2) (2023-06-22) + + +### Bug Fixes + +* **config:** on windows default concurrency is now set to 2*available parallelism. See [#887](https://github.com/folke/lazy.nvim/issues/887) ([d7d5842](https://github.com/folke/lazy.nvim/commit/d7d5842d1c9a566d480db8b4a5aaf00054b99bb5)) + ## [9.24.1](https://github.com/folke/lazy.nvim/compare/v9.24.0...v9.24.1) (2023-06-19) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index ccad780..6935bb5 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.24.1" -- x-release-please-version +M.version = "9.24.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 24803fcbe3fe2c84300903278b7445cfb2e54deb Mon Sep 17 00:00:00 2001 From: Mayrixon <bygsxizhen@gmail.com> Date: Mon, 26 Jun 2023 06:54:12 +0100 Subject: [PATCH 1003/1610] fix(health): false warning when checking plugins configured with 'optional' key (#897) --- lua/lazy/health.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index f0ccb22..8fc6e95 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -127,6 +127,7 @@ M.valid = { "main", "module", "name", + "optional", "opts", "pin", "priority", From 4c8b625bc873ca76b76eee0c28c98f1f7148f17f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 05:55:00 +0000 Subject: [PATCH 1004/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e51bd9a..f139c9c 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 22 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 26 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From d5c31f1ed7dcceb20a04a5dfc8d02f440122177c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Jun 2023 18:08:52 +0200 Subject: [PATCH 1005/1610] style: lua annotations --- lua/lazy/manage/reloader.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index b6e1f1e..6938231 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -5,10 +5,10 @@ local Loader = require("lazy.core.loader") local M = {} ----@type table<string, vim.loop.Stat> +---@type table<string, uv.aliases.fs_stat_table> M.files = {} ----@type vim.loop.Timer +---@type uv_timer_t M.timer = nil function M.enable() @@ -16,7 +16,7 @@ function M.enable() M.timer:stop() end if #Config.spec.modules > 0 then - M.timer = vim.loop.new_timer() + M.timer = assert(vim.loop.new_timer()) M.check(true) M.timer:start(2000, 2000, M.check) end @@ -29,8 +29,8 @@ function M.disable() end end ----@param h1 vim.loop.Stat ----@param h2 vim.loop.Stat +---@param h1 uv.aliases.fs_stat_table +---@param h2 uv.aliases.fs_stat_table function M.eq(h1, h2) return h1 and h2 and h1.size == h2.size and h1.mtime.sec == h2.mtime.sec and h1.mtime.nsec == h2.mtime.nsec end From 2772cc587ed2153043676d95f0d75e791f4134cf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:11:15 +0000 Subject: [PATCH 1006/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f139c9c..ba139a6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 26 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 30 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 4c26421785be8c49f1d8eaa5bdb55b73c7be5127 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Jun 2023 18:22:39 +0200 Subject: [PATCH 1007/1610] feat(build): added support for build.lua, build/init.lua (#903) --- lua/lazy/manage/task/plugin.lua | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 9e6d84a..00dd262 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -4,13 +4,23 @@ local Loader = require("lazy.core.loader") ---@type table<string, LazyTaskDef> local M = {} +---@param plugin LazyPlugin +local function get_build_file(plugin) + for _, path in ipairs({ "build.lua", "build/init.lua" }) do + path = plugin.dir .. "/" .. path + if Util.file_exists(path) then + return path + end + end +end + M.build = { ---@param opts? {force:boolean} skip = function(plugin, opts) if opts and opts.force then return false end - return not (plugin._.dirty and plugin.build) + return not (plugin._.dirty and (plugin.build or get_build_file(plugin))) end, run = function(self) vim.cmd([[silent! runtime plugin/rplugin.vim]]) @@ -18,6 +28,20 @@ M.build = { Loader.load(self.plugin, { task = "build" }) local builders = self.plugin.build + + local build_file = get_build_file(self.plugin) + if build_file then + if builders then + Util.warn( + ("Plugin **%s** provides its own build script.\nPlease remove the `build` option from the plugin's spec"):format( + self.plugin.name + ) + ) + end + builders = function() + Loader.source(build_file) + end + end if builders then builders = type(builders) == "table" and builders or { builders } ---@cast builders (string|fun(LazyPlugin))[] From 2ea3c54b5f3d079e9aae10411e672fb306c55481 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Jun 2023 18:28:29 +0200 Subject: [PATCH 1008/1610] docs: added docs about new build.lua --- README.md | 65 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 15a3f54..8610761 100644 --- a/README.md +++ b/README.md @@ -79,35 +79,35 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | -| **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 | -| **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 `fun(LazyPlugin):boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | -| **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. | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require(MAIN).setup(opts)`. Lazy uses several heuristics to determine the plugin's `MAIN` module automatically based on the plugin's **name**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | -| **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 a list of build commands | `build` is executed when a plugin is installed or updated. Before running `build`, a plugin is first loaded. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` or `false` to override the default | Version to use from the repository. Full [Semver](https://devhints.io/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` | -| **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | -| **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | -| **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. | -| **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 | +| Property | Type | Description | +| ---------------- | ------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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` | +| **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 | +| **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 `fun(LazyPlugin):boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | +| **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. | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require(MAIN).setup(opts)`. Lazy uses several heuristics to determine the plugin's `MAIN` module automatically based on the plugin's **name**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | +| **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 a list of build commands | `build` is executed when a plugin is installed or updated. Before running `build`, a plugin is first loaded. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands. Some plugins provide their own `build.lua` which is automatically used by lazy. So no need to specify a build step for those plugins. | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` or `false` to override the default | Version to use from the repository. Full [Semver](https://devhints.io/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` | +| **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | +| **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| **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. | +| **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 | ### Lazy Loading @@ -790,6 +790,13 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori </details> +## 📚 Plugin Authors + +If your plugin needs a build step, you can create a file `build.lua` or `build/init.lua` +in the root of your repo. This file will be loaded when the plugin is installed or updated. + +This makes it easier for users, so they no longer need to specify a `build` command. + ## 📦 Other Neovim Plugin Managers in Lua - [packer.nvim](https://github.com/wbthomason/packer.nvim) From d54ae0b96d60ff07f5774a431406b33a17491794 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:29:13 +0000 Subject: [PATCH 1009/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 78 +++++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ba139a6..51c9d09 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -18,6 +18,7 @@ Table of Contents *lazy.nvim-table-of-contents* - Migration Guide |lazy.nvim-lazy.nvim-migration-guide| - Uninstalling |lazy.nvim-lazy.nvim-uninstalling| - Highlight Groups |lazy.nvim-lazy.nvim-highlight-groups| + - Plugin Authors |lazy.nvim-lazy.nvim-plugin-authors| - Other Neovim Plugin Managers in Lua|lazy.nvim-lazy.nvim-other-neovim-plugin-managers-in-lua| ============================================================================== @@ -102,9 +103,9 @@ It is recommended to run `:checkhealth lazy` after installation. PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* - -------------------------------------------------------------------------------------------------------------------------------- + ---------------------------------------------------------------------------------------------------------------------------------- Property Type Description - -------------- ------------------------------------------------------------ ---------------------------------------------------- + -------------- ------------------------------------------------------------ ------------------------------------------------------ [1] string? Short plugin url. Will be expanded using config.git.url_format @@ -112,40 +113,40 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* 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 + 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 - 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 + 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 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 fun(LazyPlugin):boolean When false, or if the function returns false, then - this plugin will not be loaded. Useful to disable - some plugins in vscode, or firenvim for example. + this plugin will not be loaded. Useful to disable some + plugins in vscode, or firenvim for example. - 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. + 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. init fun(LazyPlugin) init functions are always executed during startup opts table or fun(LazyPlugin, opts:table) opts should be a table (will be merged with parent 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() + 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) or true config is executed when the plugin loads. The - default implementation will automatically run + config fun(LazyPlugin, opts:table) or true config is executed when the plugin loads. The default + implementation will automatically run require(MAIN).setup(opts). Lazy uses several heuristics to determine the plugin’s MAIN module automatically based on the plugin’s name. See also @@ -160,8 +161,10 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* updated. Before running build, a plugin is first loaded. If it’s a string it will be ran as a shell command. When prefixed with it is a Neovim command. - You can also specify a list to executed multiple - build commands + You can also specify a list to executed multiple build + commands. Some plugins provide their own build.lua + which is automatically used by lazy. So no need to + specify a build step for those plugins. branch string? Branch of the repository @@ -169,11 +172,10 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* commit string? Commit of the repository - version string? or false to override the default Version to use from the repository. Full Semver - ranges are supported + version string? or false to override the default Version to use from the repository. Full Semver ranges + are supported - pin boolean? When true, this plugin will not be included in - updates + 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 @@ -194,17 +196,17 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* required somewhere 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. + loading certain plugins first. Default priority is 50. + It’s recommended to set this to a high number for + colorschemes. 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 - -------------------------------------------------------------------------------------------------------------------------------- + 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 + ---------------------------------------------------------------------------------------------------------------------------------- LAZY LOADING ~ @@ -936,6 +938,16 @@ Click to see all highlight groups ~ LazyValue _@string_ valueof a property --------------------------------------------------------------------------------- +PLUGIN AUTHORS *lazy.nvim-lazy.nvim-plugin-authors* + +If your plugin needs a build step, you can create a file `build.lua` or +`build/init.lua` in the root of your repo. This file will be loaded when the +plugin is installed or updated. + +This makes it easier for users, so they no longer need to specify a `build` +command. + + OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-lazy.nvim-other-neovim-plugin-managers-in-lua* - packer.nvim <https://github.com/wbthomason/packer.nvim> From de0a911ad97e273edb6e3890ddb1aac59e2d0fb4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Jun 2023 18:30:15 +0200 Subject: [PATCH 1010/1610] chore(main): release 9.25.0 (#898) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7370853..a6d9c91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [9.25.0](https://github.com/folke/lazy.nvim/compare/v9.24.2...v9.25.0) (2023-06-30) + + +### Features + +* **build:** added support for build.lua, build/init.lua ([#903](https://github.com/folke/lazy.nvim/issues/903)) ([4c26421](https://github.com/folke/lazy.nvim/commit/4c26421785be8c49f1d8eaa5bdb55b73c7be5127)) + + +### Bug Fixes + +* **health:** false warning when checking plugins configured with 'optional' key ([#897](https://github.com/folke/lazy.nvim/issues/897)) ([24803fc](https://github.com/folke/lazy.nvim/commit/24803fcbe3fe2c84300903278b7445cfb2e54deb)) + ## [9.24.2](https://github.com/folke/lazy.nvim/compare/v9.24.1...v9.24.2) (2023-06-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 6935bb5..b655b9b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -153,7 +153,7 @@ M.defaults = { debug = false, } -M.version = "9.24.2" -- x-release-please-version +M.version = "9.25.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 189371c8d8ac8205687522dd4c3601edc7b7a927 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 30 Jun 2023 21:19:30 +0200 Subject: [PATCH 1011/1610] fix(build): allow `build` command to override plugin's build and option to disable warning --- README.md | 9 ++++++++- lua/lazy/core/config.lua | 6 ++++++ lua/lazy/manage/task/plugin.lua | 18 +++++++++++------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8610761..a30e651 100644 --- a/README.md +++ b/README.md @@ -306,7 +306,7 @@ return { -- leave nil when passing the spec as the first argument to setup() spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. - concurrency = nil, ---@type number limit the maximum amount of concurrent tasks + concurrency = jit.os:find("Windows") and (vim.loop.available_parallelism() * 2) or nil, ---@type number limit the maximum amount of concurrent tasks git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits @@ -439,6 +439,12 @@ return { skip_if_doc_exists = true, }, state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things + build = { + -- Plugins can provide a `build.lua` file that will be executed when the plugin is installed + -- or updated. When the plugin spec also has a `build` command, the plugin's `build.lua` not be + -- executed. In this case, a warning message will be shown. + warn_on_override = true, + }, } ``` @@ -500,6 +506,7 @@ Any operation can be started from the UI, with a sub command or an API function: | `: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 | diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index b655b9b..9a25a7d 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -150,6 +150,12 @@ M.defaults = { skip_if_doc_exists = true, }, state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things + build = { + -- Plugins can provide a `build.lua` file that will be executed when the plugin is installed + -- or updated. When the plugin spec also has a `build` command, the plugin's `build.lua` not be + -- executed. In this case, a warning message will be shown. + warn_on_override = true, + }, debug = false, } diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 00dd262..fd6153b 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -1,5 +1,6 @@ local Util = require("lazy.util") local Loader = require("lazy.core.loader") +local Config = require("lazy.core.config") ---@type table<string, LazyTaskDef> local M = {} @@ -32,14 +33,17 @@ M.build = { local build_file = get_build_file(self.plugin) if build_file then if builders then - Util.warn( - ("Plugin **%s** provides its own build script.\nPlease remove the `build` option from the plugin's spec"):format( - self.plugin.name + if Config.options.build.warn_on_override then + Util.warn( + ("Plugin **%s** provides its own build script, but you also defined a `build` command.\nThe `build.lua` file will not be used"):format( + self.plugin.name + ) ) - ) - end - builders = function() - Loader.source(build_file) + end + else + builders = function() + Loader.source(build_file) + end end end if builders then From d65d5441d997c98be8c261ca8537694c5f4642be Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 30 Jun 2023 19:20:17 +0000 Subject: [PATCH 1012/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 51c9d09..6fe0750 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -405,7 +405,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* -- leave nil when passing the spec as the first argument to setup() spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. - concurrency = nil, ---@type number limit the maximum amount of concurrent tasks + concurrency = jit.os:find("Windows") and (vim.loop.available_parallelism() 2) or nil, ---@type number limit the maximum amount of concurrent tasks git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits @@ -538,6 +538,12 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* skip_if_doc_exists = true, }, state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things + build = { + -- Plugins can provide a `build.lua` file that will be executed when the plugin is installed + -- or updated. When the plugin spec also has a `build` command, the plugin's `build.lua` not be + -- executed. In this case, a warning message will be shown. + warn_on_override = true, + }, } < @@ -609,6 +615,8 @@ function: :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 From 0d61488b89a570415177f75a36ef93616aac6c77 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 1 Jul 2023 08:51:17 +0200 Subject: [PATCH 1013/1610] chore(main): release 9.25.1 (#904) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6d9c91..26ec8d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [9.25.1](https://github.com/folke/lazy.nvim/compare/v9.25.0...v9.25.1) (2023-06-30) + + +### Bug Fixes + +* **build:** allow `build` command to override plugin's build and option to disable warning ([189371c](https://github.com/folke/lazy.nvim/commit/189371c8d8ac8205687522dd4c3601edc7b7a927)) + ## [9.25.0](https://github.com/folke/lazy.nvim/compare/v9.24.2...v9.25.0) (2023-06-30) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9a25a7d..4263bc1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -159,7 +159,7 @@ M.defaults = { debug = false, } -M.version = "9.25.0" -- x-release-please-version +M.version = "9.25.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From f8611632d0f9c6818e8eb54f9bcd1dad122b5a7f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 1 Jul 2023 06:51:58 +0000 Subject: [PATCH 1014/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6fe0750..727445e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 June 30 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 01 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From fbb0bea2db1963b4b83a3cb1f0c09d78a2ab286f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 6 Jul 2023 15:30:01 +0200 Subject: [PATCH 1015/1610] feat(plugin)!: `cond` is now the same as `enabled`, but skips clean --- lua/lazy/core/loader.lua | 11 ++--------- lua/lazy/core/plugin.lua | 33 +++++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 3065040..91a3f3a 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -297,15 +297,8 @@ function M._load(plugin, reason, opts) return Util.error("Plugin " .. plugin.name .. " is not installed") end - local cond = plugin.cond - if cond == nil then - cond = Config.options.defaults.cond - end - if cond ~= nil and not (opts and opts.force) then - if cond == false or (type(cond) == "function" and not cond(plugin)) then - plugin._.cond = false - return - end + if plugin._.cond == false and not (opts and opts.force) then + return end ---@diagnostic disable-next-line: assign-type-mismatch diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index c373f6d..3019d8a 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -146,13 +146,20 @@ function Spec:warn(msg) self:log(msg, vim.log.levels.WARN) end -function Spec:fix_disabled() +function Spec:fix_cond() for _, plugin in pairs(self.plugins) do - if not plugin.name or not plugin.dir then - self:error("Plugin spec for **" .. plugin.name .. "** not found.\n```lua\n" .. vim.inspect(plugin) .. "\n```") - self.plugins[plugin.name] = nil + local cond = plugin.cond + if cond == nil then + cond = Config.options.defaults.cond + end + if cond == false or (type(cond) == "function" and not cond(plugin)) then + plugin._.cond = false + plugin.enabled = false end end +end + +function Spec:fix_optional() if not self.optional then ---@param plugin LazyPlugin local function all_optional(plugin) @@ -166,6 +173,18 @@ function Spec:fix_disabled() end end end +end + +function Spec:fix_disabled() + for _, plugin in pairs(self.plugins) do + if not plugin.name or not plugin.dir then + self:error("Plugin spec for **" .. plugin.name .. "** not found.\n```lua\n" .. vim.inspect(plugin) .. "\n```") + self.plugins[plugin.name] = nil + end + end + + self:fix_optional() + self:fix_cond() ---@type table<string,string[]> plugin to parent plugin local dep_of = {} @@ -384,6 +403,12 @@ function M.update_state() end end + for _, plugin in pairs(Config.spec.disabled) do + if plugin._.cond == false then + installed[plugin.name] = nil + end + end + Config.to_clean = {} for pack, dir_type in pairs(installed) do table.insert(Config.to_clean, { From 045f23eb35bab4f64fb37b55ac796ff858b2e207 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 6 Jul 2023 15:38:21 +0200 Subject: [PATCH 1016/1610] test: fixed tests --- tests/core/plugin_spec.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 2eaf349..3c37e91 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -47,6 +47,7 @@ describe("plugin spec opt", function() local spec = Plugin.Spec.new(vim.deepcopy(test)) assert(#spec.notifs == 0) Config.plugins = spec.plugins + Config.spec = spec Plugin.update_state() assert(vim.tbl_count(spec.plugins) == 3) assert(#spec.plugins.bar.dependencies == 2) From c27cd36e6c97ee716fc04620ee7d99bb4d866e3e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 13:39:12 +0000 Subject: [PATCH 1017/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 727445e..f49b1ef 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 01 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 29f8e3ecb7b035bd97c16b9bd218004907827345 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 15:40:23 +0200 Subject: [PATCH 1018/1610] chore(main): release 10.0.0 (#918) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 11 +++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26ec8d3..9af83a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [10.0.0](https://github.com/folke/lazy.nvim/compare/v9.25.1...v10.0.0) (2023-07-06) + + +### ⚠ BREAKING CHANGES + +* **plugin:** `cond` is now the same as `enabled`, but skips clean + +### Features + +* **plugin:** `cond` is now the same as `enabled`, but skips clean ([fbb0bea](https://github.com/folke/lazy.nvim/commit/fbb0bea2db1963b4b83a3cb1f0c09d78a2ab286f)) + ## [9.25.1](https://github.com/folke/lazy.nvim/compare/v9.25.0...v9.25.1) (2023-06-30) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4263bc1..862ff1b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -159,7 +159,7 @@ M.defaults = { debug = false, } -M.version = "9.25.1" -- x-release-please-version +M.version = "10.0.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 5082cd56e49c737619c967e9c57309c2eeaad425 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Lacaze <pal.dev@pa-l.fr> Date: Thu, 6 Jul 2023 16:19:08 +0200 Subject: [PATCH 1019/1610] fix(stats): corrected typo in cputime() for Linux (#916) --- lua/lazy/stats.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index a2ccdd8..a898ff7 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -50,7 +50,7 @@ function M.cputime() local pnano = assert(ffi.new("nanotime[?]", 1)) local CLOCK_PROCESS_CPUTIME_ID = jit.os == "OSX" and 12 or 2 ffi.C.clock_gettime(CLOCK_PROCESS_CPUTIME_ID, pnano) - return tonumber(pnano[0].tv_sec) / 1e6 + tonumber(pnano[0].tv_nsec) / 1e6 + return tonumber(pnano[0].tv_sec) * 1e3 + tonumber(pnano[0].tv_nsec) / 1e6 end local function fallback() From 867528c0fec1f2908edd9539618e4b033203c954 Mon Sep 17 00:00:00 2001 From: yangbinji <1139040653@qq.com> Date: Thu, 6 Jul 2023 22:30:54 +0800 Subject: [PATCH 1020/1610] style(cache): fix comment case typo (#915) --- lua/lazy/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 2b41ffd..226069b 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -33,7 +33,7 @@ function M.setup(spec, opts) end local start = vim.loop.hrtime() - -- use the NEovim cache if available + -- use the Neovim cache if available if vim.loader and vim.fn.has("nvim-0.9.1") == 1 then package.loaded["lazy.core.cache"] = vim.loader end From 5af331ea65418dc9361769891921fdee4bcc837a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 20:44:00 +0200 Subject: [PATCH 1021/1610] chore(main): release 10.0.1 (#919) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9af83a6..8d52236 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.0.1](https://github.com/folke/lazy.nvim/compare/v10.0.0...v10.0.1) (2023-07-06) + + +### Bug Fixes + +* **stats:** corrected typo in cputime() for Linux ([#916](https://github.com/folke/lazy.nvim/issues/916)) ([5082cd5](https://github.com/folke/lazy.nvim/commit/5082cd56e49c737619c967e9c57309c2eeaad425)) + ## [10.0.0](https://github.com/folke/lazy.nvim/compare/v9.25.1...v10.0.0) (2023-07-06) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 862ff1b..dbb0027 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -159,7 +159,7 @@ M.defaults = { debug = false, } -M.version = "10.0.0" -- x-release-please-version +M.version = "10.0.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From fd94e69ceb15268496b85ee61fcd55a08539df1d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 9 Jul 2023 09:44:08 +0200 Subject: [PATCH 1022/1610] fix(event): pass data to event lazy loaders. Fixes #922 --- lua/lazy/core/handler/event.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 8c64231..0e26c68 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -23,7 +23,7 @@ function M:_add(value) group = self.group, once = true, pattern = pattern, - callback = function() + callback = function(ev) if not self.active[value] then return end @@ -32,7 +32,7 @@ function M:_add(value) -- load the plugins Loader.load(self.active[value], { [self.type] = value }) -- check if any plugin created an event handler for this event and fire the group - self:trigger(event, pattern, groups) + self:trigger(event, pattern, groups, ev.data) Util.track() end, }) @@ -61,7 +61,7 @@ end ---@param event string|string[] ---@param pattern? string ---@param groups table<string,true> -function M:trigger(event, pattern, groups) +function M:trigger(event, pattern, groups, data) local events = M.trigger_events[event] or { event } ---@cast events string[] for _, e in ipairs(events) do @@ -77,7 +77,7 @@ function M:trigger(event, pattern, groups) end Util.track({ event = autocmd.group_name }) Util.try(function() - vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false }) + vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false, data = data }) Util.track() end) end From 8ae6cb4b44ff95e556fcdd0054837241893a947f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Jul 2023 07:44:55 +0000 Subject: [PATCH 1023/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f49b1ef..c498a6c 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 06 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 09 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From da8b00581a52f5f87ad2aba9f52171fda7491f18 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Jul 2023 09:46:59 +0200 Subject: [PATCH 1024/1610] chore(main): release 10.0.2 (#923) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d52236..e4a24bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.0.2](https://github.com/folke/lazy.nvim/compare/v10.0.1...v10.0.2) (2023-07-09) + + +### Bug Fixes + +* **event:** pass data to event lazy loaders. Fixes [#922](https://github.com/folke/lazy.nvim/issues/922) ([fd94e69](https://github.com/folke/lazy.nvim/commit/fd94e69ceb15268496b85ee61fcd55a08539df1d)) + ## [10.0.1](https://github.com/folke/lazy.nvim/compare/v10.0.0...v10.0.1) (2023-07-06) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index dbb0027..9ed0f2a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -159,7 +159,7 @@ M.defaults = { debug = false, } -M.version = "10.0.1" -- x-release-please-version +M.version = "10.0.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From ea5b2e00bf7aeaaf10a4e93763419e4af2796782 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 12 Jul 2023 17:21:32 +0200 Subject: [PATCH 1025/1610] feat(loader): `LazyLoad` event with plugin name as `data` field. Useful to do stuff when a plugin loads --- README.md | 1 + lua/lazy/core/loader.lua | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index a30e651..eb3faa1 100644 --- a/README.md +++ b/README.md @@ -582,6 +582,7 @@ The following user events will be triggered: - **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 diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 91a3f3a..ea1d143 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -333,6 +333,7 @@ function M._load(plugin, reason, opts) plugin._.loaded.time = Util.track().time table.remove(M.loading) vim.schedule(function() + vim.api.nvim_exec_autocmds("User", { pattern = "LazyLoad", modeline = false, data = plugin.name }) vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) end) end From f6aedf1269ee5e7dee04fd94f893535ac9ddb434 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 15:22:18 +0000 Subject: [PATCH 1026/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c498a6c..9107ded 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 09 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 12 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -688,6 +688,7 @@ The following user events will be triggered: - **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 From 14d76aac4bd3ff07c1fca074c210f28f766a931e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 17:24:07 +0200 Subject: [PATCH 1027/1610] chore(main): release 10.1.0 (#927) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4a24bd..9d06808 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.1.0](https://github.com/folke/lazy.nvim/compare/v10.0.2...v10.1.0) (2023-07-12) + + +### Features + +* **loader:** `LazyLoad` event with plugin name as `data` field. Useful to do stuff when a plugin loads ([ea5b2e0](https://github.com/folke/lazy.nvim/commit/ea5b2e00bf7aeaaf10a4e93763419e4af2796782)) + ## [10.0.2](https://github.com/folke/lazy.nvim/compare/v10.0.1...v10.0.2) (2023-07-09) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9ed0f2a..505db78 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -159,7 +159,7 @@ M.defaults = { debug = false, } -M.version = "10.0.2" -- x-release-please-version +M.version = "10.1.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 2b241f74edb3f0a9de73c23f7a5a35048789bb08 Mon Sep 17 00:00:00 2001 From: Kasshi K <46557690+chickbone@users.noreply.github.com> Date: Sun, 16 Jul 2023 15:50:53 +0900 Subject: [PATCH 1028/1610] fix typo in health.lua (#933) --- lua/lazy/health.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 8fc6e95..8757b77 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -14,7 +14,7 @@ function M.check() if vim.fn.executable("git") == 1 then ok("Git installed") else - error("Git not installd?") + error("Git not installed?") end local sites = vim.opt.packpath:get() From 25beed5e2e935ebc00d7e3eed1dc502df3c40e39 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Jul 2023 06:51:36 +0000 Subject: [PATCH 1029/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9107ded..6b22250 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 12 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 16 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 84266b9f0ff314319e69adfeb1a86bd72d1aff91 Mon Sep 17 00:00:00 2001 From: 3719e04 <56977205+3719e04@users.noreply.github.com> Date: Thu, 20 Jul 2023 16:48:50 -0500 Subject: [PATCH 1030/1610] feat(view): add option `ui.pills`. Set to `false` to disable the top buttons in the lazy window (#938) * add option `ui.button` * add option `ui.button` * refactor: rename button to pills --------- Co-authored-by: Folke Lemaitre <folke.lemaitre@gmail.com> --- README.md | 2 ++ lua/lazy/core/config.lua | 2 ++ lua/lazy/view/render.lua | 47 +++++++++++++++++++++------------------- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index eb3faa1..31ddfb7 100644 --- a/README.md +++ b/README.md @@ -339,6 +339,8 @@ return { border = "none", 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 = "", diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 505db78..9f51a78 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -50,6 +50,8 @@ M.defaults = { border = "none", 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 = "", diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 19a6feb..fe9f87e 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -112,38 +112,41 @@ function M:get_plugin(row) end function M:title() - self:nl():nl() + self:nl() local modes = vim.tbl_filter(function(c) return c.button end, ViewConfig.get_commands()) - for c, mode in ipairs(modes) do - local title = " " .. mode.name:sub(1, 1):upper() .. mode.name:sub(2) .. " (" .. mode.key .. ") " - 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 - - if self.view.state.mode == mode.name then + if Config.options.ui.pills then + self:nl() + for c, mode in ipairs(modes) do + local title = " " .. mode.name:sub(1, 1):upper() .. mode.name:sub(2) .. " (" .. mode.key .. ") " if mode.name == "home" then - self:append(title, "LazyH1", { wrap = true }) + if self.view.state.mode == "home" then + title = " lazy.nvim " .. Config.options.ui.icons.lazy + else + title = " lazy.nvim (H) " + end + end + + if self.view.state.mode == mode.name then + if mode.name == "home" then + self:append(title, "LazyH1", { wrap = true }) + else + self:append(title, "LazyButtonActive", { wrap = true }) + self:highlight({ ["%(.%)"] = "LazySpecial" }) + end else - self:append(title, "LazyButtonActive", { wrap = true }) + self:append(title, "LazyButton", { wrap = true }) self:highlight({ ["%(.%)"] = "LazySpecial" }) end - else - self:append(title, "LazyButton", { wrap = true }) - self:highlight({ ["%(.%)"] = "LazySpecial" }) + if c == #modes then + break + end + self:append(" ") end - if c == #modes then - break - end - self:append(" ") + self:nl() end - self:nl() if self.progress.done < self.progress.total then self:progressbar() end From 61c43455b0be8eb855d0871000aa4425341a239e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 20 Jul 2023 23:42:38 +0200 Subject: [PATCH 1031/1610] style: lua annotations --- lua/lazy/util.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index c5c64a1..dbe108b 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -6,6 +6,7 @@ function M.file_exists(file) end ---@param opts? LazyFloatOptions +---@return LazyFloat function M.float(opts) return require("lazy.view.float")(opts) end From 50c365bfe972daa9352a0e62bb78fc7254cffeac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 20 Jul 2023 21:49:43 +0000 Subject: [PATCH 1032/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6b22250..2ea5ea3 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 16 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 20 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -438,6 +438,8 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* border = "none", 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 = "", From b7303a68309296fb4809c51ce0bf66722e5dc4f7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 21 Jul 2023 08:14:51 +0200 Subject: [PATCH 1033/1610] chore(main): release 10.2.0 (#939) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d06808..c6ce672 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.2.0](https://github.com/folke/lazy.nvim/compare/v10.1.0...v10.2.0) (2023-07-20) + + +### Features + +* **view:** add option `ui.pills`. Set to `false` to disable the top buttons in the lazy window ([#938](https://github.com/folke/lazy.nvim/issues/938)) ([84266b9](https://github.com/folke/lazy.nvim/commit/84266b9f0ff314319e69adfeb1a86bd72d1aff91)) + ## [10.1.0](https://github.com/folke/lazy.nvim/compare/v10.0.2...v10.1.0) (2023-07-12) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9f51a78..4133c3f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.1.0" -- x-release-please-version +M.version = "10.2.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From ed15f6b39422f46412212005f6d12c6f353b0293 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 21 Jul 2023 06:15:36 +0000 Subject: [PATCH 1034/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 2ea5ea3..c861379 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 20 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 21 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From e428c5ee4b02dfb39203ac8745a58c1226ceebae Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 22 Jul 2023 08:24:24 +0200 Subject: [PATCH 1035/1610] fix(loader): getscriptinfo compat with stable. Fixes #944 --- lua/lazy/core/loader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index ea1d143..caf9087 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -266,7 +266,7 @@ function M.reload(plugin) end -- reload any vimscript files for this plugin - local scripts = vim.fn.getscriptinfo({ name = ".vim" }) + local scripts = vim.fn.getscriptinfo() local loaded_scripts = {} for _, s in ipairs(scripts) do ---@type string From 54a2aa4db43ab6fc2bdbfd10db2939bc35f26af9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 22 Jul 2023 06:25:12 +0000 Subject: [PATCH 1036/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c861379..25a6b08 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 21 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 22 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From af4d24b8d03ba5851f1099b024a417b62d8b6d48 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 22 Jul 2023 09:09:46 +0200 Subject: [PATCH 1037/1610] chore(main): release 10.2.1 (#946) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6ce672..19dc75e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.2.1](https://github.com/folke/lazy.nvim/compare/v10.2.0...v10.2.1) (2023-07-22) + + +### Bug Fixes + +* **loader:** getscriptinfo compat with stable. Fixes [#944](https://github.com/folke/lazy.nvim/issues/944) ([e428c5e](https://github.com/folke/lazy.nvim/commit/e428c5ee4b02dfb39203ac8745a58c1226ceebae)) + ## [10.2.0](https://github.com/folke/lazy.nvim/compare/v10.1.0...v10.2.0) (2023-07-20) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4133c3f..2576887 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.2.0" -- x-release-please-version +M.version = "10.2.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From e7334d8db5bab48463f8ab3ea020bf2f76aaa7f9 Mon Sep 17 00:00:00 2001 From: abeldekat <58370433+abeldekat@users.noreply.github.com> Date: Sat, 22 Jul 2023 08:20:52 +0000 Subject: [PATCH 1038/1610] feat(plugins): Given an optional plugin, conditionally discard deps (#947) * deps_of_all_optional: First, refactor the code responsible for disabling unneeded deps to be more generic * deps_of_all_optional: Second, also disable unneeded deps from plugins marked as all optional * deps_of_all_optional: add tests proving unneeded optional deps are now also discarded * deps_of_all_optional: forgot return type --------- Co-authored-by: abeldekat <abel@nomail.com> --- lua/lazy/core/plugin.lua | 70 +++++++++++++++++++++++++------------- tests/core/plugin_spec.lua | 19 +++++++++++ 2 files changed, 65 insertions(+), 24 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 3019d8a..f141d27 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -146,6 +146,31 @@ function Spec:warn(msg) self:log(msg, vim.log.levels.WARN) end +---@param gathered_deps string[] +---@param dep_of table<string,string[]> +---@param on_disable fun(string):nil +function Spec:fix_dependencies(gathered_deps, dep_of, on_disable) + local function should_disable(dep_name) + for _, parent in ipairs(dep_of[dep_name] or {}) do + if self.plugins[parent] then + return false + end + end + return true + end + + for _, dep_name in ipairs(gathered_deps) do + -- only check if the plugin is still enabled and it is a dep + if self.plugins[dep_name] and self.plugins[dep_name]._.dep then + -- check if the dep is still used by another plugin + if should_disable(dep_name) then + -- disable the dep when no longer needed + on_disable(dep_name) + end + end + end +end + function Spec:fix_cond() for _, plugin in pairs(self.plugins) do local cond = plugin.cond @@ -159,7 +184,9 @@ function Spec:fix_cond() end end +---@return string[] function Spec:fix_optional() + local all_optional_deps = {} if not self.optional then ---@param plugin LazyPlugin local function all_optional(plugin) @@ -170,9 +197,13 @@ function Spec:fix_optional() for _, plugin in pairs(self.plugins) do if plugin.optional and all_optional(plugin) then self.plugins[plugin.name] = nil + if plugin.dependencies then + vim.list_extend(all_optional_deps, plugin.dependencies) + end end end end + return all_optional_deps end function Spec:fix_disabled() @@ -183,15 +214,16 @@ function Spec:fix_disabled() end end - self:fix_optional() - self:fix_cond() - ---@type table<string,string[]> plugin to parent plugin local dep_of = {} ---@type string[] dependencies of disabled plugins local disabled_deps = {} + ---@type string[] dependencies of plugins that are completely optional + local all_optional_deps = self:fix_optional() + self:fix_cond() + for _, plugin in pairs(self.plugins) do local enabled = not (plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled())) if enabled then @@ -209,27 +241,17 @@ function Spec:fix_disabled() end end - -- check deps of disabled plugins - for _, dep in ipairs(disabled_deps) do - -- only check if the plugin is still enabled and it is a dep - if self.plugins[dep] and self.plugins[dep]._.dep then - -- check if the dep is still used by another plugin - local keep = false - for _, parent in ipairs(dep_of[dep] or {}) do - if self.plugins[parent] then - keep = true - break - end - end - -- disable the dep when no longer needed - if not keep then - local plugin = self.plugins[dep] - plugin._.kind = "disabled" - self.plugins[plugin.name] = nil - self.disabled[plugin.name] = plugin - end - end - end + -- fix deps of plugins that are completely optional + self:fix_dependencies(all_optional_deps, dep_of, function(dep_name) + self.plugins[dep_name] = nil + end) + -- fix deps of disabled plugins + self:fix_dependencies(disabled_deps, dep_of, function(dep_name) + local plugin = self.plugins[dep_name] + plugin._.kind = "disabled" + self.plugins[plugin.name] = nil + self.disabled[plugin.name] = plugin + end) end ---@param msg string diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 3c37e91..f64cb4c 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -273,6 +273,25 @@ describe("plugin spec opt", function() end end end) + + it("handles the optional keyword", function() + local tests = { + [{ { "foo/bax" }, { "foo/bar", optional = true, dependencies = "foo/dep1" } }] = false, + [{ { "foo/bax", dependencies = "foo/dep1" }, { "foo/bar", optional = true, dependencies = "foo/dep1" } }] = true, + } + for test, ret in pairs(tests) do + local spec = Plugin.Spec.new(test) + assert(#spec.notifs == 0) + assert(spec.plugins.bax) + assert(not spec.plugins.bar) + assert(#spec.disabled == 0) + if ret then + assert(spec.plugins.dep1) + else + assert(not spec.plugins.opt1) + end + end + end) end) describe("plugin opts", function() From 3ad55ae678876516156cca2f361c51f7952a924b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 22 Jul 2023 10:23:12 +0200 Subject: [PATCH 1039/1610] chore(main): release 10.3.0 (#948) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19dc75e..cd65ac6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.3.0](https://github.com/folke/lazy.nvim/compare/v10.2.1...v10.3.0) (2023-07-22) + + +### Features + +* **plugins:** Given an optional plugin, conditionally discard deps ([#947](https://github.com/folke/lazy.nvim/issues/947)) ([e7334d8](https://github.com/folke/lazy.nvim/commit/e7334d8db5bab48463f8ab3ea020bf2f76aaa7f9)) + ## [10.2.1](https://github.com/folke/lazy.nvim/compare/v10.2.0...v10.2.1) (2023-07-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 2576887..51b8c3b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.2.1" -- x-release-please-version +M.version = "10.3.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From a977a7ab21f570a28d592e4d57af4b1df286c399 Mon Sep 17 00:00:00 2001 From: Distinct Wind <zq_zhouqi@qq.com> Date: Sun, 30 Jul 2023 17:08:52 +0800 Subject: [PATCH 1040/1610] docs: Fix doc missing bracket (#962) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 31ddfb7..fb2371f 100644 --- a/README.md +++ b/README.md @@ -699,7 +699,7 @@ require("lazy").setup({ { "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 From dac844ed617dda4f9ec85eb88e9629ad2add5e05 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 30 Jul 2023 09:09:38 +0000 Subject: [PATCH 1041/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 25a6b08..5a22178 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 22 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 30 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -813,7 +813,7 @@ For example, to import LazyVim core plugins and an optional plugin: { "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 From 4eb3e932e5006c925069c2386c0c6da6bb5baccb Mon Sep 17 00:00:00 2001 From: Darkhan <darkhanu@gmail.com> Date: Sat, 26 Aug 2023 15:47:18 +0100 Subject: [PATCH 1042/1610] Make commit pattern more accurate (#973) Sometimes when hovering over updated plugins and triggering `diff` with `d` key, I get an empty `diff` view. I traced the problem to a very generic `commit_pattern` which currently matches any alphanumeric sequence of 7 characters surrounded by "word boundary" / frontier patterns. I adjusted the regex to match only `[a-z0-9] * 7` which should make this issue appear less. I am keeping the older frontier sets `%f[%w]` and `%f[%W]` because if I switch to `%f[a-f0-9]` and `%f[^0-9a-f]` I will be matching strings like `zzz1234567xxx`. --- lua/lazy/view/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 93611e2..d179f11 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -159,7 +159,7 @@ function M:open_url(path) end function M:setup_patterns() - local commit_pattern = "%f[%w](" .. string.rep("%w", 7) .. ")%f[%W]" + local commit_pattern = "%f[%w](" .. string.rep("[a-f0-9]", 7) .. ")%f[%W]" self:on_pattern(ViewConfig.keys.hover, { [commit_pattern] = function(hash) self:diff({ commit = hash, browser = true }) From 0e9c3934ab5db59156997f78a5186ed20e7568cb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 26 Aug 2023 14:47:56 +0000 Subject: [PATCH 1043/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5a22178..aa730bb 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 July 30 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 August 26 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From d179a17fa1552de9d494b72243497dc86f3325f9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 26 Aug 2023 17:21:48 +0200 Subject: [PATCH 1044/1610] docs: added link to pckr.nvim --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fb2371f..62de315 100644 --- a/README.md +++ b/README.md @@ -809,6 +809,7 @@ This makes it easier for users, so they no longer need to specify a `build` comm ## 📦 Other Neovim Plugin Managers in Lua +- [pckr.nvim](https://github.com/lewis6991/pckr.nvim) - [packer.nvim](https://github.com/wbthomason/packer.nvim) - [paq-nvim](https://github.com/savq/paq-nvim) - [neopm](https://github.com/ii14/neopm) From 2a9354c7d2368d78cbd5575a51a2af5bd8a6ad01 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 26 Aug 2023 15:22:34 +0000 Subject: [PATCH 1045/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index aa730bb..a045ce6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -961,6 +961,7 @@ command. OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-lazy.nvim-other-neovim-plugin-managers-in-lua* +- pckr.nvim <https://github.com/lewis6991/pckr.nvim> - packer.nvim <https://github.com/wbthomason/packer.nvim> - paq-nvim <https://github.com/savq/paq-nvim> - neopm <https://github.com/ii14/neopm> From 24f6b6f1c7fb68f02335dd9579faee8b243e6a54 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 27 Sep 2023 12:39:39 +0200 Subject: [PATCH 1046/1610] fix: properly setup handlers when loading a plugin before startup (build) etc --- lua/lazy/core/handler/init.lua | 15 ++++++++++----- lua/lazy/core/loader.lua | 7 +++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index af85820..9c6b92d 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -19,13 +19,19 @@ M.types = { ---@type table<string,LazyHandler> M.handlers = {} -function M.setup() +M.did_setup = false + +function M.init() for _, type in pairs(M.types) do M.handlers[type] = M.new(type) end +end + +function M.setup() + M.did_setup = true for _, plugin in pairs(Config.plugins) do Util.try(function() - M.enable(plugin, true) + M.enable(plugin) end, "Failed to setup handlers for " .. plugin.name) end end @@ -40,9 +46,8 @@ function M.disable(plugin) end ---@param plugin LazyPlugin ----@param force? boolean -function M.enable(plugin, force) - if force or not plugin._.loaded then +function M.enable(plugin) + if not plugin._.loaded then for type, handler in pairs(M.handlers) do if plugin[type] then handler:add(plugin) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index caf9087..1912338 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -34,6 +34,7 @@ function M.setup() -- load the plugins Plugin.load() + Handler.init() -- install missing plugins if Config.options.install.missing then @@ -301,6 +302,12 @@ function M._load(plugin, reason, opts) return end + if not Handler.did_setup then + Util.try(function() + Handler.enable(plugin) + end, "Failed to setup handlers for " .. plugin.name) + end + ---@diagnostic disable-next-line: assign-type-mismatch plugin._.loaded = {} for k, v in pairs(reason) do From fe9f93692ea92a5091bc3abc2a8881552f6aeb55 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 27 Sep 2023 10:40:28 +0000 Subject: [PATCH 1047/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 88 +++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a045ce6..a691894 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 August 26 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 September 27 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -160,7 +160,7 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* build fun(LazyPlugin) or string or a list of build commands build is executed when a plugin is installed or updated. Before running build, a plugin is first loaded. If it’s a string it will be ran as a shell - command. When prefixed with it is a Neovim command. + command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands. Some plugins provide their own build.lua which is automatically used by lazy. So no need to @@ -181,7 +181,7 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* Defaults to true event string? or string[] or Lazy-load on event. Events can be specified as - fun(self:LazyPlugin, event:string[]):string[] BufEnter or with a pattern like BufEnter .lua + fun(self:LazyPlugin, event:string[]):string[] BufEnter or with a pattern like BufEnter *.lua cmd string? or string[] or Lazy-load on command fun(self:LazyPlugin, cmd:string[]):string[] @@ -281,7 +281,7 @@ The `version` property supports Semver <https://semver.org/> ranges. Click to see some examples ~ -- latest stable version (this excludes pre-release versions) +- `*`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`. @@ -290,8 +290,8 @@ Click to see some examples ~ - `<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 -You can set `config.defaults.version = ""` to install the latest stable version -of plugins that support Semver. +You can set `config.defaults.version = "*"` to install the latest stable +version of plugins that support Semver. EXAMPLES ~ @@ -400,12 +400,12 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* -- 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 - -- version = "", -- enable this to try installing the latest stable versions of plugins + -- version = "*", -- enable this to try installing the latest stable versions of plugins }, -- leave nil when passing the spec as the first argument to setup() spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. - concurrency = jit.os:find("Windows") and (vim.loop.available_parallelism() 2) or nil, ---@type number limit the maximum amount of concurrent tasks + concurrency = jit.os:find("Windows") and (vim.loop.available_parallelism() * 2) or nil, ---@type number limit the maximum amount of concurrent tasks git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits @@ -441,25 +441,25 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* -- Show pills on top of the Lazy window pills = true, ---@type boolean icons = { - cmd = " ", - config = "", - event = "", - ft = " ", - init = " ", - import = " ", - keys = " ", + cmd = " ", + config = "", + event = "", + ft = " ", + init = " ", + import = " ", + keys = " ", lazy = "󰒲 ", - loaded = "", - not_loaded = "", - plugin = " ", - runtime = " ", - source = " ", - start = "", - task = " ", + loaded = "●", + not_loaded = "○", + plugin = " ", + runtime = " ", + source = " ", + start = "", + task = "✔ ", list = { - "", - "", - "", + "●", + "➜", + "★", "‒", }, }, @@ -488,11 +488,11 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* }, diff = { -- 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, -- so you can have a different command for diff <d> - -- 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 + -- * 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 = { @@ -535,7 +535,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* readme = { enabled = true, 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 dont have docs skip_if_doc_exists = true, }, @@ -556,17 +556,17 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s ui = { icons = { cmd = "⌘", - config = "", - event = "", - ft = "", - init = "", - keys = "", - plugin = "", - runtime = "", - source = "", - start = "", - task = "", - lazy = " ", + config = "🛠", + event = "📅", + ft = "📂", + init = "⚙", + keys = "🗝", + plugin = "🔌", + runtime = "💻", + source = "📄", + start = "🚀", + task = "📌", + lazy = "💤 ", }, }, } @@ -671,7 +671,7 @@ Example of configuring lualine.nvim ~ { require("lazy.status").updates, cond = require("lazy.status").has_updates, - color = { fg = "ff9e64" }, + color = { fg = "#ff9e64" }, }, }, }, @@ -784,7 +784,7 @@ Example: } < -- Any lua file in `~/.config/nvim/lua/plugins/.lua` will be automatically merged in the main plugin spec +- 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 <https://github.com/LazyVim/LazyVim> and more specifically: @@ -836,7 +836,7 @@ PACKER.NVIM ~ - `run` `build` - `lock` `pin` - `disable=true` `enabled = false` -- `tag=''` `version=""` +- `tag='*'` `version="*"` - `after` **not needed** for most use-cases. Use `dependencies` otherwise. - `wants` **not needed** for most use-cases. Use `dependencies` otherwise. - `config` don’t support string type, use `fun(LazyPlugin)` instead. From cc24fc0e858c080eb8a7462697c48c6046849359 Mon Sep 17 00:00:00 2001 From: Mike <10135646+mikesmithgh@users.noreply.github.com> Date: Wed, 27 Sep 2023 06:49:20 -0400 Subject: [PATCH 1048/1610] docs: fix spec opts in README (#1030) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 62de315..0f25814 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ require("lazy").setup({ | Property | Type | Description | | ---------------- | ------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **[1]** | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | | **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 | @@ -100,7 +100,7 @@ require("lazy").setup({ | **commit** | `string?` | Commit of the repository | | **version** | `string?` or `false` to override the default | Version to use from the repository. Full [Semver](https://devhints.io/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` | +| **submodules** | `boolean?` | When false, git submodules will not be fetched. Defaults to `true` | | **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | | **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | | **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | From 0e1d264ab6567725b6c30ffd1ad120b16884ff45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maria=20Jos=C3=A9=20Solano?= <majosolano99@gmail.com> Date: Wed, 27 Sep 2023 03:51:11 -0700 Subject: [PATCH 1049/1610] fix: return true when opening diff (#970) --- lua/lazy/view/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index d179f11..869fac7 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -243,6 +243,8 @@ function M:diff(opts) else Diff.handlers[Config.options.diff.cmd](plugin, diff) end + + return true end end From 7ca3bdb566c3ba4492f2d22b37c2c9e26f09470f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:48:20 +0200 Subject: [PATCH 1050/1610] chore(main): release 10.3.1 (#1051) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd65ac6..b0cefce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [10.3.1](https://github.com/folke/lazy.nvim/compare/v10.3.0...v10.3.1) (2023-09-27) + + +### Bug Fixes + +* properly setup handlers when loading a plugin before startup (build) etc ([24f6b6f](https://github.com/folke/lazy.nvim/commit/24f6b6f1c7fb68f02335dd9579faee8b243e6a54)) +* return true when opening diff ([#970](https://github.com/folke/lazy.nvim/issues/970)) ([0e1d264](https://github.com/folke/lazy.nvim/commit/0e1d264ab6567725b6c30ffd1ad120b16884ff45)) + ## [10.3.0](https://github.com/folke/lazy.nvim/compare/v10.2.1...v10.3.0) (2023-07-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 51b8c3b..d0499fb 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.3.0" -- x-release-please-version +M.version = "10.3.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 4f27fc33c4e0e81802f4afadbe350de93447ac1e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 28 Sep 2023 12:26:21 +0200 Subject: [PATCH 1051/1610] fix(ui): sort plugins case insensitive --- lua/lazy/view/render.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index fe9f87e..442e769 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -241,6 +241,9 @@ function M:section(section) end, self.plugins) local count = #section_plugins + table.sort(section_plugins, function(a, b) + return a.name:lower() < b.name:lower() + end) if count > 0 then self:append(section.title, "LazyH2"):append(" (" .. count .. ")", "LazyComment"):nl() for _, plugin in ipairs(section_plugins) do From 54ecfc7c245e5e3fbbc749658ad171335418d48c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 28 Sep 2023 12:28:05 +0200 Subject: [PATCH 1052/1610] fix(help): sort readme tags case sensitive. Fixes #67 --- lua/lazy/help.lua | 2 +- lua/lazy/util.lua | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index 4a289eb..a33e808 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -63,7 +63,7 @@ function M.update() local lines = { [[!_TAG_FILE_ENCODING utf-8 //]] } Util.foreach(tags, function(_, tag) table.insert(lines, ("%s\t%s\t/%s"):format(tag.tag, tag.file, tag.line)) - end) + end, { case_sensitive = true }) Util.write_file(docs .. "/tags", table.concat(lines, "\n")) end diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index dbe108b..d841255 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -235,10 +235,14 @@ end ---@generic V ---@param t table<string, V> ---@param fn fun(key:string, value:V) -function M.foreach(t, fn) +---@param opts? {case_sensitive?:boolean} +function M.foreach(t, fn, opts) ---@type string[] local keys = vim.tbl_keys(t) pcall(table.sort, keys, function(a, b) + if opts and opts.case_sensitive then + return a < b + end return a:lower() < b:lower() end) for _, key in ipairs(keys) do From 6b55e4695a5e85d862e517bf860bd913a4a45d86 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 28 Sep 2023 10:28:53 +0000 Subject: [PATCH 1053/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a691894..b406615 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 September 27 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 September 28 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From f3c7169dd65f5ae528b6c930492359971014290b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 29 Sep 2023 16:11:56 +0200 Subject: [PATCH 1054/1610] feat(plugin): dont include plugin spec fragments for disabled or optional plugins (#1058) * feat(plugin): dont include plugin spec fragments for disabled or optional plugins * test: fixed tests * fix(plugin): calculate handlers after disabling plugins * fix(plugin): clear Plugin._.super when rebuilding * fix(ui): dont process handlers for disabled plugins * test: added tests for disabling fragments * fix(plugin): ignore any installed deps of a disabled conditional plugin. Fixes #1053 --- lua/lazy/core/plugin.lua | 190 +++++++++++++++++++++++-------------- lua/lazy/types.lua | 7 +- lua/lazy/view/render.lua | 14 +-- tests/core/plugin_spec.lua | 50 +++++++++- 4 files changed, 181 insertions(+), 80 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f141d27..00039ef 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -8,22 +8,30 @@ M.loading = false ---@class LazySpecLoader ---@field plugins table<string, LazyPlugin> +---@field fragments table<number, LazyPlugin> ---@field disabled table<string, LazyPlugin> +---@field dirty table<string, true> +---@field ignore_installed table<string, true> ---@field modules string[] ---@field notifs {msg:string, level:number, file?:string}[] ---@field importing? string ---@field optional? boolean local Spec = {} M.Spec = Spec +M.last_fid = 0 +M.fid_stack = {} ---@type number[] ---@param spec? LazySpec ---@param opts? {optional?:boolean} function Spec.new(spec, opts) local self = setmetatable({}, { __index = Spec }) self.plugins = {} + self.fragments = {} self.disabled = {} self.modules = {} + self.dirty = {} self.notifs = {} + self.ignore_installed = {} self.optional = opts and opts.optional if spec then self:parse(spec) @@ -33,6 +41,7 @@ end function Spec:parse(spec) self:normalize(spec) + self:fix_disabled() -- calculate handlers for _, plugin in pairs(self.plugins) do @@ -42,8 +51,6 @@ function Spec:parse(spec) end end end - - self:fix_disabled() end -- PERF: optimized code to get package name without using lua patterns @@ -56,8 +63,7 @@ end ---@param plugin LazyPlugin ---@param results? string[] ----@param is_dep? boolean -function Spec:add(plugin, results, is_dep) +function Spec:add(plugin, results) -- check if we already processed this spec. Can happen when a user uses the same instance of a spec in multiple specs -- see https://github.com/folke/lazy.nvim/issues/45 if rawget(plugin, "_") then @@ -124,10 +130,28 @@ function Spec:add(plugin, results, is_dep) plugin.config = nil end - plugin._ = {} - plugin._.dep = is_dep + local fpid = M.fid_stack[#M.fid_stack] + + M.last_fid = M.last_fid + 1 + plugin._ = { + fid = M.last_fid, + fpid = fpid, + dep = fpid ~= nil, + } + self.fragments[plugin._.fid] = plugin + + if fpid then + local parent = self.fragments[fpid] + parent._.fdeps = parent._.fdeps or {} + table.insert(parent._.fdeps, plugin._.fid) + end + + if plugin.dependencies then + table.insert(M.fid_stack, plugin._.fid) + plugin.dependencies = self:normalize(plugin.dependencies, {}) + table.remove(M.fid_stack) + end - plugin.dependencies = plugin.dependencies and self:normalize(plugin.dependencies, {}, true) or nil if self.plugins[plugin.name] then plugin = self:merge(self.plugins[plugin.name], plugin) end @@ -146,27 +170,73 @@ function Spec:warn(msg) self:log(msg, vim.log.levels.WARN) end ----@param gathered_deps string[] ----@param dep_of table<string,string[]> ----@param on_disable fun(string):nil -function Spec:fix_dependencies(gathered_deps, dep_of, on_disable) - local function should_disable(dep_name) - for _, parent in ipairs(dep_of[dep_name] or {}) do - if self.plugins[parent] then - return false - end - end - return true +--- Rebuilds a plugin spec excluding any removed fragments +---@param name string +function Spec:rebuild(name) + local plugin = self.plugins[name] + if not plugin then + return end - for _, dep_name in ipairs(gathered_deps) do - -- only check if the plugin is still enabled and it is a dep - if self.plugins[dep_name] and self.plugins[dep_name]._.dep then - -- check if the dep is still used by another plugin - if should_disable(dep_name) then - -- disable the dep when no longer needed - on_disable(dep_name) + local fragments = {} ---@type LazyPlugin[] + + repeat + local super = plugin._.super + if self.fragments[plugin._.fid] then + plugin._.dep = plugin._.fpid ~= nil + plugin._.super = nil + if plugin._.fdeps then + plugin.dependencies = {} + for _, cid in ipairs(plugin._.fdeps) do + if self.fragments[cid] then + table.insert(plugin.dependencies, self.fragments[cid].name) + end + end end + setmetatable(plugin, nil) + table.insert(fragments, 1, plugin) + end + plugin = super + until not plugin + + if #fragments == 0 then + self.plugins[name] = nil + return + end + + plugin = fragments[1] + for i = 2, #fragments do + plugin = self:merge(plugin, fragments[i]) + end + self.plugins[name] = plugin +end + +--- Recursively removes all fragments from a plugin spec or a given fragment +---@param id string|number Plugin name or fragment id +---@param opts {self: boolean} +function Spec:remove_fragments(id, opts) + local fids = {} ---@type number[] + + if type(id) == "number" then + fids[1] = id + else + local plugin = self.plugins[id] + repeat + fids[#fids + 1] = plugin._.fid + plugin = plugin._.super + until not plugin + end + + for _, fid in ipairs(fids) do + local fragment = self.fragments[fid] + if fragment then + for _, cid in ipairs(fragment._.fdeps or {}) do + self:remove_fragments(cid, { self = true }) + end + if opts.self then + self.fragments[fid] = nil + end + self.dirty[fragment.name] = true end end end @@ -179,14 +249,20 @@ function Spec:fix_cond() end if cond == false or (type(cond) == "function" and not cond(plugin)) then plugin._.cond = false + local stack = { plugin } + while #stack > 0 do + local p = table.remove(stack) + for _, dep in ipairs(p.dependencies or {}) do + table.insert(stack, self.plugins[dep]) + end + self.ignore_installed[p.name] = true + end plugin.enabled = false end end end ----@return string[] function Spec:fix_optional() - local all_optional_deps = {} if not self.optional then ---@param plugin LazyPlugin local function all_optional(plugin) @@ -196,14 +272,12 @@ function Spec:fix_optional() -- handle optional plugins for _, plugin in pairs(self.plugins) do if plugin.optional and all_optional(plugin) then + -- remove all optional fragments + self:remove_fragments(plugin.name, { self = true }) self.plugins[plugin.name] = nil - if plugin.dependencies then - vim.list_extend(all_optional_deps, plugin.dependencies) - end end end end - return all_optional_deps end function Spec:fix_disabled() @@ -214,44 +288,24 @@ function Spec:fix_disabled() end end - ---@type table<string,string[]> plugin to parent plugin - local dep_of = {} - - ---@type string[] dependencies of disabled plugins - local disabled_deps = {} - - ---@type string[] dependencies of plugins that are completely optional - local all_optional_deps = self:fix_optional() + self:fix_optional() self:fix_cond() for _, plugin in pairs(self.plugins) do - local enabled = not (plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled())) - if enabled then - for _, dep in ipairs(plugin.dependencies or {}) do - dep_of[dep] = dep_of[dep] or {} - table.insert(dep_of[dep], plugin.name) - end - else + local disabled = plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled()) + if disabled then plugin._.kind = "disabled" + -- remove all child fragments + self:remove_fragments(plugin.name, { self = false }) self.plugins[plugin.name] = nil self.disabled[plugin.name] = plugin - if plugin.dependencies then - vim.list_extend(disabled_deps, plugin.dependencies) - end end end - -- fix deps of plugins that are completely optional - self:fix_dependencies(all_optional_deps, dep_of, function(dep_name) - self.plugins[dep_name] = nil - end) - -- fix deps of disabled plugins - self:fix_dependencies(disabled_deps, dep_of, function(dep_name) - local plugin = self.plugins[dep_name] - plugin._.kind = "disabled" - self.plugins[plugin.name] = nil - self.disabled[plugin.name] = plugin - end) + -- rebuild any plugin specs that were modified + for name, _ in pairs(self.dirty) do + self:rebuild(name) + end end ---@param msg string @@ -272,24 +326,24 @@ end ---@param spec LazySpec|LazySpecImport ---@param results? string[] ---@param is_dep? boolean -function Spec:normalize(spec, results, is_dep) +function Spec:normalize(spec, results) if type(spec) == "string" then - if is_dep and not spec:find("/", 1, true) then + if not spec:find("/", 1, true) then -- spec is a plugin name if results then table.insert(results, spec) end else - self:add({ spec }, results, is_dep) + self:add({ spec }, results) end elseif #spec > 1 or Util.is_list(spec) then ---@cast spec LazySpec[] for _, s in ipairs(spec) do - self:normalize(s, results, is_dep) + self:normalize(s, results) end elseif spec[1] or spec.dir or spec.url then ---@cast spec LazyPlugin - local plugin = self:add(spec, results, is_dep) + local plugin = self:add(spec, results) ---@diagnostic disable-next-line: cast-type-mismatch ---@cast plugin LazySpecImport if plugin and plugin.import then @@ -425,10 +479,8 @@ function M.update_state() end end - for _, plugin in pairs(Config.spec.disabled) do - if plugin._.cond == false then - installed[plugin.name] = nil - end + for name in pairs(Config.spec.ignore_installed) do + installed[name] = nil end Config.to_clean = {} diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index df8c19d..0fa9202 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -2,12 +2,15 @@ ---@alias LazyPluginKind "normal"|"clean"|"disabled" ---@class LazyPluginState +---@field fid number id of the plugin spec fragment +---@field fpid? number parent id of the plugin spec fragment +---@field fdeps? number[] children ids of the fragment ---@field loaded? {[string]:string}|{time:number} ----@field installed boolean +---@field installed? boolean ---@field tasks? LazyTask[] ---@field dirty? boolean ---@field updated? {from:string, to:string} ----@field is_local boolean +---@field is_local? boolean ---@field updates? {from:GitInfo, to:GitInfo} ---@field cloned? boolean ---@field kind? LazyPluginKind diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 442e769..5b1f9af 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -411,13 +411,15 @@ function M:plugin(plugin) else self:append(" ") local reason = {} - for handler in pairs(Handler.types) do - if plugin[handler] then - local trigger = {} - for _, value in ipairs(plugin[handler]) do - table.insert(trigger, type(value) == "table" and value[1] or value) + if plugin._.kind ~= "disabled" then + for handler in pairs(Handler.types) do + if plugin[handler] then + local trigger = {} + for _, value in ipairs(plugin[handler]) do + table.insert(trigger, type(value) == "table" and value[1] or value) + end + reason[handler] = table.concat(trigger, " ") end - reason[handler] = table.concat(trigger, " ") end end for _, other in pairs(Config.plugins) do diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index f64cb4c..15eb060 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -1,11 +1,25 @@ local Config = require("lazy.core.config") local Plugin = require("lazy.core.plugin") -local Loader = require("lazy.core.loader") local assert = require("luassert") Config.setup() +---@param plugins LazyPlugin[]|LazyPlugin +local function clean(plugins) + local p = plugins + plugins = type(plugins) == "table" and plugins or { plugins } + for _, plugin in pairs(plugins) do + plugin._.fid = nil + plugin._.fpid = nil + plugin._.fdeps = nil + if plugin._.dep == false then + plugin._.dep = nil + end + end + return p +end + describe("plugin spec url/name", function() local tests = { { { dir = "~/foo" }, { name = "foo", dir = vim.fn.fnamemodify("~/foo", ":p") } }, @@ -28,6 +42,7 @@ describe("plugin spec url/name", function() end local spec = Plugin.Spec.new(test[1]) local plugins = vim.tbl_values(spec.plugins) + plugins[1]._ = {} assert(#spec.notifs == 0) assert.equal(1, #plugins) assert.same(test[2], plugins[1]) @@ -61,7 +76,7 @@ describe("plugin spec opt", function() for _, plugin in pairs(spec.plugins) do plugin.dir = nil end - assert.same(spec.plugins, { + assert.same(clean(spec.plugins), { bar = { "foo/bar", _ = {}, @@ -105,7 +120,7 @@ describe("plugin spec opt", function() for _, plugin in pairs(spec.plugins) do plugin.dir = nil end - assert.same(spec.plugins, { + assert.same(clean(spec.plugins), { bar = { "foo/bar", _ = {}, @@ -335,3 +350,32 @@ describe("plugin opts", function() end end) end) + +describe("plugin spec", function() + it("only includes fragments from enabled plugins", function() + local tests = { + { + spec = { + { "foo/disabled", enabled = false, dependencies = { "foo/bar", opts = { key_disabled = true } } }, + { "foo/disabled", dependencies = { "foo/bar", opts = { key_disabled_two = true } } }, + { "foo/conditional", cond = false, dependencies = { "foo/bar", opts = { key_cond = true } } }, + { "foo/optional", optional = true, dependencies = { "foo/bar", opts = { key_optional = true } } }, + { "foo/active", dependencies = { "foo/bar", opts = { key_active = true } } }, + { + "foo/bar", + opts = { key = true }, + }, + }, + expected_opts = { key = true, key_active = true }, + }, -- for now, one test... + } + for _, test in ipairs(tests) do + local spec = Plugin.Spec.new(test.spec) + assert(#spec.notifs == 0) + assert(vim.tbl_count(spec.plugins) == 2) + assert(spec.plugins.active) + assert(spec.plugins.bar) + assert.same(test.expected_opts, Plugin.values(spec.plugins.bar, "opts")) + end + end) +end) From 7bf6a274582b01150c71453a9c007be22e315e62 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 29 Sep 2023 14:12:39 +0000 Subject: [PATCH 1055/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b406615..2f1cb7f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 September 28 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 September 29 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 753c391b44daadafb0e821d4a4dfd72c4fac6f43 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 29 Sep 2023 16:14:01 +0200 Subject: [PATCH 1056/1610] chore(main): release 10.4.0 (#1054) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0cefce..045befb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [10.4.0](https://github.com/folke/lazy.nvim/compare/v10.3.1...v10.4.0) (2023-09-29) + + +### Features + +* **plugin:** dont include plugin spec fragments for disabled or optional plugins ([#1058](https://github.com/folke/lazy.nvim/issues/1058)) ([f3c7169](https://github.com/folke/lazy.nvim/commit/f3c7169dd65f5ae528b6c930492359971014290b)) + + +### Bug Fixes + +* **help:** sort readme tags case sensitive. Fixes [#67](https://github.com/folke/lazy.nvim/issues/67) ([54ecfc7](https://github.com/folke/lazy.nvim/commit/54ecfc7c245e5e3fbbc749658ad171335418d48c)) +* **ui:** sort plugins case insensitive ([4f27fc3](https://github.com/folke/lazy.nvim/commit/4f27fc33c4e0e81802f4afadbe350de93447ac1e)) + ## [10.3.1](https://github.com/folke/lazy.nvim/compare/v10.3.0...v10.3.1) (2023-09-27) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index d0499fb..99b1766 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.3.1" -- x-release-please-version +M.version = "10.4.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 6a2c47e6424a3f1e373bfeb714b716f6be13501c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 29 Sep 2023 16:37:53 +0200 Subject: [PATCH 1057/1610] style: lua annotations --- lua/lazy/core/plugin.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 00039ef..b418759 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -325,7 +325,6 @@ end ---@param spec LazySpec|LazySpecImport ---@param results? string[] ----@param is_dep? boolean function Spec:normalize(spec, results) if type(spec) == "string" then if not spec:find("/", 1, true) then From 09e5010741e340eb603afbff34453dbee55b7011 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 30 Sep 2023 18:02:07 +0200 Subject: [PATCH 1058/1610] fix(plugin): prevent recursive loop with cond=false. Fixes #1061 --- lua/lazy/core/plugin.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index b418759..d0a2f0b 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -252,10 +252,12 @@ function Spec:fix_cond() local stack = { plugin } while #stack > 0 do local p = table.remove(stack) - for _, dep in ipairs(p.dependencies or {}) do - table.insert(stack, self.plugins[dep]) + if not self.ignore_installed[p.name] then + for _, dep in ipairs(p.dependencies or {}) do + table.insert(stack, self.plugins[dep]) + end + self.ignore_installed[p.name] = true end - self.ignore_installed[p.name] = true end plugin.enabled = false end From 1605df75ad3d1d4a4cd272177270c9adaa876855 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:02:55 +0000 Subject: [PATCH 1059/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 2f1cb7f..d8420db 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 September 29 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 September 30 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 59335c5b9d116f5d3948f833288a89e2a829a005 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 30 Sep 2023 18:08:27 +0200 Subject: [PATCH 1060/1610] chore(main): release 10.4.1 (#1062) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 045befb..f2c5854 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.4.1](https://github.com/folke/lazy.nvim/compare/v10.4.0...v10.4.1) (2023-09-30) + + +### Bug Fixes + +* **plugin:** prevent recursive loop with cond=false. Fixes [#1061](https://github.com/folke/lazy.nvim/issues/1061) ([09e5010](https://github.com/folke/lazy.nvim/commit/09e5010741e340eb603afbff34453dbee55b7011)) + ## [10.4.0](https://github.com/folke/lazy.nvim/compare/v10.3.1...v10.4.0) (2023-09-29) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 99b1766..3c8261d 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.4.0" -- x-release-please-version +M.version = "10.4.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 8b73492249100d8a9ce9d874f7ea5a71b4d6f07e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Oct 2023 00:19:29 +0200 Subject: [PATCH 1061/1610] perf(util): don't try to load nvim-treesitter when markdown parser is builtin --- lua/lazy/core/util.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 3e0042e..d1d6bec 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -315,7 +315,12 @@ function M.notify(msg, opts) local lang = opts.lang or "markdown" vim.notify(msg, opts.level or vim.log.levels.INFO, { on_open = function(win) - pcall(require, "nvim-treesitter") + local ok = pcall(function() + vim.treesitter.language.add("markdown") + end) + if not ok then + pcall(require, "nvim-treesitter") + end vim.wo[win].conceallevel = 3 vim.wo[win].concealcursor = "" vim.wo[win].spell = false From 8eb8de29af6e2ab9dd7986e2521178875dbcad95 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Oct 2023 00:20:08 +0200 Subject: [PATCH 1062/1610] feat(plugin): keep track of the module a spec fragment was defined in --- lua/lazy/core/plugin.lua | 1 + lua/lazy/types.lua | 1 + 2 files changed, 2 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index d0a2f0b..4255366 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -137,6 +137,7 @@ function Spec:add(plugin, results) fid = M.last_fid, fpid = fpid, dep = fpid ~= nil, + module = self.importing, } self.fragments[plugin._.fid] = plugin diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 0fa9202..e9c5fbb 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -17,6 +17,7 @@ ---@field dep? boolean True if this plugin is only in the spec as a dependency ---@field cond? boolean ---@field super? LazyPlugin +---@field module? string ---@alias PluginOpts table|fun(self:LazyPlugin, opts:table):table? From f4ed421453fd0804239821bca8135f87a99c9c47 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 3 Oct 2023 22:20:59 +0000 Subject: [PATCH 1063/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d8420db..e878673 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 September 30 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 03 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 28a80136b5253a8de6dea87f335919ac9f67116d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 00:30:12 +0200 Subject: [PATCH 1064/1610] chore(main): release 10.5.0 (#1069) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2c5854..cd7c0c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [10.5.0](https://github.com/folke/lazy.nvim/compare/v10.4.1...v10.5.0) (2023-10-03) + + +### Features + +* **plugin:** keep track of the module a spec fragment was defined in ([8eb8de2](https://github.com/folke/lazy.nvim/commit/8eb8de29af6e2ab9dd7986e2521178875dbcad95)) + + +### Performance Improvements + +* **util:** don't try to load nvim-treesitter when markdown parser is builtin ([8b73492](https://github.com/folke/lazy.nvim/commit/8b73492249100d8a9ce9d874f7ea5a71b4d6f07e)) + ## [10.4.1](https://github.com/folke/lazy.nvim/compare/v10.4.0...v10.4.1) (2023-09-30) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 3c8261d..549b5a1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.4.1" -- x-release-please-version +M.version = "10.5.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 638c8e6382f121aef983c78d865f6dbbc72d68c3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Oct 2023 11:48:14 +0200 Subject: [PATCH 1065/1610] fix(plugin): rebuild plugins after fixing optional and cond to ensure enabled will work correctly --- lua/lazy/core/plugin.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 4255366..0517aa3 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -292,7 +292,12 @@ function Spec:fix_disabled() end self:fix_optional() + -- rebuild any plugin specs that were modified + for name, _ in pairs(self.dirty) do + self:rebuild(name) + end self:fix_cond() + self.dirty = {} for _, plugin in pairs(self.plugins) do local disabled = plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled()) From d8453bc1379c3baa40514c8510046e9ffd93affd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 09:49:03 +0000 Subject: [PATCH 1066/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e878673..c85ef68 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 03 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 04 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 82da5a004867be2cc96c345430d9381f991cf2e6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Oct 2023 12:50:46 +0200 Subject: [PATCH 1067/1610] refactor(plugin): refactored rebuild --- lua/lazy/core/plugin.lua | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 0517aa3..95a21ec 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -172,8 +172,14 @@ function Spec:warn(msg) end --- Rebuilds a plugin spec excluding any removed fragments ----@param name string +---@param name? string function Spec:rebuild(name) + if not name then + for n, _ in pairs(self.dirty) do + self:rebuild(n) + end + self.dirty = {} + end local plugin = self.plugins[name] if not plugin then return @@ -292,11 +298,11 @@ function Spec:fix_disabled() end self:fix_optional() - -- rebuild any plugin specs that were modified - for name, _ in pairs(self.dirty) do - self:rebuild(name) - end + self:rebuild() + self:fix_cond() + self:rebuild() + self.dirty = {} for _, plugin in pairs(self.plugins) do @@ -311,9 +317,7 @@ function Spec:fix_disabled() end -- rebuild any plugin specs that were modified - for name, _ in pairs(self.dirty) do - self:rebuild(name) - end + self:rebuild() end ---@param msg string From 64cb9b16f6d4f1c395de4ec672d9d79fffb5c3b4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 21:15:11 +0200 Subject: [PATCH 1068/1610] chore(main): release 10.5.1 (#1071) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd7c0c7..6f4cff6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.5.1](https://github.com/folke/lazy.nvim/compare/v10.5.0...v10.5.1) (2023-10-04) + + +### Bug Fixes + +* **plugin:** rebuild plugins after fixing optional and cond to ensure enabled will work correctly ([638c8e6](https://github.com/folke/lazy.nvim/commit/638c8e6382f121aef983c78d865f6dbbc72d68c3)) + ## [10.5.0](https://github.com/folke/lazy.nvim/compare/v10.4.1...v10.5.0) (2023-10-03) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 549b5a1..0ee4d74 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.5.0" -- x-release-please-version +M.version = "10.5.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 19d1b3aa72790cab245e52af8438a4686a364b44 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 4 Oct 2023 21:43:14 +0200 Subject: [PATCH 1069/1610] style: lua annotations --- lua/lazy/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 226069b..a2e0940 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -1,4 +1,4 @@ ----@type LazyCommands +---@class Lazy: LazyCommands local M = {} M._start = 0 From c42e63c1986af6ba417d9c2a0062ac41f79df18b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 5 Oct 2023 14:00:08 +0200 Subject: [PATCH 1070/1610] feat(keys): you can now create buffer-local filetype keymaps by specifying `ft=`. Fixes #1076 --- README.md | 1 + lua/lazy/core/handler/keys.lua | 72 ++++++++++++++++++++++++---------- 2 files changed, 52 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 0f25814..fb1a377 100644 --- a/README.md +++ b/README.md @@ -147,6 +147,7 @@ can be a `LazyKeys` 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. diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index cdf2243..5db4f0f 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -9,6 +9,7 @@ local Loader = require("lazy.core.loader") ---@field noremap? boolean ---@field remap? boolean ---@field expr? boolean +---@field ft? string|string[] ---@field id string ---@class LazyKeysHandler:LazyHandler @@ -53,7 +54,7 @@ end function M.opts(keys) local opts = {} for k, v in pairs(keys) do - if type(k) ~= "number" and k ~= "mode" and k ~= "id" then + if type(k) ~= "number" and k ~= "mode" and k ~= "id" and k ~= "ft" then opts[k] = v end end @@ -64,33 +65,62 @@ end function M:_add(keys) local lhs = keys[1] local opts = M.opts(keys) - vim.keymap.set(keys.mode, lhs, function() - local plugins = self.active[keys.id] - -- always delete the mapping immediately to prevent recursive mappings - self:_del(keys) - self.active[keys.id] = nil + ---@param buf? number + local function add(buf) + vim.keymap.set(keys.mode, lhs, function() + local plugins = self.active[keys.id] - Util.track({ keys = lhs }) - Loader.load(plugins, { keys = lhs }) - Util.track() + -- always delete the mapping immediately to prevent recursive mappings + self:_del(keys, buf) + self.active[keys.id] = nil - local feed = vim.api.nvim_replace_termcodes("<Ignore>" .. lhs, true, true, true) - -- insert instead of append the lhs - vim.api.nvim_feedkeys(feed, "i", false) - end, { - desc = opts.desc, - nowait = opts.nowait, - -- we do not return anything, but this is still needed to make operator pending mappings work - expr = true, - }) + if plugins then + Util.track({ keys = lhs }) + Loader.load(plugins, { keys = lhs }) + Util.track() + end + + local feed = vim.api.nvim_replace_termcodes("<Ignore>" .. lhs, true, true, true) + -- insert instead of append the lhs + vim.api.nvim_feedkeys(feed, "i", false) + end, { + desc = opts.desc, + nowait = opts.nowait, + -- we do not return anything, but this is still needed to make operator pending mappings work + expr = true, + buffer = buf, + }) + end + + if keys.ft then + vim.api.nvim_create_autocmd("FileType", { + pattern = keys.ft, + callback = function(event) + if self.active[keys.id] then + add(event.buf) + else + -- Only create the mapping if its managed by lazy + -- otherwise the plugin is supposed to manage it + if keys[2] then + self:_del(keys, event.buf) + end + end + end, + }) + else + add() + end end ---@param keys LazyKeys -function M:_del(keys) - pcall(vim.keymap.del, keys.mode, keys[1]) +---@param buf number? +function M:_del(keys, buf) + pcall(vim.keymap.del, keys.mode, keys[1], { buffer = buf }) if keys[2] then - vim.keymap.set(keys.mode, keys[1], keys[2], M.opts(keys)) + local opts = M.opts(keys) + opts.buffer = buf + vim.keymap.set(keys.mode, keys[1], keys[2], opts) end end From d9509b56cee2d3f8bcb43b6912a48bf3899f580b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 12:01:02 +0000 Subject: [PATCH 1071/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c85ef68..9ab1ff0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 04 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 05 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -251,6 +251,7 @@ mappings, or it can be a `LazyKeys` 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. From 6b6f0a451200bb6abde85978c577c73ea1577758 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 16:05:05 +0200 Subject: [PATCH 1072/1610] chore(main): release 10.6.0 (#1078) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f4cff6..9863843 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.6.0](https://github.com/folke/lazy.nvim/compare/v10.5.1...v10.6.0) (2023-10-05) + + +### Features + +* **keys:** you can now create buffer-local filetype keymaps by specifying `ft=`. Fixes [#1076](https://github.com/folke/lazy.nvim/issues/1076) ([c42e63c](https://github.com/folke/lazy.nvim/commit/c42e63c1986af6ba417d9c2a0062ac41f79df18b)) + ## [10.5.1](https://github.com/folke/lazy.nvim/compare/v10.5.0...v10.5.1) (2023-10-04) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 0ee4d74..0600a49 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.5.1" -- x-release-please-version +M.version = "10.6.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From ef2a5d0bd1a4995539b93be69fc760be7d9f62be Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 6 Oct 2023 15:39:18 +0200 Subject: [PATCH 1073/1610] fix(event): better dealing with even handlers. Fixes #788 --- lua/lazy/core/handler/event.lua | 78 +++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 0e26c68..050c3f6 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -7,10 +7,6 @@ local Loader = require("lazy.core.loader") ---@field group number local M = {} -M.trigger_events = { - BufRead = { "BufReadPre", "BufRead" }, - BufReadPost = { "BufReadPre", "BufRead", "BufReadPost" }, -} M.group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) ---@param value string @@ -28,11 +24,17 @@ function M:_add(value) return end Util.track({ [self.type] = value }) - local groups = M.get_augroups(event, pattern) + local groups = M.get_augroups(ev.event, pattern) -- load the plugins Loader.load(self.active[value], { [self.type] = value }) -- check if any plugin created an event handler for this event and fire the group - self:trigger(event, pattern, groups, ev.data) + M.trigger({ + event = ev.event, + pattern = pattern, + exclude = groups, + data = ev.data, + buf = ev.buf, + }) Util.track() end, }) @@ -40,47 +42,55 @@ end ---@param value string function M:_event(value) - return value == "VeryLazy" and "User VeryLazy" or value + if value == "VeryLazy" then + return "User VeryLazy" + elseif value == "BufRead" then + return "BufReadPost" + end + return value end -- Get all augroups for the events ---@param event string ---@param pattern? string function M.get_augroups(event, pattern) - local events = M.trigger_events[event] or { event } - ---@type table<string,true> - local groups = {} - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events, pattern = pattern })) do + local groups = {} ---@type number[] + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = event, pattern = pattern })) do if autocmd.group then - groups[autocmd.group] = true + table.insert(groups, autocmd.group) end end return groups end ----@param event string|string[] ----@param pattern? string ----@param groups table<string,true> -function M:trigger(event, pattern, groups, data) - local events = M.trigger_events[event] or { event } - ---@cast events string[] - for _, e in ipairs(events) do - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = e, pattern = pattern })) do - if autocmd.event == e and autocmd.group and not groups[autocmd.group] then - if Config.options.debug then - Util.info({ - "# Firing Events", - " - **group:** `" .. autocmd.group_name .. "`", - " - **event:** " .. autocmd.event, - pattern and (" - **pattern:** " .. pattern), - }) - end - Util.track({ event = autocmd.group_name }) - Util.try(function() - vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false, data = data }) - Util.track() - end) +---@param opts {event:string, pattern?:string, exclude?:string[], data?:any, buf?:number} +function M.trigger(opts) + local done = {} ---@type table<string,true> + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = opts.event, pattern = opts.pattern })) do + local id = autocmd.event .. ":" .. (autocmd.group or "") ---@type string + local skip = done[id] or (opts.exclude and vim.list_contains(opts.exclude, autocmd.group)) + done[id] = true + if autocmd.group and not skip then + if Config.options.debug then + Util.info({ + "# Firing Events", + " - **group:** `" .. autocmd.group_name .. "`", + " - **event:** " .. autocmd.event, + opts.pattern and (" - **pattern:** " .. opts.pattern), + opts.buf and (" - **buf:** " .. opts.buf), + }) end + Util.track({ event = autocmd.group_name }) + Util.try(function() + vim.api.nvim_exec_autocmds(autocmd.event, { + -- pattern = opts.pattern, + buffer = opts.buf, + group = autocmd.group, + modeline = false, + data = opts.data, + }) + Util.track() + end) end end end From acda8d29ca6f1aedada0b92b77722384d605275b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 13:41:21 +0000 Subject: [PATCH 1074/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9ab1ff0..c4a57f0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 05 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 58e954a735767fd23c24c455dc09c5323951ec83 Mon Sep 17 00:00:00 2001 From: abeldekat <58370433+abeldekat@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:46:46 +0200 Subject: [PATCH 1075/1610] feat(plugin): added support for `cond` for imports (#1079) Co-authored-by: abeldekat <abel@nomail.com> --- lua/lazy/core/plugin.lua | 3 +++ lua/lazy/types.lua | 1 + 2 files changed, 4 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 95a21ec..12ba1a8 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -380,6 +380,9 @@ function Spec:import(spec) if vim.tbl_contains(self.modules, spec.import) then return end + if spec.cond == false or (type(spec.cond) == "function" and not spec.cond()) then + return + end if spec.enabled == false or (type(spec.enabled) == "function" and not spec.enabled()) then return end diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index e9c5fbb..30363b6 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -75,3 +75,4 @@ ---@class LazySpecImport ---@field import string spec module to import ---@field enabled? boolean|(fun():boolean) +---@field cond? boolean|(fun():boolean) From 2b2adb9d4d6ccd469b1e82416c58ea74fe5a0e1b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 6 Oct 2023 15:48:41 +0200 Subject: [PATCH 1076/1610] fix(event): use tbl_contains instead of list_contains --- lua/lazy/core/handler/event.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 050c3f6..62d3ea3 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -68,7 +68,7 @@ function M.trigger(opts) local done = {} ---@type table<string,true> for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = opts.event, pattern = opts.pattern })) do local id = autocmd.event .. ":" .. (autocmd.group or "") ---@type string - local skip = done[id] or (opts.exclude and vim.list_contains(opts.exclude, autocmd.group)) + local skip = done[id] or (opts.exclude and vim.tbl_contains(opts.exclude, autocmd.group)) done[id] = true if autocmd.group and not skip then if Config.options.debug then From 25f6009087cc2bb85aedf4425c23f35c03e60b02 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:53:37 +0200 Subject: [PATCH 1077/1610] chore(main): release 10.7.0 (#1081) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9863843..b595e0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [10.7.0](https://github.com/folke/lazy.nvim/compare/v10.6.0...v10.7.0) (2023-10-06) + + +### Features + +* **plugin:** added support for `cond` for imports ([#1079](https://github.com/folke/lazy.nvim/issues/1079)) ([58e954a](https://github.com/folke/lazy.nvim/commit/58e954a735767fd23c24c455dc09c5323951ec83)) + + +### Bug Fixes + +* **event:** better dealing with even handlers. Fixes [#788](https://github.com/folke/lazy.nvim/issues/788) ([ef2a5d0](https://github.com/folke/lazy.nvim/commit/ef2a5d0bd1a4995539b93be69fc760be7d9f62be)) +* **event:** use tbl_contains instead of list_contains ([2b2adb9](https://github.com/folke/lazy.nvim/commit/2b2adb9d4d6ccd469b1e82416c58ea74fe5a0e1b)) + ## [10.6.0](https://github.com/folke/lazy.nvim/compare/v10.5.1...v10.6.0) (2023-10-05) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 0600a49..922bc6f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.6.0" -- x-release-please-version +M.version = "10.7.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 6b37927be9e0166ddb4445023904345d88045497 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 6 Oct 2023 19:42:19 +0200 Subject: [PATCH 1078/1610] fix(event): prevent loading event handler more than once in some cases --- lua/lazy/core/handler/event.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 62d3ea3..8b40d9a 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -15,14 +15,16 @@ function M:_add(value) ---@type string?, string? local event, pattern = event_spec:match("^(%w+)%s+(.*)$") event = event or event_spec + local done = false vim.api.nvim_create_autocmd(event, { group = self.group, once = true, pattern = pattern, callback = function(ev) - if not self.active[value] then + if done or not self.active[value] then return end + done = true Util.track({ [self.type] = value }) local groups = M.get_augroups(ev.event, pattern) -- load the plugins From 6687afae42b72fb660bfae2bd0eb98e77156829b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 20:22:13 +0200 Subject: [PATCH 1079/1610] chore(main): release 10.7.1 (#1083) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b595e0c..bdeccb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.7.1](https://github.com/folke/lazy.nvim/compare/v10.7.0...v10.7.1) (2023-10-06) + + +### Bug Fixes + +* **event:** prevent loading event handler more than once in some cases ([6b37927](https://github.com/folke/lazy.nvim/commit/6b37927be9e0166ddb4445023904345d88045497)) + ## [10.7.0](https://github.com/folke/lazy.nvim/compare/v10.6.0...v10.7.0) (2023-10-06) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 922bc6f..42bc512 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.7.0" -- x-release-please-version +M.version = "10.7.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From e4ea874e33fd3116d0e113f4b03eff2d6b1e3399 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Oct 2023 09:48:53 +0200 Subject: [PATCH 1080/1610] fix(ft): fix ft handlers to properly use new events. Fixes #1084 --- lua/lazy/core/handler/event.lua | 24 ++++++++++++++++++------ lua/lazy/core/handler/ft.lua | 30 +++++++++++++++--------------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 8b40d9a..ee0b1e4 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -2,6 +2,13 @@ local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") +---@class LazyEventOpts +---@field event string +---@field pattern? string +---@field exclude? string[] +---@field data? any +---@field buf? number} + ---@class LazyEventHandler:LazyHandler ---@field events table<string,true> ---@field group number @@ -30,7 +37,7 @@ function M:_add(value) -- load the plugins Loader.load(self.active[value], { [self.type] = value }) -- check if any plugin created an event handler for this event and fire the group - M.trigger({ + self:_trigger({ event = ev.event, pattern = pattern, exclude = groups, @@ -56,21 +63,26 @@ end ---@param event string ---@param pattern? string function M.get_augroups(event, pattern) - local groups = {} ---@type number[] + local groups = {} ---@type string[] for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = event, pattern = pattern })) do - if autocmd.group then - table.insert(groups, autocmd.group) + if autocmd.group_name then + table.insert(groups, autocmd.group_name) end end return groups end ----@param opts {event:string, pattern?:string, exclude?:string[], data?:any, buf?:number} +---@param opts LazyEventOpts +function M:_trigger(opts) + M.trigger(opts) +end + +---@param opts LazyEventOpts function M.trigger(opts) local done = {} ---@type table<string,true> for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = opts.event, pattern = opts.pattern })) do local id = autocmd.event .. ":" .. (autocmd.group or "") ---@type string - local skip = done[id] or (opts.exclude and vim.tbl_contains(opts.exclude, autocmd.group)) + local skip = done[id] or (opts.exclude and vim.tbl_contains(opts.exclude, autocmd.group_name)) done[id] = true if autocmd.group and not skip then if Config.options.debug then diff --git a/lua/lazy/core/handler/ft.lua b/lua/lazy/core/handler/ft.lua index 66fd13a..25739ce 100644 --- a/lua/lazy/core/handler/ft.lua +++ b/lua/lazy/core/handler/ft.lua @@ -20,21 +20,21 @@ function M:add(plugin) end end ----@param pattern? string -function M:trigger(_, pattern, _) - for _, group in ipairs({ "filetypeplugin", "filetypeindent" }) do - Util.try(function() - if Config.options.debug then - Util.info({ - "# Firing Events", - " - **group:** `" .. group .. "`", - " - **event:** FileType", - pattern and (" - **pattern:** " .. pattern), - }) - end - vim.api.nvim_exec_autocmds("FileType", { group = group, modeline = false, pattern = pattern }) - end) - end +---@param opts LazyEventOpts +function M:_trigger(opts) + Util.try(function() + if Config.options.debug then + Util.info({ + "# Firing Events", + " - **event:** FileType", + opts.pattern and (" - **pattern:** " .. opts.pattern), + opts.buf and (" - **buf:** " .. opts.buf), + }) + end + Util.track({ event = "FileType" }) + vim.api.nvim_exec_autocmds("FileType", { modeline = false, buffer = opts.buf }) + Util.track() + end) end return M From f2132946c7ba0c891f79a7f89634aaeb825b6dee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 07:49:38 +0000 Subject: [PATCH 1081/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c4a57f0..66aca31 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 06 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 07 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 8871602e541c9c7ecd036d631b527454312f88b2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Oct 2023 11:15:12 +0200 Subject: [PATCH 1082/1610] fix(event): move all ft logic to the event handler --- lua/lazy/core/handler/event.lua | 112 +++++++++++++++++++++----------- lua/lazy/core/handler/ft.lua | 19 ------ 2 files changed, 74 insertions(+), 57 deletions(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index ee0b1e4..2fdaa51 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -5,15 +5,22 @@ local Loader = require("lazy.core.loader") ---@class LazyEventOpts ---@field event string ---@field pattern? string +---@field group? string ---@field exclude? string[] ---@field data? any ----@field buf? number} +---@field buffer? number ---@class LazyEventHandler:LazyHandler ---@field events table<string,true> ---@field group number local M = {} +-- Event dependencies +M.triggers = { + FileType = "BufReadPost", + BufReadPost = "BufReadPre", +} + M.group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) ---@param value string @@ -33,22 +40,45 @@ function M:_add(value) end done = true Util.track({ [self.type] = value }) - local groups = M.get_augroups(ev.event, pattern) + + local state = M.get_state(ev.event, pattern, ev.buf, ev.data) + -- load the plugins Loader.load(self.active[value], { [self.type] = value }) + -- check if any plugin created an event handler for this event and fire the group - self:_trigger({ - event = ev.event, - pattern = pattern, - exclude = groups, - data = ev.data, - buf = ev.buf, - }) + for _, s in ipairs(state) do + M.trigger(s) + end Util.track() end, }) end +-- Get the current state of the event and all the events that will be fired +---@param event string +---@param pattern? string +---@param buf number +---@param data any +function M.get_state(event, pattern, buf, data) + local state = {} ---@type LazyEventOpts[] + while event do + table.insert(state, 1, { + event = event, + pattern = pattern, + exclude = event ~= "FileType" and M.get_augroups(event) or nil, + buffer = buf, + data = data, + }) + data = nil -- only pass the data to the first event + if event == "FileType" then + pattern = nil -- only use the pattern for the first event + end + event = M.triggers[event] + end + return state +end + ---@param value string function M:_event(value) if value == "VeryLazy" then @@ -61,10 +91,9 @@ end -- Get all augroups for the events ---@param event string ----@param pattern? string -function M.get_augroups(event, pattern) +function M.get_augroups(event) local groups = {} ---@type string[] - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = event, pattern = pattern })) do + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = event })) do if autocmd.group_name then table.insert(groups, autocmd.group_name) end @@ -72,41 +101,48 @@ function M.get_augroups(event, pattern) return groups end ----@param opts LazyEventOpts -function M:_trigger(opts) - M.trigger(opts) -end - +-- Trigger an event. When a group is given, only the events in that group will be triggered. +-- When exclude is set, the events in those groups will be skipped. ---@param opts LazyEventOpts function M.trigger(opts) + if opts.group or opts.exclude == nil then + return M._trigger(opts) + end local done = {} ---@type table<string,true> - for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = opts.event, pattern = opts.pattern })) do + for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = opts.event })) do local id = autocmd.event .. ":" .. (autocmd.group or "") ---@type string local skip = done[id] or (opts.exclude and vim.tbl_contains(opts.exclude, autocmd.group_name)) done[id] = true if autocmd.group and not skip then - if Config.options.debug then - Util.info({ - "# Firing Events", - " - **group:** `" .. autocmd.group_name .. "`", - " - **event:** " .. autocmd.event, - opts.pattern and (" - **pattern:** " .. opts.pattern), - opts.buf and (" - **buf:** " .. opts.buf), - }) - end - Util.track({ event = autocmd.group_name }) - Util.try(function() - vim.api.nvim_exec_autocmds(autocmd.event, { - -- pattern = opts.pattern, - buffer = opts.buf, - group = autocmd.group, - modeline = false, - data = opts.data, - }) - Util.track() - end) + opts.group = autocmd.group_name + M._trigger(opts) end end end +-- Trigger an event +---@param opts LazyEventOpts +function M._trigger(opts) + if Config.options.debug then + Util.info({ + "# Firing Events", + " - **event:** " .. opts.event, + opts.pattern and (" - **pattern:** " .. opts.pattern), + opts.group and (" - **group:** " .. opts.group), + opts.buffer and (" - **buffer:** " .. opts.buffer), + }) + end + Util.track({ event = opts.group or opts.event }) + Util.try(function() + vim.api.nvim_exec_autocmds(opts.event, { + -- pattern = opts.pattern, + buffer = opts.buffer, + group = opts.group, + modeline = false, + data = opts.data, + }) + Util.track() + end) +end + return M diff --git a/lua/lazy/core/handler/ft.lua b/lua/lazy/core/handler/ft.lua index 25739ce..f0947c6 100644 --- a/lua/lazy/core/handler/ft.lua +++ b/lua/lazy/core/handler/ft.lua @@ -1,7 +1,5 @@ local Event = require("lazy.core.handler.event") -local Util = require("lazy.core.util") local Loader = require("lazy.core.loader") -local Config = require("lazy.core.config") ---@class LazyFiletypeHandler:LazyEventHandler local M = {} @@ -20,21 +18,4 @@ function M:add(plugin) end end ----@param opts LazyEventOpts -function M:_trigger(opts) - Util.try(function() - if Config.options.debug then - Util.info({ - "# Firing Events", - " - **event:** FileType", - opts.pattern and (" - **pattern:** " .. opts.pattern), - opts.buf and (" - **buf:** " .. opts.buf), - }) - end - Util.track({ event = "FileType" }) - vim.api.nvim_exec_autocmds("FileType", { modeline = false, buffer = opts.buf }) - Util.track() - end) -end - return M From 5aaafcb3019e04dd38a011b3d4c8a0f130c422ef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 11:44:13 +0200 Subject: [PATCH 1083/1610] chore(main): release 10.7.2 (#1086) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdeccb7..b9a823e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [10.7.2](https://github.com/folke/lazy.nvim/compare/v10.7.1...v10.7.2) (2023-10-07) + + +### Bug Fixes + +* **event:** move all ft logic to the event handler ([8871602](https://github.com/folke/lazy.nvim/commit/8871602e541c9c7ecd036d631b527454312f88b2)) +* **ft:** fix ft handlers to properly use new events. Fixes [#1084](https://github.com/folke/lazy.nvim/issues/1084) ([e4ea874](https://github.com/folke/lazy.nvim/commit/e4ea874e33fd3116d0e113f4b03eff2d6b1e3399)) + ## [10.7.1](https://github.com/folke/lazy.nvim/compare/v10.7.0...v10.7.1) (2023-10-06) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 42bc512..773d885 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.7.1" -- x-release-please-version +M.version = "10.7.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 09e30f88cd4b47704005c41f0486a628b0b8d774 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Oct 2023 20:41:06 +0200 Subject: [PATCH 1084/1610] fix(keys): fixed buffer-local mappings --- lua/lazy/core/handler/keys.lua | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 5db4f0f..35d7fb0 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -72,7 +72,7 @@ function M:_add(keys) local plugins = self.active[keys.id] -- always delete the mapping immediately to prevent recursive mappings - self:_del(keys, buf) + self:_del(keys) self.active[keys.id] = nil if plugins then @@ -81,6 +81,11 @@ function M:_add(keys) Util.track() end + -- Create the real buffer-local mapping + if keys.ft then + self:_set(keys, buf) + end + local feed = vim.api.nvim_replace_termcodes("<Ignore>" .. lhs, true, true, true) -- insert instead of append the lhs vim.api.nvim_feedkeys(feed, "i", false) @@ -93,6 +98,7 @@ function M:_add(keys) }) end + -- buffer-local mappings if keys.ft then vim.api.nvim_create_autocmd("FileType", { pattern = keys.ft, @@ -102,9 +108,7 @@ function M:_add(keys) else -- Only create the mapping if its managed by lazy -- otherwise the plugin is supposed to manage it - if keys[2] then - self:_del(keys, event.buf) - end + self:_set(keys, event.buf) end end, }) @@ -113,10 +117,22 @@ function M:_add(keys) end end +-- Delete a mapping and create the real global +-- mapping when needed +---@param keys LazyKeys +function M:_del(keys) + pcall(vim.keymap.del, keys.mode, keys[1]) + -- make sure to create global mappings when needed + -- buffer-local mappings are managed by lazy + if not keys.ft then + self:_set(keys) + end +end + +-- Create a mapping if it is managed by lazy ---@param keys LazyKeys ---@param buf number? -function M:_del(keys, buf) - pcall(vim.keymap.del, keys.mode, keys[1], { buffer = buf }) +function M:_set(keys, buf) if keys[2] then local opts = M.opts(keys) opts.buffer = buf From 62745a7320f48a00ac4f7b0591352608cbc6bcea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 20:45:37 +0200 Subject: [PATCH 1085/1610] chore(main): release 10.7.3 (#1087) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9a823e..6b6da43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.7.3](https://github.com/folke/lazy.nvim/compare/v10.7.2...v10.7.3) (2023-10-07) + + +### Bug Fixes + +* **keys:** fixed buffer-local mappings ([09e30f8](https://github.com/folke/lazy.nvim/commit/09e30f88cd4b47704005c41f0486a628b0b8d774)) + ## [10.7.2](https://github.com/folke/lazy.nvim/compare/v10.7.1...v10.7.2) (2023-10-07) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 773d885..d44efc0 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.7.2" -- x-release-please-version +M.version = "10.7.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From b79099cc9d768241162bb45d284d6a243736b9fb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 8 Oct 2023 10:11:25 +0200 Subject: [PATCH 1086/1610] feat(keys): refactor code and allow disabling keymaps per mode. mode no longer needs to be exactly the same in order to disable. --- lua/lazy/core/handler/init.lua | 3 ++ lua/lazy/core/handler/keys.lua | 96 ++++++++++++++++++++++------------ lua/lazy/types.lua | 2 +- lua/lazy/view/render.lua | 2 +- 4 files changed, 68 insertions(+), 35 deletions(-) diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index 9c6b92d..9a3fd5a 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -5,6 +5,7 @@ local Config = require("lazy.core.config") ---@field type LazyHandlerTypes ---@field extends? LazyHandler ---@field active table<string,table<string,string>> +---@field managed table<string,string> ---@field super LazyHandler local M = {} @@ -64,6 +65,7 @@ function M.new(type) local self = setmetatable({}, { __index = setmetatable(handler, { __index = super }) }) self.super = super self.active = {} + self.managed = {} self.type = type return self end @@ -94,6 +96,7 @@ function M:add(plugin) self.active[key] = {} self:_add(value) end + self.managed[key] = self.managed[key] self.active[key][plugin.name] = plugin.name end end diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 35d7fb0..9253102 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -1,60 +1,89 @@ local Util = require("lazy.core.util") local Loader = require("lazy.core.loader") ----@class LazyKeys ----@field [1] string lhs ----@field [2]? string|fun()|false rhs +---@class LazyKeysBase ---@field desc? string ----@field mode? string|string[] ---@field noremap? boolean ---@field remap? boolean ---@field expr? boolean +---@field nowait? boolean ---@field ft? string|string[] + +---@class LazyKeysSpec: LazyKeysBase +---@field [1] string lhs +---@field [2]? string|fun()|false rhs +---@field mode? string|string[] + +---@class LazyKeys: LazyKeysBase +---@field lhs string lhs +---@field rhs? string|fun() rhs +---@field mode? string ---@field id string ---@class LazyKeysHandler:LazyHandler local M = {} ----@param value string|LazyKeys -function M.parse(value) - local ret = vim.deepcopy(value) - ret = type(ret) == "string" and { ret } or ret --[[@as LazyKeys]] - ret.mode = ret.mode or "n" - ret.id = vim.api.nvim_replace_termcodes(ret[1] or "", true, true, true) - if ret.mode then - local mode = ret.mode - if type(mode) == "table" then - ---@cast mode string[] - table.sort(mode) - mode = table.concat(mode, ", ") - end - if mode ~= "n" then - ret.id = ret.id .. " (" .. mode .. ")" - end +---@param value string|LazyKeysSpec +---@param mode? string +---@return LazyKeys +function M.parse(value, mode) + value = type(value) == "string" and { value } or value --[[@as LazyKeysSpec]] + local ret = vim.deepcopy(value) --[[@as LazyKeys]] + ret.lhs = ret[1] or "" + ret.rhs = ret[2] + ---@diagnostic disable-next-line: no-unknown + ret[1] = nil + ---@diagnostic disable-next-line: no-unknown + ret[2] = nil + ret.mode = mode or "n" + ret.id = vim.api.nvim_replace_termcodes(ret.lhs, true, true, true) + if ret.mode ~= "n" then + ret.id = ret.id .. " (" .. ret.mode .. ")" end return ret end +---@param lhs string +---@param mode? string +function M:have(lhs, mode) + local keys = M.parse(lhs, mode) + return self.managed[keys.id] +end + ---@param plugin LazyPlugin function M:values(plugin) - ---@type table<string,any> + return M.resolve(plugin.keys) +end + +---@param spec? (string|LazyKeysSpec)[] +function M.resolve(spec) + ---@type LazyKeys[] local values = {} ---@diagnostic disable-next-line: no-unknown - for _, value in ipairs(plugin[self.type] or {}) do - local keys = M.parse(value) - if keys[2] == vim.NIL or keys[2] == false then - values[keys.id] = nil - else - values[keys.id] = keys + for _, value in ipairs(spec or {}) do + value = type(value) == "string" and { value } or value --[[@as LazyKeysSpec]] + value.mode = value.mode or "n" + local modes = (type(value.mode) == "table" and value.mode or { value.mode }) --[=[@as string[]]=] + for _, mode in ipairs(modes) do + local keys = M.parse(value, mode) + if keys.rhs == vim.NIL or keys.rhs == false then + values[keys.id] = nil + else + values[keys.id] = keys + end end end return values end +---@param keys LazyKeys function M.opts(keys) - local opts = {} + local skip = { mode = true, id = true, ft = true, rhs = true, lhs = true } + local opts = {} ---@type LazyKeysBase + ---@diagnostic disable-next-line: no-unknown for k, v in pairs(keys) do - if type(k) ~= "number" and k ~= "mode" and k ~= "id" and k ~= "ft" then + if type(k) ~= "number" and not skip[k] then + ---@diagnostic disable-next-line: no-unknown opts[k] = v end end @@ -63,7 +92,7 @@ end ---@param keys LazyKeys function M:_add(keys) - local lhs = keys[1] + local lhs = keys.lhs local opts = M.opts(keys) ---@param buf? number @@ -121,7 +150,7 @@ end -- mapping when needed ---@param keys LazyKeys function M:_del(keys) - pcall(vim.keymap.del, keys.mode, keys[1]) + pcall(vim.keymap.del, keys.mode, keys.lhs) -- make sure to create global mappings when needed -- buffer-local mappings are managed by lazy if not keys.ft then @@ -133,10 +162,11 @@ end ---@param keys LazyKeys ---@param buf number? function M:_set(keys, buf) - if keys[2] then + if keys.rhs then local opts = M.opts(keys) + ---@diagnostic disable-next-line: inject-field opts.buffer = buf - vim.keymap.set(keys.mode, keys[1], keys[2], opts) + vim.keymap.set(keys.mode, keys.lhs, keys.rhs, opts) end end diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 30363b6..3e7f74d 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -32,7 +32,7 @@ ---@field event? string[] ---@field cmd? string[] ---@field ft? string[] ----@field keys? (string|LazyKeys)[] +---@field keys? (string|LazyKeysSpec)[] ---@field module? false ---@class LazyPluginRef diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 5b1f9af..319d627 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -331,7 +331,7 @@ function M:reason(reason, opts) value = value:match("User (.*)") or value end if key == "keys" then - value = type(value) == "string" and value or value[1] + value = type(value) == "string" and value or value.lhs end local hl = "LazyReason" .. key:sub(1, 1):upper() .. key:sub(2) local icon = Config.options.ui.icons[key] From cd7493da78ab1117c404f0c470ddc2dabd9f3cfe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 08:12:09 +0000 Subject: [PATCH 1087/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 66aca31..4a4a451 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 07 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 08 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 4b5b03f60319bdf67cada9d72e549dc21a92d5f1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 10:13:01 +0200 Subject: [PATCH 1088/1610] chore(main): release 10.8.0 (#1088) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b6da43..c47ce35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.8.0](https://github.com/folke/lazy.nvim/compare/v10.7.3...v10.8.0) (2023-10-08) + + +### Features + +* **keys:** refactor code and allow disabling keymaps per mode. mode no longer needs to be exactly the same in order to disable. ([b79099c](https://github.com/folke/lazy.nvim/commit/b79099cc9d768241162bb45d284d6a243736b9fb)) + ## [10.7.3](https://github.com/folke/lazy.nvim/compare/v10.7.2...v10.7.3) (2023-10-07) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index d44efc0..5797511 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.7.3" -- x-release-please-version +M.version = "10.8.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 26762c97e6dc3fddf141db0e82d044ee73e5f78d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 8 Oct 2023 12:36:21 +0200 Subject: [PATCH 1089/1610] fix(ui): use correct keymap for display. Fixes #1089 --- lua/lazy/view/render.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 319d627..852a5d2 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -331,7 +331,7 @@ function M:reason(reason, opts) value = value:match("User (.*)") or value end if key == "keys" then - value = type(value) == "string" and value or value.lhs + value = type(value) == "string" and value or value.lhs or value[1] end local hl = "LazyReason" .. key:sub(1, 1):upper() .. key:sub(2) local icon = Config.options.ui.icons[key] From 9102d051a8e27298f4c913e3017ac44f151ae820 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 12:57:44 +0200 Subject: [PATCH 1090/1610] chore(main): release 10.8.1 (#1090) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c47ce35..e2b225b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.8.1](https://github.com/folke/lazy.nvim/compare/v10.8.0...v10.8.1) (2023-10-08) + + +### Bug Fixes + +* **ui:** use correct keymap for display. Fixes [#1089](https://github.com/folke/lazy.nvim/issues/1089) ([26762c9](https://github.com/folke/lazy.nvim/commit/26762c97e6dc3fddf141db0e82d044ee73e5f78d)) + ## [10.8.0](https://github.com/folke/lazy.nvim/compare/v10.7.3...v10.8.0) (2023-10-08) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5797511..4410939 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.8.0" -- x-release-please-version +M.version = "10.8.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 9d92e65fd17d35f97bed43dc92810576a57376fc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 8 Oct 2023 19:14:33 +0200 Subject: [PATCH 1091/1610] fix(keys): fixed adding managed keys --- lua/lazy/core/handler/init.lua | 2 +- lua/lazy/core/handler/keys.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index 9a3fd5a..dce3415 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -95,8 +95,8 @@ function M:add(plugin) if not self.active[key] then self.active[key] = {} self:_add(value) + self.managed[key] = key end - self.managed[key] = self.managed[key] self.active[key][plugin.name] = plugin.name end end diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 9253102..30a4b4f 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -47,7 +47,7 @@ end ---@param mode? string function M:have(lhs, mode) local keys = M.parse(lhs, mode) - return self.managed[keys.id] + return self.managed[keys.id] ~= nil end ---@param plugin LazyPlugin From 0a07fa6cd74db668e4859896d30f8f6ed2b60b13 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 19:32:24 +0200 Subject: [PATCH 1092/1610] chore(main): release 10.8.2 (#1091) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2b225b..ea2dadb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.8.2](https://github.com/folke/lazy.nvim/compare/v10.8.1...v10.8.2) (2023-10-08) + + +### Bug Fixes + +* **keys:** fixed adding managed keys ([9d92e65](https://github.com/folke/lazy.nvim/commit/9d92e65fd17d35f97bed43dc92810576a57376fc)) + ## [10.8.1](https://github.com/folke/lazy.nvim/compare/v10.8.0...v10.8.1) (2023-10-08) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4410939..e676ab9 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -161,7 +161,7 @@ M.defaults = { debug = false, } -M.version = "10.8.1" -- x-release-please-version +M.version = "10.8.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From f0cfbf995238a42064e119bd1daa694fd1683ea3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 8 Oct 2023 20:22:01 +0200 Subject: [PATCH 1093/1610] perf: lazy require commands --- lua/lazy/core/util.lua | 13 +++++++++++++ lua/lazy/view/commands.lua | 1 + 2 files changed, 14 insertions(+) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index d1d6bec..a11d3ae 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -411,4 +411,17 @@ function M.merge(...) return ret end +function M.lazy_require(module) + local mod = nil + -- if already loaded, return the module + -- otherwise return a lazy module + return type(package.loaded[module]) == "table" and package.loaded[module] + or setmetatable({}, { + __index = function(_, key) + mod = mod or require(module) + return mod[key] + end, + }) +end + return M diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 1fa7cc1..c66611d 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -1,3 +1,4 @@ +local require = require("lazy.core.util").lazy_require local View = require("lazy.view") local Manage = require("lazy.manage") local Util = require("lazy.util") From 22bf6ae04bbfe0e11b3c539f8bd2ce66b72c328b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 9 Oct 2023 11:25:42 +0200 Subject: [PATCH 1094/1610] style: sort requires --- lua/lazy/core/handler/cmd.lua | 2 +- lua/lazy/core/handler/event.lua | 2 +- lua/lazy/core/handler/init.lua | 2 +- lua/lazy/core/handler/keys.lua | 2 +- lua/lazy/core/loader.lua | 4 ++-- lua/lazy/core/plugin.lua | 2 +- lua/lazy/health.lua | 2 +- lua/lazy/manage/checker.lua | 6 +++--- lua/lazy/manage/git.lua | 4 ++-- lua/lazy/manage/init.lua | 2 +- lua/lazy/manage/reloader.lua | 4 ++-- lua/lazy/manage/runner.lua | 2 +- lua/lazy/manage/task/fs.lua | 2 +- lua/lazy/manage/task/git.lua | 2 +- lua/lazy/manage/task/plugin.lua | 4 ++-- lua/lazy/state.lua | 2 +- lua/lazy/view/commands.lua | 4 ++-- lua/lazy/view/float.lua | 2 +- lua/lazy/view/init.lua | 8 ++++---- lua/lazy/view/render.lua | 6 +++--- stylua.toml | 5 ++++- tests/core/util_spec.lua | 2 +- 22 files changed, 37 insertions(+), 34 deletions(-) diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index 28c7d9b..6ff9623 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -1,5 +1,5 @@ -local Util = require("lazy.core.util") local Loader = require("lazy.core.loader") +local Util = require("lazy.core.util") ---@class LazyCmdHandler:LazyHandler local M = {} diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 2fdaa51..3a8d9a7 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -1,6 +1,6 @@ -local Util = require("lazy.core.util") local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") +local Util = require("lazy.core.util") ---@class LazyEventOpts ---@field event string diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index dce3415..127ccae 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -1,5 +1,5 @@ -local Util = require("lazy.core.util") local Config = require("lazy.core.config") +local Util = require("lazy.core.util") ---@class LazyHandler ---@field type LazyHandlerTypes diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 30a4b4f..9a87128 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -1,5 +1,5 @@ -local Util = require("lazy.core.util") local Loader = require("lazy.core.loader") +local Util = require("lazy.core.util") ---@class LazyKeysBase ---@field desc? string diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 1912338..9e62371 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -1,8 +1,8 @@ -local Util = require("lazy.core.util") +local Cache = require("lazy.core.cache") local Config = require("lazy.core.config") local Handler = require("lazy.core.handler") local Plugin = require("lazy.core.plugin") -local Cache = require("lazy.core.cache") +local Util = require("lazy.core.util") ---@class LazyCoreLoader local M = {} diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 12ba1a8..3e5743a 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,6 +1,6 @@ local Config = require("lazy.core.config") -local Util = require("lazy.core.util") local Handler = require("lazy.core.handler") +local Util = require("lazy.core.util") ---@class LazyCorePlugin local M = {} diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 8757b77..929092d 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -54,7 +54,7 @@ function M.check() local spec = Config.spec if spec == nil then - error("No plugins loaded. Did you forget to run `require(\"lazy\").setup()`?") + error('No plugins loaded. Did you forget to run `require("lazy").setup()`?') else for _, plugin in pairs(spec.plugins) do M.check_valid(plugin) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 1cc5322..803972e 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -1,9 +1,9 @@ local Config = require("lazy.core.config") -local Manage = require("lazy.manage") -local Util = require("lazy.util") -local Plugin = require("lazy.core.plugin") local Git = require("lazy.manage.git") +local Manage = require("lazy.manage") +local Plugin = require("lazy.core.plugin") local State = require("lazy.state") +local Util = require("lazy.util") local M = {} diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 116c5fe..98c44b5 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -1,7 +1,7 @@ -local Util = require("lazy.util") -local Semver = require("lazy.manage.semver") local Config = require("lazy.core.config") local Process = require("lazy.manage.process") +local Semver = require("lazy.manage.semver") +local Util = require("lazy.util") local M = {} diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 05ffa88..49953f0 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -1,6 +1,6 @@ local Config = require("lazy.core.config") -local Runner = require("lazy.manage.runner") local Plugin = require("lazy.core.plugin") +local Runner = require("lazy.manage.runner") local M = {} diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index 6938231..c48cc9f 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -1,7 +1,7 @@ local Config = require("lazy.core.config") -local Util = require("lazy.util") -local Plugin = require("lazy.core.plugin") local Loader = require("lazy.core.loader") +local Plugin = require("lazy.core.plugin") +local Util = require("lazy.util") local M = {} diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 7e556f2..85c20be 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -1,5 +1,5 @@ -local Task = require("lazy.manage.task") local Config = require("lazy.core.config") +local Task = require("lazy.manage.task") local Util = require("lazy.util") ---@class RunnerOpts diff --git a/lua/lazy/manage/task/fs.lua b/lua/lazy/manage/task/fs.lua index 9386f76..525997e 100644 --- a/lua/lazy/manage/task/fs.lua +++ b/lua/lazy/manage/task/fs.lua @@ -1,5 +1,5 @@ -local Util = require("lazy.util") local Config = require("lazy.core.config") +local Util = require("lazy.util") ---@type table<string, LazyTaskDef> local M = {} diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index bcecfec..74f7dfb 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -1,6 +1,6 @@ +local Config = require("lazy.core.config") local Git = require("lazy.manage.git") local Lock = require("lazy.manage.lock") -local Config = require("lazy.core.config") local Util = require("lazy.util") ---@type table<string, LazyTaskDef> diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index fd6153b..ea623ee 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -1,6 +1,6 @@ -local Util = require("lazy.util") -local Loader = require("lazy.core.loader") local Config = require("lazy.core.config") +local Loader = require("lazy.core.loader") +local Util = require("lazy.util") ---@type table<string, LazyTaskDef> local M = {} diff --git a/lua/lazy/state.lua b/lua/lazy/state.lua index 80e4c2e..cb4cd4d 100644 --- a/lua/lazy/state.lua +++ b/lua/lazy/state.lua @@ -1,5 +1,5 @@ -local Util = require("lazy.util") local Config = require("lazy.core.config") +local Util = require("lazy.util") ---@type LazyState local M = {} diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index c66611d..a826827 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -1,8 +1,8 @@ local require = require("lazy.core.util").lazy_require -local View = require("lazy.view") +local Config = require("lazy.core.config") local Manage = require("lazy.manage") local Util = require("lazy.util") -local Config = require("lazy.core.config") +local View = require("lazy.view") local ViewConfig = require("lazy.view.config") local M = {} diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index a879640..f69108e 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -1,6 +1,6 @@ local Config = require("lazy.core.config") -local ViewConfig = require("lazy.view.config") local Util = require("lazy.util") +local ViewConfig = require("lazy.view.config") ---@class LazyFloatOptions ---@field buf? number diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 869fac7..1be4b16 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -1,10 +1,10 @@ -local Util = require("lazy.util") -local Render = require("lazy.view.render") local Config = require("lazy.core.config") -local ViewConfig = require("lazy.view.config") -local Git = require("lazy.manage.git") local Diff = require("lazy.view.diff") local Float = require("lazy.view.float") +local Git = require("lazy.manage.git") +local Render = require("lazy.view.render") +local Util = require("lazy.util") +local ViewConfig = require("lazy.view.config") ---@class LazyViewState ---@field mode string diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 852a5d2..cc677b9 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -1,9 +1,9 @@ local Config = require("lazy.core.config") -local Util = require("lazy.util") -local Sections = require("lazy.view.sections") -local Handler = require("lazy.core.handler") local Git = require("lazy.manage.git") +local Handler = require("lazy.core.handler") local Plugin = require("lazy.core.plugin") +local Sections = require("lazy.view.sections") +local Util = require("lazy.util") local ViewConfig = require("lazy.view.config") local Text = require("lazy.view.text") diff --git a/stylua.toml b/stylua.toml index 5d6c50d..9732fe6 100644 --- a/stylua.toml +++ b/stylua.toml @@ -1,3 +1,6 @@ indent_type = "Spaces" indent_width = 2 -column_width = 120 \ No newline at end of file +column_width = 120 +[sort_requires] +enabled = true + diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index ee829a1..97c42c7 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -1,6 +1,6 @@ -local Util = require("lazy.util") local Cache = require("lazy.core.cache") local Helpers = require("tests.helpers") +local Util = require("lazy.util") describe("util", function() local rtp = vim.opt.rtp:get() From ce3e8523de7adfa73b104c816ce21ba54d70006b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 09:26:35 +0000 Subject: [PATCH 1095/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4a4a451..a13634a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 08 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 09 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 423a152e94db37dd535d56e6cb6f06b282c5f081 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 9 Oct 2023 12:38:43 +0200 Subject: [PATCH 1096/1610] feat(profiling): added options to enable additional profiling --- README.md | 111 +++++++++++++++++++++------------------ lua/lazy/core/config.lua | 10 ++++ lua/lazy/core/util.lua | 2 +- lua/lazy/init.lua | 36 ++++++++++--- lua/lazy/view/colors.lua | 1 + lua/lazy/view/render.lua | 2 +- 6 files changed, 102 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index fb1a377..31963fc 100644 --- a/README.md +++ b/README.md @@ -355,6 +355,7 @@ return { not_loaded = "○", plugin = " ", runtime = " ", + require = "󰢱 ", source = " ", start = "", task = "✔ ", @@ -448,6 +449,15 @@ return { -- executed. In this case, a warning message will be shown. warn_on_override = true, }, + -- 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, + }, } ``` @@ -495,24 +505,24 @@ Any operation can be started from the UI, with a sub command or an API function: <!-- commands:start --> -| 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!!) | +| 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 | +| `: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 | <!-- commands:end --> @@ -763,39 +773,40 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori <!-- colors:start --> -| Highlight Group | Default Group | Description | -| --------------------- | -------------------------- | --------------------------------------------------- | -| **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** | **_@text.reference_** | directory | -| **LazyH1** | **_IncSearch_** | home button | -| **LazyH2** | **_Bold_** | titles | -| **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_** | | -| **LazyReasonRuntime** | **_@macro_** | | -| **LazyReasonSource** | **_Character_** | | -| **LazyReasonStart** | **_@field_** | | -| **LazySpecial** | **_@punctuation.special_** | | -| **LazyTaskError** | **_ErrorMsg_** | task errors | -| **LazyTaskOutput** | **_MsgArea_** | task output | -| **LazyUrl** | **_@text.reference_** | url | -| **LazyValue** | **_@string_** | value of a property | +| Highlight Group | Default Group | Description | +| --- | --- | --- | +| **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** | ***@text.reference*** | directory | +| **LazyH1** | ***IncSearch*** | home button | +| **LazyH2** | ***Bold*** | titles | +| **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** | ***@parameter*** | | +| **LazyReasonRuntime** | ***@macro*** | | +| **LazyReasonSource** | ***Character*** | | +| **LazyReasonStart** | ***@field*** | | +| **LazySpecial** | ***@punctuation.special*** | | +| **LazyTaskError** | ***ErrorMsg*** | task errors | +| **LazyTaskOutput** | ***MsgArea*** | task output | +| **LazyUrl** | ***@text.reference*** | url | +| **LazyValue** | ***@string*** | value of a property | <!-- colors:end --> diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index e676ab9..f4d948b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -65,6 +65,7 @@ M.defaults = { not_loaded = "○", plugin = " ", runtime = " ", + require = "󰢱 ", source = " ", start = "", task = "✔ ", @@ -158,6 +159,15 @@ M.defaults = { -- executed. In this case, a warning message will be shown. warn_on_override = true, }, + -- 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, + }, debug = false, } diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index a11d3ae..da0fcf6 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -118,7 +118,7 @@ function M.get_source() if not info then break end - if info.what ~= "C" and not info.source:find("lazy.nvim", 1, true) then + if info.what ~= "C" and not info.source:find("lazy.nvim", 1, true) and info.source ~= "@vim/loader.lua" then return info.source:sub(2) end f = f + 1 diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index a2e0940..e219eaf 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -2,6 +2,23 @@ local M = {} M._start = 0 +local function profile_require() + local done = {} ---@type table<string, true> + local r = require + _G.require = function(modname) + local Util = package.loaded["lazy.core.util"] + if Util and not done[modname] then + done[modname] = true + Util.track({ require = modname }) + local ret = vim.F.pack_len(r(modname)) + Util.track() + return vim.F.unpack_len(ret) + else + return r(modname) + end + end +end + ---@overload fun(opts: LazyConfig) ---@overload fun(spec:LazySpec, opts: LazyConfig) function M.setup(spec, opts) @@ -40,17 +57,16 @@ function M.setup(spec, opts) local Cache = require("lazy.core.cache") - local enable_cache = not ( - opts - and opts.performance - and opts.performance.cache - and opts.performance.cache.enabled == false - ) + local enable_cache = vim.tbl_get(opts, "performance", "cache", "enabled") ~= false -- load module cache before anything else if enable_cache then Cache.enable() end + if vim.tbl_get(opts, "profiling", "require") then + profile_require() + end + require("lazy.stats").track("LazyStart") local Util = require("lazy.core.util") @@ -59,8 +75,12 @@ function M.setup(spec, opts) table.insert(package.loaders, 3, Loader.loader) - if vim.g.profile_loaders then - Cache.profile_loaders() + if vim.tbl_get(opts, "profiling", "loader") then + if vim.loader then + vim.loader._profile({ loaders = true }) + else + Cache._profile_loaders() + end end Util.track({ plugin = "lazy.nvim" }) -- setup start diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index 6d43f1f..cc00a3a 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -26,6 +26,7 @@ M.colors = { ReasonFt = "Character", ReasonCmd = "Operator", ReasonImport = "Identifier", + ReasonRequire = "@parameter", Button = "CursorLine", ButtonActive = "Visual", TaskOutput = "MsgArea", -- task output diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index cc677b9..12c3da3 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -320,7 +320,7 @@ function M:reason(reason, opts) for _, key in ipairs(keys) do local value = reason[key] if type(key) == "number" then - elseif key == "require" then + -- elseif key == "require" then elseif key ~= "time" then if first then first = false From 336bbbebcb28e40283361562acca4daa2bd5f3d6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 10:39:27 +0000 Subject: [PATCH 1097/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 153 ++++++++++++++++++++++++++++------------------ 1 file changed, 93 insertions(+), 60 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a13634a..8ee9960 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -454,6 +454,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* not_loaded = "○", plugin = " ", runtime = " ", + require = "󰢱 ", source = " ", start = "", task = "✔ ", @@ -547,6 +548,15 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* -- executed. In this case, a warning message will be shown. warn_on_override = true, }, + -- 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, + }, } < @@ -589,45 +599,63 @@ 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 + --------------------------------------------------------------------------------------------------- + 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 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 clean [plugins] require("lazy").clean(opts?) Clean plugins that are + no longer needed - :Lazy clear require("lazy").clear() Clear finished tasks + :Lazy clear require("lazy").clear() Clear finished tasks - :Lazy debug require("lazy").debug() Show debug information + :Lazy debug require("lazy").debug() Show debug information - :Lazy health require("lazy").health() Run :checkhealth lazy + :Lazy health require("lazy").health() Run :checkhealth lazy - :Lazy help require("lazy").help() Toggle this help page + :Lazy help require("lazy").help() Toggle this help page - :Lazy home require("lazy").home() Go back to plugin list + :Lazy home require("lazy").home() Go back to plugin list - :Lazy install [plugins] require("lazy").install(opts?) Install missing plugins + :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 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 log [plugins] require("lazy").log(opts?) Show recent updates - :Lazy profile require("lazy").profile() Show detailed profiling + :Lazy profile require("lazy").profile() Show detailed + profiling - :Lazy reload {plugins} require("lazy").reload(opts) Reload a plugin (experimental!!) + :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 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 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 - -------------------------------------------------------------------------------------------------------------- + :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: @@ -883,72 +911,77 @@ HIGHLIGHT GROUPS *lazy.nvim-lazy.nvim-highlight-groups* Click to see all highlight groups ~ - --------------------------------------------------------------------------------- - Highlight Group Default Group Description - ------------------- ------------------------ ------------------------------------ - LazyButton CursorLine + ----------------------------------------------------------------------- + Highlight Group Default Group Description + ----------------------- ----------------------- ----------------------- + LazyButton CursorLine - LazyButtonActive Visual + LazyButtonActive Visual - LazyComment Comment + LazyComment Comment - LazyCommit _@variable.builtin_ commitref + LazyCommit @variable.builtin commit ref - LazyCommitIssue Number + LazyCommitIssue Number - LazyCommitScope Italic conventional commit scope + LazyCommitScope Italic conventional commit + scope - LazyCommitType Title conventional commit type + LazyCommitType Title conventional commit + type - LazyDimmed Conceal property + LazyDimmed Conceal property - LazyDir _@text.reference_ directory + LazyDir @text.reference directory - LazyH1 IncSearch homebutton + LazyH1 IncSearch home button - LazyH2 Bold titles + LazyH2 Bold titles - LazyLocal Constant + LazyLocal Constant - LazyNoCond DiagnosticWarn unloaded icon for a plugin where - cond() was false + LazyNoCond DiagnosticWarn unloaded icon for a + plugin where cond() was + false - LazyNormal NormalFloat + LazyNormal NormalFloat - LazyProgressDone Constant progress bar done + LazyProgressDone Constant progress bar done - LazyProgressTodo LineNr progress bar todo + LazyProgressTodo LineNr progress bar todo - LazyProp Conceal property + LazyProp Conceal property - LazyReasonCmd Operator + LazyReasonCmd Operator - LazyReasonEvent Constant + LazyReasonEvent Constant - LazyReasonFt Character + LazyReasonFt Character - LazyReasonImport Identifier + LazyReasonImport Identifier - LazyReasonKeys Statement + LazyReasonKeys Statement - LazyReasonPlugin Special + LazyReasonPlugin Special - LazyReasonRuntime _@macro_ + LazyReasonRequire @parameter - LazyReasonSource Character + LazyReasonRuntime @macro - LazyReasonStart _@field_ + LazyReasonSource Character - LazySpecial _@punctuation.special_ + LazyReasonStart @field - LazyTaskError ErrorMsg taskerrors + LazySpecial @punctuation.special - LazyTaskOutput MsgArea task output + LazyTaskError ErrorMsg task errors - LazyUrl _@text.reference_ url + LazyTaskOutput MsgArea task output - LazyValue _@string_ valueof a property - --------------------------------------------------------------------------------- + LazyUrl @text.reference url + + LazyValue @string value of a property + ----------------------------------------------------------------------- PLUGIN AUTHORS *lazy.nvim-lazy.nvim-plugin-authors* From 41d3b2a9dbf03774a2c92c376d8371dcca9710a9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 12:43:14 +0200 Subject: [PATCH 1098/1610] chore(main): release 10.9.0 (#1092) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea2dadb..dcdecb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [10.9.0](https://github.com/folke/lazy.nvim/compare/v10.8.2...v10.9.0) (2023-10-09) + + +### Features + +* **profiling:** added options to enable additional profiling ([423a152](https://github.com/folke/lazy.nvim/commit/423a152e94db37dd535d56e6cb6f06b282c5f081)) + + +### Performance Improvements + +* lazy require commands ([f0cfbf9](https://github.com/folke/lazy.nvim/commit/f0cfbf995238a42064e119bd1daa694fd1683ea3)) + ## [10.8.2](https://github.com/folke/lazy.nvim/compare/v10.8.1...v10.8.2) (2023-10-08) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f4d948b..4cb4568 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -171,7 +171,7 @@ M.defaults = { debug = false, } -M.version = "10.8.2" -- x-release-please-version +M.version = "10.9.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 5579d72576b21b9c8c2d01838598aece5dc2be6d Mon Sep 17 00:00:00 2001 From: KANATSU Minoru <dev@orum.in> Date: Mon, 9 Oct 2023 23:17:42 +0900 Subject: [PATCH 1099/1610] fix(manage): prevend auto conversion 'CRLF' to 'LF' in update lazy-lock.json on Windows. Fixes #1093 (#1094) --- lua/lazy/manage/lock.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/lock.lua b/lua/lazy/manage/lock.lua index 4545f74..c7ceb4e 100644 --- a/lua/lazy/manage/lock.lua +++ b/lua/lazy/manage/lock.lua @@ -9,7 +9,7 @@ M._loaded = false function M.update() vim.fn.mkdir(vim.fn.fnamemodify(Config.options.lockfile, ":p:h"), "p") - local f = assert(io.open(Config.options.lockfile, "w")) + local f = assert(io.open(Config.options.lockfile, "wb")) f:write("{\n") M.lock = {} From 2782f8125e793940f5bf942af1a1df0bbc989d11 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 9 Oct 2023 23:42:05 +0200 Subject: [PATCH 1100/1610] fix(profiling): ensure proper traces in case of require errors --- lua/lazy/init.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index e219eaf..75ccfa2 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -10,8 +10,13 @@ local function profile_require() if Util and not done[modname] then done[modname] = true Util.track({ require = modname }) - local ret = vim.F.pack_len(r(modname)) + local ok, ret = pcall(function() + return vim.F.pack_len(r(modname)) + end) Util.track() + if not ok then + error(ret, 2) + end return vim.F.unpack_len(ret) else return r(modname) From 0d9989d46cd2ae624858b94e529ee3e9d07773fd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 23:45:04 +0200 Subject: [PATCH 1101/1610] chore(main): release 10.9.1 (#1096) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcdecb9..c7b1bd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [10.9.1](https://github.com/folke/lazy.nvim/compare/v10.9.0...v10.9.1) (2023-10-09) + + +### Bug Fixes + +* **manage:** prevend auto conversion 'CRLF' to 'LF' in update lazy-lock.json on Windows. Fixes [#1093](https://github.com/folke/lazy.nvim/issues/1093) ([#1094](https://github.com/folke/lazy.nvim/issues/1094)) ([5579d72](https://github.com/folke/lazy.nvim/commit/5579d72576b21b9c8c2d01838598aece5dc2be6d)) +* **profiling:** ensure proper traces in case of require errors ([2782f81](https://github.com/folke/lazy.nvim/commit/2782f8125e793940f5bf942af1a1df0bbc989d11)) + ## [10.9.0](https://github.com/folke/lazy.nvim/compare/v10.8.2...v10.9.0) (2023-10-09) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4cb4568..57f5fef 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -171,7 +171,7 @@ M.defaults = { debug = false, } -M.version = "10.9.0" -- x-release-please-version +M.version = "10.9.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 89581ce37e1252133725cb583b5ba4fa0a827270 Mon Sep 17 00:00:00 2001 From: 0xAdk <29005635+0xAdk@users.noreply.github.com> Date: Tue, 10 Oct 2023 00:31:06 -0700 Subject: [PATCH 1102/1610] fix(docs): broken table in readme (#1097) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 31963fc..e5ddc66 100644 --- a/README.md +++ b/README.md @@ -506,7 +506,7 @@ Any operation can be started from the UI, with a sub command or an API function: <!-- commands:start --> | 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 | From 067544c74a6336fb5eb1c414b9d164ea27b616d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 07:31:52 +0000 Subject: [PATCH 1103/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 83 +++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 43 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 8ee9960..b378be0 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 09 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 10 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -599,63 +599,60 @@ 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 + ---------------------------------------------------------------------------------- + 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 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 clean [plugins] require("lazy").clean(opts?) Clean plugins that are + no longer needed - :Lazy clear require("lazy").clear() Clear finished tasks + :Lazy clear require("lazy").clear() Clear finished tasks - :Lazy debug require("lazy").debug() Show debug information + :Lazy debug require("lazy").debug() Show debug information - :Lazy health require("lazy").health() Run :checkhealth lazy + :Lazy health require("lazy").health() Run :checkhealth lazy - :Lazy help require("lazy").help() Toggle this help page + :Lazy help require("lazy").help() Toggle this help page - :Lazy home require("lazy").home() Go back to plugin list + :Lazy home require("lazy").home() Go back to plugin list - :Lazy install [plugins] require("lazy").install(opts?) Install missing - plugins + :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 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 log [plugins] require("lazy").log(opts?) Show recent updates - :Lazy profile require("lazy").profile() Show detailed - profiling + :Lazy profile require("lazy").profile() Show detailed profiling - :Lazy reload {plugins} require("lazy").reload(opts) Reload a plugin - (experimental!!) + :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 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 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 - --------------------------------------------------------------------------------------------------- + :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: From 43e9165994d76038bd6ebd2d06830a7204ae74e0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Oct 2023 11:41:32 +0200 Subject: [PATCH 1104/1610] feat(git): show error for local changes during check/update --- lua/lazy/manage/init.lua | 2 ++ lua/lazy/manage/task/git.lua | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 49953f0..897bdbf 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -103,6 +103,7 @@ function M.update(opts) "git.origin", "git.branch", "git.fetch", + "git.status", { "git.checkout", lockfile = opts.lockfile }, "plugin.docs", "wait", @@ -132,6 +133,7 @@ function M.check(opts) pipeline = { { "git.origin", check = true }, "git.fetch", + "git.status", "wait", { "git.log", check = true }, }, diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 74f7dfb..e18968b 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -156,6 +156,33 @@ M.origin = { end, } +M.status = { + skip = function(plugin) + return not plugin._.installed or plugin._.is_local + end, + run = function(self) + self:spawn("git", { + args = { "ls-files", "-d", "-m" }, + cwd = self.plugin.dir, + on_exit = function(ok, output) + if ok then + local lines = vim.split(output, "\n") + lines = vim.tbl_filter(function(line) + return line ~= "" + end, lines) + if #lines > 0 then + self.error = "You have local changes in `" .. self.plugin.dir .. "`:\n" + for _, line in ipairs(lines) do + self.error = self.error .. " * " .. line .. "\n" + end + self.error = self.error .. "Please remove them to update." + end + end + end, + }) + end, +} + -- fetches all needed origin branches M.fetch = { skip = function(plugin) From 736529d097979b3585cbc8e2728543fde9b314ed Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Oct 2023 11:41:49 +0200 Subject: [PATCH 1105/1610] fix(git): automatically restore doc/tags when modified --- lua/lazy/manage/task/git.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index e18968b..1c70b38 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -168,6 +168,12 @@ M.status = { if ok then local lines = vim.split(output, "\n") lines = vim.tbl_filter(function(line) + -- Fix doc/tags being marked as modified + if line:gsub("[\\/]", "/") == "doc/tags" then + local Process = require("lazy.manage.process") + Process.exec({ "git", "checkout", "--", "doc/tags" }, { cwd = self.plugin.dir }) + return false + end return line ~= "" end, lines) if #lines > 0 then From 92869d0928ad3bb1aa61cf61897a78f3faa17835 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Oct 2023 11:52:45 +0200 Subject: [PATCH 1106/1610] fix(process): make sure cwd is a valid directory --- lua/lazy/manage/process.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 9b7fef4..00883e7 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -90,6 +90,11 @@ function M.spawn(cmd, opts) end) end + -- make sure the cwd is valid + if not opts.cwd and type(uv.cwd()) ~= "string" then + opts.cwd = uv.os_homedir() + end + handle = uv.spawn(cmd, { stdio = { nil, stdout, stderr }, args = opts.args, From 58e5726592a3f4a83735edfea996911d8daea002 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Oct 2023 11:53:00 +0200 Subject: [PATCH 1107/1610] feat(git): show help on how to remove local changes --- lua/lazy/manage/task/git.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 1c70b38..9913ea1 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -181,7 +181,8 @@ M.status = { for _, line in ipairs(lines) do self.error = self.error .. " * " .. line .. "\n" end - self.error = self.error .. "Please remove them to update." + self.error = self.error .. "Please remove them to update.\n" + self.error = self.error .. "You can also press `x` to remove the plugin and then `I` to install it again." end end end, From 84d13c1d7e9a887a89525196dababdaad5021c93 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 16:15:05 +0200 Subject: [PATCH 1108/1610] chore(main): release 10.10.0 (#1098) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 15 +++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7b1bd5..a1003ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## [10.10.0](https://github.com/folke/lazy.nvim/compare/v10.9.1...v10.10.0) (2023-10-10) + + +### Features + +* **git:** show error for local changes during check/update ([43e9165](https://github.com/folke/lazy.nvim/commit/43e9165994d76038bd6ebd2d06830a7204ae74e0)) +* **git:** show help on how to remove local changes ([58e5726](https://github.com/folke/lazy.nvim/commit/58e5726592a3f4a83735edfea996911d8daea002)) + + +### Bug Fixes + +* **docs:** broken table in readme ([#1097](https://github.com/folke/lazy.nvim/issues/1097)) ([89581ce](https://github.com/folke/lazy.nvim/commit/89581ce37e1252133725cb583b5ba4fa0a827270)) +* **git:** automatically restore doc/tags when modified ([736529d](https://github.com/folke/lazy.nvim/commit/736529d097979b3585cbc8e2728543fde9b314ed)) +* **process:** make sure cwd is a valid directory ([92869d0](https://github.com/folke/lazy.nvim/commit/92869d0928ad3bb1aa61cf61897a78f3faa17835)) + ## [10.9.1](https://github.com/folke/lazy.nvim/compare/v10.9.0...v10.9.1) (2023-10-09) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 57f5fef..6ed4f94 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -171,7 +171,7 @@ M.defaults = { debug = false, } -M.version = "10.9.1" -- x-release-please-version +M.version = "10.10.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From a617db7e79bf826b46a8032f9170b42f62490013 Mon Sep 17 00:00:00 2001 From: Artyom Andreev <aandreev06.1998@gmail.com> Date: Tue, 10 Oct 2023 19:59:13 +0300 Subject: [PATCH 1109/1610] docs: icon for require without nerd font (#1100) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e5ddc66..1ac4cee 100644 --- a/README.md +++ b/README.md @@ -478,6 +478,7 @@ return { keys = "🗝", plugin = "🔌", runtime = "💻", + require = "🌙", source = "📄", start = "🚀", task = "📌", From 1a47d3b2aacfaba57231201a08fc23b753bab813 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 16:59:52 +0000 Subject: [PATCH 1110/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b378be0..48b123b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -574,6 +574,7 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s keys = "🗝", plugin = "🔌", runtime = "💻", + require = "🌙", source = "📄", start = "🚀", task = "📌", From cb3a0555b96cb90265860561991134e6ae16739c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Oct 2023 19:12:07 +0200 Subject: [PATCH 1111/1610] docs: format table --- README.md | 102 +++++++++++++++++++++++++++--------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 1ac4cee..e8d87c7 100644 --- a/README.md +++ b/README.md @@ -506,24 +506,24 @@ Any operation can be started from the UI, with a sub command or an API function: <!-- commands:start --> -| 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!!) | +| 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 | +| `: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 | <!-- commands:end --> @@ -774,40 +774,40 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori <!-- colors:start --> -| Highlight Group | Default Group | Description | -| --- | --- | --- | -| **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** | ***@text.reference*** | directory | -| **LazyH1** | ***IncSearch*** | home button | -| **LazyH2** | ***Bold*** | titles | -| **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** | ***@parameter*** | | -| **LazyReasonRuntime** | ***@macro*** | | -| **LazyReasonSource** | ***Character*** | | -| **LazyReasonStart** | ***@field*** | | -| **LazySpecial** | ***@punctuation.special*** | | -| **LazyTaskError** | ***ErrorMsg*** | task errors | -| **LazyTaskOutput** | ***MsgArea*** | task output | -| **LazyUrl** | ***@text.reference*** | url | -| **LazyValue** | ***@string*** | value of a property | +| Highlight Group | Default Group | Description | +| --------------------- | -------------------------- | --------------------------------------------------- | +| **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** | **_@text.reference_** | directory | +| **LazyH1** | **_IncSearch_** | home button | +| **LazyH2** | **_Bold_** | titles | +| **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** | **_@parameter_** | | +| **LazyReasonRuntime** | **_@macro_** | | +| **LazyReasonSource** | **_Character_** | | +| **LazyReasonStart** | **_@field_** | | +| **LazySpecial** | **_@punctuation.special_** | | +| **LazyTaskError** | **_ErrorMsg_** | task errors | +| **LazyTaskOutput** | **_MsgArea_** | task output | +| **LazyUrl** | **_@text.reference_** | url | +| **LazyValue** | **_@string_** | value of a property | <!-- colors:end --> From 7b84609a06bd11869370bc20a9255bb469e35a50 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 10 Oct 2023 19:12:35 +0200 Subject: [PATCH 1112/1610] feat(util): expose pretty stacktraces for notify --- lua/lazy/core/util.lua | 63 +++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index da0fcf6..dd9b2a9 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -64,38 +64,41 @@ function M.norm(path) return path:sub(-1) == "/" and path:sub(1, -2) or path end +---@param opts? {level?: number} +function M.pretty_trace(opts) + opts = opts or {} + local Config = require("lazy.core.config") + local trace = {} + local level = opts.level or 2 + while true do + local info = debug.getinfo(level, "Sln") + if not info then + break + end + if info.what ~= "C" and not info.source:find("lazy.nvim") then + local source = info.source:sub(2) + if source:find(Config.options.root, 1, true) == 1 then + source = source:sub(#Config.options.root + 1) + end + source = vim.fn.fnamemodify(source, ":p:~:.") --[[@as string]] + local line = " - " .. source .. ":" .. info.currentline + if info.name then + line = line .. " _in_ **" .. info.name .. "**" + end + table.insert(trace, line) + end + level = level + 1 + end + return #trace > 0 and ("\n\n# stacktrace:\n" .. table.concat(trace, "\n")) or "" +end + ---@param opts? string|{msg:string, on_error:fun(msg)} function M.try(fn, opts) opts = type(opts) == "string" and { msg = opts } or opts or {} local msg = opts.msg -- error handler local error_handler = function(err) - local Config = require("lazy.core.config") - local trace = {} - local level = 1 - while true do - local info = debug.getinfo(level, "Sln") - if not info then - break - end - if info.what ~= "C" and not info.source:find("lazy.nvim") then - local source = info.source:sub(2) - if source:find(Config.options.root, 1, true) == 1 then - source = source:sub(#Config.options.root + 1) - end - source = vim.fn.fnamemodify(source, ":p:~:.") - local line = " - " .. source .. ":" .. info.currentline - if info.name then - line = line .. " _in_ **" .. info.name .. "**" - end - table.insert(trace, line) - end - level = level + 1 - end - msg = (msg and (msg .. "\n\n") or "") .. err - if #trace > 0 then - msg = msg .. "\n\n# stacktrace:\n" .. table.concat(trace, "\n") - end + msg = (msg and (msg .. "\n\n") or "") .. err .. M.pretty_trace() if opts.on_error then opts.on_error(msg) else @@ -292,7 +295,7 @@ function M.extend(list, add) return list end ----@alias LazyNotifyOpts {lang?:string, title?:string, level?:number} +---@alias LazyNotifyOpts {lang?:string, title?:string, level?:number, once?:boolean, stacktrace?:boolean, stacklevel?:number} ---@param msg string|string[] ---@param opts? LazyNotifyOpts @@ -312,8 +315,12 @@ function M.notify(msg, opts) "\n" ) end + if opts.stacktrace then + msg = msg .. M.pretty_trace({ level = opts.stacklevel or 2 }) + end local lang = opts.lang or "markdown" - vim.notify(msg, opts.level or vim.log.levels.INFO, { + local n = opts.once and vim.notify_once or vim.notify + n(msg, opts.level or vim.log.levels.INFO, { on_open = function(win) local ok = pcall(function() vim.treesitter.language.add("markdown") From 2947f104e140e21cc87c55f86c1599fbe26caf0f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 17:13:22 +0000 Subject: [PATCH 1113/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 120 ++++++++++++++++++++-------------------------- 1 file changed, 51 insertions(+), 69 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 48b123b..bf45902 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -600,17 +600,14 @@ 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 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 clean [plugins] require("lazy").clean(opts?) Clean plugins that are no longer needed :Lazy clear require("lazy").clear() Clear finished tasks @@ -624,36 +621,24 @@ function: :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 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 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 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 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 - ---------------------------------------------------------------------------------- + :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: @@ -909,77 +894,74 @@ HIGHLIGHT GROUPS *lazy.nvim-lazy.nvim-highlight-groups* Click to see all highlight groups ~ - ----------------------------------------------------------------------- - Highlight Group Default Group Description - ----------------------- ----------------------- ----------------------- - LazyButton CursorLine + --------------------------------------------------------------------------------- + Highlight Group Default Group Description + ------------------- ------------------------ ------------------------------------ + LazyButton CursorLine - LazyButtonActive Visual + LazyButtonActive Visual - LazyComment Comment + LazyComment Comment - LazyCommit @variable.builtin commit ref + LazyCommit _@variable.builtin_ commitref - LazyCommitIssue Number + LazyCommitIssue Number - LazyCommitScope Italic conventional commit - scope + LazyCommitScope Italic conventional commit scope - LazyCommitType Title conventional commit - type + LazyCommitType Title conventional commit type - LazyDimmed Conceal property + LazyDimmed Conceal property - LazyDir @text.reference directory + LazyDir _@text.reference_ directory - LazyH1 IncSearch home button + LazyH1 IncSearch homebutton - LazyH2 Bold titles + LazyH2 Bold titles - LazyLocal Constant + LazyLocal Constant - LazyNoCond DiagnosticWarn unloaded icon for a - plugin where cond() was - false + LazyNoCond DiagnosticWarn unloaded icon for a plugin where + cond() was false - LazyNormal NormalFloat + LazyNormal NormalFloat - LazyProgressDone Constant progress bar done + LazyProgressDone Constant progress bar done - LazyProgressTodo LineNr progress bar todo + LazyProgressTodo LineNr progress bar todo - LazyProp Conceal property + LazyProp Conceal property - LazyReasonCmd Operator + LazyReasonCmd Operator - LazyReasonEvent Constant + LazyReasonEvent Constant - LazyReasonFt Character + LazyReasonFt Character - LazyReasonImport Identifier + LazyReasonImport Identifier - LazyReasonKeys Statement + LazyReasonKeys Statement - LazyReasonPlugin Special + LazyReasonPlugin Special - LazyReasonRequire @parameter + LazyReasonRequire _@parameter_ - LazyReasonRuntime @macro + LazyReasonRuntime _@macro_ - LazyReasonSource Character + LazyReasonSource Character - LazyReasonStart @field + LazyReasonStart _@field_ - LazySpecial @punctuation.special + LazySpecial _@punctuation.special_ - LazyTaskError ErrorMsg task errors + LazyTaskError ErrorMsg taskerrors - LazyTaskOutput MsgArea task output + LazyTaskOutput MsgArea task output - LazyUrl @text.reference url + LazyUrl _@text.reference_ url - LazyValue @string value of a property - ----------------------------------------------------------------------- + LazyValue _@string_ valueof a property + --------------------------------------------------------------------------------- PLUGIN AUTHORS *lazy.nvim-lazy.nvim-plugin-authors* From 73fbf5ccabd0233653bdeb4bb2b07fcfa97b57e0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 19:52:13 +0200 Subject: [PATCH 1114/1610] chore(main): release 10.11.0 (#1101) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1003ef..e427d30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.11.0](https://github.com/folke/lazy.nvim/compare/v10.10.0...v10.11.0) (2023-10-10) + + +### Features + +* **util:** expose pretty stacktraces for notify ([7b84609](https://github.com/folke/lazy.nvim/commit/7b84609a06bd11869370bc20a9255bb469e35a50)) + ## [10.10.0](https://github.com/folke/lazy.nvim/compare/v10.9.1...v10.10.0) (2023-10-10) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 6ed4f94..9333785 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -171,7 +171,7 @@ M.defaults = { debug = false, } -M.version = "10.10.0" -- x-release-please-version +M.version = "10.11.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 303a3ed6a874bb5bdebf11ecdf99e1dfa3eed2c3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 11 Oct 2023 14:24:18 +0200 Subject: [PATCH 1115/1610] feat(event): added support for structured events (see readme on event) --- README.md | 58 +++++++++++------------ lua/lazy/core/handler/event.lua | 83 +++++++++++++++++++++------------ lua/lazy/types.lua | 2 +- 3 files changed, 82 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index e8d87c7..f17dd46 100644 --- a/README.md +++ b/README.md @@ -79,35 +79,35 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **[1]** | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | -| **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 | -| **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 `fun(LazyPlugin):boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | -| **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. | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require(MAIN).setup(opts)`. Lazy uses several heuristics to determine the plugin's `MAIN` module automatically based on the plugin's **name**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | -| **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 a list of build commands | `build` is executed when a plugin is installed or updated. Before running `build`, a plugin is first loaded. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands. Some plugins provide their own `build.lua` which is automatically used by lazy. So no need to specify a build step for those plugins. | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` or `false` to override the default | Version to use from the repository. Full [Semver](https://devhints.io/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` | -| **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | -| **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | -| **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. | -| **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 | +| Property | Type | Description | +| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **[1]** | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **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` | +| **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 | +| **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 `fun(LazyPlugin):boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | +| **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. | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require(MAIN).setup(opts)`. Lazy uses several heuristics to determine the plugin's `MAIN` module automatically based on the plugin's **name**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | +| **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 a list of build commands | `build` is executed when a plugin is installed or updated. Before running `build`, a plugin is first loaded. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands. Some plugins provide their own `build.lua` which is automatically used by lazy. So no need to specify a build step for those plugins. | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` or `false` to override the default | Version to use from the repository. Full [Semver](https://devhints.io/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` | +| **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` or `{event:string[]\|string, pattern?:string[]\|string}` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | +| **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| **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. | +| **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 | ### Lazy Loading diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 3a8d9a7..69f9086 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -4,12 +4,14 @@ local Util = require("lazy.core.util") ---@class LazyEventOpts ---@field event string ----@field pattern? string ---@field group? string ---@field exclude? string[] ---@field data? any ---@field buffer? number +---@alias LazyEvent {id:string, event:string[]|string, pattern?:string[]|string} +---@alias LazyEventSpec string|{event?:string|string[], pattern?:string|string[]}|string[] + ---@class LazyEventHandler:LazyHandler ---@field events table<string,true> ---@field group number @@ -23,28 +25,64 @@ M.triggers = { M.group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) ----@param value string -function M:_add(value) - local event_spec = self:_event(value) - ---@type string?, string? - local event, pattern = event_spec:match("^(%w+)%s+(.*)$") - event = event or event_spec +---@param spec LazyEventSpec +---@return LazyEvent +function M:parse(spec) + local ret = M.mappings[spec] --[[@as LazyEvent?]] + if ret then + return ret + end + if type(spec) == "string" then + local event, pattern = spec:match("^(%w+)%s+(.*)$") + event = event or spec + return { id = spec, event = event, pattern = pattern } + elseif Util.is_list(spec) then + ret = { id = table.concat(spec, "|"), event = spec } + else + ret = spec --[[@as LazyEvent]] + if not ret.id then + ---@diagnostic disable-next-line: assign-type-mismatch, param-type-mismatch + ret.id = type(ret.event) == "string" and ret.event or table.concat(ret.event, "|") + if ret.pattern then + ---@diagnostic disable-next-line: assign-type-mismatch, param-type-mismatch + ret.id = ret.id .. " " .. (type(ret.pattern) == "string" and ret.pattern or table.concat(ret.pattern, ", ")) + end + end + end + return ret +end + +---@param plugin LazyPlugin +function M:values(plugin) + ---@type table<string,any> + local values = {} + ---@diagnostic disable-next-line: no-unknown + for _, value in ipairs(plugin[self.type] or {}) do + local event = self:parse(value) + values[event.id] = event + end + return values +end + +---@param event LazyEvent +function M:_add(event) local done = false - vim.api.nvim_create_autocmd(event, { + vim.api.nvim_create_autocmd(event.event, { group = self.group, once = true, - pattern = pattern, + pattern = event.pattern, callback = function(ev) - if done or not self.active[value] then + if done or not self.active[event.id] then return end + -- HACK: work-around for https://github.com/neovim/neovim/issues/25526 done = true - Util.track({ [self.type] = value }) + Util.track({ [self.type] = event.id }) - local state = M.get_state(ev.event, pattern, ev.buf, ev.data) + local state = M.get_state(ev.event, ev.buf, ev.data) -- load the plugins - Loader.load(self.active[value], { [self.type] = value }) + Loader.load(self.active[event.id], { [self.type] = event.id }) -- check if any plugin created an event handler for this event and fire the group for _, s in ipairs(state) do @@ -57,38 +95,23 @@ end -- Get the current state of the event and all the events that will be fired ---@param event string ----@param pattern? string ---@param buf number ---@param data any -function M.get_state(event, pattern, buf, data) +function M.get_state(event, buf, data) local state = {} ---@type LazyEventOpts[] while event do table.insert(state, 1, { event = event, - pattern = pattern, exclude = event ~= "FileType" and M.get_augroups(event) or nil, buffer = buf, data = data, }) data = nil -- only pass the data to the first event - if event == "FileType" then - pattern = nil -- only use the pattern for the first event - end event = M.triggers[event] end return state end ----@param value string -function M:_event(value) - if value == "VeryLazy" then - return "User VeryLazy" - elseif value == "BufRead" then - return "BufReadPost" - end - return value -end - -- Get all augroups for the events ---@param event string function M.get_augroups(event) @@ -127,7 +150,6 @@ function M._trigger(opts) Util.info({ "# Firing Events", " - **event:** " .. opts.event, - opts.pattern and (" - **pattern:** " .. opts.pattern), opts.group and (" - **group:** " .. opts.group), opts.buffer and (" - **buffer:** " .. opts.buffer), }) @@ -135,7 +157,6 @@ function M._trigger(opts) Util.track({ event = opts.group or opts.event }) Util.try(function() vim.api.nvim_exec_autocmds(opts.event, { - -- pattern = opts.pattern, buffer = opts.buffer, group = opts.group, modeline = false, diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 3e7f74d..e83b9c4 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -29,7 +29,7 @@ ---@field opts? PluginOpts ---@class LazyPluginHandlers ----@field event? string[] +---@field event? LazyEventSpec[] ---@field cmd? string[] ---@field ft? string[] ---@field keys? (string|LazyKeysSpec)[] From b65d3086623448b93bf02055f73819b76ca1dd78 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 11 Oct 2023 14:24:40 +0200 Subject: [PATCH 1116/1610] feat(event): custom lazy event hook for distros --- lua/lazy/core/handler/event.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 69f9086..dd1a38f 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -23,6 +23,16 @@ M.triggers = { BufReadPost = "BufReadPre", } +-- A table of mappings for custom events +-- Can be used by distros to add custom events (see usage in LazyVim) +---@type table<string, LazyEvent> +M.mappings = { + VeryLazy = { id = "VeryLazy", event = "User", pattern = "VeryLazy" }, + -- Example: + -- LazyFile = { id = "LazyFile", event = { "BufReadPost", "BufNewFile", "BufWritePre" } }, +} +M.mappings["User VeryLazy"] = M.mappings.VeryLazy + M.group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) ---@param spec LazyEventSpec From 99ee28473962d9ab8aa11db2d2cc201e38f0f432 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 11 Oct 2023 14:25:10 +0200 Subject: [PATCH 1117/1610] fix(ui): use actual handler values for rendering plugin handlers --- lua/lazy/core/handler/ft.lua | 13 ++++++++----- lua/lazy/view/render.lua | 25 ++++++++++++++----------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lua/lazy/core/handler/ft.lua b/lua/lazy/core/handler/ft.lua index f0947c6..7af2b9a 100644 --- a/lua/lazy/core/handler/ft.lua +++ b/lua/lazy/core/handler/ft.lua @@ -5,11 +5,6 @@ local Loader = require("lazy.core.loader") local M = {} M.extends = Event ----@param value string -function M:_event(value) - return "FileType " .. value -end - ---@param plugin LazyPlugin function M:add(plugin) self.super.add(self, plugin) @@ -18,4 +13,12 @@ function M:add(plugin) end end +function M:parse(value) + return { + id = value, + event = "FileType", + pattern = value, + } +end + return M diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 12c3da3..d4cfdfb 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -319,17 +319,13 @@ function M:reason(reason, opts) end for _, key in ipairs(keys) do local value = reason[key] - if type(key) == "number" then - -- elseif key == "require" then - elseif key ~= "time" then + local skip = type(key) == "number" or key == "time" + if not skip then if first then first = false else self:append(" ") end - if key == "event" then - value = value:match("User (.*)") or value - end if key == "keys" then value = type(value) == "string" and value or value.lhs or value[1] end @@ -414,11 +410,18 @@ function M:plugin(plugin) if plugin._.kind ~= "disabled" then for handler in pairs(Handler.types) do if plugin[handler] then - local trigger = {} - for _, value in ipairs(plugin[handler]) do - table.insert(trigger, type(value) == "table" and value[1] or value) - end - reason[handler] = table.concat(trigger, " ") + local values = Handler.handlers[handler]:values(plugin) + values = vim.tbl_map(function(value) + if handler == "ft" or handler == "event" then + ---@cast value LazyEvent + return value.id + elseif handler == "keys" then + ---@cast value LazyKeys + return value.lhs .. (value.mode == "n" and "" or " (" .. value.mode .. ")") + end + return value + end, vim.tbl_values(values)) + reason[handler] = table.concat(values, " ") end end end From 9ca9a63be5672aafbb30cf6984c065da3927b1ee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 12:26:07 +0000 Subject: [PATCH 1118/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 77 ++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index bf45902..62a6025 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 10 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 11 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -103,9 +103,9 @@ It is recommended to run `:checkhealth lazy` after installation. PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* - ---------------------------------------------------------------------------------------------------------------------------------- + -------------------------------------------------------------------------------------------------------------------------------- Property Type Description - -------------- ------------------------------------------------------------ ------------------------------------------------------ + -------------- ------------------------------------------------------------ ---------------------------------------------------- [1] string? Short plugin url. Will be expanded using config.git.url_format @@ -113,40 +113,40 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* 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 + 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 - 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 + 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 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 fun(LazyPlugin):boolean When false, or if the function returns false, then - this plugin will not be loaded. Useful to disable some - plugins in vscode, or firenvim for example. + this plugin will not be loaded. Useful to disable + some plugins in vscode, or firenvim for example. - 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. + 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. init fun(LazyPlugin) init functions are always executed during startup opts table or fun(LazyPlugin, opts:table) opts should be a table (will be merged with parent 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() + 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) or true config is executed when the plugin loads. The default - implementation will automatically run + config fun(LazyPlugin, opts:table) or true config is executed when the plugin loads. The + default implementation will automatically run require(MAIN).setup(opts). Lazy uses several heuristics to determine the plugin’s MAIN module automatically based on the plugin’s name. See also @@ -160,11 +160,12 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* build fun(LazyPlugin) or string or a list of build commands build is executed when a plugin is installed or updated. Before running build, a plugin is first loaded. If it’s a string it will be ran as a shell - command. When prefixed with : it is a Neovim command. - You can also specify a list to executed multiple build - commands. Some plugins provide their own build.lua - which is automatically used by lazy. So no need to - specify a build step for those plugins. + command. When prefixed with : it is a Neovim + command. You can also specify a list to executed + multiple build commands. Some plugins provide their + own build.lua which is automatically used by lazy. + So no need to specify a build step for those + plugins. branch string? Branch of the repository @@ -172,16 +173,18 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* commit string? Commit of the repository - version string? or false to override the default Version to use from the repository. Full Semver ranges - are supported + version string? or false to override the default Version to use from the repository. Full Semver + ranges are supported - pin boolean? When true, this plugin will not be included in updates + 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 event string? or string[] or Lazy-load on event. Events can be specified as - fun(self:LazyPlugin, event:string[]):string[] BufEnter or with a pattern like BufEnter *.lua + fun(self:LazyPlugin, event:string[]):string[] or BufEnter or with a pattern like BufEnter *.lua + {event:string[]\|string, pattern?:string[]\|string} cmd string? or string[] or Lazy-load on command fun(self:LazyPlugin, cmd:string[]):string[] @@ -196,17 +199,17 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* required somewhere 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. + loading certain plugins first. Default priority is + 50. It’s recommended to set this to a high number + for colorschemes. 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 - ---------------------------------------------------------------------------------------------------------------------------------- + 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 + -------------------------------------------------------------------------------------------------------------------------------- LAZY LOADING ~ From 906ff8e569872d9081cfc9246d917011c22b5e61 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 15:00:30 +0200 Subject: [PATCH 1119/1610] chore(main): release 10.12.0 (#1102) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e427d30..11b36a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [10.12.0](https://github.com/folke/lazy.nvim/compare/v10.11.0...v10.12.0) (2023-10-11) + + +### Features + +* **event:** added support for structured events (see readme on event) ([303a3ed](https://github.com/folke/lazy.nvim/commit/303a3ed6a874bb5bdebf11ecdf99e1dfa3eed2c3)) +* **event:** custom lazy event hook for distros ([b65d308](https://github.com/folke/lazy.nvim/commit/b65d3086623448b93bf02055f73819b76ca1dd78)) + + +### Bug Fixes + +* **ui:** use actual handler values for rendering plugin handlers ([99ee284](https://github.com/folke/lazy.nvim/commit/99ee28473962d9ab8aa11db2d2cc201e38f0f432)) + ## [10.11.0](https://github.com/folke/lazy.nvim/compare/v10.10.0...v10.11.0) (2023-10-10) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9333785..e74eee6 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -171,7 +171,7 @@ M.defaults = { debug = false, } -M.version = "10.11.0" -- x-release-please-version +M.version = "10.12.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 43c284a57870e1a7ed42782eacf444a6a752f81e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maria=20Jos=C3=A9=20Solano?= <majosolano99@gmail.com> Date: Wed, 11 Oct 2023 22:18:53 -0700 Subject: [PATCH 1120/1610] feat(keys): include custom keys in help menu (#1105) --- README.md | 33 +++++++++++++++++++-------------- doc/lazy.nvim.txt | 37 +++++++++++++++++++++---------------- lua/lazy/core/config.lua | 33 +++++++++++++++++++-------------- lua/lazy/view/init.lua | 7 ++++--- lua/lazy/view/render.lua | 8 ++++++++ 5 files changed, 71 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index f17dd46..13b25e1 100644 --- a/README.md +++ b/README.md @@ -371,22 +371,27 @@ return { browser = nil, ---@type string? throttle = 20, -- how frequently should the ui process render events custom_keys = { - -- you can define custom key maps here. - -- To disable one of the defaults, set it to false + -- 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. - -- open lazygit log - ["<localleader>l"] = function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, - -- open a terminal for the plugin dir - ["<localleader>t"] = function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, }, }, diff = { diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 62a6025..a0cd52f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -473,22 +473,27 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* browser = nil, ---@type string? throttle = 20, -- how frequently should the ui process render events custom_keys = { - -- you can define custom key maps here. - -- To disable one of the defaults, set it to false - - -- open lazygit log - ["<localleader>l"] = function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - - -- open a terminal for the plugin dir - ["<localleader>t"] = function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, + -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, }, }, diff = { diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index e74eee6..81b4477 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -81,22 +81,27 @@ M.defaults = { browser = nil, ---@type string? throttle = 20, -- how frequently should the ui process render events custom_keys = { - -- you can define custom key maps here. - -- To disable one of the defaults, set it to false + -- 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. - -- open lazygit log - ["<localleader>l"] = function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, - -- open a terminal for the plugin dir - ["<localleader>t"] = function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, }, }, diff = { diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 1be4b16..e62fc6e 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -121,9 +121,10 @@ function M.create() end end) - for key, handler in pairs(Config.options.ui.custom_keys) do - if handler then - self:on_key(key, function() + for lhs, rhs in pairs(Config.options.ui.custom_keys) do + if rhs then + local handler = type(rhs) == "table" and rhs[1] or rhs + self:on_key(lhs, function() local plugin = self.render:get_plugin() if plugin then handler(plugin) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index d4cfdfb..fca229b 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -209,6 +209,14 @@ function M:help() self:append(" " .. (mode.desc_plugin or mode.desc)):nl() end end + for lhs, rhs in pairs(Config.options.ui.custom_keys) do + if type(rhs) == "table" and rhs.desc then + self:append("- ", "LazySpecial", { indent = 2 }) + self:append("Custom key ", "Title") + self:append(lhs, "LazyProp") + self:append(" " .. rhs.desc):nl() + end + end end function M:progressbar() From 84ae36f30d157ad2d3fb54abdad15700429cf5b6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 05:19:35 +0000 Subject: [PATCH 1121/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a0cd52f..4b859db 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 11 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 12 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -476,7 +476,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* -- 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. - + ["<localleader>l"] = { function(plugin) require("lazy.util").float_term({ "lazygit", "log" }, { @@ -485,7 +485,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* end, desc = "Open lazygit log", }, - + ["<localleader>t"] = { function(plugin) require("lazy.util").float_term(nil, { From 117556d9e73136c434b553b29c0d32a05152eecc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 11:40:26 +0200 Subject: [PATCH 1122/1610] chore(main): release 10.13.0 (#1106) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11b36a3..935ac60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.13.0](https://github.com/folke/lazy.nvim/compare/v10.12.0...v10.13.0) (2023-10-12) + + +### Features + +* **keys:** include custom keys in help menu ([#1105](https://github.com/folke/lazy.nvim/issues/1105)) ([43c284a](https://github.com/folke/lazy.nvim/commit/43c284a57870e1a7ed42782eacf444a6a752f81e)) + ## [10.12.0](https://github.com/folke/lazy.nvim/compare/v10.11.0...v10.12.0) (2023-10-11) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 81b4477..fe963d7 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.12.0" -- x-release-please-version +M.version = "10.13.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 7f70dd17497973f2a83e7e46aa7479111174e765 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 12 Oct 2023 12:23:39 +0200 Subject: [PATCH 1123/1610] fix(git): unset GIT_INDEX_FILE so we dont accidentally overwrite a different git repo. Fixes #1107 --- lua/lazy/manage/process.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 00883e7..1db3677 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -64,6 +64,7 @@ function M.spawn(cmd, opts) env.GIT_DIR = nil env.GIT_WORK_TREE = nil env.GIT_TERMINAL_PROMPT = "0" + env.GIT_INDEX_FILE = nil ---@type string[] local env_flat = {} From 33c447b96e1cb1a5a2be87982d5d32bb5054079d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 12:40:23 +0200 Subject: [PATCH 1124/1610] chore(main): release 10.13.1 (#1108) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 935ac60..936aa88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.13.1](https://github.com/folke/lazy.nvim/compare/v10.13.0...v10.13.1) (2023-10-12) + + +### Bug Fixes + +* **git:** unset GIT_INDEX_FILE so we dont accidentally overwrite a different git repo. Fixes [#1107](https://github.com/folke/lazy.nvim/issues/1107) ([7f70dd1](https://github.com/folke/lazy.nvim/commit/7f70dd17497973f2a83e7e46aa7479111174e765)) + ## [10.13.0](https://github.com/folke/lazy.nvim/compare/v10.12.0...v10.13.0) (2023-10-12) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index fe963d7..c68dd84 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.13.0" -- x-release-please-version +M.version = "10.13.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 37694611946387dc79d546bdc193bc8611ac1c6d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 13 Oct 2023 11:37:38 +0200 Subject: [PATCH 1125/1610] fix(float): disable swapfile for files shown in Float --- lua/lazy/view/float.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index f69108e..0a21b38 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -104,6 +104,8 @@ function M:mount() self.buf = self.buf elseif self.opts.file then self.buf = vim.fn.bufadd(self.opts.file) + vim.bo[self.buf].readonly = true + vim.bo[self.buf].swapfile = false vim.fn.bufload(self.buf) vim.bo[self.buf].modifiable = false elseif self.opts.buf then From 70f764bf735f74aed795188aeb8e57ccae0ae94e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 13 Oct 2023 11:37:52 +0200 Subject: [PATCH 1126/1610] fix(util): Util.merge now skips nil args --- lua/lazy/core/util.lua | 11 ++++------- tests/core/util_spec.lua | 22 +++++++++++++++++++++- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index dd9b2a9..0b27797 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -396,22 +396,19 @@ end ---@param ... T ---@return T function M.merge(...) - local values = { ... } - local ret = values[1] - + local ret = select(1, ...) if ret == vim.NIL then ret = nil end - - for i = 2, #values, 1 do - local value = values[i] + for i = 2, select("#", ...) do + local value = select(i, ...) if can_merge(ret) and can_merge(value) then for k, v in pairs(value) do ret[k] = M.merge(ret[k], v) end elseif value == vim.NIL then ret = nil - else + elseif value ~= nil then ret = value end end diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index 97c42c7..1d3592c 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -101,6 +101,22 @@ describe("util", function() input = { { a = 1 }, { b = 2 } }, output = { a = 1, b = 2 }, }, + { + input = { nil, { a = 1 }, { b = 2 } }, + output = { a = 1, b = 2 }, + }, + { + input = { { a = 1 }, { b = 2 }, nil }, + output = { a = 1, b = 2 }, + }, + { + input = { { a = 1 }, nil, { b = 2 } }, + output = { a = 1, b = 2 }, + }, + { + input = { nil, { a = 1 }, nil, { b = 2 }, nil }, + output = { a = 1, b = 2 }, + }, { input = { { a = 1 }, { a = 2 } }, output = { a = 2 }, @@ -120,7 +136,11 @@ describe("util", function() } for _, test in ipairs(tests) do - assert.same(test.output, Util.merge(unpack(test.input))) + local n = 0 + for i in pairs(test.input) do + n = math.max(n, i) + end + assert.same(test.output, Util.merge(unpack(test.input, 1, n))) end end) end) From e15dfab3c3729af6e54df2828c82db9698ba2c0a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 09:38:43 +0000 Subject: [PATCH 1127/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4b859db..b602b6a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 12 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 13 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From a026f7395324aad8df1cbd45112d620f528123ba Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 13 Oct 2023 12:37:41 +0200 Subject: [PATCH 1128/1610] docs: fix types for `keys`. Fixes #1109 --- README.md | 2 +- lua/lazy/types.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 13b25e1..86cc9ef 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ require("lazy").setup({ | **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` or `{event:string[]\|string, pattern?:string[]\|string}` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | | **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | | **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[]` | Lazy-load on key mapping | +| **keys** | `string?` or `string[]` or `LazyKeysSpec[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeysSpec)[]` | Lazy-load on key mapping | | **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | | **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. | | **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 | diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index e83b9c4..54c0930 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -61,10 +61,10 @@ ---@field _ LazyPluginState ---@class LazyPluginSpecHandlers ----@field event? string[]|string|fun(self:LazyPlugin, event:string[]):string[] +---@field event? string[]|string|LazyEventSpec[]|fun(self:LazyPlugin, event:string[]):string[] ---@field cmd? string[]|string|fun(self:LazyPlugin, cmd:string[]):string[] ---@field ft? string[]|string|fun(self:LazyPlugin, ft:string[]):string[] ----@field keys? string|string[]|LazyKeys[]|fun(self:LazyPlugin, keys:string[]):(string|LazyKeys)[] +---@field keys? string|string[]|LazyKeysSpec[]|fun(self:LazyPlugin, keys:string[]):(string|LazyKeys)[] ---@field module? false ---@class LazyPluginSpec: LazyPluginBase,LazyPluginSpecHandlers,LazyPluginHooks,LazyPluginRef From 8a6379eddd2bffaad20aefe74580c1b546477ae8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 10:38:26 +0000 Subject: [PATCH 1129/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 162 +++++++++++++++++++++++----------------------- 1 file changed, 81 insertions(+), 81 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b602b6a..878faa9 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -103,113 +103,113 @@ It is recommended to run `:checkhealth lazy` after installation. PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* - -------------------------------------------------------------------------------------------------------------------------------- - Property Type Description - -------------- ------------------------------------------------------------ ---------------------------------------------------- - [1] string? Short plugin url. Will be expanded using - config.git.url_format + ------------------------------------------------------------------------------------------------------------------------------------ + Property Type Description + -------------- ---------------------------------------------------------------- ---------------------------------------------------- + [1] string? Short plugin url. Will be expanded using + config.git.url_format - dir string? A directory pointing to a local plugin + dir string? A directory pointing to a local plugin - url string? A custom git url where the plugin is hosted + 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 + 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 + dev boolean? When true, a local plugin directory will be used + instead. See config.dev - 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 + 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 - enabled boolean? or fun():boolean When false, or if the function returns false, then - this plugin will not be included in the spec + 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 fun(LazyPlugin):boolean When false, or if the function returns false, then - this plugin will not be loaded. Useful to disable - some plugins in vscode, or firenvim for example. + cond boolean? or fun(LazyPlugin):boolean When false, or if the function returns false, then + this plugin will not be loaded. Useful to disable + some plugins in vscode, or firenvim for example. - 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. + 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. - init fun(LazyPlugin) init functions are always executed during startup + init fun(LazyPlugin) init functions are always executed during startup - opts table or fun(LazyPlugin, opts:table) opts should be a table (will be merged with parent - 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() + opts table or fun(LazyPlugin, opts:table) opts should be a table (will be merged with parent + 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) or true config is executed when the plugin loads. The - default implementation will automatically run - require(MAIN).setup(opts). Lazy uses several - heuristics to determine the plugin’s MAIN module - automatically based on the plugin’s name. See also - opts. To use the default implementation without opts - set config to true. + config fun(LazyPlugin, opts:table) or true config is executed when the plugin loads. The + default implementation will automatically run + require(MAIN).setup(opts). Lazy uses several + heuristics to determine the plugin’s MAIN module + automatically based on the plugin’s name. See also + opts. To use the default implementation without opts + set config to true. - main string? You can specify the main module to use for config() - and opts(), in case it can not be determined - automatically. See config() + 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 a list of build commands build is executed when a plugin is installed or - updated. Before running build, a plugin is first - loaded. If it’s a string it will be ran as a shell - command. When prefixed with : it is a Neovim - command. You can also specify a list to executed - multiple build commands. Some plugins provide their - own build.lua which is automatically used by lazy. - So no need to specify a build step for those - plugins. + build fun(LazyPlugin) or string or a list of build commands build is executed when a plugin is installed or + updated. Before running build, a plugin is first + loaded. If it’s a string it will be ran as a shell + command. When prefixed with : it is a Neovim + command. You can also specify a list to executed + multiple build commands. Some plugins provide their + own build.lua which is automatically used by lazy. + So no need to specify a build step for those + plugins. - branch string? Branch of the repository + branch string? Branch of the repository - tag string? Tag of the repository + tag string? Tag of the repository - commit string? Commit of the repository + commit string? Commit of the repository - version string? or false to override the default Version to use from the repository. Full Semver - ranges are supported + version string? or false to override the default Version to use from the repository. Full Semver + ranges are supported - pin boolean? When true, this plugin will not be included in - updates + 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 + submodules boolean? When false, git submodules will not be fetched. + Defaults to true - event string? or string[] or Lazy-load on event. Events can be specified as - fun(self:LazyPlugin, event:string[]):string[] or BufEnter or with a pattern like BufEnter *.lua - {event:string[]\|string, pattern?:string[]\|string} + event string? or string[] or Lazy-load on event. Events can be specified as + fun(self:LazyPlugin, event:string[]):string[] or BufEnter or with a pattern like BufEnter *.lua + {event:string[]\|string, pattern?:string[]\|string} - cmd string? or string[] or Lazy-load on command - fun(self:LazyPlugin, cmd:string[]):string[] + 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[] + ft string? or string[] or Lazy-load on filetype + fun(self:LazyPlugin, ft:string[]):string[] - keys string? or string[] or LazyKeys[] or Lazy-load on key mapping - fun(self:LazyPlugin, keys:string[]):(string \| LazyKeys)[] + keys string? or string[] or LazyKeysSpec[] or Lazy-load on key mapping + fun(self:LazyPlugin, keys:string[]):(string \| LazyKeysSpec)[] - module false? Do not automatically load this Lua module when it’s - required somewhere + module false? Do not automatically load this Lua module when it’s + required somewhere - 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. + 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. - 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 - -------------------------------------------------------------------------------------------------------------------------------- + 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 + ------------------------------------------------------------------------------------------------------------------------------------ LAZY LOADING ~ From 9f5637f1d7112637df29ca1104540874e9c84b72 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 13 Oct 2023 13:14:39 +0200 Subject: [PATCH 1130/1610] docs: another LazyKeys reference. Fixes #1109 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 86cc9ef..9fcf781 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ 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 `LazyKeys` table with the following key-value pairs: +can be a `LazyKeysSpec` table with the following key-value pairs: - **[1]**: (`string`) lhs **_(required)_** - **[2]**: (`string|fun()`) rhs **_(optional)_** From 8d712c8e5d7ee0c43713934e955a17e39a1aad72 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 11:15:19 +0000 Subject: [PATCH 1131/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 878faa9..6b76d6a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -249,7 +249,8 @@ 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 `LazyKeys` table with the following key-value pairs: +mappings, or it can be a `LazyKeysSpec` table with the following key-value +pairs: - **[1]**(`string`) lhs **(required)** - **[2]**(`string|fun()`) rhs **(optional)** From 276e572f645430bcfd6fd25faa301ea9077f6ab1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 13:17:52 +0200 Subject: [PATCH 1132/1610] chore(main): release 10.13.2 (#1110) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 936aa88..fbb9bdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [10.13.2](https://github.com/folke/lazy.nvim/compare/v10.13.1...v10.13.2) (2023-10-13) + + +### Bug Fixes + +* **float:** disable swapfile for files shown in Float ([3769461](https://github.com/folke/lazy.nvim/commit/37694611946387dc79d546bdc193bc8611ac1c6d)) +* **util:** Util.merge now skips nil args ([70f764b](https://github.com/folke/lazy.nvim/commit/70f764bf735f74aed795188aeb8e57ccae0ae94e)) + ## [10.13.1](https://github.com/folke/lazy.nvim/compare/v10.13.0...v10.13.1) (2023-10-12) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c68dd84..c77936a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.13.1" -- x-release-please-version +M.version = "10.13.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From ad5da0ae20beca5dd89cb17c515c237c46c37b1e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 14 Oct 2023 16:00:30 +0200 Subject: [PATCH 1133/1610] fix(ui): sort lazy plugin handlers --- lua/lazy/view/render.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index fca229b..b5d83a0 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -429,6 +429,7 @@ function M:plugin(plugin) end return value end, vim.tbl_values(values)) + table.sort(values) reason[handler] = table.concat(values, " ") end end From 2b8b8b020b2922722cbc2bd2f51b894699689c1f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 14:01:16 +0000 Subject: [PATCH 1134/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6b76d6a..dead002 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 13 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 14 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From a27935e0d4d14658f976f50042b98d254b8c13fd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 17:02:44 +0200 Subject: [PATCH 1135/1610] chore(main): release 10.13.3 (#1116) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbb9bdc..9a05737 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.13.3](https://github.com/folke/lazy.nvim/compare/v10.13.2...v10.13.3) (2023-10-14) + + +### Bug Fixes + +* **ui:** sort lazy plugin handlers ([ad5da0a](https://github.com/folke/lazy.nvim/commit/ad5da0ae20beca5dd89cb17c515c237c46c37b1e)) + ## [10.13.2](https://github.com/folke/lazy.nvim/compare/v10.13.1...v10.13.2) (2023-10-13) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c77936a..9652da0 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.13.2" -- x-release-please-version +M.version = "10.13.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From a993bfd6de7266c531b1f462a1d64e307b4ca349 Mon Sep 17 00:00:00 2001 From: sibouras <64098483+sibouras@users.noreply.github.com> Date: Sat, 14 Oct 2023 16:14:45 +0100 Subject: [PATCH 1136/1610] docs: update git.log in readme (#1115) * docs: update git.log in readme * Revert "docs: update git.log in readme" This reverts commit ff602aa987cde7324a9d15f2f888628f2741ea3f. * update git.log in lazy.core.config --- lua/lazy/core/config.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9652da0..f38ee1f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -20,8 +20,8 @@ M.defaults = { concurrency = jit.os:find("Windows") and (vim.loop.available_parallelism() * 2) or nil, ---@type number limit the maximum amount of concurrent tasks git = { -- defaults for the `Lazy log` command - -- log = { "-10" }, -- show the last 10 commits - log = { "-8" }, -- show commits from the last 3 days + -- 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, From 3b31897275d5c09e2654db1c163b87eb383ca25e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 14 Oct 2023 17:30:24 +0200 Subject: [PATCH 1137/1610] fix(cmd): lazy-cmds no longer show an error for buffer-local commands --- lua/lazy/core/handler/cmd.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index 6ff9623..ef7a2bd 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -33,7 +33,7 @@ function M:_add(cmd) self:_load(cmd) - local info = vim.api.nvim_get_commands({})[cmd] + local info = vim.api.nvim_get_commands({})[cmd] or vim.api.nvim_buf_get_commands(0, {})[cmd] if not info then return Util.error("Command `" .. cmd .. "` not found after loading " .. plugins) end From 1c16e4236f0937e8955865a0e5e046c7dafbc4b5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 17:33:31 +0200 Subject: [PATCH 1138/1610] chore(main): release 10.13.4 (#1117) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a05737..95c49a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.13.4](https://github.com/folke/lazy.nvim/compare/v10.13.3...v10.13.4) (2023-10-14) + + +### Bug Fixes + +* **cmd:** lazy-cmds no longer show an error for buffer-local commands ([3b31897](https://github.com/folke/lazy.nvim/commit/3b31897275d5c09e2654db1c163b87eb383ca25e)) + ## [10.13.3](https://github.com/folke/lazy.nvim/compare/v10.13.2...v10.13.3) (2023-10-14) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f38ee1f..cf278a9 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.13.3" -- x-release-please-version +M.version = "10.13.4" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 0c53d4673ff02c57a192558325b394cfd9adde0f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 14 Oct 2023 23:07:01 +0200 Subject: [PATCH 1139/1610] feat(plugin): treat url changes as warnings. They will only be shown with checkhealth --- lua/lazy/core/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 3e5743a..dbfcb46 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -441,7 +441,7 @@ function Spec:merge(old, new) new._.dep = old._.dep and new._.dep if new.url and old.url and new.url ~= old.url then - self:error("Two plugins with the same name and different url:\n" .. vim.inspect({ old = old, new = new })) + self:warn("Two plugins with the same name and different url:\n" .. vim.inspect({ old = old, new = new })) end if new.dependencies and old.dependencies then From 3dc413d6fd279dfff777a9f9a964697a16c5aabc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 15 Oct 2023 08:36:15 +0200 Subject: [PATCH 1140/1610] fix(plugin): improved dir/dev merging. Fixes #993 --- lua/lazy/core/plugin.lua | 38 +++++++++++++++++++++++++++----------- lua/lazy/types.lua | 1 + tests/core/plugin_spec.lua | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index dbfcb46..a915d8f 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -84,8 +84,11 @@ function Spec:add(plugin, results) end end + ---@type string? + local dir + if plugin.dir then - plugin.dir = Util.norm(plugin.dir) + dir = Util.norm(plugin.dir) -- local plugin plugin.name = plugin.name or Spec.get_name(plugin.dir) elseif plugin.url then @@ -99,16 +102,6 @@ function Spec:add(plugin, results) end end end - -- dev plugins - if - plugin.dev - and (not Config.options.dev.fallback or vim.fn.isdirectory(Config.options.dev.path .. "/" .. plugin.name) == 1) - then - plugin.dir = Config.options.dev.path .. "/" .. plugin.name - else - -- remote plugin - plugin.dir = Config.options.root .. "/" .. plugin.name - end elseif is_ref then plugin.name = plugin[1] else @@ -121,6 +114,17 @@ function Spec:add(plugin, results) return end + -- dev plugins + if + plugin.dev + and (not Config.options.dev.fallback or vim.fn.isdirectory(Config.options.dev.path .. "/" .. plugin.name) == 1) + then + dir = Config.options.dev.path .. "/" .. plugin.name + elseif plugin.dev == false then + -- explicitely select the default path + dir = Config.options.root .. "/" .. plugin.name + end + if type(plugin.config) == "table" then self:warn( "{" .. plugin.name .. "}: setting a table to `Plugin.config` is deprecated. Please use `Plugin.opts` instead" @@ -134,12 +138,15 @@ function Spec:add(plugin, results) M.last_fid = M.last_fid + 1 plugin._ = { + dir = dir, fid = M.last_fid, fpid = fpid, dep = fpid ~= nil, module = self.importing, } self.fragments[plugin._.fid] = plugin + -- remote plugin + plugin.dir = plugin._.dir or (plugin.name and (Config.options.root .. "/" .. plugin.name)) or nil if fpid then local parent = self.fragments[fpid] @@ -328,11 +335,14 @@ end function Spec:report(level) level = level or vim.log.levels.ERROR + local count = 0 for _, notif in ipairs(self.notifs) do if notif.level >= level then Util.notify(notif.msg, { level = notif.level }) + count = count + 1 end end + return count end ---@param spec LazySpec|LazySpecImport @@ -448,6 +458,12 @@ function Spec:merge(old, new) Util.extend(new.dependencies, old.dependencies) end + local new_dir = new._.dir or old._.dir or (new.name and (Config.options.root .. "/" .. new.name)) or nil + if new_dir ~= new.dir then + self:warn("Plugin `" .. new.name .. "` changed `dir`:\n- from: `" .. new.dir .. "`\n- to: `" .. new_dir .. "`") + end + new.dir = new_dir + new._.super = old setmetatable(new, { __index = old }) diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 54c0930..0434359 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -18,6 +18,7 @@ ---@field cond? boolean ---@field super? LazyPlugin ---@field module? string +---@field dir? string Explicit dir or dev set for this plugin ---@alias PluginOpts table|fun(self:LazyPlugin, opts:table):table? diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 15eb060..cae8542 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -50,6 +50,43 @@ describe("plugin spec url/name", function() end end) +describe("plugin spec dir", function() + local tests = { + { + "~/projects/gitsigns.nvim", + { "lewis6991/gitsigns.nvim", opts = {}, dev = true }, + { "lewis6991/gitsigns.nvim" }, + }, + { + "~/projects/gitsigns.nvim", + { "lewis6991/gitsigns.nvim", opts = {}, dev = true }, + { "gitsigns.nvim" }, + }, + { + "~/projects/gitsigns.nvim", + { "lewis6991/gitsigns.nvim", opts = {} }, + { "lewis6991/gitsigns.nvim", dev = true }, + }, + { + "~/projects/gitsigns.nvim", + { "lewis6991/gitsigns.nvim", opts = {} }, + { "gitsigns.nvim", dev = true }, + }, + } + + for _, test in ipairs(tests) do + local dir = vim.fn.expand(test[1]) + local input = vim.list_slice(test, 2) + it("parses dir " .. vim.inspect(input):gsub("%s+", " "), function() + local spec = Plugin.Spec.new(input) + local plugins = vim.tbl_values(spec.plugins) + assert(spec:report() == 0) + assert.equal(1, #plugins) + assert.same(dir, plugins[1].dir) + end) + end +end) + describe("plugin spec opt", function() it("handles dependencies", function() Config.options.defaults.lazy = false From c8e2091e6d2836b587b9892e0fb64afaec36926a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 15 Oct 2023 08:51:54 +0200 Subject: [PATCH 1141/1610] fix(plugin): dont allow `dir` changes when we already loaded files from the plugin's old dir. Show an error in this case. Fixes #993 --- lua/lazy/core/loader.lua | 1 + lua/lazy/core/plugin.lua | 13 +++++++++++-- lua/lazy/types.lua | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 9e62371..bc41864 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -495,6 +495,7 @@ end function M.auto_load(modname, modpath) local plugin = Plugin.find(modpath) if plugin and modpath:find(plugin.dir, 1, true) == 1 then + plugin._.rtp_loaded = true -- don't load if we're loading specs or if the plugin is already loaded if not (Plugin.loading or plugin._.loaded) then if plugin.module == false then diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index a915d8f..a51806e 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -459,10 +459,19 @@ function Spec:merge(old, new) end local new_dir = new._.dir or old._.dir or (new.name and (Config.options.root .. "/" .. new.name)) or nil - if new_dir ~= new.dir then - self:warn("Plugin `" .. new.name .. "` changed `dir`:\n- from: `" .. new.dir .. "`\n- to: `" .. new_dir .. "`") + if new_dir ~= old.dir then + local msg = "Plugin `" .. new.name .. "` changed `dir`:\n- from: `" .. old.dir .. "`\n- to: `" .. new_dir .. "`" + if new._.rtp_loaded or old._.rtp_loaded then + msg = msg + .. "\n\nThis plugin was already partially loaded, so we did not change it's `dir`.\nPlease fix your config." + self:error(msg) + new_dir = old.dir + else + self:warn(msg) + end end new.dir = new_dir + new._.rtp_loaded = new._.rtp_loaded or old._.rtp_loaded new._.super = old setmetatable(new, { __index = old }) diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 0434359..dcbcf18 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -19,6 +19,7 @@ ---@field super? LazyPlugin ---@field module? string ---@field dir? string Explicit dir or dev set for this plugin +---@field rtp_loaded? boolean ---@alias PluginOpts table|fun(self:LazyPlugin, opts:table):table? From c5598617daad5fc4915032fef987c70efa48c0ef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 06:53:52 +0000 Subject: [PATCH 1142/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index dead002..8d1bb74 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 14 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 15 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From ed6c9ffe2174bcfe4c17199ec4535aa4d4be1e62 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 22:24:48 +0200 Subject: [PATCH 1143/1610] chore(main): release 10.14.0 (#1120) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95c49a1..a19283e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [10.14.0](https://github.com/folke/lazy.nvim/compare/v10.13.4...v10.14.0) (2023-10-15) + + +### Features + +* **plugin:** treat url changes as warnings. They will only be shown with checkhealth ([0c53d46](https://github.com/folke/lazy.nvim/commit/0c53d4673ff02c57a192558325b394cfd9adde0f)) + + +### Bug Fixes + +* **plugin:** dont allow `dir` changes when we already loaded files from the plugin's old dir. Show an error in this case. Fixes [#993](https://github.com/folke/lazy.nvim/issues/993) ([c8e2091](https://github.com/folke/lazy.nvim/commit/c8e2091e6d2836b587b9892e0fb64afaec36926a)) +* **plugin:** improved dir/dev merging. Fixes [#993](https://github.com/folke/lazy.nvim/issues/993) ([3dc413d](https://github.com/folke/lazy.nvim/commit/3dc413d6fd279dfff777a9f9a964697a16c5aabc)) + ## [10.13.4](https://github.com/folke/lazy.nvim/compare/v10.13.3...v10.13.4) (2023-10-14) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index cf278a9..7fa7a91 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.13.4" -- x-release-please-version +M.version = "10.14.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 1cfd6d1f368ab72690e31cf4d8e15c36d8b60202 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Oct 2023 15:05:16 +0200 Subject: [PATCH 1144/1610] fix(loader): don't load handlers before installing plugins --- lua/lazy/core/handler/event.lua | 3 ++- lua/lazy/core/handler/init.lua | 11 ++++++++++- lua/lazy/core/handler/keys.lua | 3 ++- lua/lazy/core/plugin.lua | 29 +++++++++++++++++++---------- lua/lazy/types.lua | 2 ++ lua/lazy/view/render.lua | 26 ++++++++++++++------------ 6 files changed, 49 insertions(+), 25 deletions(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index dd1a38f..018d04b 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -64,10 +64,11 @@ end ---@param plugin LazyPlugin function M:values(plugin) + local Plugin = require("lazy.core.plugin") ---@type table<string,any> local values = {} ---@diagnostic disable-next-line: no-unknown - for _, value in ipairs(plugin[self.type] or {}) do + for _, value in ipairs(Plugin.values(plugin, self.type, true)) do local event = self:parse(value) values[event.id] = event end diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index 127ccae..8a5179d 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -39,6 +39,10 @@ end ---@param plugin LazyPlugin function M.disable(plugin) + if not plugin._.handlers_enabled then + return + end + plugin._.handlers_enabled = false for type, handler in pairs(M.handlers) do if plugin[type] then handler:del(plugin) @@ -49,11 +53,15 @@ end ---@param plugin LazyPlugin function M.enable(plugin) if not plugin._.loaded then + if plugin._.handlers_enabled then + return + end for type, handler in pairs(M.handlers) do if plugin[type] then handler:add(plugin) end end + plugin._.handlers_enabled = true end end @@ -80,10 +88,11 @@ function M:_del(_value) end ---@param plugin LazyPlugin function M:values(plugin) + local Plugin = require("lazy.core.plugin") ---@type table<string,any> local values = {} ---@diagnostic disable-next-line: no-unknown - for _, value in ipairs(plugin[self.type] or {}) do + for _, value in ipairs(Plugin.values(plugin, self.type, true)) do values[value] = value end return values diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 9a87128..a7f7f68 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -52,7 +52,8 @@ end ---@param plugin LazyPlugin function M:values(plugin) - return M.resolve(plugin.keys) + local Plugin = require("lazy.core.plugin") + return M.resolve(Plugin.values(plugin, "keys", true)) end ---@param spec? (string|LazyKeysSpec)[] diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index a51806e..9c36f71 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -42,15 +42,6 @@ end function Spec:parse(spec) self:normalize(spec) self:fix_disabled() - - -- calculate handlers - for _, plugin in pairs(self.plugins) do - for _, handler in pairs(Handler.types) do - if plugin[handler] then - plugin[handler] = M.values(plugin, handler, true) - end - end - end end -- PERF: optimized code to get package name without using lua patterns @@ -609,8 +600,26 @@ end ---@param prop string ---@param is_list? boolean function M.values(plugin, prop, is_list) + if not plugin[prop] then + return {} + end + plugin._.values = plugin._.values or {} + local key = prop .. (is_list and "_list" or "") + if plugin._.values[key] == nil then + plugin[prop] = M._values(plugin, prop, is_list) + plugin._.values[key] = true + end + return plugin[prop] or {} +end + +-- Merges super values or runs the values function to override values or return new ones +-- Used for opts, cmd, event, ft and keys +---@param plugin LazyPlugin +---@param prop string +---@param is_list? boolean +function M._values(plugin, prop, is_list) ---@type table - local ret = plugin._.super and M.values(plugin._.super, prop, is_list) or {} + local ret = plugin._.super and M._values(plugin._.super, prop, is_list) or {} local values = rawget(plugin, prop) if not values then diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index dcbcf18..346d8e4 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -20,6 +20,8 @@ ---@field module? string ---@field dir? string Explicit dir or dev set for this plugin ---@field rtp_loaded? boolean +---@field values? table<string,boolean> +---@field handlers_enabled? boolean ---@alias PluginOpts table|fun(self:LazyPlugin, opts:table):table? diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index b5d83a0..df37b74 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -415,7 +415,7 @@ function M:plugin(plugin) else self:append(" ") local reason = {} - if plugin._.kind ~= "disabled" then + if plugin._.kind ~= "disabled" and plugin._.handlers_enabled then for handler in pairs(Handler.types) do if plugin[handler] then local values = Handler.handlers[handler]:values(plugin) @@ -542,17 +542,19 @@ function M:details(plugin) end end) - for handler in pairs(Handler.types) do - if plugin[handler] then - table.insert(props, { - handler, - function() - for _, value in ipairs(plugin[handler]) do - self:reason({ [handler] = value }) - self:append(" ") - end - end, - }) + if plugin._.handlers_enabled then + for handler in pairs(Handler.types) do + if plugin[handler] then + table.insert(props, { + handler, + function() + for _, value in ipairs(Plugin.values(plugin, handler, true)) do + self:reason({ [handler] = value }) + self:append(" ") + end + end, + }) + end end end self:props(props, { indent = 6 }) From 1ea2eaefa66fdc5a2a7e7b9309c11291cca0a020 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Oct 2023 15:11:01 +0200 Subject: [PATCH 1145/1610] test: fixed tests for plugin spec --- tests/core/plugin_spec.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index cae8542..6df2e81 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -237,6 +237,7 @@ describe("plugin spec opt", function() local spec = Plugin.Spec.new(test) assert(#spec.notifs == 0) assert(vim.tbl_count(spec.plugins) == 1) + Plugin.values(spec.plugins.bar, "event", true) assert(type(spec.plugins.bar.event) == "table") assert(#spec.plugins.bar.event == 2) assert(vim.tbl_contains(spec.plugins.bar.event, "mod1")) @@ -299,6 +300,7 @@ describe("plugin spec opt", function() local spec = Plugin.Spec.new(test) assert(#spec.notifs == 0) assert(vim.tbl_count(spec.plugins) == 1) + Plugin.values(spec.plugins.bar, "event", true) assert(type(spec.plugins.bar.event) == "table") assert(#spec.plugins.bar.event == 2) assert(vim.tbl_contains(spec.plugins.bar.event, "mod1")) From 24a93426c412f356b3dc51d5f9d4604689bb7dbe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 13:12:01 +0000 Subject: [PATCH 1146/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 8d1bb74..80df4c9 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 15 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 16 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 239f0fa9c181150656ed23e33465349b61a3ed20 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 15:30:19 +0200 Subject: [PATCH 1147/1610] chore(main): release 10.14.1 (#1123) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a19283e..6cdb490 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.14.1](https://github.com/folke/lazy.nvim/compare/v10.14.0...v10.14.1) (2023-10-16) + + +### Bug Fixes + +* **loader:** don't load handlers before installing plugins ([1cfd6d1](https://github.com/folke/lazy.nvim/commit/1cfd6d1f368ab72690e31cf4d8e15c36d8b60202)) + ## [10.14.0](https://github.com/folke/lazy.nvim/compare/v10.13.4...v10.14.0) (2023-10-15) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 7fa7a91..06ed181 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.14.0" -- x-release-please-version +M.version = "10.14.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 2270bbbc48503f468633cc5c2065321001c4f0ac Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Oct 2023 18:11:02 +0200 Subject: [PATCH 1148/1610] fix(plugin): work-around for Plugin.values error. Will add proper fix later. Fixes #1124 --- lua/lazy/core/plugin.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 9c36f71..d9ad3ac 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -556,6 +556,10 @@ function M.load() Config.plugins[name]._ = plugin._ Config.plugins[name]._.dep = dep Config.plugins[name]._.super = super + -- FIXME: work-around for changes related to Plugin.values + for handler in pairs(Handler) do + Config.plugins[name][handler] = plugin[handler] + end end end Util.track() From b9c604e839e854bc999e99b90319f1b49776aeac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 18:18:42 +0200 Subject: [PATCH 1149/1610] chore(main): release 10.14.2 (#1125) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cdb490..8998644 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.14.2](https://github.com/folke/lazy.nvim/compare/v10.14.1...v10.14.2) (2023-10-16) + + +### Bug Fixes + +* **plugin:** work-around for Plugin.values error. Will add proper fix later. Fixes [#1124](https://github.com/folke/lazy.nvim/issues/1124) ([2270bbb](https://github.com/folke/lazy.nvim/commit/2270bbbc48503f468633cc5c2065321001c4f0ac)) + ## [10.14.1](https://github.com/folke/lazy.nvim/compare/v10.14.0...v10.14.1) (2023-10-16) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 06ed181..beafd4c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.14.1" -- x-release-please-version +M.version = "10.14.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 2f169e74d46dea437661ddefccdc1f397a073e09 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Oct 2023 22:34:44 +0200 Subject: [PATCH 1150/1610] refactor(handlers): lazy resolving of plugin handlers (#1126) * refactor(handlers): lazy resolving of plugin handlers * test: fixed tests --- lua/lazy/core/config.lua | 4 +- lua/lazy/core/handler/event.lua | 15 +------ lua/lazy/core/handler/ft.lua | 3 +- lua/lazy/core/handler/init.lua | 61 +++++++++++++++----------- lua/lazy/core/handler/keys.lua | 21 ++++++--- lua/lazy/core/plugin.lua | 23 +++++----- lua/lazy/types.lua | 15 +++---- lua/lazy/view/render.lua | 76 +++++++++++++++------------------ tests/core/plugin_spec.lua | 28 +++++++----- 9 files changed, 126 insertions(+), 120 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index beafd4c..0ed35ee 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -55,7 +55,7 @@ M.defaults = { icons = { cmd = " ", config = "", - event = "", + event = " ", ft = " ", init = " ", import = " ", @@ -67,7 +67,7 @@ M.defaults = { runtime = " ", require = "󰢱 ", source = " ", - start = "", + start = " ", task = "✔ ", list = { "●", diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index 018d04b..aff4572 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -37,7 +37,7 @@ M.group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true }) ---@param spec LazyEventSpec ---@return LazyEvent -function M:parse(spec) +function M:_parse(spec) local ret = M.mappings[spec] --[[@as LazyEvent?]] if ret then return ret @@ -62,19 +62,6 @@ function M:parse(spec) return ret end ----@param plugin LazyPlugin -function M:values(plugin) - local Plugin = require("lazy.core.plugin") - ---@type table<string,any> - local values = {} - ---@diagnostic disable-next-line: no-unknown - for _, value in ipairs(Plugin.values(plugin, self.type, true)) do - local event = self:parse(value) - values[event.id] = event - end - return values -end - ---@param event LazyEvent function M:_add(event) local done = false diff --git a/lua/lazy/core/handler/ft.lua b/lua/lazy/core/handler/ft.lua index 7af2b9a..9b33d37 100644 --- a/lua/lazy/core/handler/ft.lua +++ b/lua/lazy/core/handler/ft.lua @@ -13,7 +13,8 @@ function M:add(plugin) end end -function M:parse(value) +---@return LazyEvent +function M:_parse(value) return { id = value, event = "FileType", diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index 8a5179d..ba45de5 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -39,29 +39,20 @@ end ---@param plugin LazyPlugin function M.disable(plugin) - if not plugin._.handlers_enabled then - return - end - plugin._.handlers_enabled = false - for type, handler in pairs(M.handlers) do - if plugin[type] then - handler:del(plugin) - end + for type in pairs(plugin._.handlers or {}) do + M.handlers[type]:del(plugin) end end ---@param plugin LazyPlugin function M.enable(plugin) if not plugin._.loaded then - if plugin._.handlers_enabled then - return + if not plugin._.handlers then + M.load(plugin) end - for type, handler in pairs(M.handlers) do - if plugin[type] then - handler:add(plugin) - end + for type in pairs(plugin._.handlers or {}) do + M.handlers[type]:add(plugin) end - plugin._.handlers_enabled = true end end @@ -86,21 +77,40 @@ function M:_add(_value) end ---@protected function M:_del(_value) end +---@param value any +---@param _plugin LazyPlugin +---@return string|{id:string} +function M:_parse(value, _plugin) + assert(type(value) == "string", "Expected string, got " .. vim.inspect(value)) + return value +end + +---@param values any[] ---@param plugin LazyPlugin -function M:values(plugin) - local Plugin = require("lazy.core.plugin") +function M:_values(values, plugin) ---@type table<string,any> - local values = {} - ---@diagnostic disable-next-line: no-unknown - for _, value in ipairs(Plugin.values(plugin, self.type, true)) do - values[value] = value + local ret = {} + for _, value in ipairs(values) do + local parsed = self:_parse(value, plugin) + ret[type(parsed) == "string" and parsed or parsed.id] = parsed + end + return ret +end + +---@param plugin LazyPlugin +function M.load(plugin) + local Plugin = require("lazy.core.plugin") + plugin._.handlers = {} + for type, handler in pairs(M.handlers) do + if plugin[type] then + plugin._.handlers[type] = handler:_values(Plugin.values(plugin, type, true), plugin) + end end - return values end ---@param plugin LazyPlugin function M:add(plugin) - for key, value in pairs(self:values(plugin)) do + for key, value in pairs(plugin._.handlers[self.type] or {}) do if not self.active[key] then self.active[key] = {} self:_add(value) @@ -112,7 +122,10 @@ end ---@param plugin LazyPlugin function M:del(plugin) - for key, value in pairs(self:values(plugin)) do + if not plugin._.handlers then + return + end + for key, value in pairs(plugin._.handlers[self.type] or {}) do if self.active[key] and self.active[key][plugin.name] then self.active[key][plugin.name] = nil if vim.tbl_isempty(self.active[key]) then diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index a7f7f68..e19d6e5 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -19,10 +19,13 @@ local Util = require("lazy.core.util") ---@field rhs? string|fun() rhs ---@field mode? string ---@field id string +---@field name string ---@class LazyKeysHandler:LazyHandler local M = {} +local skip = { mode = true, id = true, ft = true, rhs = true, lhs = true } + ---@param value string|LazyKeysSpec ---@param mode? string ---@return LazyKeys @@ -37,12 +40,18 @@ function M.parse(value, mode) ret[2] = nil ret.mode = mode or "n" ret.id = vim.api.nvim_replace_termcodes(ret.lhs, true, true, true) + if ret.mode ~= "n" then ret.id = ret.id .. " (" .. ret.mode .. ")" end return ret end +---@param keys LazyKeys +function M.to_string(keys) + return keys.lhs .. (keys.mode == "n" and "" or " (" .. keys.mode .. ")") +end + ---@param lhs string ---@param mode? string function M:have(lhs, mode) @@ -50,10 +59,8 @@ function M:have(lhs, mode) return self.managed[keys.id] ~= nil end ----@param plugin LazyPlugin -function M:values(plugin) - local Plugin = require("lazy.core.plugin") - return M.resolve(Plugin.values(plugin, "keys", true)) +function M:_values(values) + return M.resolve(values) end ---@param spec? (string|LazyKeysSpec)[] @@ -79,7 +86,6 @@ end ---@param keys LazyKeys function M.opts(keys) - local skip = { mode = true, id = true, ft = true, rhs = true, lhs = true } local opts = {} ---@type LazyKeysBase ---@diagnostic disable-next-line: no-unknown for k, v in pairs(keys) do @@ -106,8 +112,9 @@ function M:_add(keys) self.active[keys.id] = nil if plugins then - Util.track({ keys = lhs }) - Loader.load(plugins, { keys = lhs }) + local name = M.to_string(keys) + Util.track({ keys = name }) + Loader.load(plugins, { keys = name }) Util.track() end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index d9ad3ac..229b6bf 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -556,10 +556,6 @@ function M.load() Config.plugins[name]._ = plugin._ Config.plugins[name]._.dep = dep Config.plugins[name]._.super = super - -- FIXME: work-around for changes related to Plugin.values - for handler in pairs(Handler) do - Config.plugins[name][handler] = plugin[handler] - end end end Util.track() @@ -607,29 +603,32 @@ function M.values(plugin, prop, is_list) if not plugin[prop] then return {} end - plugin._.values = plugin._.values or {} + plugin._.cache = plugin._.cache or {} local key = prop .. (is_list and "_list" or "") - if plugin._.values[key] == nil then - plugin[prop] = M._values(plugin, prop, is_list) - plugin._.values[key] = true + if plugin._.cache[key] == nil then + plugin._.cache[key] = M._values(plugin, plugin, prop, is_list) end - return plugin[prop] or {} + return plugin._.cache[key] end -- Merges super values or runs the values function to override values or return new ones -- Used for opts, cmd, event, ft and keys +---@param root LazyPlugin ---@param plugin LazyPlugin ---@param prop string ---@param is_list? boolean -function M._values(plugin, prop, is_list) +function M._values(root, plugin, prop, is_list) + if not plugin[prop] then + return {} + end ---@type table - local ret = plugin._.super and M._values(plugin._.super, prop, is_list) or {} + local ret = plugin._.super and M._values(root, plugin._.super, prop, is_list) or {} local values = rawget(plugin, prop) if not values then return ret elseif type(values) == "function" then - ret = values(plugin, ret) or ret + ret = values(root, ret) or ret return type(ret) == "table" and ret or { ret } end diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 346d8e4..0525ca0 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -20,8 +20,8 @@ ---@field module? string ---@field dir? string Explicit dir or dev set for this plugin ---@field rtp_loaded? boolean ----@field values? table<string,boolean> ----@field handlers_enabled? boolean +---@field handlers? LazyPluginHandlers +---@field cache? table<string,any> ---@alias PluginOpts table|fun(self:LazyPlugin, opts:table):table? @@ -32,12 +32,11 @@ ---@field build? string|fun(self:LazyPlugin)|(string|fun(self:LazyPlugin))[] ---@field opts? PluginOpts ----@class LazyPluginHandlers ----@field event? LazyEventSpec[] ----@field cmd? string[] ----@field ft? string[] ----@field keys? (string|LazyKeysSpec)[] ----@field module? false +---@class LazyPluginHandlers: {[string]: any} +---@field event? table<string,LazyEvent> +---@field ft? table<string,LazyEvent> +---@field keys? table<string,LazyKeys> +---@field cmd? table<string,string> ---@class LazyPluginRef ---@field branch? string diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index df37b74..770abf8 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -1,6 +1,7 @@ local Config = require("lazy.core.config") local Git = require("lazy.manage.git") local Handler = require("lazy.core.handler") +local Keys = require("lazy.core.handler.keys") local Plugin = require("lazy.core.plugin") local Sections = require("lazy.view.sections") local Util = require("lazy.util") @@ -334,12 +335,10 @@ function M:reason(reason, opts) else self:append(" ") end - if key == "keys" then - value = type(value) == "string" and value or value.lhs or value[1] - end local hl = "LazyReason" .. key:sub(1, 1):upper() .. key:sub(2) local icon = Config.options.ui.icons[key] if icon then + icon = icon:gsub("%s*$", "") self:append(icon .. " ", hl) self:append(value, hl) else @@ -411,35 +410,18 @@ function M:plugin(plugin) end local plugin_start = self:row() if plugin._.loaded then + -- When the plugin is loaded, only show the loading reason self:reason(plugin._.loaded) else + -- otherwise show all lazy handlers self:append(" ") - local reason = {} - if plugin._.kind ~= "disabled" and plugin._.handlers_enabled then - for handler in pairs(Handler.types) do - if plugin[handler] then - local values = Handler.handlers[handler]:values(plugin) - values = vim.tbl_map(function(value) - if handler == "ft" or handler == "event" then - ---@cast value LazyEvent - return value.id - elseif handler == "keys" then - ---@cast value LazyKeys - return value.lhs .. (value.mode == "n" and "" or " (" .. value.mode .. ")") - end - return value - end, vim.tbl_values(values)) - table.sort(values) - reason[handler] = table.concat(values, " ") - end - end - end + self:handlers(plugin) for _, other in pairs(Config.plugins) do if vim.tbl_contains(other.dependencies or {}, plugin.name) then - reason.plugin = other.name + self:reason({ plugin = other.name }) + self:append(" ") end end - self:reason(reason) end self:diagnostics(plugin) self:nl() @@ -542,26 +524,36 @@ function M:details(plugin) end end) - if plugin._.handlers_enabled then - for handler in pairs(Handler.types) do - if plugin[handler] then - table.insert(props, { - handler, - function() - for _, value in ipairs(Plugin.values(plugin, handler, true)) do - self:reason({ [handler] = value }) - self:append(" ") - end - end, - }) - end - end + for handler in pairs(plugin._.handlers or {}) do + table.insert(props, { + handler, + function() + self:handlers(plugin, handler) + end, + }) end self:props(props, { indent = 6 }) self:nl() end +---@param plugin LazyPlugin +---@param types? LazyHandlerTypes[]|LazyHandlerTypes +function M:handlers(plugin, types) + if not plugin._.handlers then + return + end + types = type(types) == "string" and { types } or types + types = types and types or vim.tbl_keys(Handler.types) + for _, t in ipairs(types) do + for id, value in pairs(plugin._.handlers[t] or {}) do + value = t == "keys" and Keys.to_string(value) or id + self:reason({ [t] = value }) + self:append(" ") + end + end +end + ---@alias LazyProps {[1]:string, [2]:string|fun(), [3]?:string}[] ---@param props LazyProps ---@param opts? {indent: number} @@ -690,16 +682,16 @@ function M:debug() Util.foreach(require("lazy.core.handler").handlers, function(handler_type, handler) Util.foreach(handler.active, function(value, plugins) - value = type(value) == "table" and value[1] or value + assert(type(value) == "string") if not vim.tbl_isempty(plugins) then ---@type string[] plugins = vim.tbl_values(plugins) table.sort(plugins) self:append("● ", "LazySpecial", { indent = 2 }) if handler_type == "keys" then - for k, v in pairs(Handler.handlers.keys:values(Config.plugins[plugins[1]])) do + for k, v in pairs(Config.plugins[plugins[1]]._.handlers.keys) do if k == value then - value = v + value = v.name break end end diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 6df2e81..ee5b007 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -1,4 +1,5 @@ local Config = require("lazy.core.config") +local Handler = require("lazy.core.handler") local Plugin = require("lazy.core.plugin") local assert = require("luassert") @@ -142,6 +143,9 @@ describe("plugin spec opt", function() end) describe("deps", function() + before_each(function() + Handler.init() + end) it("handles dep names", function() Config.options.defaults.lazy = false local tests = { @@ -237,11 +241,13 @@ describe("plugin spec opt", function() local spec = Plugin.Spec.new(test) assert(#spec.notifs == 0) assert(vim.tbl_count(spec.plugins) == 1) - Plugin.values(spec.plugins.bar, "event", true) - assert(type(spec.plugins.bar.event) == "table") - assert(#spec.plugins.bar.event == 2) - assert(vim.tbl_contains(spec.plugins.bar.event, "mod1")) - assert(vim.tbl_contains(spec.plugins.bar.event, "mod2")) + Handler.load(spec.plugins.bar) + vim.print(spec.plugins.bar._.handlers) + local events = vim.tbl_keys(spec.plugins.bar._.handlers.event or {}) + assert(type(events) == "table") + assert(#events == 2) + assert(vim.tbl_contains(events, "mod1")) + assert(vim.tbl_contains(events, "mod2")) end end) end) @@ -297,14 +303,16 @@ describe("plugin spec opt", function() { { "foo/bar", event = "mod1" }, { "foo/bar", event = { "mod2" } } }, } for _, test in ipairs(tests) do + Handler.init() local spec = Plugin.Spec.new(test) assert(#spec.notifs == 0) assert(vim.tbl_count(spec.plugins) == 1) - Plugin.values(spec.plugins.bar, "event", true) - assert(type(spec.plugins.bar.event) == "table") - assert(#spec.plugins.bar.event == 2) - assert(vim.tbl_contains(spec.plugins.bar.event, "mod1")) - assert(vim.tbl_contains(spec.plugins.bar.event, "mod2")) + Handler.load(spec.plugins.bar) + local events = spec.plugins.bar._.handlers.event + assert(type(events) == "table") + assert(vim.tbl_count(events) == 2) + assert(events["mod1"]) + assert(events["mod2"]) end end) From c1b98873730d7121fec6a2f732b2083cd2cd62bf Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Oct 2023 23:04:57 +0200 Subject: [PATCH 1151/1610] perf(plugin): cache lazy handler values --- lua/lazy/core/plugin.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 229b6bf..fc25f8d 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -594,7 +594,8 @@ function M.has_errors(plugin) return false end --- Merges super values or runs the values function to override values or return new ones +-- Merges super values or runs the values function to override values or return new ones. +-- Values are cached for performance. -- Used for opts, cmd, event, ft and keys ---@param plugin LazyPlugin ---@param prop string From 3049575bd84335c63171282c1991089f80977620 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 23:09:07 +0200 Subject: [PATCH 1152/1610] chore(main): release 10.14.3 (#1127) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8998644..9906d4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.14.3](https://github.com/folke/lazy.nvim/compare/v10.14.2...v10.14.3) (2023-10-16) + + +### Performance Improvements + +* **plugin:** cache lazy handler values ([c1b9887](https://github.com/folke/lazy.nvim/commit/c1b98873730d7121fec6a2f732b2083cd2cd62bf)) + ## [10.14.2](https://github.com/folke/lazy.nvim/compare/v10.14.1...v10.14.2) (2023-10-16) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 0ed35ee..59d0b67 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.14.2" -- x-release-please-version +M.version = "10.14.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From fb9795e49fcd45e99bf386c675fbca28d98bf0a6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Oct 2023 00:29:09 +0200 Subject: [PATCH 1153/1610] fix(ui): fixed keymaps in debug view --- lua/lazy/view/render.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 770abf8..c79be62 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -682,7 +682,6 @@ function M:debug() Util.foreach(require("lazy.core.handler").handlers, function(handler_type, handler) Util.foreach(handler.active, function(value, plugins) - assert(type(value) == "string") if not vim.tbl_isempty(plugins) then ---@type string[] plugins = vim.tbl_values(plugins) @@ -691,7 +690,7 @@ function M:debug() if handler_type == "keys" then for k, v in pairs(Config.plugins[plugins[1]]._.handlers.keys) do if k == value then - value = v.name + value = Keys.to_string(v) break end end From f73986546cadecbcc0531c14b73d4e2cd679d672 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 00:33:20 +0200 Subject: [PATCH 1154/1610] chore(main): release 10.14.4 (#1128) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9906d4b..3432f19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.14.4](https://github.com/folke/lazy.nvim/compare/v10.14.3...v10.14.4) (2023-10-16) + + +### Bug Fixes + +* **ui:** fixed keymaps in debug view ([fb9795e](https://github.com/folke/lazy.nvim/commit/fb9795e49fcd45e99bf386c675fbca28d98bf0a6)) + ## [10.14.3](https://github.com/folke/lazy.nvim/compare/v10.14.2...v10.14.3) (2023-10-16) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 59d0b67..cde7506 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.14.3" -- x-release-please-version +M.version = "10.14.4" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From cdfa78888159323abc931db26f3301360393fbb7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Oct 2023 08:36:09 +0200 Subject: [PATCH 1155/1610] fix(loader): fixed event check in reload. Fixes #1124 --- lua/lazy/core/loader.lua | 6 ++++-- lua/lazy/types.lua | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index bc41864..edf9ba7 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -259,8 +259,10 @@ function M.reload(plugin) load = true end - for _, event in ipairs(plugin.event or {}) do - if event == "VimEnter" or event == "UIEnter" or event:find("VeryLazy") then + local events = plugin._.handlers and plugin._.handlers.event and plugin._.handlers.event or {} + + for _, event in pairs(events) do + if event.id:find("VimEnter") or event.id:find("UIEnter") or event.id:find("VeryLazy") then load = true break end diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 0525ca0..a3dd9b9 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -32,7 +32,7 @@ ---@field build? string|fun(self:LazyPlugin)|(string|fun(self:LazyPlugin))[] ---@field opts? PluginOpts ----@class LazyPluginHandlers: {[string]: any} +---@class LazyPluginHandlers ---@field event? table<string,LazyEvent> ---@field ft? table<string,LazyEvent> ---@field keys? table<string,LazyKeys> From c373663b491e2e3426a55bb199ebfccff96fbaca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 06:36:51 +0000 Subject: [PATCH 1156/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 80df4c9..5474610 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 16 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 17 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From c7298a10db9b9ef975472827e5898b0c494b70bd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 10:04:13 +0200 Subject: [PATCH 1157/1610] chore(main): release 10.14.5 (#1129) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3432f19..0cac2ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.14.5](https://github.com/folke/lazy.nvim/compare/v10.14.4...v10.14.5) (2023-10-17) + + +### Bug Fixes + +* **loader:** fixed event check in reload. Fixes [#1124](https://github.com/folke/lazy.nvim/issues/1124) ([cdfa788](https://github.com/folke/lazy.nvim/commit/cdfa78888159323abc931db26f3301360393fbb7)) + ## [10.14.4](https://github.com/folke/lazy.nvim/compare/v10.14.3...v10.14.4) (2023-10-16) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index cde7506..7e970e4 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.14.4" -- x-release-please-version +M.version = "10.14.5" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 7613ab2abb1bd99e039ae02030bc2c48b7626925 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Oct 2023 10:29:48 +0200 Subject: [PATCH 1158/1610] fix(ui): running tasks are now less twitchy --- lua/lazy/manage/runner.lua | 25 ++++++++++++++++++++----- lua/lazy/types.lua | 1 + lua/lazy/view/sections.lua | 3 +++ 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 85c20be..0ac0c15 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -8,7 +8,7 @@ local Util = require("lazy.util") ---@field concurrency? number ---@alias PipelineStep {task:string, opts?:TaskOptions} ----@alias LazyRunnerTask {co:thread, status: {task?:LazyTask, waiting?:boolean}} +---@alias LazyRunnerTask {co:thread, status: {task?:LazyTask, waiting?:boolean}, plugin: LazyPlugin} ---@class Runner ---@field _plugins LazyPlugin[] @@ -29,6 +29,9 @@ function Runner.new(opts) else self._plugins = plugins or Config.plugins end + table.sort(self._plugins, function(a, b) + return a.name < b.name + end) self._running = {} self._on_done = {} @@ -54,12 +57,19 @@ function Runner:_resume(entry) end function Runner:resume(waiting) + if waiting then + for _, entry in ipairs(self._running) do + if entry.status then + if entry.status.waiting then + entry.status.waiting = false + entry.plugin._.working = true + end + end + end + end local running = 0 for _, entry in ipairs(self._running) do if entry.status then - if waiting and entry.status.waiting then - entry.status.waiting = false - end if not entry.status.waiting and self:_resume(entry) then running = running + 1 if self._opts.concurrency and running >= self._opts.concurrency then @@ -76,7 +86,7 @@ function Runner:start() local co = coroutine.create(self.run_pipeline) local ok, err = coroutine.resume(co, self, plugin) if ok then - table.insert(self._running, { co = co, status = {} }) + table.insert(self._running, { co = co, status = {}, plugin = plugin }) else Util.error("Could not start tasks for " .. plugin.name .. "\n" .. err) end @@ -99,21 +109,26 @@ end ---@async ---@param plugin LazyPlugin function Runner:run_pipeline(plugin) + plugin._.working = true coroutine.yield() for _, step in ipairs(self._pipeline) do if step.task == "wait" then + plugin._.working = false coroutine.yield({ waiting = true }) + plugin._.working = true else local task = self:queue(plugin, step.task, step.opts) if task then coroutine.yield({ task = task }) assert(task:is_done()) if task.error then + plugin._.working = false return end end end end + plugin._.working = false end ---@param plugin LazyPlugin diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index a3dd9b9..222acbe 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -8,6 +8,7 @@ ---@field loaded? {[string]:string}|{time:number} ---@field installed? boolean ---@field tasks? LazyTask[] +---@field working? boolean ---@field dirty? boolean ---@field updated? {from:string, to:string} ---@field is_local? boolean diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index 8325332..0c1f578 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -24,6 +24,9 @@ return { }, { filter = function(plugin) + if plugin._.working then + return true + end return has_task(plugin, function(task) return task:is_running() end) From 03419f3e5f7590194d599aa8a1a7a7841409d141 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Oct 2023 16:52:32 +0200 Subject: [PATCH 1159/1610] fix(cmd): shedule error message instead of showing directly --- lua/lazy/core/handler/cmd.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/cmd.lua b/lua/lazy/core/handler/cmd.lua index ef7a2bd..658c957 100644 --- a/lua/lazy/core/handler/cmd.lua +++ b/lua/lazy/core/handler/cmd.lua @@ -35,7 +35,10 @@ function M:_add(cmd) local info = vim.api.nvim_get_commands({})[cmd] or vim.api.nvim_buf_get_commands(0, {})[cmd] if not info then - return Util.error("Command `" .. cmd .. "` not found after loading " .. plugins) + vim.schedule(function() + Util.error("Command `" .. cmd .. "` not found after loading " .. plugins) + end) + return end command.nargs = info.nargs From c059eece0cdd681b2dd212946e3d48544cc079bf Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Oct 2023 17:43:37 +0200 Subject: [PATCH 1160/1610] refactor: Handler.load => Handler.resolve --- lua/lazy/core/handler/init.lua | 4 ++-- tests/core/plugin_spec.lua | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index ba45de5..b7ce3e5 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -48,7 +48,7 @@ end function M.enable(plugin) if not plugin._.loaded then if not plugin._.handlers then - M.load(plugin) + M.resolve(plugin) end for type in pairs(plugin._.handlers or {}) do M.handlers[type]:add(plugin) @@ -98,7 +98,7 @@ function M:_values(values, plugin) end ---@param plugin LazyPlugin -function M.load(plugin) +function M.resolve(plugin) local Plugin = require("lazy.core.plugin") plugin._.handlers = {} for type, handler in pairs(M.handlers) do diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index ee5b007..51f6e03 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -241,7 +241,7 @@ describe("plugin spec opt", function() local spec = Plugin.Spec.new(test) assert(#spec.notifs == 0) assert(vim.tbl_count(spec.plugins) == 1) - Handler.load(spec.plugins.bar) + Handler.resolve(spec.plugins.bar) vim.print(spec.plugins.bar._.handlers) local events = vim.tbl_keys(spec.plugins.bar._.handlers.event or {}) assert(type(events) == "table") @@ -307,7 +307,7 @@ describe("plugin spec opt", function() local spec = Plugin.Spec.new(test) assert(#spec.notifs == 0) assert(vim.tbl_count(spec.plugins) == 1) - Handler.load(spec.plugins.bar) + Handler.resolve(spec.plugins.bar) local events = spec.plugins.bar._.handlers.event assert(type(events) == "table") assert(vim.tbl_count(events) == 2) From daab5fe2807c55867d5f7cfb6ef0944783361be2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 17 Oct 2023 17:44:14 +0200 Subject: [PATCH 1161/1610] fix(loader): dont autoload when lazy handlers have not been setup yet. Fixes #1132 --- lua/lazy/core/loader.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index edf9ba7..7cbd6f8 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -16,6 +16,7 @@ M.init_done = false M.disabled_rtp_plugins = { packer_compiled = true } ---@type table<string,string> M.did_ftdetect = {} +M.did_handlers = false function M.disable_rtp_plugin(plugin) M.disabled_rtp_plugins[plugin] = true @@ -56,6 +57,7 @@ function M.setup() -- setup handlers Util.track("handlers") Handler.setup() + M.did_handlers = true Util.track() end @@ -498,8 +500,11 @@ function M.auto_load(modname, modpath) local plugin = Plugin.find(modpath) if plugin and modpath:find(plugin.dir, 1, true) == 1 then plugin._.rtp_loaded = true - -- don't load if we're loading specs or if the plugin is already loaded - if not (Plugin.loading or plugin._.loaded) then + -- don't load if: + -- * handlers haven't been setup yet + -- * we're loading specs + -- * the plugin is already loaded + if M.did_handlers and not (Plugin.loading or plugin._.loaded) then if plugin.module == false then error("Plugin " .. plugin.name .. " is not loaded and is configured with module=false") end @@ -508,9 +513,7 @@ function M.auto_load(modname, modpath) error("You're trying to load `" .. plugin.name .. "` for which `cond==false`") end end - return true end - return false end ---@param modname string From 4c75c8eeb957a99aa44ce8e526c04340ab358c5e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 21:52:13 +0200 Subject: [PATCH 1162/1610] chore(main): release 10.14.6 (#1130) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 9 +++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cac2ce..7355141 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [10.14.6](https://github.com/folke/lazy.nvim/compare/v10.14.5...v10.14.6) (2023-10-17) + + +### Bug Fixes + +* **cmd:** shedule error message instead of showing directly ([03419f3](https://github.com/folke/lazy.nvim/commit/03419f3e5f7590194d599aa8a1a7a7841409d141)) +* **loader:** dont autoload when lazy handlers have not been setup yet. Fixes [#1132](https://github.com/folke/lazy.nvim/issues/1132) ([daab5fe](https://github.com/folke/lazy.nvim/commit/daab5fe2807c55867d5f7cfb6ef0944783361be2)) +* **ui:** running tasks are now less twitchy ([7613ab2](https://github.com/folke/lazy.nvim/commit/7613ab2abb1bd99e039ae02030bc2c48b7626925)) + ## [10.14.5](https://github.com/folke/lazy.nvim/compare/v10.14.4...v10.14.5) (2023-10-17) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 7e970e4..7ba6851 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -176,7 +176,7 @@ M.defaults = { debug = false, } -M.version = "10.14.5" -- x-release-please-version +M.version = "10.14.6" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 71007c715f14b395546cc319005a6fba9e43c705 Mon Sep 17 00:00:00 2001 From: SandeshPyakurel <85491057+SandeshPyakurel@users.noreply.github.com> Date: Thu, 19 Oct 2023 23:58:25 +0545 Subject: [PATCH 1163/1610] docs: Typos fixed in CHANGELOG.md (#1140) --- CHANGELOG.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7355141..a09c1a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ ### Bug Fixes -* **cmd:** shedule error message instead of showing directly ([03419f3](https://github.com/folke/lazy.nvim/commit/03419f3e5f7590194d599aa8a1a7a7841409d141)) +* **cmd:** schedule error message instead of showing directly ([03419f3](https://github.com/folke/lazy.nvim/commit/03419f3e5f7590194d599aa8a1a7a7841409d141)) * **loader:** dont autoload when lazy handlers have not been setup yet. Fixes [#1132](https://github.com/folke/lazy.nvim/issues/1132) ([daab5fe](https://github.com/folke/lazy.nvim/commit/daab5fe2807c55867d5f7cfb6ef0944783361be2)) * **ui:** running tasks are now less twitchy ([7613ab2](https://github.com/folke/lazy.nvim/commit/7613ab2abb1bd99e039ae02030bc2c48b7626925)) @@ -133,7 +133,7 @@ ### Bug Fixes -* **manage:** prevend auto conversion 'CRLF' to 'LF' in update lazy-lock.json on Windows. Fixes [#1093](https://github.com/folke/lazy.nvim/issues/1093) ([#1094](https://github.com/folke/lazy.nvim/issues/1094)) ([5579d72](https://github.com/folke/lazy.nvim/commit/5579d72576b21b9c8c2d01838598aece5dc2be6d)) +* **manage:** prevent auto conversion 'CRLF' to 'LF' in update lazy-lock.json on Windows. Fixes [#1093](https://github.com/folke/lazy.nvim/issues/1093) ([#1094](https://github.com/folke/lazy.nvim/issues/1094)) ([5579d72](https://github.com/folke/lazy.nvim/commit/5579d72576b21b9c8c2d01838598aece5dc2be6d)) * **profiling:** ensure proper traces in case of require errors ([2782f81](https://github.com/folke/lazy.nvim/commit/2782f8125e793940f5bf942af1a1df0bbc989d11)) ## [10.9.0](https://github.com/folke/lazy.nvim/compare/v10.8.2...v10.9.0) (2023-10-09) @@ -459,7 +459,7 @@ ### Features -* **plugin:** added support for `weak` specs. They will not be included in the final spec if not specified somwhere else ([8564f6d](https://github.com/folke/lazy.nvim/commit/8564f6d22b78a4a0fba9811faa556159b6c90a49)) +* **plugin:** added support for `weak` specs. They will not be included in the final spec if not specified somewhere else ([8564f6d](https://github.com/folke/lazy.nvim/commit/8564f6d22b78a4a0fba9811faa556159b6c90a49)) ### Bug Fixes @@ -480,7 +480,7 @@ ### Bug Fixes -* **loader:** dont clear tasks when istalling missing plugins ([80c4dec](https://github.com/folke/lazy.nvim/commit/80c4decc3226551b433dfea5e459998a96f17822)) +* **loader:** dont clear tasks when installing missing plugins ([80c4dec](https://github.com/folke/lazy.nvim/commit/80c4decc3226551b433dfea5e459998a96f17822)) * **loader:** reset cache before installing plugins during startup. Fixes [#803](https://github.com/folke/lazy.nvim/issues/803) ([aecdaab](https://github.com/folke/lazy.nvim/commit/aecdaab6a6ce8c9fdf9f983d5f943c6cfb11bf61)) ## [9.16.0](https://github.com/folke/lazy.nvim/compare/v9.15.0...v9.16.0) (2023-05-13) @@ -758,7 +758,7 @@ ### Features * deactivate WIP ([57a3960](https://github.com/folke/lazy.nvim/commit/57a3960fafc210f240a07439d1adfaba09d6ff59)) -* use "wslview" instead of "xsl-open" if it exsits ([#509](https://github.com/folke/lazy.nvim/issues/509)) ([2451ea4](https://github.com/folke/lazy.nvim/commit/2451ea4e655bc60ef639ad284e69c6fca15da352)) +* use "wslview" instead of "xsl-open" if it exists ([#509](https://github.com/folke/lazy.nvim/issues/509)) ([2451ea4](https://github.com/folke/lazy.nvim/commit/2451ea4e655bc60ef639ad284e69c6fca15da352)) ### Bug Fixes @@ -1100,7 +1100,7 @@ ### Features * **git:** added support for packed-refs. Fixes [#260](https://github.com/folke/lazy.nvim/issues/260) ([865ff41](https://github.com/folke/lazy.nvim/commit/865ff414c70d20648000d1b9d754dba64dbf4a62)) -* **ui:** make brower configurable. Fixes [#248](https://github.com/folke/lazy.nvim/issues/248) ([679d85c](https://github.com/folke/lazy.nvim/commit/679d85c9ffb6bd49d27267b3a282eeb73e063cde)) +* **ui:** make browser configurable. Fixes [#248](https://github.com/folke/lazy.nvim/issues/248) ([679d85c](https://github.com/folke/lazy.nvim/commit/679d85c9ffb6bd49d27267b3a282eeb73e063cde)) * **ui:** show when plugin would be loaded for unloaded plugins. Fixes [#261](https://github.com/folke/lazy.nvim/issues/261) ([5575d2b](https://github.com/folke/lazy.nvim/commit/5575d2b2a9eb7e104d85f4f68754ef3734c7a4a1)) @@ -1167,7 +1167,7 @@ ### Bug Fixes -* **cache:** ad jit.verion to cache version string. Fixes [#225](https://github.com/folke/lazy.nvim/issues/225) ([e3ffcff](https://github.com/folke/lazy.nvim/commit/e3ffcff7cce1206a2e41b413b0923a3aafeb9306)) +* **cache:** ad jit.version to cache version string. Fixes [#225](https://github.com/folke/lazy.nvim/issues/225) ([e3ffcff](https://github.com/folke/lazy.nvim/commit/e3ffcff7cce1206a2e41b413b0923a3aafeb9306)) * **cache:** added support for top level lua linked directories. Fixes [#233](https://github.com/folke/lazy.nvim/issues/233) ([853d4d5](https://github.com/folke/lazy.nvim/commit/853d4d58381870a4804ee7d822d3331d3cc5924d)) * **cache:** always normalize modname separators ([8544c38](https://github.com/folke/lazy.nvim/commit/8544c389ab54dd21c562b2763829670c71266caa)) * **cache:** check package.loaded after auto-load and return existing module if present. Fixes [#224](https://github.com/folke/lazy.nvim/issues/224) ([044e28b](https://github.com/folke/lazy.nvim/commit/044e28bf8bb454335c63998ef6f21bc34b3e6124)) @@ -1187,7 +1187,7 @@ * **loader:** show proper error message when trying to load a plugin that is not installed. Fixes [#201](https://github.com/folke/lazy.nvim/issues/201). Fixes [#202](https://github.com/folke/lazy.nvim/issues/202) ([956164d](https://github.com/folke/lazy.nvim/commit/956164d27dc02b8d3c21c9ef7cc9028d854b0978)) * **loader:** temporary fix for Vimtex and others. See [#230](https://github.com/folke/lazy.nvim/issues/230) ([c7122d6](https://github.com/folke/lazy.nvim/commit/c7122d64cdf16766433588486adcee67571de6d0)) * **loader:** when `config=true`, pass `nil` to `setup()`. Fixes [#208](https://github.com/folke/lazy.nvim/issues/208) ([5f423b2](https://github.com/folke/lazy.nvim/commit/5f423b29c65f536a9c41a34a8328372baa444da5)) -* only show fired ft events in debug obvioulsy. Fixes [#232](https://github.com/folke/lazy.nvim/issues/232) ([c7c1295](https://github.com/folke/lazy.nvim/commit/c7c1295c3e429d4a95e36b5c5b2dfcbeca61f42d)) +* only show fired ft events in debug obviously. Fixes [#232](https://github.com/folke/lazy.nvim/issues/232) ([c7c1295](https://github.com/folke/lazy.nvim/commit/c7c1295c3e429d4a95e36b5c5b2dfcbeca61f42d)) * **rtp:** correct order of adding to rtp. Fixes [#226](https://github.com/folke/lazy.nvim/issues/226) ([4e3a973](https://github.com/folke/lazy.nvim/commit/4e3a973f85bd2393009d495ecfd6c058345309d4)) From 9788a19ec0b4036028e78aec702634b4b89d3470 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 18:14:04 +0000 Subject: [PATCH 1164/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5474610..d92274b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 17 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 19 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 6b7b4c5b96b39806e3b8a02ade07bee468f57b58 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 22 Oct 2023 14:24:27 +0200 Subject: [PATCH 1165/1610] style: show full trace when debug=true --- lua/lazy/core/util.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 0b27797..77cb8f5 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -75,7 +75,7 @@ function M.pretty_trace(opts) if not info then break end - if info.what ~= "C" and not info.source:find("lazy.nvim") then + if info.what ~= "C" and (Config.options.debug or not info.source:find("lazy.nvim")) then local source = info.source:sub(2) if source:find(Config.options.root, 1, true) == 1 then source = source:sub(#Config.options.root + 1) From 42fb1e89adb8008a401848e131c5ecb985db52f1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 22 Oct 2023 12:25:19 +0000 Subject: [PATCH 1166/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d92274b..3c1e435 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 19 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 22 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 4446fdb9af1b1c41560f6cc41452eee826a8bce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maria=20Jos=C3=A9=20Solano?= <majosolano99@gmail.com> Date: Sun, 22 Oct 2023 22:52:54 -0700 Subject: [PATCH 1167/1610] feat(ui): check pinned packages that can't be updated (#1139) * style: fix filter types * feat: check outdated pinned plugins --- README.md | 1 + lua/lazy/core/config.lua | 1 + lua/lazy/manage/task/git.lua | 9 ++++++++- lua/lazy/types.lua | 1 + lua/lazy/view/sections.lua | 12 ++++++++---- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9fcf781..ebcca6a 100644 --- a/README.md +++ b/README.md @@ -409,6 +409,7 @@ return { 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 diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 7ba6851..3f1f269 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -119,6 +119,7 @@ M.defaults = { 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 diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 9913ea1..a1bfcf6 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -42,7 +42,14 @@ M.log = { error("no target commit found") end assert(target.commit, self.plugin.name .. " " .. target.branch) - if not Git.eq(info, target) then + if Git.eq(info, target) then + if Config.options.checker.check_pinned then + local last_commit = Git.get_commit(self.plugin.dir, target.branch, true) + if not Git.eq(info, { commit = last_commit }) then + self.plugin._.outdated = true + end + end + else self.plugin._.updates = { from = info, to = target } end table.insert(args, info.commit .. ".." .. target.commit) diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 222acbe..5085b14 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -14,6 +14,7 @@ ---@field is_local? boolean ---@field updates? {from:GitInfo, to:GitInfo} ---@field cloned? boolean +---@field outdated? boolean ---@field kind? LazyPluginKind ---@field dep? boolean True if this plugin is only in the spec as a dependency ---@field cond? boolean diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index 0c1f578..5dfb57e 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -50,14 +50,12 @@ return { title = "Breaking Changes", }, { - ---@param plugin LazyPlugin filter = function(plugin) return plugin._.updated and plugin._.updated.from ~= plugin._.updated.to end, title = "Updated", }, { - ---@param plugin LazyPlugin filter = function(plugin) return plugin._.cloned end, @@ -66,7 +64,7 @@ return { { ---@param plugin LazyPlugin filter = function(plugin) - return plugin._.updates + return plugin._.updates ~= nil end, title = "Updates", }, @@ -90,9 +88,15 @@ return { end, title = "Not Installed", }, + { + filter = function (plugin) + return plugin._.outdated + end, + title = "Outdated", + }, { filter = function(plugin) - return plugin._.loaded + return plugin._.loaded ~= nil end, title = "Loaded", }, From e42fccc3cda70266e0841c5126de2c23e8982800 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 05:53:33 +0000 Subject: [PATCH 1168/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 3c1e435..0462e83 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 22 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 23 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -512,6 +512,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* 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 From 312e424a084a43b8b786f786b884be60043c23dc Mon Sep 17 00:00:00 2001 From: Serhii Karvatskyi <sergkarv@gmail.com> Date: Wed, 25 Oct 2023 21:00:50 +0300 Subject: [PATCH 1169/1610] fix(loader): when reloading, clear plugin properties cache (#1153) See #445 --- lua/lazy/core/loader.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 7cbd6f8..0dc9e9f 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -216,6 +216,9 @@ function M.deactivate(plugin) -- disable handlers Handler.disable(plugin) + -- clear plugin properties cache + plugin._.cache = nil + -- remove loaded lua modules Util.walkmods(plugin.dir .. "/lua", function(modname) package.loaded[modname] = nil From f82bac799cd9107b3538d30d3cd3b62a53c94025 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 18:01:37 +0000 Subject: [PATCH 1170/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0462e83..a356eb1 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 23 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 25 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 16603c6917435d8446f7357cb61095138a417085 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 20:13:09 +0200 Subject: [PATCH 1171/1610] chore(main): release 10.15.0 (#1147) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a09c1a2..5692ca4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [10.15.0](https://github.com/folke/lazy.nvim/compare/v10.14.6...v10.15.0) (2023-10-25) + + +### Features + +* **ui:** check pinned packages that can't be updated ([#1139](https://github.com/folke/lazy.nvim/issues/1139)) ([4446fdb](https://github.com/folke/lazy.nvim/commit/4446fdb9af1b1c41560f6cc41452eee826a8bce0)) + + +### Bug Fixes + +* **loader:** when reloading, clear plugin properties cache ([#1153](https://github.com/folke/lazy.nvim/issues/1153)) ([312e424](https://github.com/folke/lazy.nvim/commit/312e424a084a43b8b786f786b884be60043c23dc)), closes [#445](https://github.com/folke/lazy.nvim/issues/445) + ## [10.14.6](https://github.com/folke/lazy.nvim/compare/v10.14.5...v10.14.6) (2023-10-17) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 3f1f269..2b18a24 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -177,7 +177,7 @@ M.defaults = { debug = false, } -M.version = "10.14.6" -- x-release-please-version +M.version = "10.15.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 314193af1d63181bff65e8b24db416e34c5fae86 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 4 Nov 2023 10:14:03 +0100 Subject: [PATCH 1172/1610] fix(build): allow build=false to skip building --- lua/lazy/manage/task/plugin.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index ea623ee..e058c50 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -30,6 +30,11 @@ M.build = { local builders = self.plugin.build + -- Skip if `build` is set to `false` + if builders == false then + return + end + local build_file = get_build_file(self.plugin) if build_file then if builders then From 32dead0376f83b96728f5c799df64d0f0a325254 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 4 Nov 2023 09:14:45 +0000 Subject: [PATCH 1173/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a356eb1..4c69064 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 October 25 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 November 04 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 3674036a59a6a4a65559343d606a92145a782533 Mon Sep 17 00:00:00 2001 From: Riley Bruins <ribru17@hotmail.com> Date: Sat, 4 Nov 2023 03:05:02 -0700 Subject: [PATCH 1174/1610] fix(ui): properly highlight breaking change commit scope (#1160) --- lua/lazy/view/render.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index c79be62..7487056 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -475,7 +475,7 @@ function M:log(task) self:append(vim.trim(msg), dimmed and "LazyDimmed" or nil):highlight({ ["#%d+"] = "LazyCommitIssue", ["^%S+:"] = dimmed and "Bold" or "LazyCommitType", - ["^%S+(%(.*%)):"] = "LazyCommitScope", + ["^%S+(%(.*%))!?:"] = "LazyCommitScope", ["`.-`"] = "@text.literal.markdown_inline", ["%*.-%*"] = "Italic", ["%*%*.-%*%*"] = "Bold", From 96584866b9c5e998cbae300594d0ccfd0c464627 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 4 Nov 2023 11:12:07 +0100 Subject: [PATCH 1175/1610] chore(main): release 10.15.1 (#1166) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5692ca4..f953d5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [10.15.1](https://github.com/folke/lazy.nvim/compare/v10.15.0...v10.15.1) (2023-11-04) + + +### Bug Fixes + +* **build:** allow build=false to skip building ([314193a](https://github.com/folke/lazy.nvim/commit/314193af1d63181bff65e8b24db416e34c5fae86)) +* **ui:** properly highlight breaking change commit scope ([#1160](https://github.com/folke/lazy.nvim/issues/1160)) ([3674036](https://github.com/folke/lazy.nvim/commit/3674036a59a6a4a65559343d606a92145a782533)) + ## [10.15.0](https://github.com/folke/lazy.nvim/compare/v10.14.6...v10.15.0) (2023-10-25) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 2b18a24..1fbf3ef 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -177,7 +177,7 @@ M.defaults = { debug = false, } -M.version = "10.15.0" -- x-release-please-version +M.version = "10.15.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 47d4baafcc370f16c195fd718f37f8fb1e0aa9a1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 19 Jan 2024 16:09:28 +0100 Subject: [PATCH 1176/1610] fix(fs): error when plugin directory to delete is not a valid directory --- lua/lazy/manage/task/fs.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/fs.lua b/lua/lazy/manage/task/fs.lua index 525997e..c753143 100644 --- a/lua/lazy/manage/task/fs.lua +++ b/lua/lazy/manage/task/fs.lua @@ -13,7 +13,7 @@ M.clean = { assert(dir:find(Config.options.root, 1, true) == 1, self.plugin.dir .. " should be under packpath!") local stat = vim.loop.fs_lstat(dir) - assert(stat.type == "directory", self.plugin.dir .. " should be a directory!") + assert(stat and stat.type == "directory", self.plugin.dir .. " should be a directory!") Util.walk(dir, function(path, _, type) if type == "directory" then From 747bb955c5bfb2dc5d51280132f00a56a53f9f6d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 15:10:07 +0000 Subject: [PATCH 1177/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4c69064..9b9bc16 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2023 November 04 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 January 19 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 5757b551fc6066d836b9e45f70b41561ca619272 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 20 Jan 2024 14:11:32 +0100 Subject: [PATCH 1178/1610] fix(keys): allow global/local ft keymaps to exist at the same time. Fixes #1241 --- lua/lazy/core/handler/keys.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index e19d6e5..6ca2c50 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -41,6 +41,11 @@ function M.parse(value, mode) ret.mode = mode or "n" ret.id = vim.api.nvim_replace_termcodes(ret.lhs, true, true, true) + if ret.ft then + local ft = type(ret.ft) == "string" and { ret.ft } or ret.ft --[[@as string[] ]] + ret.id = ret.id .. " (" .. table.concat(ft, ", ") .. ")" + end + if ret.mode ~= "n" then ret.id = ret.id .. " (" .. ret.mode .. ")" end From 42694c4fda37b786670ed2edb7521833954b09ba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 20 Jan 2024 13:12:10 +0000 Subject: [PATCH 1179/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9b9bc16..1b1b744 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 January 19 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 January 20 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From a6f782adc1ace840a7e671c731daab7851cba6af Mon Sep 17 00:00:00 2001 From: atusy <30277794+atusy@users.noreply.github.com> Date: Sat, 20 Jan 2024 22:19:09 +0900 Subject: [PATCH 1180/1610] feat(plugin): dev.path can now be a function (#1157) In some case, `dev.path .. plugin.name` is not enoguh. For example, when using `ghq` to manage projects, plugin directories may vary by onewrs of the plugins. With this change, users can do something like below ``` lua require("lazy").setup("plugins", { dev = { path = function(p) -- ghq local path, cnt = string.gsub(p.url, "^https://(.*)%.git$", "~/ghq/%1") if cnt == 1 then return path end -- fallback to default return "~/projects/" .. plugin.name end, }, }) ``` --- README.md | 2 +- lua/lazy/core/config.lua | 6 ++++-- lua/lazy/core/plugin.lua | 15 ++++++++++----- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index ebcca6a..18ade37 100644 --- a/README.md +++ b/README.md @@ -320,7 +320,7 @@ return { filter = true, }, dev = { - -- directory where you store your local plugin projects + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects path = "~/projects", ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1fbf3ef..90c4206 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -30,7 +30,7 @@ M.defaults = { filter = true, }, dev = { - -- directory where you store your local plugin projects + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects path = "~/projects", ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} @@ -213,7 +213,9 @@ function M.setup(opts) table.insert(M.options.install.colorscheme, "habamax") M.options.root = Util.norm(M.options.root) - M.options.dev.path = Util.norm(M.options.dev.path) + if type(M.options.dev.path) == "string" then + M.options.dev.path = Util.norm(M.options.dev.path) + end M.options.lockfile = Util.norm(M.options.lockfile) M.options.readme.root = Util.norm(M.options.readme.root) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index fc25f8d..64c93cd 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -106,11 +106,16 @@ function Spec:add(plugin, results) end -- dev plugins - if - plugin.dev - and (not Config.options.dev.fallback or vim.fn.isdirectory(Config.options.dev.path .. "/" .. plugin.name) == 1) - then - dir = Config.options.dev.path .. "/" .. plugin.name + if plugin.dev then + local dir_dev + if type(Config.options.dev.path) == "string" then + dir_dev = Config.options.dev.path .. "/" .. plugin.name + else + dir_dev = Util.norm(Config.options.dev.path(plugin)) + end + if not Config.options.dev.fallback or vim.fn.isdirectory(dir_dev) == 1 then + dir = dir_dev + end elseif plugin.dev == false then -- explicitely select the default path dir = Config.options.root .. "/" .. plugin.name From 3e0c0a05bdbec315d58c2f181f8dcec04ef6b24d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 20 Jan 2024 13:19:39 +0000 Subject: [PATCH 1181/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1b1b744..e65b6c8 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -423,7 +423,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* filter = true, }, dev = { - -- directory where you store your local plugin projects + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects path = "~/projects", ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} From 1b3df6c00797e1b12f7c16148261e9dd841a33dd Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 20 Jan 2024 14:49:47 +0100 Subject: [PATCH 1182/1610] fix(health): dont warn on submodules. Fixes #1174 --- lua/lazy/health.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 929092d..89feabe 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -131,6 +131,7 @@ M.valid = { "opts", "pin", "priority", + "submodules", "tag", "url", "version", From d0d410bc222a475202d9c2b55d1c5fbd12c26ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Kr=C3=B3l?= <piotr.krol@3mdeb.com> Date: Sat, 20 Jan 2024 15:05:26 +0100 Subject: [PATCH 1183/1610] fix(git): comment sign detection in get_config function (#1281) - Modify the condition in the get_config function to correctly ignore comments and blank lines. - Update the regular expression to exclude lines starting with '#' or ';'. - This change ensures that only valid key-value pairs are added to the configuration table. --- lua/lazy/manage/git.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 98c44b5..6b0ab58 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -217,7 +217,7 @@ function M.get_config(repo) current_section = section:gsub('%s+"', "."):gsub('"+%s*$', "") else -- Ignore comments and blank lines - if not line:match("^%s*#") and line:match("%S") then + if not line:match("^%s*[#;]") and line:match("%S") then local key, value = line:match("^%s*(%S+)%s*=%s*(.+)%s*$") ret[current_section .. "." .. key] = value end From 89e6840d8b921a545724153c2a667624ea7d495b Mon Sep 17 00:00:00 2001 From: Johnny Horvi <jhrv@users.noreply.github.com> Date: Sat, 20 Jan 2024 15:08:08 +0100 Subject: [PATCH 1184/1610] docs: fix typo (#1230) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 18ade37..148f0bd 100644 --- a/README.md +++ b/README.md @@ -654,7 +654,7 @@ In practice this means that step 10 of [Neovim Initialization](https://neovim.io 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 you rtp are sourced (excluding `/after`) +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. @@ -824,7 +824,7 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori If your plugin needs a build step, you can create a file `build.lua` or `build/init.lua` in the root of your repo. This file will be loaded when the plugin is installed or updated. -This makes it easier for users, so they no longer need to specify a `build` command. +This makes it easier for users, as they no longer need to specify a `build` command. ## 📦 Other Neovim Plugin Managers in Lua From 0b507680ee5bbc998fdc54a40119de964dbc96cc Mon Sep 17 00:00:00 2001 From: Tomasz Wysocki <121371814+tomaszwysocki@users.noreply.github.com> Date: Sat, 20 Jan 2024 15:08:38 +0100 Subject: [PATCH 1185/1610] docs: fix typo in README.md (#1226) Corrected a typo in Migration Guide section of the README file. Co-authored-by: Tomasz Wysocki <twysocki5@gmail.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 148f0bd..c404f63 100644 --- a/README.md +++ b/README.md @@ -738,8 +738,8 @@ Any other property will override the property from the parent spec. - `lock` ➡️ `pin` - `disable=true` ➡️ `enabled = false` - `tag='*'` ➡️ `version="*"` -- `after` ℹ️ **_not needed_** for most use-cases. Use `dependencies` otherwise. -- `wants` ℹ️ **_not needed_** for most use-cases. Use `dependencies` otherwise. +- `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 [different](#%EF%B8%8F-lazy-key-mappings) From 17d9c93943c692e084dbf203e47e7fa122386d0f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 20 Jan 2024 14:09:14 +0000 Subject: [PATCH 1186/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e65b6c8..2fec161 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -768,7 +768,7 @@ 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 you rtp are sourced (excluding `/after`) +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. @@ -859,8 +859,8 @@ PACKER.NVIM ~ - `lock` `pin` - `disable=true` `enabled = false` - `tag='*'` `version="*"` -- `after` **not needed** for most use-cases. Use `dependencies` otherwise. -- `wants` **not needed** for most use-cases. Use `dependencies` otherwise. +- `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| @@ -979,7 +979,7 @@ If your plugin needs a build step, you can create a file `build.lua` or `build/init.lua` in the root of your repo. This file will be loaded when the plugin is installed or updated. -This makes it easier for users, so they no longer need to specify a `build` +This makes it easier for users, as they no longer need to specify a `build` command. From 7ded44ce2a442aa32b90488b8f1f9c8ca6899f3b Mon Sep 17 00:00:00 2001 From: star-szr <327943+star-szr@users.noreply.github.com> Date: Sun, 21 Jan 2024 04:50:23 -0500 Subject: [PATCH 1187/1610] feat(ui): add style to dimmed commits (#1210) --- lua/lazy/view/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index cf7df1c..ea8a066 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -24,7 +24,7 @@ function M.get_commands() return ret end -M.dimmed_commits = { "build", "ci", "chore", "doc", "test" } +M.dimmed_commits = { "build", "ci", "chore", "doc", "style", "test" } M.keys = { hover = "K", From ababf0dab5375befb4525ede3b16e8d2c6b65ad2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 21 Jan 2024 09:50:53 +0000 Subject: [PATCH 1188/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 2fec161..6e16e3e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 January 20 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 January 21 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From a9b9a4b3a2dcc1e81828cfd74bfb61193b014b67 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 21 Jan 2024 11:10:24 +0100 Subject: [PATCH 1189/1610] fix(keys): make sure we don't delete the global mapping when executing an ft keymap. See #1241 --- lua/lazy/core/handler/keys.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 6ca2c50..815fcbb 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -163,7 +163,11 @@ end -- mapping when needed ---@param keys LazyKeys function M:_del(keys) - pcall(vim.keymap.del, keys.mode, keys.lhs) + pcall(vim.keymap.del, keys.mode, keys.lhs, { + -- NOTE: for buffer-local mappings, we only delete the mapping for the current buffer + -- So the mapping could still exist in other buffers + buffer = keys.ft and true or nil, + }) -- make sure to create global mappings when needed -- buffer-local mappings are managed by lazy if not keys.ft then From d09084c4b1f5c58724152a4acad7c880117a95ea Mon Sep 17 00:00:00 2001 From: Emilia Simmons <emilia.milisims@gmail.com> Date: Sun, 21 Jan 2024 05:40:46 -0500 Subject: [PATCH 1190/1610] fix(keys): fix abbreviation expansion on lazy load (#1219) --- lua/lazy/core/handler/keys.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 815fcbb..e2020d1 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -128,6 +128,9 @@ function M:_add(keys) self:_set(keys, buf) end + if keys.mode:sub(-1) == 'a' then + lhs = lhs .. '<C-]>' + end local feed = vim.api.nvim_replace_termcodes("<Ignore>" .. lhs, true, true, true) -- insert instead of append the lhs vim.api.nvim_feedkeys(feed, "i", false) From 28126922c9b54e35a192ac415788f202c3944c9f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 21 Jan 2024 11:43:48 +0100 Subject: [PATCH 1191/1610] chore(main): release 10.16.0 (#1284) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 18 ++++++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f953d5c..8232b8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## [10.16.0](https://github.com/folke/lazy.nvim/compare/v10.15.1...v10.16.0) (2024-01-21) + + +### Features + +* **plugin:** dev.path can now be a function ([#1157](https://github.com/folke/lazy.nvim/issues/1157)) ([a6f782a](https://github.com/folke/lazy.nvim/commit/a6f782adc1ace840a7e671c731daab7851cba6af)) +* **ui:** add style to dimmed commits ([#1210](https://github.com/folke/lazy.nvim/issues/1210)) ([7ded44c](https://github.com/folke/lazy.nvim/commit/7ded44ce2a442aa32b90488b8f1f9c8ca6899f3b)) + + +### Bug Fixes + +* **fs:** error when plugin directory to delete is not a valid directory ([47d4baa](https://github.com/folke/lazy.nvim/commit/47d4baafcc370f16c195fd718f37f8fb1e0aa9a1)) +* **git:** comment sign detection in get_config function ([#1281](https://github.com/folke/lazy.nvim/issues/1281)) ([d0d410b](https://github.com/folke/lazy.nvim/commit/d0d410bc222a475202d9c2b55d1c5fbd12c26ffe)) +* **health:** dont warn on submodules. Fixes [#1174](https://github.com/folke/lazy.nvim/issues/1174) ([1b3df6c](https://github.com/folke/lazy.nvim/commit/1b3df6c00797e1b12f7c16148261e9dd841a33dd)) +* **keys:** allow global/local ft keymaps to exist at the same time. Fixes [#1241](https://github.com/folke/lazy.nvim/issues/1241) ([5757b55](https://github.com/folke/lazy.nvim/commit/5757b551fc6066d836b9e45f70b41561ca619272)) +* **keys:** fix abbreviation expansion on lazy load ([#1219](https://github.com/folke/lazy.nvim/issues/1219)) ([d09084c](https://github.com/folke/lazy.nvim/commit/d09084c4b1f5c58724152a4acad7c880117a95ea)) +* **keys:** make sure we don't delete the global mapping when executing an ft keymap. See [#1241](https://github.com/folke/lazy.nvim/issues/1241) ([a9b9a4b](https://github.com/folke/lazy.nvim/commit/a9b9a4b3a2dcc1e81828cfd74bfb61193b014b67)) + ## [10.15.1](https://github.com/folke/lazy.nvim/compare/v10.15.0...v10.15.1) (2023-11-04) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 90c4206..e5f5f1a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -177,7 +177,7 @@ M.defaults = { debug = false, } -M.version = "10.15.1" -- x-release-please-version +M.version = "10.16.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 670a6fec7f9b03134849e308d87f4dc316875c46 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 23 Jan 2024 21:51:00 +0100 Subject: [PATCH 1192/1610] fix(manage): better support for using the default colorscheme during install. See #1277 --- lua/lazy/core/loader.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 0dc9e9f..2d011dc 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -67,6 +67,9 @@ function M.install_missing() for _, plugin in pairs(Config.plugins) do if not (plugin._.installed or Plugin.has_errors(plugin)) then for _, colorscheme in ipairs(Config.options.install.colorscheme) do + if colorscheme == "default" then + break + end M.colorscheme(colorscheme) if vim.g.colors_name or pcall(vim.cmd.colorscheme, colorscheme) then break From aedcd79811d491b60d0a6577a9c1701063c2a609 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:51:51 +0000 Subject: [PATCH 1193/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6e16e3e..5138375 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 January 21 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 January 23 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 5aea4e7021287d7bcda6f31d7ad234580940be32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=8D=E7=94=9F=E8=8A=B1?= <hoangtun0810@gmail.com> Date: Fri, 8 Mar 2024 01:27:50 +0900 Subject: [PATCH 1194/1610] fix(types): fix incorrect LuaLS types (#1339) --- lua/lazy/types.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 5085b14..5d1980a 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -69,7 +69,7 @@ ---@field event? string[]|string|LazyEventSpec[]|fun(self:LazyPlugin, event:string[]):string[] ---@field cmd? string[]|string|fun(self:LazyPlugin, cmd:string[]):string[] ---@field ft? string[]|string|fun(self:LazyPlugin, ft:string[]):string[] ----@field keys? string|string[]|LazyKeysSpec[]|fun(self:LazyPlugin, keys:string[]):(string|LazyKeys)[] +---@field keys? string|string[]|LazyKeysSpec[]|fun(self:LazyPlugin, keys:string[]):((string|LazyKeys)[]) ---@field module? false ---@class LazyPluginSpec: LazyPluginBase,LazyPluginSpecHandlers,LazyPluginHooks,LazyPluginRef From 5be95fe3b4f024337b54e38cb2562f29b4504d45 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 16:28:22 +0000 Subject: [PATCH 1195/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5138375..2f30f42 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 January 23 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 07 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From c96fc24555e838a5d9ae6207c0e74919a8c603da Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 7 Mar 2024 17:30:37 +0100 Subject: [PATCH 1196/1610] style: format --- lua/lazy/core/handler/keys.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index e2020d1..382d732 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -128,8 +128,8 @@ function M:_add(keys) self:_set(keys, buf) end - if keys.mode:sub(-1) == 'a' then - lhs = lhs .. '<C-]>' + if keys.mode:sub(-1) == "a" then + lhs = lhs .. "<C-]>" end local feed = vim.api.nvim_replace_termcodes("<Ignore>" .. lhs, true, true, true) -- insert instead of append the lhs From 0694651fd37c3645e1683b4f392d4e38e7d2991b Mon Sep 17 00:00:00 2001 From: TheSast <27977196+TheSast@users.noreply.github.com> Date: Thu, 7 Mar 2024 16:32:07 +0000 Subject: [PATCH 1197/1610] feat(loader): warn when maplocalleader is changed after init (#1326) * feat(loader): warn when maplocalleader is changed after init * docs: default maplocalleader --------- Co-authored-by: Folke Lemaitre <folke.lemaitre@gmail.com> --- README.md | 3 ++- lua/lazy/core/config.lua | 4 ++++ lua/lazy/core/loader.lua | 1 + lua/lazy/manage/reloader.lua | 7 +++++++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c404f63..7231917 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ require("lazy").setup(plugins, opts) ```lua -- Example using a list of specs with the default options vim.g.mapleader = " " -- Make sure to set `mapleader` before lazy so your mappings are correct +vim.g.maplocalleader = "\\" -- Same for `maplocalleader` require("lazy").setup({ "folke/which-key.nvim", @@ -537,7 +538,7 @@ Any command can have a **bang** to make the command wait till it finished. For e if you want to sync lazy from the cmdline, you can use: ```shell -$ nvim --headless "+Lazy! sync" +qa +nvim --headless "+Lazy! sync" +qa ``` `opts` is a table with the following key-values: diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index e5f5f1a..6b64c9d 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -199,6 +199,9 @@ M.me = nil ---@type string M.mapleader = nil +---@type string +M.maplocalleader = nil + function M.headless() return #vim.api.nvim_list_uis() == 0 end @@ -245,6 +248,7 @@ function M.setup(opts) -- disable plugin loading since we do all of that ourselves vim.go.loadplugins = false M.mapleader = vim.g.mapleader + M.maplocalleader = vim.g.maplocalleader if M.headless() then require("lazy.view.commands").setup() diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 2d011dc..ac5f471 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -50,6 +50,7 @@ function M.setup() Util.track() end Config.mapleader = vim.g.mapleader + Config.maplocalleader = vim.g.maplocalleader -- report any warnings & errors Config.spec:report() diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index c48cc9f..e94f038 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -76,6 +76,13 @@ function M.check(start) Config.mapleader = vim.g.mapleader end + if Loader.init_done and Config.maplocalleader ~= vim.g.maplocalleader then + vim.schedule(function() + require("lazy.core.util").warn("You need to set `vim.g.maplocalleader` **BEFORE** loading lazy") + end) + Config.maplocalleader = vim.g.maplocalleader + end + if not (start or #changes == 0) then vim.schedule(function() if Config.options.change_detection.notify and not Config.headless() then From e1e8d2f0f6e1cc1df3430458453a817cbd287bed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 16:32:44 +0000 Subject: [PATCH 1198/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 2f30f42..3e61949 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -90,6 +90,7 @@ Nextstep is to add **lazy.nvim** below the code added in the prior step in >lua -- Example using a list of specs with the default options vim.g.mapleader = " " -- Make sure to set `mapleader` before lazy so your mappings are correct + vim.g.maplocalleader = "\\" -- Same for `maplocalleader` require("lazy").setup({ "folke/which-key.nvim", @@ -653,7 +654,7 @@ 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 + nvim --headless "+Lazy! sync" +qa < `opts` is a table with the following key-values: From d5c58bb1937f8aee390f206e724ef23b0cc95eb3 Mon Sep 17 00:00:00 2001 From: Wayne Wu <11427457+wyw@users.noreply.github.com> Date: Fri, 8 Mar 2024 00:32:52 +0800 Subject: [PATCH 1199/1610] fix(ui): remove a single space character from home title (#1309) Align home pill title spacing with other pills --- lua/lazy/view/render.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 7487056..1d97dd3 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -124,7 +124,7 @@ function M:title() local title = " " .. mode.name:sub(1, 1):upper() .. mode.name:sub(2) .. " (" .. mode.key .. ") " if mode.name == "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 From 298bed190e40b67bb1c20c4d5845c2c0c7da450f Mon Sep 17 00:00:00 2001 From: Riley Bruins <ribru17@hotmail.com> Date: Thu, 7 Mar 2024 08:34:29 -0800 Subject: [PATCH 1200/1610] fix: update to new treesitter capture groups (#1294) --- README.md | 8 ++++---- doc/lazy.nvim.txt | 8 ++++---- lua/lazy/view/colors.lua | 8 ++++---- lua/lazy/view/render.lua | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 7231917..10fabe9 100644 --- a/README.md +++ b/README.md @@ -791,7 +791,7 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori | **LazyCommitScope** | **_Italic_** | conventional commit scope | | **LazyCommitType** | **_Title_** | conventional commit type | | **LazyDimmed** | **_Conceal_** | property | -| **LazyDir** | **_@text.reference_** | directory | +| **LazyDir** | **_@markup.link_** | directory | | **LazyH1** | **_IncSearch_** | home button | | **LazyH2** | **_Bold_** | titles | | **LazyLocal** | **_Constant_** | | @@ -806,14 +806,14 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori | **LazyReasonImport** | **_Identifier_** | | | **LazyReasonKeys** | **_Statement_** | | | **LazyReasonPlugin** | **_Special_** | | -| **LazyReasonRequire** | **_@parameter_** | | +| **LazyReasonRequire** | **_@variable.parameter_** | | | **LazyReasonRuntime** | **_@macro_** | | | **LazyReasonSource** | **_Character_** | | -| **LazyReasonStart** | **_@field_** | | +| **LazyReasonStart** | **_@variable.member_** | | | **LazySpecial** | **_@punctuation.special_** | | | **LazyTaskError** | **_ErrorMsg_** | task errors | | **LazyTaskOutput** | **_MsgArea_** | task output | -| **LazyUrl** | **_@text.reference_** | url | +| **LazyUrl** | **_@markup.link_** | url | | **LazyValue** | **_@string_** | value of a property | <!-- colors:end --> diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 3e61949..617bdc1 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -924,7 +924,7 @@ Click to see all highlight groups ~ LazyDimmed Conceal property - LazyDir _@text.reference_ directory + LazyDir _@markup.link_ directory LazyH1 IncSearch homebutton @@ -955,13 +955,13 @@ Click to see all highlight groups ~ LazyReasonPlugin Special - LazyReasonRequire _@parameter_ + LazyReasonRequire _@variable.parameter_ LazyReasonRuntime _@macro_ LazyReasonSource Character - LazyReasonStart _@field_ + LazyReasonStart _@variable.member_ LazySpecial _@punctuation.special_ @@ -969,7 +969,7 @@ Click to see all highlight groups ~ LazyTaskOutput MsgArea task output - LazyUrl _@text.reference_ url + LazyUrl _@markup.link_ url LazyValue _@string_ valueof a property --------------------------------------------------------------------------------- diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index cc00a3a..83269f9 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -21,18 +21,18 @@ M.colors = { ReasonPlugin = "Special", ReasonEvent = "Constant", ReasonKeys = "Statement", - ReasonStart = "@field", + ReasonStart = "@variable.member", ReasonSource = "Character", ReasonFt = "Character", ReasonCmd = "Operator", ReasonImport = "Identifier", - ReasonRequire = "@parameter", + ReasonRequire = "@variable.parameter", Button = "CursorLine", ButtonActive = "Visual", TaskOutput = "MsgArea", -- task output TaskError = "ErrorMsg", -- task errors - Dir = "@text.reference", -- directory - Url = "@text.reference", -- url + Dir = "@markup.link", -- directory + Url = "@markup.link", -- url } M.did_setup = false diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 1d97dd3..5d7e197 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -476,7 +476,7 @@ function M:log(task) ["#%d+"] = "LazyCommitIssue", ["^%S+:"] = dimmed and "Bold" or "LazyCommitType", ["^%S+(%(.*%))!?:"] = "LazyCommitScope", - ["`.-`"] = "@text.literal.markdown_inline", + ["`.-`"] = "@markup.raw.markdown_inline", ["%*.-%*"] = "Italic", ["%*%*.-%*%*"] = "Bold", }) @@ -582,7 +582,7 @@ function M:profile() self:append("Based on the actual CPU time of the Neovim process till "):append("UIEnter", "LazySpecial") self:append("."):nl() self:append("This is more accurate than ") - self:append("`nvim --startuptime`", "@text.literal.markdown_inline") + self:append("`nvim --startuptime`", "@markup.raw.markdown_inline") self:append(".") else self:append("An accurate startuptime based on the actual CPU time of the Neovim process is not available."):nl() From a5ac16955e09f285074287b53e833ab675d15eef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 16:35:04 +0000 Subject: [PATCH 1201/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 617bdc1..844aa6d 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -955,13 +955,13 @@ Click to see all highlight groups ~ LazyReasonPlugin Special - LazyReasonRequire _@variable.parameter_ + LazyReasonRequire _@variable.parameter_ LazyReasonRuntime _@macro_ LazyReasonSource Character - LazyReasonStart _@variable.member_ + LazyReasonStart _@variable.member_ LazySpecial _@punctuation.special_ From 83493db50a434a4c5c648faf41e2ead80f96e478 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 17:41:58 +0100 Subject: [PATCH 1202/1610] chore(main): release 10.17.0 (#1292) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 15 +++++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8232b8a..e766de1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## [10.17.0](https://github.com/folke/lazy.nvim/compare/v10.16.0...v10.17.0) (2024-03-07) + + +### Features + +* **loader:** warn when maplocalleader is changed after init ([#1326](https://github.com/folke/lazy.nvim/issues/1326)) ([0694651](https://github.com/folke/lazy.nvim/commit/0694651fd37c3645e1683b4f392d4e38e7d2991b)) + + +### Bug Fixes + +* **manage:** better support for using the default colorscheme during install. See [#1277](https://github.com/folke/lazy.nvim/issues/1277) ([670a6fe](https://github.com/folke/lazy.nvim/commit/670a6fec7f9b03134849e308d87f4dc316875c46)) +* **types:** fix incorrect LuaLS types ([#1339](https://github.com/folke/lazy.nvim/issues/1339)) ([5aea4e7](https://github.com/folke/lazy.nvim/commit/5aea4e7021287d7bcda6f31d7ad234580940be32)) +* **ui:** remove a single space character from home title ([#1309](https://github.com/folke/lazy.nvim/issues/1309)) ([d5c58bb](https://github.com/folke/lazy.nvim/commit/d5c58bb1937f8aee390f206e724ef23b0cc95eb3)) +* update to new treesitter capture groups ([#1294](https://github.com/folke/lazy.nvim/issues/1294)) ([298bed1](https://github.com/folke/lazy.nvim/commit/298bed190e40b67bb1c20c4d5845c2c0c7da450f)) + ## [10.16.0](https://github.com/folke/lazy.nvim/compare/v10.15.1...v10.16.0) (2024-01-21) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 6b64c9d..60934a0 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -177,7 +177,7 @@ M.defaults = { debug = false, } -M.version = "10.16.0" -- x-release-please-version +M.version = "10.17.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 9e157df077d24654d0cdefe08158cd4f76e85fe8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 22 Mar 2024 08:58:36 +0100 Subject: [PATCH 1203/1610] feat: refactor all vim.loop -> vim.uv and add a shim when needed --- lua/lazy/core/cache.lua | 12 ++++++------ lua/lazy/core/config.lua | 2 +- lua/lazy/core/loader.lua | 4 ++-- lua/lazy/core/util.lua | 16 ++++++++-------- lua/lazy/health.lua | 4 ++-- lua/lazy/help.lua | 6 +++--- lua/lazy/init.lua | 12 +++++++----- lua/lazy/manage/process.lua | 2 +- lua/lazy/manage/reloader.lua | 4 ++-- lua/lazy/manage/runner.lua | 2 +- lua/lazy/manage/task/fs.lua | 8 ++++---- lua/lazy/manage/task/git.lua | 4 ++-- lua/lazy/manage/task/init.lua | 6 +++--- lua/lazy/stats.lua | 2 +- lua/lazy/util.lua | 4 ++-- tests/core/e2e_spec.lua | 4 ++-- tests/core/util_spec.lua | 4 ++-- tests/helpers.lua | 6 +++--- tests/init.lua | 2 +- 19 files changed, 53 insertions(+), 51 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index ea9f4d9..6588c1e 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -1,4 +1,4 @@ -local uv = vim.loop +local uv = vim.uv local M = {} @@ -51,7 +51,7 @@ end ---@private function Loader.normalize(path) if path:sub(1, 1) == "~" then - local home = vim.loop.os_homedir() or "~" + local home = vim.uv.os_homedir() or "~" if home:sub(-1) == "\\" or home:sub(-1) == "/" then home = home:sub(1, -2) end @@ -222,7 +222,7 @@ end --- Loads the given module path using the cache ---@param modpath string ---@param opts? {hash?: CacheHash, mode?: "b"|"t"|"bt", env?:table} (table|nil) Options for loading the module: ---- - hash: (table) the hash of the file to load if it is already known. (defaults to `vim.loop.fs_stat({modpath})`) +--- - hash: (table) the hash of the file to load if it is already known. (defaults to `vim.uv.fs_stat({modpath})`) --- - mode: (string) the mode to load the module with. "b"|"t"|"bt" (defaults to `nil`) --- - env: (table) the environment to load the module in. (defaults to `nil`) ---@see |luaL_loadfile()| @@ -442,9 +442,9 @@ function Loader.lsmod(path) if not Loader._indexed[path] then local start = uv.hrtime() Loader._indexed[path] = {} - local handle = vim.loop.fs_scandir(path .. "/lua") + local handle = vim.uv.fs_scandir(path .. "/lua") while handle do - local name, t = vim.loop.fs_scandir_next(handle) + local name, t = vim.uv.fs_scandir_next(handle) if not name then break end @@ -480,7 +480,7 @@ function M._profile_loaders() for l, loader in pairs(package.loaders) do local loc = debug.getinfo(loader, "Sn").source:sub(2) package.loaders[l] = function(modname) - local start = vim.loop.hrtime() + local start = vim.uv.hrtime() local ret = loader(modname) Loader.track("loader " .. l .. ": " .. loc, start) Loader.track("loader_all", start) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 60934a0..0e6b7ee 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -17,7 +17,7 @@ M.defaults = { -- leave nil when passing the spec as the first argument to setup() spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. - concurrency = jit.os:find("Windows") and (vim.loop.available_parallelism() * 2) or nil, ---@type number limit the maximum amount of concurrent tasks + concurrency = jit.os:find("Windows") and (vim.uv.available_parallelism() * 2) or nil, ---@type number limit the maximum amount of concurrent tasks git = { -- defaults for the `Lazy log` command -- log = { "--since=3 days ago" }, -- show commits from the last 3 days diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index ac5f471..9cd5018 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -472,7 +472,7 @@ function M.add_to_rtp(plugin) table.insert(rtp, idx_dir or (#rtp + 1), plugin.dir) local after = plugin.dir .. "/after" - if vim.loop.fs_stat(after) then + if vim.uv.fs_stat(after) then table.insert(rtp, idx_after or (#rtp + 1), after) end @@ -495,7 +495,7 @@ function M.colorscheme(name) if not plugin._.loaded then for _, ext in ipairs({ "lua", "vim" }) do local path = plugin.dir .. "/colors/" .. name .. "." .. ext - if vim.loop.fs_stat(path) then + if vim.uv.fs_stat(path) then return M.load(plugin, { colorscheme = name }) end end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 77cb8f5..e51e670 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -12,7 +12,7 @@ function M.track(data, time) if data then local entry = { data = data, - time = time or vim.loop.hrtime(), + time = time or vim.uv.hrtime(), } table.insert(M._profiles[#M._profiles], entry) @@ -23,7 +23,7 @@ function M.track(data, time) else ---@type LazyProfile local entry = table.remove(M._profiles) - entry.time = vim.loop.hrtime() - entry.time + entry.time = vim.uv.hrtime() - entry.time return entry end end @@ -54,7 +54,7 @@ end ---@return string function M.norm(path) if path:sub(1, 1) == "~" then - local home = vim.loop.os_homedir() + local home = vim.uv.os_homedir() if home:sub(-1) == "\\" or home:sub(-1) == "/" then home = home:sub(1, -2) end @@ -175,9 +175,9 @@ end ---@param path string ---@param fn fun(path: string, name:string, type:FileType):boolean? function M.ls(path, fn) - local handle = vim.loop.fs_scandir(path) + local handle = vim.uv.fs_scandir(path) while handle do - local name, t = vim.loop.fs_scandir_next(handle) + local name, t = vim.uv.fs_scandir_next(handle) if not name then break end @@ -187,7 +187,7 @@ function M.ls(path, fn) -- HACK: type is not always returned due to a bug in luv, -- so fecth it with fs_stat instead when needed. -- see https://github.com/folke/lazy.nvim/issues/306 - if fn(fname, name, t or vim.loop.fs_stat(fname).type) == false then + if fn(fname, name, t or vim.uv.fs_stat(fname).type) == false then break end end @@ -263,7 +263,7 @@ function M.lsmod(modname, fn) return end - if vim.loop.fs_stat(root .. ".lua") then + if vim.uv.fs_stat(root .. ".lua") then fn(modname, root .. ".lua") end @@ -272,7 +272,7 @@ function M.lsmod(modname, fn) fn(modname, path) elseif (type == "file" or type == "link") and name:sub(-4) == ".lua" then fn(modname .. "." .. name:sub(1, -5), path) - elseif type == "directory" and vim.loop.fs_stat(path .. "/init.lua") then + elseif type == "directory" and vim.uv.fs_stat(path .. "/init.lua") then fn(modname .. "." .. name, path .. "/init.lua") end end) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 89feabe..bcc546a 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -26,7 +26,7 @@ function M.check() local existing = false for _, site in pairs(sites) do for _, packs in ipairs(vim.fn.expand(site .. "/pack/*", false, true)) do - if not packs:find("[/\\]dist$") and vim.loop.fs_stat(packs) then + if not packs:find("[/\\]dist$") and vim.uv.fs_stat(packs) then existing = true warn("found existing packages at `" .. packs .. "`") end @@ -46,7 +46,7 @@ function M.check() end local packer_compiled = vim.fn.stdpath("config") .. "/plugin/packer_compiled.lua" - if vim.loop.fs_stat(packer_compiled) then + if vim.uv.fs_stat(packer_compiled) then error("please remove the file `" .. packer_compiled .. "`") else ok("packer_compiled.lua not found") diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index a33e808..aa7666e 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -4,7 +4,7 @@ local Util = require("lazy.util") local M = {} function M.index(plugin) - if Config.options.readme.skip_if_doc_exists and vim.loop.fs_stat(plugin.dir .. "/doc") then + if Config.options.readme.skip_if_doc_exists and vim.uv.fs_stat(plugin.dir .. "/doc") then return {} end @@ -17,7 +17,7 @@ function M.index(plugin) local tags = {} for _, file in ipairs(files) do file = Util.norm(file) - if vim.loop.fs_stat(file) then + if vim.uv.fs_stat(file) then local rel_file = file:sub(#plugin.dir + 1) local tag_filename = plugin.name .. vim.fn.fnamemodify(rel_file, ":h"):gsub("%W+", "-"):gsub("^%-$", "") local lines = vim.split(Util.read_file(file), "\n") @@ -50,7 +50,7 @@ function M.update() Util.ls(docs, function(path, name, type) if type == "file" and name:sub(-2) == "md" then - vim.loop.fs_unlink(path) + vim.uv.fs_unlink(path) end end) ---@type {file:string, tag:string, line:string}[] diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 75ccfa2..3bfa8c8 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -2,6 +2,8 @@ local M = {} M._start = 0 +vim.uv = vim.uv or vim.uv + local function profile_require() local done = {} ---@type table<string, true> local r = require @@ -35,7 +37,7 @@ function M.setup(spec, opts) opts.spec = spec end - M._start = M._start == 0 and vim.loop.hrtime() or M._start + M._start = M._start == 0 and vim.uv.hrtime() or M._start if vim.g.lazy_did_setup then return vim.notify( "Re-sourcing your config is not supported with lazy.nvim", @@ -53,7 +55,7 @@ function M.setup(spec, opts) if not (pcall(require, "ffi") and jit and jit.version) then return vim.notify("lazy.nvim requires Neovim built with LuaJIT", vim.log.levels.ERROR, { title = "lazy.nvim" }) end - local start = vim.loop.hrtime() + local start = vim.uv.hrtime() -- use the Neovim cache if available if vim.loader and vim.fn.has("nvim-0.9.1") == 1 then @@ -89,7 +91,7 @@ function M.setup(spec, opts) end Util.track({ plugin = "lazy.nvim" }) -- setup start - Util.track("module", vim.loop.hrtime() - start) + Util.track("module", vim.uv.hrtime() - start) -- load config Util.track("config") @@ -100,7 +102,7 @@ function M.setup(spec, opts) Loader.setup() -- correct time delta and loaded - local delta = vim.loop.hrtime() - start + local delta = vim.uv.hrtime() - start Util.track().time = delta -- end setup if Config.plugins["lazy.nvim"] then Config.plugins["lazy.nvim"]._.loaded = { time = delta, source = "init.lua" } @@ -120,7 +122,7 @@ end function M.bootstrap() local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not vim.loop.fs_stat(lazypath) then + if not vim.uv.fs_stat(lazypath) then vim.fn.system({ "git", "clone", diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 1db3677..5bb2716 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -41,7 +41,7 @@ M.signals = { } ---@diagnostic disable-next-line: no-unknown -local uv = vim.loop +local uv = vim.uv ---@class ProcessOpts ---@field args string[] diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index e94f038..ef9305c 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -16,7 +16,7 @@ function M.enable() M.timer:stop() end if #Config.spec.modules > 0 then - M.timer = assert(vim.loop.new_timer()) + M.timer = assert(vim.uv.new_timer()) M.check(true) M.timer:start(2000, 2000, M.check) end @@ -44,7 +44,7 @@ function M.check(start) -- spec is a module local function check(_, modpath) checked[modpath] = true - local hash = vim.loop.fs_stat(modpath) + local hash = vim.uv.fs_stat(modpath) if hash then if M.files[modpath] then if not M.eq(M.files[modpath], hash) then diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 0ac0c15..7e3a39d 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -92,7 +92,7 @@ function Runner:start() end end - local check = vim.loop.new_check() + local check = vim.uv.new_check() check:start(function() if self:resume() then return diff --git a/lua/lazy/manage/task/fs.lua b/lua/lazy/manage/task/fs.lua index c753143..c99c8bf 100644 --- a/lua/lazy/manage/task/fs.lua +++ b/lua/lazy/manage/task/fs.lua @@ -12,17 +12,17 @@ M.clean = { local dir = self.plugin.dir:gsub("/+$", "") assert(dir:find(Config.options.root, 1, true) == 1, self.plugin.dir .. " should be under packpath!") - local stat = vim.loop.fs_lstat(dir) + local stat = vim.uv.fs_lstat(dir) assert(stat and stat.type == "directory", self.plugin.dir .. " should be a directory!") Util.walk(dir, function(path, _, type) if type == "directory" then - vim.loop.fs_rmdir(path) + vim.uv.fs_rmdir(path) else - vim.loop.fs_unlink(path) + vim.uv.fs_unlink(path) end end) - vim.loop.fs_rmdir(dir) + vim.uv.fs_rmdir(dir) self.plugin._.installed = false end, diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index a1bfcf6..c838f30 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -15,7 +15,7 @@ M.log = { if opts.updated and not (plugin._.updated and plugin._.updated.from ~= plugin._.updated.to) then return true end - local stat = vim.loop.fs_stat(plugin.dir .. "/.git") + local stat = vim.uv.fs_stat(plugin.dir .. "/.git") return not (stat and stat.type == "directory") end, ---@param opts {args?: string[], updated?:boolean, check?:boolean} @@ -106,7 +106,7 @@ M.clone = { self.plugin._.cloned = true self.plugin._.installed = true self.plugin._.dirty = true - vim.loop.fs_unlink(marker) + vim.uv.fs_unlink(marker) end end, }) diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index a68c7d7..2397cdf 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -65,7 +65,7 @@ function Task:start() self:start() end) end - self._started = vim.loop.hrtime() + self._started = vim.uv.hrtime() ---@type boolean, string|any local ok, err = pcall(self._task, self, self._opts) if not ok then @@ -81,7 +81,7 @@ function Task:_check() return end end - self._ended = vim.loop.hrtime() + self._ended = vim.uv.hrtime() if self._opts.on_done then self._opts.on_done(self) end @@ -97,7 +97,7 @@ function Task:time() return 0 end if not self:is_done() then - return (vim.loop.hrtime() - self._started) / 1e6 + return (vim.uv.hrtime() - self._started) / 1e6 end return (self._ended - self._started) / 1e6 end diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index a898ff7..c4f1ec2 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -54,7 +54,7 @@ function M.cputime() end local function fallback() - return (vim.loop.hrtime() - require("lazy")._start) / 1e6 + return (vim.uv.hrtime() - require("lazy")._start) / 1e6 end local ok, ret = pcall(real) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index d841255..1c73d43 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -2,7 +2,7 @@ local M = setmetatable({}, { __index = require("lazy.core.util") }) function M.file_exists(file) - return vim.loop.fs_stat(file) ~= nil + return vim.uv.fs_stat(file) ~= nil end ---@param opts? LazyFloatOptions @@ -71,7 +71,7 @@ end ---@param fn F ---@return F function M.throttle(ms, fn) - local timer = vim.loop.new_timer() + local timer = vim.uv.new_timer() local running = false local first = true diff --git a/tests/core/e2e_spec.lua b/tests/core/e2e_spec.lua index a7d02fc..37cdca5 100644 --- a/tests/core/e2e_spec.lua +++ b/tests/core/e2e_spec.lua @@ -28,8 +28,8 @@ describe("lazy", function() "folke/paint.nvim", }, { install_missing = true, defaults = { lazy = true } }) assert(3 == vim.tbl_count(Config.plugins)) - assert(vim.loop.fs_stat(root .. "/paint.nvim/README.md")) - assert(vim.loop.fs_stat(root .. "/neodev.nvim/README.md")) + assert(vim.uv.fs_stat(root .. "/paint.nvim/README.md")) + assert(vim.uv.fs_stat(root .. "/neodev.nvim/README.md")) assert(not neodev) assert(Config.plugins["neodev.nvim"]._.installed) assert(not Config.plugins["neodev.nvim"]._.is_local) diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index 1d3592c..a497881 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -12,7 +12,7 @@ describe("util", function() end end Helpers.fs_rm("") - assert(not vim.loop.fs_stat(Helpers.path("")), "fs root should be deleted") + assert(not vim.uv.fs_stat(Helpers.path("")), "fs root should be deleted") end) it("lsmod lists all mods in dir", function() @@ -85,7 +85,7 @@ describe("util", function() assert.same(Helpers.path("old/lua/foobar"), root) Helpers.fs_rm("old") - assert(not vim.loop.fs_stat(Helpers.path("old/lua/foobar")), "old/lua/foobar should not exist") + assert(not vim.uv.fs_stat(Helpers.path("old/lua/foobar")), "old/lua/foobar should not exist") -- vim.opt.rtp = rtp vim.opt.rtp:append(Helpers.path("new")) diff --git a/tests/helpers.lua b/tests/helpers.lua index 48d84f9..b722a4a 100644 --- a/tests/helpers.lua +++ b/tests/helpers.lua @@ -26,12 +26,12 @@ function M.fs_rm(dir) dir = Util.norm(M.fs_root .. "/" .. dir) Util.walk(dir, function(path, _, type) if type == "directory" then - vim.loop.fs_rmdir(path) + vim.uv.fs_rmdir(path) else - vim.loop.fs_unlink(path) + vim.uv.fs_unlink(path) end end) - vim.loop.fs_rmdir(dir) + vim.uv.fs_rmdir(dir) end return M diff --git a/tests/init.lua b/tests/init.lua index a72b101..7b243c5 100644 --- a/tests/init.lua +++ b/tests/init.lua @@ -9,7 +9,7 @@ end function M.load(plugin) local name = plugin:match(".*/(.*)") local package_root = M.root(".tests/site/pack/deps/start/") - if not vim.loop.fs_stat(package_root .. name) then + if not vim.uv.fs_stat(package_root .. name) then print("Installing " .. plugin) vim.fn.mkdir(package_root, "p") vim.fn.system({ From 6705a0f11f3108ce499f933662602b08f99a6a65 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 07:59:10 +0000 Subject: [PATCH 1204/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 844aa6d..cf2c53b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 07 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 22 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From b2174810cdf18fab850cefd0a50788b19b2d8e94 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:01:10 +0100 Subject: [PATCH 1205/1610] chore(main): release 10.18.0 (#1369) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e766de1..36eaeff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.18.0](https://github.com/folke/lazy.nvim/compare/v10.17.0...v10.18.0) (2024-03-22) + + +### Features + +* refactor all vim.loop -> vim.uv and add a shim when needed ([9e157df](https://github.com/folke/lazy.nvim/commit/9e157df077d24654d0cdefe08158cd4f76e85fe8)) + ## [10.17.0](https://github.com/folke/lazy.nvim/compare/v10.16.0...v10.17.0) (2024-03-07) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 0e6b7ee..910280e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -177,7 +177,7 @@ M.defaults = { debug = false, } -M.version = "10.17.0" -- x-release-please-version +M.version = "10.18.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 61dddaec58f8594e40e95a8d5069ce7e493089df Mon Sep 17 00:00:00 2001 From: Michael Braun <m.braun92@gmail.com> Date: Fri, 22 Mar 2024 09:15:46 +0100 Subject: [PATCH 1206/1610] fix: uv shim was not falling back to vim.loop (#1370) --- lua/lazy/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 3bfa8c8..91acd37 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -2,7 +2,7 @@ local M = {} M._start = 0 -vim.uv = vim.uv or vim.uv +vim.uv = vim.uv or vim.loop local function profile_require() local done = {} ---@type table<string, true> From c76cc600304e07e8677173fcecb45aa866a5681c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:17:40 +0100 Subject: [PATCH 1207/1610] chore(main): release 10.18.1 (#1372) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36eaeff..8f1ac4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.18.1](https://github.com/folke/lazy.nvim/compare/v10.18.0...v10.18.1) (2024-03-22) + + +### Bug Fixes + +* uv shim was not falling back to vim.loop ([#1370](https://github.com/folke/lazy.nvim/issues/1370)) ([61dddae](https://github.com/folke/lazy.nvim/commit/61dddaec58f8594e40e95a8d5069ce7e493089df)) + ## [10.18.0](https://github.com/folke/lazy.nvim/compare/v10.17.0...v10.18.0) (2024-03-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 910280e..7c86d1e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -177,7 +177,7 @@ M.defaults = { debug = false, } -M.version = "10.18.0" -- x-release-please-version +M.version = "10.18.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From b6f7ef856b36c5edbe9f03e3a8554b97c458c953 Mon Sep 17 00:00:00 2001 From: William Mathewson <neanias@users.noreply.github.com> Date: Fri, 22 Mar 2024 08:18:36 +0000 Subject: [PATCH 1208/1610] fix(ui): Add "bot" to dimmed commands list (#1367) nvim-treesitter has added a bot to automate updating parsers. This feels similar to the other commands that are dimmed. --- lua/lazy/view/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index ea8a066..e834573 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -24,7 +24,7 @@ function M.get_commands() return ret end -M.dimmed_commits = { "build", "ci", "chore", "doc", "style", "test" } +M.dimmed_commits = { "bot", "build", "ci", "chore", "doc", "style", "test" } M.keys = { hover = "K", From 3132d7d27d56d6bb4bdd0a09623d162b3cf1c588 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:19:32 +0100 Subject: [PATCH 1209/1610] chore(main): release 10.18.2 (#1373) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f1ac4d..83c104f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.18.2](https://github.com/folke/lazy.nvim/compare/v10.18.1...v10.18.2) (2024-03-22) + + +### Bug Fixes + +* **ui:** Add "bot" to dimmed commands list ([#1367](https://github.com/folke/lazy.nvim/issues/1367)) ([b6f7ef8](https://github.com/folke/lazy.nvim/commit/b6f7ef856b36c5edbe9f03e3a8554b97c458c953)) + ## [10.18.1](https://github.com/folke/lazy.nvim/compare/v10.18.0...v10.18.1) (2024-03-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 7c86d1e..cce6519 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -177,7 +177,7 @@ M.defaults = { debug = false, } -M.version = "10.18.1" -- x-release-please-version +M.version = "10.18.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 9131ea4c4ae59e347716659088a76d9b9ce3b2f5 Mon Sep 17 00:00:00 2001 From: Riley Bruins <ribru17@hotmail.com> Date: Fri, 22 Mar 2024 14:42:17 -0700 Subject: [PATCH 1210/1610] fix(cache): vim.loop fallback (#1375) --- lua/lazy/core/cache.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 6588c1e..07cb677 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -1,4 +1,4 @@ -local uv = vim.uv +local uv = vim.uv or vim.loop local M = {} @@ -51,7 +51,7 @@ end ---@private function Loader.normalize(path) if path:sub(1, 1) == "~" then - local home = vim.uv.os_homedir() or "~" + local home = uv.os_homedir() or "~" if home:sub(-1) == "\\" or home:sub(-1) == "/" then home = home:sub(1, -2) end @@ -442,9 +442,9 @@ function Loader.lsmod(path) if not Loader._indexed[path] then local start = uv.hrtime() Loader._indexed[path] = {} - local handle = vim.uv.fs_scandir(path .. "/lua") + local handle = uv.fs_scandir(path .. "/lua") while handle do - local name, t = vim.uv.fs_scandir_next(handle) + local name, t = uv.fs_scandir_next(handle) if not name then break end @@ -480,7 +480,7 @@ function M._profile_loaders() for l, loader in pairs(package.loaders) do local loc = debug.getinfo(loader, "Sn").source:sub(2) package.loaders[l] = function(modname) - local start = vim.uv.hrtime() + local start = uv.hrtime() local ret = loader(modname) Loader.track("loader " .. l .. ": " .. loc, start) Loader.track("loader_all", start) From 8134f2ac041a609f35ec8fc1a4cb4246292b0026 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 22:51:11 +0100 Subject: [PATCH 1211/1610] chore(main): release 10.18.3 (#1376) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83c104f..7a9a652 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.18.3](https://github.com/folke/lazy.nvim/compare/v10.18.2...v10.18.3) (2024-03-22) + + +### Bug Fixes + +* **cache:** vim.loop fallback ([#1375](https://github.com/folke/lazy.nvim/issues/1375)) ([9131ea4](https://github.com/folke/lazy.nvim/commit/9131ea4c4ae59e347716659088a76d9b9ce3b2f5)) + ## [10.18.2](https://github.com/folke/lazy.nvim/compare/v10.18.1...v10.18.2) (2024-03-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index cce6519..63994c9 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -177,7 +177,7 @@ M.defaults = { debug = false, } -M.version = "10.18.2" -- x-release-please-version +M.version = "10.18.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 66466a2594ab0c446193772a68c236c7e4e02ade Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 22 Mar 2024 23:35:19 +0100 Subject: [PATCH 1212/1610] feat(util): option to force system app for util.open --- lua/lazy/util.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 1c73d43..a3b94f6 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -19,13 +19,15 @@ function M.wo(win, k, v) end end -function M.open(uri) - if M.file_exists(uri) then +---@param opts? {system?:boolean} +function M.open(uri, opts) + opts = opts or {} + if not opts.system and M.file_exists(uri) then return M.float({ style = "", file = uri }) end local Config = require("lazy.core.config") local cmd - if Config.options.ui.browser then + if not opts.system and Config.options.ui.browser then cmd = { Config.options.ui.browser, uri } elseif vim.fn.has("win32") == 1 then cmd = { "explorer", uri } From af6afefbb46ab29a8a1db69536b04290a9403876 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 23:39:43 +0100 Subject: [PATCH 1213/1610] chore(main): release 10.19.0 (#1377) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a9a652..d15874e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.19.0](https://github.com/folke/lazy.nvim/compare/v10.18.3...v10.19.0) (2024-03-22) + + +### Features + +* **util:** option to force system app for util.open ([66466a2](https://github.com/folke/lazy.nvim/commit/66466a2594ab0c446193772a68c236c7e4e02ade)) + ## [10.18.3](https://github.com/folke/lazy.nvim/compare/v10.18.2...v10.18.3) (2024-03-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 63994c9..dc05600 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -177,7 +177,7 @@ M.defaults = { debug = false, } -M.version = "10.18.3" -- x-release-please-version +M.version = "10.19.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From eade87fb837d6cdeef94587ce5e8c8dfb9f88920 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 24 Mar 2024 11:30:00 +0100 Subject: [PATCH 1214/1610] fix(types): fixed type for `version`. Fixes #1381 --- lua/lazy/types.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 5d1980a..9926aee 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -44,7 +44,7 @@ ---@field branch? string ---@field tag? string ---@field commit? string ----@field version? string +---@field version? string|boolean ---@field pin? boolean ---@field submodules? boolean Defaults to true From 08954f723bf2d442ea020551e3acc956f4dc6dc7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 24 Mar 2024 10:30:32 +0000 Subject: [PATCH 1215/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index cf2c53b..69e26cc 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 22 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 24 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From a6b74f30d5aab79a40d932f449c0aa5d4a0c6934 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 26 Mar 2024 19:52:16 +0100 Subject: [PATCH 1216/1610] feat(ui): backdrop for the lazy floating window. Can be disabled with `opts.ui.backdrop` --- README.md | 117 ++++++++++++++++++++------------------- lua/lazy/core/config.lua | 5 +- lua/lazy/view/float.lua | 43 +++++++++++++- 3 files changed, 106 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 10fabe9..48f64ba 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim** ```lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" -if not vim.loop.fs_stat(lazypath) then +if not vim.uv.fs_stat(lazypath) then vim.fn.system({ "git", "clone", @@ -308,11 +308,12 @@ return { -- leave nil when passing the spec as the first argument to setup() spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. - concurrency = jit.os:find("Windows") and (vim.loop.available_parallelism() * 2) or nil, ---@type number limit the maximum amount of concurrent tasks + ---@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 = { "-10" }, -- show the last 10 commits - log = { "-8" }, -- show commits from the last 3 days + -- 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, @@ -339,6 +340,8 @@ return { 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 @@ -346,7 +349,7 @@ return { icons = { cmd = " ", config = "", - event = "", + event = " ", ft = " ", init = " ", import = " ", @@ -358,7 +361,7 @@ return { runtime = " ", require = "󰢱 ", source = " ", - start = "", + start = " ", task = "✔ ", list = { "●", @@ -513,24 +516,24 @@ Any operation can be started from the UI, with a sub command or an API function: <!-- commands:start --> -| 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!!) | +| 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 | +| `: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 | <!-- commands:end --> @@ -781,40 +784,40 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori <!-- colors:start --> -| Highlight Group | Default Group | Description | -| --------------------- | -------------------------- | --------------------------------------------------- | -| **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 | -| **LazyH1** | **_IncSearch_** | home button | -| **LazyH2** | **_Bold_** | titles | -| **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_** | | -| **LazyTaskError** | **_ErrorMsg_** | task errors | -| **LazyTaskOutput** | **_MsgArea_** | task output | -| **LazyUrl** | **_@markup.link_** | url | -| **LazyValue** | **_@string_** | value of a property | +| Highlight Group | Default Group | Description | +| --- | --- | --- | +| **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 | +| **LazyH1** | ***IncSearch*** | home button | +| **LazyH2** | ***Bold*** | titles | +| **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*** | | +| **LazyTaskError** | ***ErrorMsg*** | task errors | +| **LazyTaskOutput** | ***MsgArea*** | task output | +| **LazyUrl** | ***@markup.link*** | url | +| **LazyValue** | ***@string*** | value of a property | <!-- colors:end --> diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index dc05600..4195336 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -17,7 +17,8 @@ M.defaults = { -- leave nil when passing the spec as the first argument to setup() spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. - concurrency = jit.os:find("Windows") and (vim.uv.available_parallelism() * 2) or nil, ---@type number limit the maximum amount of concurrent tasks + ---@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 @@ -48,6 +49,8 @@ M.defaults = { 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 diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 0a21b38..3e8938f 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -15,12 +15,15 @@ local ViewConfig = require("lazy.view.config") ---@field persistent? boolean ---@field ft? string ---@field noautocmd? boolean +---@field backdrop? float ---@class LazyFloat ---@field buf number ---@field win number ---@field opts LazyFloatOptions ---@field win_opts LazyWinOpts +---@field backdrop_buf number +---@field backdrop_win number ---@overload fun(opts?:LazyFloatOptions):LazyFloat local M = {} @@ -43,6 +46,7 @@ function M:init(opts) size = Config.options.ui.size, style = "minimal", border = Config.options.ui.border or "none", + backdrop = Config.options.ui.backdrop or 60, zindex = 50, }, opts or {}) @@ -62,7 +66,7 @@ function M:init(opts) } self:mount() self:on_key(ViewConfig.keys.close, self.close) - self:on({ "BufDelete", "BufHidden" }, self.close, { once = true }) + self:on({ "BufDelete", "BufHidden" }, self.close, { once = false }) return self end @@ -114,6 +118,24 @@ function M:mount() self.buf = vim.api.nvim_create_buf(false, true) end + if self.opts.backdrop and self.opts.backdrop < 100 then + self.backdrop_buf = vim.api.nvim_create_buf(false, true) + self.backdrop_win = vim.api.nvim_open_win(self.backdrop_buf, false, { + relative = "editor", + width = vim.o.columns, + height = vim.o.lines, + row = 0, + col = 0, + style = "minimal", + focusable = false, + zindex = self.opts.zindex - 1, + }) + vim.api.nvim_set_hl(0, "LazyBackdrop", { bg = "#000000", default = true }) + Util.wo(self.backdrop_win, "winhighlight", "Normal:LazyBackdrop") + Util.wo(self.backdrop_win, "winblend", self.opts.backdrop) + vim.bo[self.backdrop_buf].buftype = "nofile" + end + self:layout() self.win = vim.api.nvim_open_win(self.buf, true, self.win_opts) self:focus() @@ -149,6 +171,14 @@ function M:mount() end config.style = self.opts.style ~= "" and self.opts.style or nil vim.api.nvim_win_set_config(self.win, config) + + if self.backdrop_win and vim.api.nvim_win_is_valid(self.backdrop_win) then + vim.api.nvim_win_set_config(self.backdrop_win, { + width = vim.o.columns, + height = vim.o.lines, + }) + end + opts() vim.api.nvim_exec_autocmds("User", { pattern = "LazyFloatResized", modeline = false }) end, @@ -204,7 +234,18 @@ function M:close(opts) if wipe then self.buf = nil end + local backdrop_buf = self.backdrop_buf + local backdrop_win = self.backdrop_win + self.backdrop_buf = nil + self.backdrop_win = nil + vim.schedule(function() + if backdrop_win and vim.api.nvim_win_is_valid(backdrop_win) then + vim.api.nvim_win_close(backdrop_win, true) + end + if backdrop_buf and vim.api.nvim_buf_is_valid(backdrop_buf) then + vim.api.nvim_buf_delete(backdrop_buf, { force = true }) + end if win and vim.api.nvim_win_is_valid(win) then vim.api.nvim_win_close(win, true) end From 6749a259c140631e53282b93050e2ab8063db5eb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 18:52:53 +0000 Subject: [PATCH 1217/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 160 ++++++++++++++++++++++++++-------------------- 1 file changed, 92 insertions(+), 68 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 69e26cc..fee5a68 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 24 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 26 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -62,7 +62,7 @@ You can add the following Lua code to your `init.lua` to bootstrap >lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not vim.loop.fs_stat(lazypath) then + if not vim.uv.fs_stat(lazypath) then vim.fn.system({ "git", "clone", @@ -411,11 +411,12 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* -- leave nil when passing the spec as the first argument to setup() spec = nil, ---@type LazySpec lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. - concurrency = jit.os:find("Windows") and (vim.loop.available_parallelism() * 2) or nil, ---@type number limit the maximum amount of concurrent tasks + ---@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 = { "-10" }, -- show the last 10 commits - log = { "-8" }, -- show commits from the last 3 days + -- 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, @@ -442,6 +443,8 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* 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 @@ -449,7 +452,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* icons = { cmd = " ", config = "", - event = "", + event = " ", ft = " ", init = " ", import = " ", @@ -461,7 +464,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* runtime = " ", require = "󰢱 ", source = " ", - start = "", + start = " ", task = "✔ ", list = { "●", @@ -611,45 +614,63 @@ 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 + --------------------------------------------------------------------------------------------------- + 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 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 clean [plugins] require("lazy").clean(opts?) Clean plugins that are + no longer needed - :Lazy clear require("lazy").clear() Clear finished tasks + :Lazy clear require("lazy").clear() Clear finished tasks - :Lazy debug require("lazy").debug() Show debug information + :Lazy debug require("lazy").debug() Show debug information - :Lazy health require("lazy").health() Run :checkhealth lazy + :Lazy health require("lazy").health() Run :checkhealth lazy - :Lazy help require("lazy").help() Toggle this help page + :Lazy help require("lazy").help() Toggle this help page - :Lazy home require("lazy").home() Go back to plugin list + :Lazy home require("lazy").home() Go back to plugin list - :Lazy install [plugins] require("lazy").install(opts?) Install missing plugins + :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 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 log [plugins] require("lazy").log(opts?) Show recent updates - :Lazy profile require("lazy").profile() Show detailed profiling + :Lazy profile require("lazy").profile() Show detailed + profiling - :Lazy reload {plugins} require("lazy").reload(opts) Reload a plugin (experimental!!) + :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 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 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 - -------------------------------------------------------------------------------------------------------------- + :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: @@ -905,74 +926,77 @@ HIGHLIGHT GROUPS *lazy.nvim-lazy.nvim-highlight-groups* Click to see all highlight groups ~ - --------------------------------------------------------------------------------- - Highlight Group Default Group Description - ------------------- ------------------------ ------------------------------------ - LazyButton CursorLine + ----------------------------------------------------------------------- + Highlight Group Default Group Description + ----------------------- ----------------------- ----------------------- + LazyButton CursorLine - LazyButtonActive Visual + LazyButtonActive Visual - LazyComment Comment + LazyComment Comment - LazyCommit _@variable.builtin_ commitref + LazyCommit @variable.builtin commit ref - LazyCommitIssue Number + LazyCommitIssue Number - LazyCommitScope Italic conventional commit scope + LazyCommitScope Italic conventional commit + scope - LazyCommitType Title conventional commit type + LazyCommitType Title conventional commit + type - LazyDimmed Conceal property + LazyDimmed Conceal property - LazyDir _@markup.link_ directory + LazyDir @markup.link directory - LazyH1 IncSearch homebutton + LazyH1 IncSearch home button - LazyH2 Bold titles + LazyH2 Bold titles - LazyLocal Constant + LazyLocal Constant - LazyNoCond DiagnosticWarn unloaded icon for a plugin where - cond() was false + LazyNoCond DiagnosticWarn unloaded icon for a + plugin where cond() was + false - LazyNormal NormalFloat + LazyNormal NormalFloat - LazyProgressDone Constant progress bar done + LazyProgressDone Constant progress bar done - LazyProgressTodo LineNr progress bar todo + LazyProgressTodo LineNr progress bar todo - LazyProp Conceal property + LazyProp Conceal property - LazyReasonCmd Operator + LazyReasonCmd Operator - LazyReasonEvent Constant + LazyReasonEvent Constant - LazyReasonFt Character + LazyReasonFt Character - LazyReasonImport Identifier + LazyReasonImport Identifier - LazyReasonKeys Statement + LazyReasonKeys Statement - LazyReasonPlugin Special + LazyReasonPlugin Special - LazyReasonRequire _@variable.parameter_ + LazyReasonRequire @variable.parameter - LazyReasonRuntime _@macro_ + LazyReasonRuntime @macro - LazyReasonSource Character + LazyReasonSource Character - LazyReasonStart _@variable.member_ + LazyReasonStart @variable.member - LazySpecial _@punctuation.special_ + LazySpecial @punctuation.special - LazyTaskError ErrorMsg taskerrors + LazyTaskError ErrorMsg task errors - LazyTaskOutput MsgArea task output + LazyTaskOutput MsgArea task output - LazyUrl _@markup.link_ url + LazyUrl @markup.link url - LazyValue _@string_ valueof a property - --------------------------------------------------------------------------------- + LazyValue @string value of a property + ----------------------------------------------------------------------- PLUGIN AUTHORS *lazy.nvim-lazy.nvim-plugin-authors* From 107719d31e2e4f4dccbabdbd7c7e662aebdb8399 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 19:54:49 +0100 Subject: [PATCH 1218/1610] chore(main): release 10.20.0 (#1382) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d15874e..a87bb1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [10.20.0](https://github.com/folke/lazy.nvim/compare/v10.19.0...v10.20.0) (2024-03-26) + + +### Features + +* **ui:** backdrop for the lazy floating window. Can be disabled with `opts.ui.backdrop` ([a6b74f3](https://github.com/folke/lazy.nvim/commit/a6b74f30d5aab79a40d932f449c0aa5d4a0c6934)) + + +### Bug Fixes + +* **types:** fixed type for `version`. Fixes [#1381](https://github.com/folke/lazy.nvim/issues/1381) ([eade87f](https://github.com/folke/lazy.nvim/commit/eade87fb837d6cdeef94587ce5e8c8dfb9f88920)) + ## [10.19.0](https://github.com/folke/lazy.nvim/compare/v10.18.3...v10.19.0) (2024-03-22) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4195336..335c93f 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -180,7 +180,7 @@ M.defaults = { debug = false, } -M.version = "10.19.0" -- x-release-please-version +M.version = "10.20.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 79e2e8593410f199b85f5d61a83704a16169282f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 26 Mar 2024 20:30:12 +0100 Subject: [PATCH 1219/1610] fix(ui): properly cleanup on `:quit`. Fixes #1385 --- lua/lazy/view/float.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 3e8938f..808f09c 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -66,7 +66,7 @@ function M:init(opts) } self:mount() self:on_key(ViewConfig.keys.close, self.close) - self:on({ "BufDelete", "BufHidden" }, self.close, { once = false }) + self:on({ "WinLeave", "BufDelete", "BufHidden" }, self.close, { once = false }) return self end From 68941b7b13861ca44ad5d4caf7296d9160b4732f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 20:32:47 +0100 Subject: [PATCH 1220/1610] chore(main): release 10.20.1 (#1386) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a87bb1b..c6785ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.20.1](https://github.com/folke/lazy.nvim/compare/v10.20.0...v10.20.1) (2024-03-26) + + +### Bug Fixes + +* **ui:** properly cleanup on `:quit`. Fixes [#1385](https://github.com/folke/lazy.nvim/issues/1385) ([79e2e85](https://github.com/folke/lazy.nvim/commit/79e2e8593410f199b85f5d61a83704a16169282f)) + ## [10.20.0](https://github.com/folke/lazy.nvim/compare/v10.19.0...v10.20.0) (2024-03-26) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 335c93f..bfc57d3 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -180,7 +180,7 @@ M.defaults = { debug = false, } -M.version = "10.20.0" -- x-release-please-version +M.version = "10.20.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From d37a76b87137c777f3d778ed03729d7f332a85f0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 26 Mar 2024 22:57:55 +0100 Subject: [PATCH 1221/1610] fix(ui): only enable backdrop when guicolors is set. Fixes #1387 --- lua/lazy/view/float.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 808f09c..d0cd6c7 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -118,7 +118,7 @@ function M:mount() self.buf = vim.api.nvim_create_buf(false, true) end - if self.opts.backdrop and self.opts.backdrop < 100 then + if self.opts.backdrop and self.opts.backdrop < 100 and vim.o.termguicolors then self.backdrop_buf = vim.api.nvim_create_buf(false, true) self.backdrop_win = vim.api.nvim_open_win(self.backdrop_buf, false, { relative = "editor", From eefb8974d6a092da6e1631855e4288499b651fdd Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 27 Mar 2024 08:48:55 +0100 Subject: [PATCH 1222/1610] fix(ui): special handling for floats closed before VimEnter. Seems that WinClosed events dont execute before that. Fixes #1390 --- lua/lazy/util.lua | 30 ++++++++++++++++++ lua/lazy/view/float.lua | 69 +++++++++++++++++++++++++++++------------ lua/lazy/view/init.lua | 16 +++++----- 3 files changed, 89 insertions(+), 26 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index a3b94f6..705ca39 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -98,6 +98,36 @@ function M.throttle(ms, fn) end end +--- Creates a weak reference to an object. +--- Calling the returned function will return the object if it has not been garbage collected. +---@generic T: table +---@param obj T +---@return T|fun():T? +function M.weak(obj) + local weak = { _obj = obj } + ---@return table<any, any> + local function get() + local ret = rawget(weak, "_obj") + return ret == nil and error("Object has been garbage collected", 2) or ret + end + local mt = { + __mode = "v", + __call = function(t) + return rawget(t, "_obj") + end, + __index = function(_, k) + return get()[k] + end, + __newindex = function(_, k, v) + get()[k] = v + end, + __pairs = function() + return pairs(get()) + end, + } + return setmetatable(weak, mt) +end + ---@class LazyCmdOptions: LazyFloatOptions ---@field cwd? string ---@field env? table<string,string> diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index d0cd6c7..bfbc4eb 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -24,6 +24,7 @@ local ViewConfig = require("lazy.view.config") ---@field win_opts LazyWinOpts ---@field backdrop_buf number ---@field backdrop_win number +---@field id number ---@overload fun(opts?:LazyFloatOptions):LazyFloat local M = {} @@ -33,6 +34,12 @@ setmetatable(M, { end, }) +local _id = 0 +local function next_id() + _id = _id + 1 + return _id +end + ---@param opts? LazyFloatOptions function M.new(opts) local self = setmetatable({}, { __index = M }) @@ -42,6 +49,7 @@ end ---@param opts? LazyFloatOptions function M:init(opts) require("lazy.view.colors").setup() + self.id = next_id() self.opts = vim.tbl_deep_extend("force", { size = Config.options.ui.size, style = "minimal", @@ -65,8 +73,13 @@ function M:init(opts) title_pos = self.opts.title and self.opts.title_pos or nil, } self:mount() - self:on_key(ViewConfig.keys.close, self.close) - self:on({ "WinLeave", "BufDelete", "BufHidden" }, self.close, { once = false }) + self:on("VimEnter", function() + vim.schedule(function() + if not self:win_valid() then + self:close() + end + end) + end, { buffer = false }) return self end @@ -138,7 +151,13 @@ function M:mount() self:layout() self.win = vim.api.nvim_open_win(self.buf, true, self.win_opts) + self:on("WinClosed", function() + self:close() + self:augroup(true) + end, { win = true }) self:focus() + self:on_key(ViewConfig.keys.close, self.close) + self:on({ "BufDelete", "BufHidden" }, self.close) if vim.bo[self.buf].buftype == "" then vim.bo[self.buf].buftype = "nofile" @@ -185,27 +204,38 @@ function M:mount() }) end +---@param clear? boolean +function M:augroup(clear) + return vim.api.nvim_create_augroup("trouble.window." .. self.id, { clear = clear == true }) +end + ---@param events string|string[] ----@param fn fun(self?):boolean? ----@param opts? table +---@param fn fun(self:LazyFloat, event:{buf:number}):boolean? +---@param opts? vim.api.keyset.create_autocmd | {buffer: false, win?:boolean} function M:on(events, fn, opts) - if type(events) == "string" then - events = { events } + opts = opts or {} + if opts.win then + opts.pattern = self.win .. "" + opts.win = nil + elseif opts.buffer == nil then + opts.buffer = self.buf + elseif opts.buffer == false then + opts.buffer = nil end - for _, e in ipairs(events) do - local event, pattern = e:match("(%w+) (%w+)") - event = event or e - vim.api.nvim_create_autocmd( - event, - vim.tbl_extend("force", { - pattern = pattern, - buffer = (not pattern) and self.buf or nil, - callback = function() - return fn(self) - end, - }, opts or {}) - ) + if opts.pattern then + opts.buffer = nil end + local _self = Util.weak(self) + opts.callback = function(e) + local this = _self() + if not this then + -- delete the autocmd + return true + end + return fn(this, e) + end + opts.group = self:augroup() + vim.api.nvim_create_autocmd(events, opts) end ---@param key string @@ -223,6 +253,7 @@ end ---@param opts? {wipe:boolean} function M:close(opts) + self:augroup(true) local buf = self.buf local win = self.win local wipe = opts and opts.wipe diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index e62fc6e..5753f5b 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -53,7 +53,7 @@ function M.create() Float.init(self, { title = Config.options.ui.title, title_pos = Config.options.ui.title_pos, - noautocmd = true, + noautocmd = false, }) if Config.options.ui.wrap then @@ -69,12 +69,14 @@ function M.create() self.render = Render.new(self) self.update = Util.throttle(Config.options.ui.throttle, self.update) - self:on({ "User LazyRender", "User LazyFloatResized" }, function() - if not (self.buf and vim.api.nvim_buf_is_valid(self.buf)) then - return true - end - self:update() - end) + for _, pattern in ipairs({ "LazyRender", "LazyFloatResized" }) do + self:on({ "User" }, function() + if not (self.buf and vim.api.nvim_buf_is_valid(self.buf)) then + return true + end + self:update() + end, { pattern = pattern }) + end vim.keymap.set("n", ViewConfig.keys.abort, function() require("lazy.manage.process").abort() From b38b2257b643c4c35e3786f7c5e7512d9eb8f945 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 07:49:31 +0000 Subject: [PATCH 1223/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index fee5a68..0c49864 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 26 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 27 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 65887ea871d44822bff47504202b3643f29d614e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 08:55:21 +0100 Subject: [PATCH 1224/1610] chore(main): release 10.20.2 (#1388) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6785ab..b7adaba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [10.20.2](https://github.com/folke/lazy.nvim/compare/v10.20.1...v10.20.2) (2024-03-27) + + +### Bug Fixes + +* **ui:** only enable backdrop when guicolors is set. Fixes [#1387](https://github.com/folke/lazy.nvim/issues/1387) ([d37a76b](https://github.com/folke/lazy.nvim/commit/d37a76b87137c777f3d778ed03729d7f332a85f0)) +* **ui:** special handling for floats closed before VimEnter. Seems that WinClosed events dont execute before that. Fixes [#1390](https://github.com/folke/lazy.nvim/issues/1390) ([eefb897](https://github.com/folke/lazy.nvim/commit/eefb8974d6a092da6e1631855e4288499b651fdd)) + ## [10.20.1](https://github.com/folke/lazy.nvim/compare/v10.20.0...v10.20.1) (2024-03-26) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index bfc57d3..66ca5b2 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -180,7 +180,7 @@ M.defaults = { debug = false, } -M.version = "10.20.1" -- x-release-please-version +M.version = "10.20.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From a836600573fbcf1879b850d40b8cdea59b33f8da Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 27 Mar 2024 09:23:15 +0100 Subject: [PATCH 1225/1610] docs: make bootstrap work on stable and nightly. Fixes #1391 --- README.md | 2 +- lua/lazy/init.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 48f64ba..aeedef9 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim** ```lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" -if not vim.uv.fs_stat(lazypath) then +if not (vim.uv or vim.loop).fs_stat(lazypath) then vim.fn.system({ "git", "clone", diff --git a/lua/lazy/init.lua b/lua/lazy/init.lua index 91acd37..4336da1 100644 --- a/lua/lazy/init.lua +++ b/lua/lazy/init.lua @@ -122,7 +122,7 @@ end function M.bootstrap() local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not vim.uv.fs_stat(lazypath) then + if not (vim.uv or vim.loop).fs_stat(lazypath) then vim.fn.system({ "git", "clone", From e888d5b64c34bc41f7ef2e8850a5e67e4b3e2731 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 08:23:55 +0000 Subject: [PATCH 1226/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0c49864..c73b322 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -62,7 +62,7 @@ You can add the following Lua code to your `init.lua` to bootstrap >lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not vim.uv.fs_stat(lazypath) then + if not (vim.uv or vim.loop).fs_stat(lazypath) then vim.fn.system({ "git", "clone", From e753eb602539bdad9f0709066d5893a788cb5db9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 27 Mar 2024 22:58:58 +0100 Subject: [PATCH 1227/1610] ci: better docgen --- lua/lazy/docs.lua | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index bf42e98..c38d047 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -109,9 +109,15 @@ function M.table(lines) return table.concat(ret, "\n") end +---@param opts? {name?:string, path?:string, modname?:string} ---@return ReadmeBlock -function M.colors() - local str = M.extract("lua/lazy/view/colors.lua", "\nM%.colors = ({.-\n})") +function M.colors(opts) + opts = vim.tbl_extend("force", { + name = "Lazy", + path = "lua/lazy/view/colors.lua", + modname = "lazy.view.colors", + }, opts or {}) + local str = M.extract(opts.path, "\nM%.colors = ({.-\n})") ---@type table<string,string> local comments = {} for _, line in ipairs(vim.split(str, "\n")) do @@ -124,8 +130,8 @@ function M.colors() { "Highlight Group", "Default Group", "Description" }, { "---", "---", "---" }, } - Util.foreach(require("lazy.view.colors").colors, function(group, link) - lines[#lines + 1] = { "**Lazy" .. group .. "**", "***" .. link .. "***", comments[group] or "" } + Util.foreach(require(opts.modname).colors, function(group, link) + lines[#lines + 1] = { "**" .. opts.name .. group .. "**", "***" .. link .. "***", comments[group] or "" } end) return { content = M.table(lines) } end From f61ca6ec701a27e57f58da0315b741df09345f8f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 28 Mar 2024 12:15:31 +0100 Subject: [PATCH 1228/1610] docs: fix commands table. Fixes #1393 --- README.md | 2 +- lua/lazy/docs.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index aeedef9..f7f709f 100644 --- a/README.md +++ b/README.md @@ -517,7 +517,7 @@ Any operation can be started from the UI, with a sub command or an API function: <!-- commands:start --> | 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 | diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index c38d047..36880a1 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -71,7 +71,7 @@ function M.commands() modes.load.opts = true local lines = { { "Command", "Lua", "Description" }, - { "---", "---", "---", "---" }, + { "---", "---", "---" }, } Util.foreach(modes, function(name, mode) if commands[name] then From ba58b87ed9c95da9d61e1b8b4da7bf7904e39986 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 11:16:10 +0000 Subject: [PATCH 1229/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 84 +++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c73b322..88476dc 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 27 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 28 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -20,6 +20,7 @@ Table of Contents *lazy.nvim-table-of-contents* - Highlight Groups |lazy.nvim-lazy.nvim-highlight-groups| - Plugin Authors |lazy.nvim-lazy.nvim-plugin-authors| - Other Neovim Plugin Managers in Lua|lazy.nvim-lazy.nvim-other-neovim-plugin-managers-in-lua| +2. Links |lazy.nvim-links| ============================================================================== 1. lazy.nvim *lazy.nvim-lazy.nvim* @@ -614,63 +615,60 @@ 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 + ---------------------------------------------------------------------------------- + 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 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 clean [plugins] require("lazy").clean(opts?) Clean plugins that are + no longer needed - :Lazy clear require("lazy").clear() Clear finished tasks + :Lazy clear require("lazy").clear() Clear finished tasks - :Lazy debug require("lazy").debug() Show debug information + :Lazy debug require("lazy").debug() Show debug information - :Lazy health require("lazy").health() Run :checkhealth lazy + :Lazy health require("lazy").health() Run :checkhealth lazy - :Lazy help require("lazy").help() Toggle this help page + :Lazy help require("lazy").help() Toggle this help page - :Lazy home require("lazy").home() Go back to plugin list + :Lazy home require("lazy").home() Go back to plugin list - :Lazy install [plugins] require("lazy").install(opts?) Install missing - plugins + :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 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 log [plugins] require("lazy").log(opts?) Show recent updates - :Lazy profile require("lazy").profile() Show detailed - profiling + :Lazy profile require("lazy").profile() Show detailed profiling - :Lazy reload {plugins} require("lazy").reload(opts) Reload a plugin - (experimental!!) + :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 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 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 - --------------------------------------------------------------------------------------------------- + :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: From 0ccf0312270d2d976ec551a9034bf05720f2486b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 28 Mar 2024 14:52:05 +0100 Subject: [PATCH 1230/1610] fix(ui): disable backdrop when Neovim is transparent --- lua/lazy/view/float.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index bfbc4eb..35baa6f 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -131,7 +131,10 @@ function M:mount() self.buf = vim.api.nvim_create_buf(false, true) end - if self.opts.backdrop and self.opts.backdrop < 100 and vim.o.termguicolors then + local normal = vim.api.nvim_get_hl(0, { name = "Normal" }) + local has_bg = normal and normal.bg ~= nil + + if has_bg and self.opts.backdrop and self.opts.backdrop < 100 and vim.o.termguicolors then self.backdrop_buf = vim.api.nvim_create_buf(false, true) self.backdrop_win = vim.api.nvim_open_win(self.backdrop_buf, false, { relative = "editor", From bef521ac89c8d423f9d092e37b58e8af0c099309 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 08:18:38 +0100 Subject: [PATCH 1231/1610] chore(main): release 10.20.3 (#1394) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7adaba..82b9efa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.20.3](https://github.com/folke/lazy.nvim/compare/v10.20.2...v10.20.3) (2024-03-28) + + +### Bug Fixes + +* **ui:** disable backdrop when Neovim is transparent ([0ccf031](https://github.com/folke/lazy.nvim/commit/0ccf0312270d2d976ec551a9034bf05720f2486b)) + ## [10.20.2](https://github.com/folke/lazy.nvim/compare/v10.20.1...v10.20.2) (2024-03-27) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 66ca5b2..4c4c394 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -180,7 +180,7 @@ M.defaults = { debug = false, } -M.version = "10.20.2" -- x-release-please-version +M.version = "10.20.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 7a2617575a8c990394c0f28a8e980b33b72e1b0d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 07:19:12 +0000 Subject: [PATCH 1232/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 88476dc..30764b3 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 28 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 29 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 31ddbea7c10b6920c9077b66c97951ca8682d5c8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 29 Mar 2024 20:28:45 +0100 Subject: [PATCH 1233/1610] fix(ui): set backdrop filetype to `lazy_backdrop`. Fixes #1399 --- lua/lazy/view/float.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 35baa6f..6696c5e 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -150,6 +150,7 @@ function M:mount() Util.wo(self.backdrop_win, "winhighlight", "Normal:LazyBackdrop") Util.wo(self.backdrop_win, "winblend", self.opts.backdrop) vim.bo[self.backdrop_buf].buftype = "nofile" + vim.bo[self.backdrop_buf].filetype = "lazy_backdrop" end self:layout() From 481aed70cc4d8e8a38463fd16edf81a23c153247 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 22 Apr 2024 10:33:32 +0200 Subject: [PATCH 1234/1610] fix(heath): vim.uv. Fixes #1412 --- lua/lazy/health.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index bcc546a..7b06f1d 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -1,4 +1,5 @@ local Config = require("lazy.core.config") +local uv = vim.uv or vim.loop local M = {} @@ -26,7 +27,7 @@ function M.check() local existing = false for _, site in pairs(sites) do for _, packs in ipairs(vim.fn.expand(site .. "/pack/*", false, true)) do - if not packs:find("[/\\]dist$") and vim.uv.fs_stat(packs) then + if not packs:find("[/\\]dist$") and uv.fs_stat(packs) then existing = true warn("found existing packages at `" .. packs .. "`") end @@ -46,7 +47,7 @@ function M.check() end local packer_compiled = vim.fn.stdpath("config") .. "/plugin/packer_compiled.lua" - if vim.uv.fs_stat(packer_compiled) then + if uv.fs_stat(packer_compiled) then error("please remove the file `" .. packer_compiled .. "`") else ok("packer_compiled.lua not found") From 3f13f080434ac942b150679223d54f5ca91e0d52 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 08:34:07 +0000 Subject: [PATCH 1235/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 30764b3..4eed594 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 March 29 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 April 22 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 24234f47a21ca690de829ea1159b553a733f3968 Mon Sep 17 00:00:00 2001 From: Iordanis Petkakis <12776461+dpetka2001@users.noreply.github.com> Date: Sat, 4 May 2024 11:01:20 +0300 Subject: [PATCH 1236/1610] fix(ui): add conditional `nvim_get_hl_by_name` for Neovim 0.8.0 (#1429) --- lua/lazy/view/float.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 6696c5e..0786193 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -131,8 +131,14 @@ function M:mount() self.buf = vim.api.nvim_create_buf(false, true) end - local normal = vim.api.nvim_get_hl(0, { name = "Normal" }) - local has_bg = normal and normal.bg ~= nil + local normal, has_bg + if vim.fn.has("nvim-0.9.0") == 0 then + normal = vim.api.nvim_get_hl_by_name("Normal", true) + has_bg = normal and normal.background ~= nil + else + normal = vim.api.nvim_get_hl(0, { name = "Normal" }) + has_bg = normal and normal.bg ~= nil + end if has_bg and self.opts.backdrop and self.opts.backdrop < 100 and vim.o.termguicolors then self.backdrop_buf = vim.api.nvim_create_buf(false, true) From d3974346b6cef2116c8e7b08423256a834cb7cbc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 08:01:54 +0000 Subject: [PATCH 1237/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 4eed594..3580d9f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 April 22 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 04 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 40845063a2586b725d84d44e41fe2c8737751a30 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 12 May 2024 09:43:30 +0200 Subject: [PATCH 1238/1610] fix(ui): hover now opens repo url when no diff with main. Fixes #1430 --- lua/lazy/view/init.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 5753f5b..8674b8f 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -211,13 +211,13 @@ function M:restore(opts) end function M:hover() - if self:diff({ browser = true }) then + if self:diff({ browser = true, hover = true }) then return end self:open_url("") end ----@param opts? {commit?:string, browser:boolean} +---@param opts? {commit?:string, browser:boolean, hover:boolean} function M:diff(opts) opts = opts or {} local plugin = self.render:get_plugin() @@ -231,6 +231,9 @@ function M:diff(opts) local info = assert(Git.info(plugin.dir)) local target = assert(Git.get_target(plugin)) diff = { from = info.commit, to = target.commit } + if opts.hover and diff.from == diff.to then + return + end end if not diff then From 76d321008f513f6b54e18d136d17d564edf187ef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 07:44:06 +0000 Subject: [PATCH 1239/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 3580d9f..0cb9fa3 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 04 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 12 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 2fcbcaf07ab79594f2ba25ebf6f4c47e250c33be Mon Sep 17 00:00:00 2001 From: Tristan Knight <tris203@gmail.com> Date: Sun, 12 May 2024 08:50:06 +0100 Subject: [PATCH 1240/1610] fix(reload): strings in lua reload (#1439) --- lua/lazy/view/commands.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index a826827..1210917 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -56,6 +56,9 @@ M.commands = { end, reload = function(opts) for _, plugin in pairs(opts.plugins) do + if type(plugin) == "string" then + plugin = Config.plugins[plugin] + end Util.warn("Reloading **" .. plugin.name .. "**") require("lazy.core.loader").reload(plugin) end From bb0179139a5cd45779d667ae60e4e2fc8b0bed24 Mon Sep 17 00:00:00 2001 From: Markus Koller <markus@snafu.ch> Date: Sun, 12 May 2024 09:52:21 +0200 Subject: [PATCH 1241/1610] docs: clarify default config implementation (#1407) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f7f709f..5465737 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ require("lazy").setup({ | **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. | | **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | | **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default implementation will automatically run `require(MAIN).setup(opts)`. Lazy uses several heuristics to determine the plugin's `MAIN` module automatically based on the plugin's **name**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | +| **config** | `fun(LazyPlugin, opts:table)` or `true` | `config` is executed when the plugin loads. The default 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**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | | **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 a list of build commands | `build` is executed when a plugin is installed or updated. Before running `build`, a plugin is first loaded. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands. Some plugins provide their own `build.lua` which is automatically used by lazy. So no need to specify a build step for those plugins. | | **branch** | `string?` | Branch of the repository | From 16510304045bf977fbf09216ef865f4f50ec5c8b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 07:52:52 +0000 Subject: [PATCH 1242/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 0cb9fa3..40e7cf6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -149,11 +149,11 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* config fun(LazyPlugin, opts:table) or true config is executed when the plugin loads. The default implementation will automatically run - require(MAIN).setup(opts). Lazy uses several - heuristics to determine the plugin’s MAIN module - automatically based on the plugin’s name. See also - opts. To use the default implementation without opts - set config to true. + 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. See also opts. To use the default + implementation without opts set config to true. main string? You can specify the main module to use for config() and opts(), in case it can not be determined From 758bb5de98b805acc5eeed8cdc8ac7f0bc4b0b86 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 10:15:14 +0200 Subject: [PATCH 1243/1610] chore(main): release 10.20.4 (#1400) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 11 +++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82b9efa..ec18539 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [10.20.4](https://github.com/folke/lazy.nvim/compare/v10.20.3...v10.20.4) (2024-05-12) + + +### Bug Fixes + +* **heath:** vim.uv. Fixes [#1412](https://github.com/folke/lazy.nvim/issues/1412) ([481aed7](https://github.com/folke/lazy.nvim/commit/481aed70cc4d8e8a38463fd16edf81a23c153247)) +* **reload:** strings in lua reload ([#1439](https://github.com/folke/lazy.nvim/issues/1439)) ([2fcbcaf](https://github.com/folke/lazy.nvim/commit/2fcbcaf07ab79594f2ba25ebf6f4c47e250c33be)) +* **ui:** add conditional `nvim_get_hl_by_name` for Neovim 0.8.0 ([#1429](https://github.com/folke/lazy.nvim/issues/1429)) ([24234f4](https://github.com/folke/lazy.nvim/commit/24234f47a21ca690de829ea1159b553a733f3968)) +* **ui:** hover now opens repo url when no diff with main. Fixes [#1430](https://github.com/folke/lazy.nvim/issues/1430) ([4084506](https://github.com/folke/lazy.nvim/commit/40845063a2586b725d84d44e41fe2c8737751a30)) +* **ui:** set backdrop filetype to `lazy_backdrop`. Fixes [#1399](https://github.com/folke/lazy.nvim/issues/1399) ([31ddbea](https://github.com/folke/lazy.nvim/commit/31ddbea7c10b6920c9077b66c97951ca8682d5c8)) + ## [10.20.3](https://github.com/folke/lazy.nvim/compare/v10.20.2...v10.20.3) (2024-03-28) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4c4c394..690e35a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -180,7 +180,7 @@ M.defaults = { debug = false, } -M.version = "10.20.3" -- x-release-please-version +M.version = "10.20.4" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From d2a4ce22dc02aa08c176cd7692b5b0ed74e4722b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 13 May 2024 08:34:33 +0200 Subject: [PATCH 1244/1610] fix(git): force `autocrlf=false`. Fixes #1055 --- lua/lazy/manage/task/git.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index c838f30..8dd2536 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -84,6 +84,12 @@ M.clone = { args[#args + 1] = "--origin=origin" + -- If git config --global core.autocrlf is true on a Unix/Linux system, then the git clone + -- process will lead to files with CRLF endings. Vi / vim / neovim cannot handle this. + -- Force git to clone with core.autocrlf=false. + args[#args + 1] = "-c" + args[#args + 1] = "core.autocrlf=false" + args[#args + 1] = "--progress" if self.plugin.branch then From e44636a43376e8a1e851958f7e9cbe996751d59f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 06:35:16 +0000 Subject: [PATCH 1245/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 40e7cf6..ba6387f 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 12 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 13 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From d039aecddb414c2df9d295e9182ed217196a2c1c Mon Sep 17 00:00:00 2001 From: Sebastian Lyng Johansen <sebastian@lyngjohansen.com> Date: Thu, 16 May 2024 21:44:51 +0200 Subject: [PATCH 1246/1610] fix: use vim.iter():flatten():totable() over vim.tbl_flatten (#1454) --- lua/lazy/help.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index aa7666e..a5fd741 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -9,9 +9,11 @@ function M.index(plugin) end ---@param file string - local files = vim.tbl_flatten(vim.tbl_map(function(file) + local tbl = vim.tbl_map(function(file) return vim.fn.expand(plugin.dir .. "/" .. file, false, true) - end, Config.options.readme.files)) + end, Config.options.readme.files) + + local files = vim.iter and vim.iter(tbl):flatten():totable() or vim.tbl_flatten(tbl) ---@type table<string,{file:string, tag:string, line:string}> local tags = {} From 05240b41548c4245a04d34ee54f789e824129991 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 16 May 2024 19:45:23 +0000 Subject: [PATCH 1247/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ba6387f..fcaa7e9 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 13 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 16 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 2e04a0c02c17facd3772c382099215acbe72535b Mon Sep 17 00:00:00 2001 From: Kevin Traver <kevintraver@kevintraver.com> Date: Sat, 18 May 2024 02:14:12 -0600 Subject: [PATCH 1248/1610] fix(checker): ignore dev plugins (#1384) --- lua/lazy/manage/checker.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 803972e..8e03d9e 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -35,7 +35,7 @@ end function M.fast_check(opts) opts = opts or {} for _, plugin in pairs(Config.plugins) do - if not plugin.pin and plugin._.installed then + if not plugin.pin and not plugin.dev and plugin._.installed then plugin._.updates = nil local info = Git.info(plugin.dir) local ok, target = pcall(Git.get_target, plugin) From c717ab88ff47830845a1e422a1d6495c764fac1d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 18 May 2024 08:14:46 +0000 Subject: [PATCH 1249/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index fcaa7e9..462627b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 16 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 18 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 5d29ffeaa0f2d91f1dfbc21943d19a11e59a6fc6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 18 May 2024 13:23:53 +0200 Subject: [PATCH 1250/1610] style: favorite icon --- lua/lazy/core/config.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 690e35a..5aa61cb 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -59,6 +59,7 @@ M.defaults = { cmd = " ", config = "", event = " ", + favorite = " ", ft = " ", init = " ", import = " ", From 56a34a825b55e0e30cd9df0e055e428a13afd4aa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 19 May 2024 17:29:43 +0200 Subject: [PATCH 1251/1610] fix(help): get rid of any tbl_flatten or iter flatten code --- lua/lazy/help.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lua/lazy/help.lua b/lua/lazy/help.lua index a5fd741..46b47fd 100644 --- a/lua/lazy/help.lua +++ b/lua/lazy/help.lua @@ -8,12 +8,11 @@ function M.index(plugin) return {} end - ---@param file string - local tbl = vim.tbl_map(function(file) - return vim.fn.expand(plugin.dir .. "/" .. file, false, true) - end, Config.options.readme.files) + local files = {} - local files = vim.iter and vim.iter(tbl):flatten():totable() or vim.tbl_flatten(tbl) + for _, file in ipairs(Config.options.readme.files) do + vim.list_extend(files, vim.fn.expand(plugin.dir .. "/" .. file, false, true)) + end ---@type table<string,{file:string, tag:string, line:string}> local tags = {} From 0de782a6b0ffba599dbd332a4019d852564bf28c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 19 May 2024 15:30:17 +0000 Subject: [PATCH 1252/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 462627b..5ef9203 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 18 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 19 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 39de11a2fa7f4b91556631c49a673bf3e48bcc16 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 20 May 2024 21:15:03 +0200 Subject: [PATCH 1253/1610] fix(keys): properly re-create buffer-local mappings. Fixes #1448 --- lua/lazy/core/handler/keys.lua | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 382d732..1d4ada3 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -123,11 +123,6 @@ function M:_add(keys) Util.track() end - -- Create the real buffer-local mapping - if keys.ft then - self:_set(keys, buf) - end - if keys.mode:sub(-1) == "a" then lhs = lhs .. "<C-]>" end @@ -162,19 +157,21 @@ function M:_add(keys) end end --- Delete a mapping and create the real global +-- Delete a mapping and create the real global/buffer-local -- mapping when needed ---@param keys LazyKeys function M:_del(keys) - pcall(vim.keymap.del, keys.mode, keys.lhs, { - -- NOTE: for buffer-local mappings, we only delete the mapping for the current buffer - -- So the mapping could still exist in other buffers - buffer = keys.ft and true or nil, - }) - -- make sure to create global mappings when needed - -- buffer-local mappings are managed by lazy - if not keys.ft then - self:_set(keys) + -- bufs will be all buffers of the filetype for a buffer-local mapping + -- OR `false` for a global mapping + local bufs = keys.ft + and vim.tbl_filter(function(buf) + return vim.bo[buf].filetype == keys.ft + end, vim.api.nvim_list_bufs()) + or { false } + + for _, buf in ipairs(bufs) do + pcall(vim.keymap.del, keys.mode, keys.lhs, { buffer = buf or nil }) + self:_set(keys, buf or nil) end end From 9895337d1f4c0cea1186d92148e3d80f6551eda8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 19:15:40 +0000 Subject: [PATCH 1254/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 5ef9203..1bde778 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 19 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 20 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 82cf974e0939b3440c4470cbcd8e7869abfe480b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 21 May 2024 22:10:49 +0200 Subject: [PATCH 1255/1610] fix(keys): properly deal with ft list for keys. Fixes #1448 --- lua/lazy/core/handler/keys.lua | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 1d4ada3..bafc205 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -163,11 +163,14 @@ end function M:_del(keys) -- bufs will be all buffers of the filetype for a buffer-local mapping -- OR `false` for a global mapping - local bufs = keys.ft - and vim.tbl_filter(function(buf) - return vim.bo[buf].filetype == keys.ft - end, vim.api.nvim_list_bufs()) - or { false } + local bufs = { false } + + if keys.ft then + local ft = type(keys.ft) == "string" and { keys.ft } or keys.ft --[[@as string[] ]] + bufs = vim.tbl_filter(function(buf) + return vim.tbl_contains(ft, vim.bo[buf].filetype) + end, vim.api.nvim_list_bufs()) + end for _, buf in ipairs(bufs) do pcall(vim.keymap.del, keys.mode, keys.lhs, { buffer = buf or nil }) From 8411fe946775d126348089950eacbcc6a38306ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 20:11:25 +0000 Subject: [PATCH 1256/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1bde778..a1b43c6 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 20 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 21 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 8f19915175395680808de529e4220da8dafc0759 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 May 2024 00:10:58 +0200 Subject: [PATCH 1257/1610] chore(main): release 10.20.5 (#1445) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec18539..1b97a4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [10.20.5](https://github.com/folke/lazy.nvim/compare/v10.20.4...v10.20.5) (2024-05-21) + + +### Bug Fixes + +* **checker:** ignore dev plugins ([#1384](https://github.com/folke/lazy.nvim/issues/1384)) ([2e04a0c](https://github.com/folke/lazy.nvim/commit/2e04a0c02c17facd3772c382099215acbe72535b)) +* **git:** force `autocrlf=false`. Fixes [#1055](https://github.com/folke/lazy.nvim/issues/1055) ([d2a4ce2](https://github.com/folke/lazy.nvim/commit/d2a4ce22dc02aa08c176cd7692b5b0ed74e4722b)) +* **help:** get rid of any tbl_flatten or iter flatten code ([56a34a8](https://github.com/folke/lazy.nvim/commit/56a34a825b55e0e30cd9df0e055e428a13afd4aa)) +* **keys:** properly deal with ft list for keys. Fixes [#1448](https://github.com/folke/lazy.nvim/issues/1448) ([82cf974](https://github.com/folke/lazy.nvim/commit/82cf974e0939b3440c4470cbcd8e7869abfe480b)) +* **keys:** properly re-create buffer-local mappings. Fixes [#1448](https://github.com/folke/lazy.nvim/issues/1448) ([39de11a](https://github.com/folke/lazy.nvim/commit/39de11a2fa7f4b91556631c49a673bf3e48bcc16)) +* use vim.iter():flatten():totable() over vim.tbl_flatten ([#1454](https://github.com/folke/lazy.nvim/issues/1454)) ([d039aec](https://github.com/folke/lazy.nvim/commit/d039aecddb414c2df9d295e9182ed217196a2c1c)) + ## [10.20.4](https://github.com/folke/lazy.nvim/compare/v10.20.3...v10.20.4) (2024-05-12) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5aa61cb..a964712 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -181,7 +181,7 @@ M.defaults = { debug = false, } -M.version = "10.20.4" -- x-release-please-version +M.version = "10.20.5" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 7667a73dee381c5fb7d538f6152aeb591e3f0372 Mon Sep 17 00:00:00 2001 From: Anshuman Medhi <amedhi@connect.ust.hk> Date: Sun, 26 May 2024 16:40:08 +0800 Subject: [PATCH 1258/1610] feat: single-plugin keys in the lazy view in visual mode (#1476) Applies to all plugins contained in the range --- lua/lazy/view/float.lua | 5 +++-- lua/lazy/view/init.lua | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 0786193..d57b384 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -251,8 +251,9 @@ end ---@param key string ---@param fn fun(self?) ---@param desc? string -function M:on_key(key, fn, desc) - vim.keymap.set("n", key, function() +---@param mode? string[] +function M:on_key(key, fn, desc,mode) + vim.keymap.set(mode or "n", key, function() fn(self) end, { nowait = true, diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 8674b8f..2965bf3 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -297,11 +297,21 @@ function M:setup_modes() end if m.key_plugin and name ~= "restore" then self:on_key(m.key_plugin, function() - local plugin = self.render:get_plugin() - if plugin then - Commands.cmd(name, { plugins = { plugin } }) + vim.api.nvim_feedkeys(vim.keycode("<esc>"), "n", false) + local plugins = {} + if vim.api.nvim_get_mode().mode:lower() == "v" then + local f, t = vim.fn.line("."), vim.fn.line("v") + if f > t then f, t = t, f end + for i = f, t do + plugins[#plugins + 1] = self.render:get_plugin(i) + end + else + plugins[1] = self.render:get_plugin() end - end, m.desc_plugin) + if #plugins > 0 then + Commands.cmd(name, { plugins = plugins }) + end + end, m.desc_plugin, { "n", "x" }) end end end From 98210e2f82a0dc7e8469de882b6d2d8ab435a374 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 26 May 2024 08:40:48 +0000 Subject: [PATCH 1259/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a1b43c6..e661c05 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 21 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 26 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From ea7b9c3c3fd9026e1a5ae27950585df9a42ccd5b Mon Sep 17 00:00:00 2001 From: Christian Clason <c.clason@uni-graz.at> Date: Sun, 26 May 2024 15:21:58 +0200 Subject: [PATCH 1260/1610] fix(render): disable underline for diagnostics (#1478) Problem: On current Nvim nightlies, a regression in a `vim.highlight.range()` refactor makes underlines for diagnostics at end of line extend into the next line, leading to visual artifacts in the update view. Solution: Suppress underlines for diagnostics, as they are not wanted anyway. --- lua/lazy/view/render.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 5d7e197..a34456c 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -84,7 +84,7 @@ function M:update() diag.lnum = diag.row - 1 return diag end, self._diagnostics), - { signs = false, virtual_text = true } + { signs = false, virtual_text = true, underline = false } ) end From 9dde1f1bce44a8fd8cb885b5a8e8d47d8fd7b8c1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 26 May 2024 16:43:52 +0200 Subject: [PATCH 1261/1610] feat: added support for local spec files `.lazy.lua` --- README.md | 105 ++++++++++++++++++++------------------- lua/lazy/core/config.lua | 1 + lua/lazy/core/plugin.lua | 42 +++++++++++++--- 3 files changed, 89 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 5465737..d3c1461 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ require("lazy").setup({ | **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. | | **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | | **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default 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**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | +| **config** | `fun(LazyPlugin, opts:table)` or `true` | `config` is executed when the plugin loads. The default 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**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | | **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 a list of build commands | `build` is executed when a plugin is installed or updated. Before running `build`, a plugin is first loaded. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands. Some plugins provide their own `build.lua` which is automatically used by lazy. So no need to specify a build step for those plugins. | | **branch** | `string?` | Branch of the repository | @@ -307,6 +307,7 @@ return { }, -- 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, @@ -516,24 +517,24 @@ Any operation can be started from the UI, with a sub command or an API function: <!-- commands:start --> -| 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!!) | +| 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 | +| `: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 | <!-- commands:end --> @@ -784,40 +785,40 @@ To uninstall **lazy.nvim**, you need to remove the following files and directori <!-- colors:start --> -| Highlight Group | Default Group | Description | -| --- | --- | --- | -| **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 | -| **LazyH1** | ***IncSearch*** | home button | -| **LazyH2** | ***Bold*** | titles | -| **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*** | | -| **LazyTaskError** | ***ErrorMsg*** | task errors | -| **LazyTaskOutput** | ***MsgArea*** | task output | -| **LazyUrl** | ***@markup.link*** | url | -| **LazyValue** | ***@string*** | value of a property | +| Highlight Group | Default Group | Description | +| --------------------- | -------------------------- | --------------------------------------------------- | +| **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 | +| **LazyH1** | **_IncSearch_** | home button | +| **LazyH2** | **_Bold_** | titles | +| **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_** | | +| **LazyTaskError** | **_ErrorMsg_** | task errors | +| **LazyTaskOutput** | **_MsgArea_** | task output | +| **LazyUrl** | **_@markup.link_** | url | +| **LazyValue** | **_@string_** | value of a property | <!-- colors:end --> diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index a964712..c95931c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -16,6 +16,7 @@ M.defaults = { }, -- 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, diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 64c93cd..7bae395 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,5 +1,4 @@ local Config = require("lazy.core.config") -local Handler = require("lazy.core.handler") local Util = require("lazy.core.util") ---@class LazyCorePlugin @@ -20,6 +19,7 @@ local Spec = {} M.Spec = Spec M.last_fid = 0 M.fid_stack = {} ---@type number[] +M.LOCAL_SPEC = ".lazy.lua" ---@param spec? LazySpec ---@param opts? {optional?:boolean} @@ -399,10 +399,15 @@ function Spec:import(spec) ---@type string[] local modnames = {} - Util.lsmod(spec.import, function(modname) - modnames[#modnames + 1] = modname - end) - table.sort(modnames) + + if spec.import == M.LOCAL_SPEC then + modnames = { spec.import } + else + Util.lsmod(spec.import, function(modname) + modnames[#modnames + 1] = modname + end) + table.sort(modnames) + end for _, modname in ipairs(modnames) do imported = imported + 1 @@ -412,7 +417,12 @@ function Spec:import(spec) ---@diagnostic disable-next-line: no-unknown package.loaded[modname] = nil Util.try(function() - local mod = require(modname) + local mod = nil + if modname == M.LOCAL_SPEC then + mod = M.local_spec() + else + mod = require(modname) + end if type(mod) ~= "table" then self.importing = nil return self:error( @@ -533,12 +543,30 @@ function M.update_state() end end +function M.local_spec() + local filepath = vim.fn.fnamemodify(".lazy.lua", ":p") + local file = vim.secure.read(filepath) + if file then + return loadstring(file)() + end + return {} +end + function M.load() M.loading = true -- load specs Util.track("spec") Config.spec = Spec.new() - Config.spec:parse({ vim.deepcopy(Config.options.spec), { "folke/lazy.nvim" } }) + Config.spec:parse({ + vim.deepcopy(Config.options.spec), + { + import = ".lazy.lua", + cond = function() + return Config.options.local_spec and vim.fn.filereadable(M.LOCAL_SPEC) == 1 + end, + }, + { "folke/lazy.nvim" }, + }) -- override some lazy props local lazy = Config.spec.plugins["lazy.nvim"] From a55d275ecafedf47eb917c8848a1645bb3e5200e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 26 May 2024 14:44:42 +0000 Subject: [PATCH 1262/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 121 ++++++++++++++++++++-------------------------- 1 file changed, 52 insertions(+), 69 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e661c05..9cd480d 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -411,6 +411,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* }, -- 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, @@ -615,17 +616,14 @@ 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 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 clean [plugins] require("lazy").clean(opts?) Clean plugins that are no longer needed :Lazy clear require("lazy").clear() Clear finished tasks @@ -639,36 +637,24 @@ function: :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 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 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 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 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 - ---------------------------------------------------------------------------------- + :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: @@ -924,77 +910,74 @@ HIGHLIGHT GROUPS *lazy.nvim-lazy.nvim-highlight-groups* Click to see all highlight groups ~ - ----------------------------------------------------------------------- - Highlight Group Default Group Description - ----------------------- ----------------------- ----------------------- - LazyButton CursorLine + --------------------------------------------------------------------------------- + Highlight Group Default Group Description + ------------------- ------------------------ ------------------------------------ + LazyButton CursorLine - LazyButtonActive Visual + LazyButtonActive Visual - LazyComment Comment + LazyComment Comment - LazyCommit @variable.builtin commit ref + LazyCommit _@variable.builtin_ commitref - LazyCommitIssue Number + LazyCommitIssue Number - LazyCommitScope Italic conventional commit - scope + LazyCommitScope Italic conventional commit scope - LazyCommitType Title conventional commit - type + LazyCommitType Title conventional commit type - LazyDimmed Conceal property + LazyDimmed Conceal property - LazyDir @markup.link directory + LazyDir _@markup.link_ directory - LazyH1 IncSearch home button + LazyH1 IncSearch homebutton - LazyH2 Bold titles + LazyH2 Bold titles - LazyLocal Constant + LazyLocal Constant - LazyNoCond DiagnosticWarn unloaded icon for a - plugin where cond() was - false + LazyNoCond DiagnosticWarn unloaded icon for a plugin where + cond() was false - LazyNormal NormalFloat + LazyNormal NormalFloat - LazyProgressDone Constant progress bar done + LazyProgressDone Constant progress bar done - LazyProgressTodo LineNr progress bar todo + LazyProgressTodo LineNr progress bar todo - LazyProp Conceal property + LazyProp Conceal property - LazyReasonCmd Operator + LazyReasonCmd Operator - LazyReasonEvent Constant + LazyReasonEvent Constant - LazyReasonFt Character + LazyReasonFt Character - LazyReasonImport Identifier + LazyReasonImport Identifier - LazyReasonKeys Statement + LazyReasonKeys Statement - LazyReasonPlugin Special + LazyReasonPlugin Special - LazyReasonRequire @variable.parameter + LazyReasonRequire _@variable.parameter_ - LazyReasonRuntime @macro + LazyReasonRuntime _@macro_ - LazyReasonSource Character + LazyReasonSource Character - LazyReasonStart @variable.member + LazyReasonStart _@variable.member_ - LazySpecial @punctuation.special + LazySpecial _@punctuation.special_ - LazyTaskError ErrorMsg task errors + LazyTaskError ErrorMsg taskerrors - LazyTaskOutput MsgArea task output + LazyTaskOutput MsgArea task output - LazyUrl @markup.link url + LazyUrl _@markup.link_ url - LazyValue @string value of a property - ----------------------------------------------------------------------- + LazyValue _@string_ valueof a property + --------------------------------------------------------------------------------- PLUGIN AUTHORS *lazy.nvim-lazy.nvim-plugin-authors* From 24fa2a97085ca8a7220b5b078916f81e316036fd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 26 May 2024 16:59:48 +0200 Subject: [PATCH 1263/1610] chore(main): release 10.21.0 (#1477) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b97a4f..8474f5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [10.21.0](https://github.com/folke/lazy.nvim/compare/v10.20.5...v10.21.0) (2024-05-26) + + +### Features + +* added support for local spec files `.lazy.lua` ([9dde1f1](https://github.com/folke/lazy.nvim/commit/9dde1f1bce44a8fd8cb885b5a8e8d47d8fd7b8c1)) +* single-plugin keys in the lazy view in visual mode ([#1476](https://github.com/folke/lazy.nvim/issues/1476)) ([7667a73](https://github.com/folke/lazy.nvim/commit/7667a73dee381c5fb7d538f6152aeb591e3f0372)) + + +### Bug Fixes + +* **render:** disable underline for diagnostics ([#1478](https://github.com/folke/lazy.nvim/issues/1478)) ([ea7b9c3](https://github.com/folke/lazy.nvim/commit/ea7b9c3c3fd9026e1a5ae27950585df9a42ccd5b)) + ## [10.20.5](https://github.com/folke/lazy.nvim/compare/v10.20.4...v10.20.5) (2024-05-21) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c95931c..b3efdfa 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -182,7 +182,7 @@ M.defaults = { debug = false, } -M.version = "10.20.5" -- x-release-please-version +M.version = "10.21.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 917dfbe2a9b606443639d1e809f2e4561a6dd654 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 31 May 2024 13:55:54 +0200 Subject: [PATCH 1264/1610] fix(view): backward compat for older Neovim versions. Fixes #1489 --- lua/lazy/view/init.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 2965bf3..eb853b5 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -297,11 +297,14 @@ function M:setup_modes() end if m.key_plugin and name ~= "restore" then self:on_key(m.key_plugin, function() - vim.api.nvim_feedkeys(vim.keycode("<esc>"), "n", false) + local esc = vim.api.nvim_replace_termcodes("<esc>", true, true, true) + vim.api.nvim_feedkeys(esc, "n", false) local plugins = {} if vim.api.nvim_get_mode().mode:lower() == "v" then local f, t = vim.fn.line("."), vim.fn.line("v") - if f > t then f, t = t, f end + if f > t then + f, t = t, f + end for i = f, t do plugins[#plugins + 1] = self.render:get_plugin(i) end From 52244a0c1d620c400d382b0a433969c5624d82f0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 31 May 2024 11:56:30 +0000 Subject: [PATCH 1265/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 9cd480d..19a09cd 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 26 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 31 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 4a8f813d8134b7c3e2c70b9ea4407f613e85bd97 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 31 May 2024 14:14:25 +0200 Subject: [PATCH 1266/1610] chore(main): release 10.21.1 (#1490) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8474f5c..15f52e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.21.1](https://github.com/folke/lazy.nvim/compare/v10.21.0...v10.21.1) (2024-05-31) + + +### Bug Fixes + +* **view:** backward compat for older Neovim versions. Fixes [#1489](https://github.com/folke/lazy.nvim/issues/1489) ([917dfbe](https://github.com/folke/lazy.nvim/commit/917dfbe2a9b606443639d1e809f2e4561a6dd654)) + ## [10.21.0](https://github.com/folke/lazy.nvim/compare/v10.20.5...v10.21.0) (2024-05-26) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index b3efdfa..f2d38b6 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -182,7 +182,7 @@ M.defaults = { debug = false, } -M.version = "10.21.0" -- x-release-please-version +M.version = "10.21.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From b77aaa08cb5b178ed8662765caa41c70ff254a4c Mon Sep 17 00:00:00 2001 From: Anshuman Medhi <amedhi@connect.ust.hk> Date: Fri, 31 May 2024 22:28:33 +0800 Subject: [PATCH 1267/1610] fix(ui): deduplicate plugins when selecting multiple (#1491) --- lua/lazy/view/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index eb853b5..7d349d3 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -306,8 +306,12 @@ function M:setup_modes() f, t = t, f end for i = f, t do - plugins[#plugins + 1] = self.render:get_plugin(i) + local plugin = self.render:get_plugin(i) + if plugin then + plugins[plugin.name] = plugin + end end + plugins = vim.tbl_values(plugins) else plugins[1] = self.render:get_plugin() end From eab487c2520f0fe9e54eb5e3ea0606e20512492e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 31 May 2024 20:41:13 +0200 Subject: [PATCH 1268/1610] chore(main): release 10.21.2 (#1492) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15f52e9..c67f57a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.21.2](https://github.com/folke/lazy.nvim/compare/v10.21.1...v10.21.2) (2024-05-31) + + +### Bug Fixes + +* **ui:** deduplicate plugins when selecting multiple ([#1491](https://github.com/folke/lazy.nvim/issues/1491)) ([b77aaa0](https://github.com/folke/lazy.nvim/commit/b77aaa08cb5b178ed8662765caa41c70ff254a4c)) + ## [10.21.1](https://github.com/folke/lazy.nvim/compare/v10.21.0...v10.21.1) (2024-05-31) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f2d38b6..50ca7e4 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -182,7 +182,7 @@ M.defaults = { debug = false, } -M.version = "10.21.1" -- x-release-please-version +M.version = "10.21.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 6a141a6dbb6f6b5495ef6716c0dce898546d7b2c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 1 Jun 2024 18:20:39 +0200 Subject: [PATCH 1269/1610] feat: set `vim.env.LAZY` to lazy root --- lua/lazy/core/config.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 50ca7e4..0bd7a5e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -221,6 +221,7 @@ function M.setup(opts) table.insert(M.options.install.colorscheme, "habamax") M.options.root = Util.norm(M.options.root) + vim.env.LAZY = M.options.root if type(M.options.dev.path) == "string" then M.options.dev.path = Util.norm(M.options.dev.path) end From a3edeae34a5dd2c129388c6cbb8f1d156e6f7724 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 16:21:15 +0000 Subject: [PATCH 1270/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 19a09cd..ff28c50 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 May 31 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 01 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From ad30030b6abca7dac5a493c58b4d183b3fe93202 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 18:57:42 +0200 Subject: [PATCH 1271/1610] chore(main): release 10.22.0 (#1493) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c67f57a..f0c0a5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.22.0](https://github.com/folke/lazy.nvim/compare/v10.21.2...v10.22.0) (2024-06-01) + + +### Features + +* set `vim.env.LAZY` to lazy root ([6a141a6](https://github.com/folke/lazy.nvim/commit/6a141a6dbb6f6b5495ef6716c0dce898546d7b2c)) + ## [10.21.2](https://github.com/folke/lazy.nvim/compare/v10.21.1...v10.21.2) (2024-05-31) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 0bd7a5e..b4f7c2e 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -182,7 +182,7 @@ M.defaults = { debug = false, } -M.version = "10.21.2" -- x-release-please-version +M.version = "10.22.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 58536d4c8134613791504e655743243a8df554fd Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 2 Jun 2024 14:48:42 +0200 Subject: [PATCH 1272/1610] Revert "feat: set `vim.env.LAZY` to lazy root" This reverts commit 6a141a6dbb6f6b5495ef6716c0dce898546d7b2c. --- lua/lazy/core/config.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index b4f7c2e..9c0a849 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -221,7 +221,6 @@ function M.setup(opts) table.insert(M.options.install.colorscheme, "habamax") M.options.root = Util.norm(M.options.root) - vim.env.LAZY = M.options.root if type(M.options.dev.path) == "string" then M.options.dev.path = Util.norm(M.options.dev.path) end From 1418f30806ac0e6882c8284e0e67ad1c2bfdfb66 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 2 Jun 2024 12:49:18 +0000 Subject: [PATCH 1273/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ff28c50..d03a1c9 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 01 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 02 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 9242edb73939e7508dbd827e9c013579391f0668 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 2 Jun 2024 14:51:44 +0200 Subject: [PATCH 1274/1610] fix: force new release --- lua/lazy/core/config.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9c0a849..5fbf762 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -220,6 +220,7 @@ function M.setup(opts) end table.insert(M.options.install.colorscheme, "habamax") + -- root M.options.root = Util.norm(M.options.root) if type(M.options.dev.path) == "string" then M.options.dev.path = Util.norm(M.options.dev.path) From b0ba3f9399bf48c86abaa4db1a40bd0b681d5018 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 2 Jun 2024 14:53:20 +0200 Subject: [PATCH 1275/1610] chore(main): release 10.22.1 (#1495) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0c0a5e..78cfcad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.22.1](https://github.com/folke/lazy.nvim/compare/v10.22.0...v10.22.1) (2024-06-02) + + +### Bug Fixes + +* force new release ([9242edb](https://github.com/folke/lazy.nvim/commit/9242edb73939e7508dbd827e9c013579391f0668)) + ## [10.22.0](https://github.com/folke/lazy.nvim/compare/v10.21.2...v10.22.0) (2024-06-01) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5fbf762..9c7bed3 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -182,7 +182,7 @@ M.defaults = { debug = false, } -M.version = "10.22.0" -- x-release-please-version +M.version = "10.22.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From f39c79fcb17ec01c24c82e139499582ee376a94b Mon Sep 17 00:00:00 2001 From: Zhizhen He <hezhizhen.yi@gmail.com> Date: Mon, 3 Jun 2024 15:18:43 +0800 Subject: [PATCH 1276/1610] style: fix some typo (#1496) --- README.md | 10 +++++----- TODO.md | 4 ++-- lua/lazy/core/cache.lua | 4 ++-- lua/lazy/core/plugin.lua | 2 +- lua/lazy/example.lua | 4 ++-- lua/lazy/stats.lua | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index d3c1461..9bde4f9 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ require("lazy").setup({ ## 🔌 Plugin Spec | Property | Type | Description | -| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **[1]** | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | | **dir** | `string?` | A directory pointing to a local plugin | | **url** | `string?` | A custom git url where the plugin is hosted | @@ -95,7 +95,7 @@ require("lazy").setup({ | **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default 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**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | | **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 a list of build commands | `build` is executed when a plugin is installed or updated. Before running `build`, a plugin is first loaded. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands. Some plugins provide their own `build.lua` which is automatically used by lazy. So no need to specify a build step for those plugins. | +| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. Before running `build`, a plugin is first loaded. If it's a string it will be run as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands. Some plugins provide their own `build.lua` which is automatically used by lazy. So no need to specify a build step for those plugins. | | **branch** | `string?` | Branch of the repository | | **tag** | `string?` | Tag of the repository | | **commit** | `string?` | Commit of the repository | @@ -279,8 +279,8 @@ return { -- you can use a custom url to fetch a plugin { url = "git@github.com:folke/noice.nvim.git" }, - -- local plugins can also be configure with the dev option. - -- This will use {config.dev.path}/noice.nvim/ instead of fetching it from Github + -- 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 }, } @@ -560,7 +560,7 @@ Stats API (`require("lazy").stats()`): { -- startuptime in milliseconds till UIEnter startuptime = 0, - -- when true, startuptime is the accurate cputime for the Neovim process. (Linux & Macos) + -- 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, diff --git a/TODO.md b/TODO.md index d3d2f09..3d4da4e 100644 --- a/TODO.md +++ b/TODO.md @@ -51,7 +51,7 @@ - [ ] add support to specify `engines`, `os` and `cpu` like in `package.json` - [ ] semver merging. Should check if two or more semver ranges are compatible and calculate the union range - - default semver merging strategy: if no version matches all, then use highest version? + - default semver merging strategy: if no version matches all, then use the highest version? - [ ] package meta index (package.lua cache for all packages) - [x] document highlight groups @@ -65,7 +65,7 @@ Maybe a quick, "for example, if you have a lua file `~/.config/nvim/lua/config/plugins.lua` that returns a table" or something it'd remove most question marks I think. -- [x] When autoinstalling the plugins the cursor isn't focused on the floating +- [x] When auto-installing the plugins the cursor isn't focused on the floating window, but on the non-floating window in the background. - [x] Doing `:Lazy clean` doesn't show which plugins were removed. - [x] Shouldn't the "Versioning" section be in the "Lockfile" chapter? diff --git a/lua/lazy/core/cache.lua b/lua/lazy/core/cache.lua index 07cb677..fc52542 100644 --- a/lua/lazy/core/cache.lua +++ b/lua/lazy/core/cache.lua @@ -8,7 +8,7 @@ local M = {} ---@class ModuleFindOpts ---@field all? boolean Search for all matches (defaults to `false`) ---@field rtp? boolean Search for modname in the runtime path (defaults to `true`) ----@field patterns? string[] Paterns to use (defaults to `{"/init.lua", ".lua"}`) +---@field patterns? string[] Patterns to use (defaults to `{"/init.lua", ".lua"}`) ---@field paths? string[] Extra paths to search for modname ---@class ModuleInfo @@ -474,7 +474,7 @@ function Loader.lsmod(path) return Loader._indexed[path] end ---- Debug function that wrapps all loaders and tracks stats +--- Debug function that wraps all loaders and tracks stats ---@private function M._profile_loaders() for l, loader in pairs(package.loaders) do diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 7bae395..905c078 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -117,7 +117,7 @@ function Spec:add(plugin, results) dir = dir_dev end elseif plugin.dev == false then - -- explicitely select the default path + -- explicitly select the default path dir = Config.options.root .. "/" .. plugin.name end diff --git a/lua/lazy/example.lua b/lua/lazy/example.lua index df52faf..5b7790a 100644 --- a/lua/lazy/example.lua +++ b/lua/lazy/example.lua @@ -80,8 +80,8 @@ return { -- you can use a custom url to fetch a plugin { url = "git@github.com:folke/noice.nvim.git" }, - -- local plugins can also be configure with the dev option. - -- This will use {config.dev.path}/noice.nvim/ instead of fetching it from Github + -- 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 }, } diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index c4f1ec2..36865db 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -6,7 +6,7 @@ local M = {} M._stats = { -- startuptime in milliseconds till UIEnter startuptime = 0, - -- when true, startuptime is the accurate cputime for the Neovim process. (Linux & Macos) + -- 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, From ebbf84eb23d796ffd92ad88b980d3cf89921add4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 07:19:16 +0000 Subject: [PATCH 1277/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d03a1c9..16bfe6e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 02 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 03 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* @@ -161,7 +161,7 @@ PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* build fun(LazyPlugin) or string or a list of build commands build is executed when a plugin is installed or updated. Before running build, a plugin is first - loaded. If it’s a string it will be ran as a shell + loaded. If it’s a string it will be run as a shell command. When prefixed with : it is a Neovim command. You can also specify a list to executed multiple build commands. Some plugins provide their @@ -386,8 +386,8 @@ EXAMPLES ~ -- you can use a custom url to fetch a plugin { url = "git@github.com:folke/noice.nvim.git" }, - -- local plugins can also be configure with the dev option. - -- This will use {config.dev.path}/noice.nvim/ instead of fetching it from Github + -- 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 }, } @@ -675,7 +675,7 @@ Stats API (`require("lazy").stats()`): { -- startuptime in milliseconds till UIEnter startuptime = 0, - -- when true, startuptime is the accurate cputime for the Neovim process. (Linux & Macos) + -- 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, From 784a726f2e10ccbc11451a50033cb43426dfaab8 Mon Sep 17 00:00:00 2001 From: Vlad <52591095+MeanderingProgrammer@users.noreply.github.com> Date: Mon, 3 Jun 2024 21:58:19 -0700 Subject: [PATCH 1278/1610] style: Set vim.opt.rtp type to vim.Option (#1498) ## Details There is an issue in the `neodev` repo that mentions this: [#193](https://github.com/folke/neodev.nvim/issues/193) I think the problem comes from a combination of 2 things: 1. As mentioned in the [Reddit post](https://www.reddit.com/r/neovim/comments/1cvrilk/diagnosticwarning_after_upgrade_to_neovim_010/): `Nvim never had Lua type annotations for vim.opt`. 2. Setting `vim.opt.rtp` anywhere in the config will cause Lua-LS to infer the type for `vim.opt.rtp`. While users are unlikely to do this it does happen in `lazy.nvim`, in places shown in this PR. --- lua/lazy/core/config.lua | 1 + lua/lazy/core/loader.lua | 1 + tests/core/util_spec.lua | 1 + 3 files changed, 3 insertions(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9c7bed3..17ce2bd 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -237,6 +237,7 @@ 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")) if M.options.performance.rtp.reset then + ---@type vim.Option vim.opt.rtp = { vim.fn.stdpath("config"), vim.fn.stdpath("data") .. "/site", diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 9cd5018..e07328c 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -476,6 +476,7 @@ function M.add_to_rtp(plugin) table.insert(rtp, idx_after or (#rtp + 1), after) end + ---@type vim.Option vim.opt.rtp = rtp end diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index a497881..643304d 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -5,6 +5,7 @@ local Util = require("lazy.util") describe("util", function() local rtp = vim.opt.rtp:get() before_each(function() + ---@type vim.Option vim.opt.rtp = rtp for k, v in pairs(package.loaded) do if k:find("^foobar") then From 0fc34a0cf5f5f6f998a0897119a7d846b47eaa9d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 04:58:50 +0000 Subject: [PATCH 1279/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 16bfe6e..f07b209 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 03 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 04 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 3e4c795cec32481bc6d0b30c05125fdf7ef2d412 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 6 Jun 2024 09:28:35 +0200 Subject: [PATCH 1280/1610] fix(keys): never lazy-load `<nop>` or empty rhs keymaps --- lua/lazy/core/handler/keys.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index bafc205..a6e9475 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -109,6 +109,10 @@ function M:_add(keys) ---@param buf? number local function add(buf) + if type(keys.rhs) == "string" and (keys.rhs == "" or keys.rhs:lower() == "<nop>") then + return self:_set(keys, buf) + end + vim.keymap.set(keys.mode, lhs, function() local plugins = self.active[keys.id] From 0c1ec520af617da89c9f0b2b8527be8894c60503 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Jun 2024 07:29:39 +0000 Subject: [PATCH 1281/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f07b209..b07aad4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 04 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From ff904178089582f90fdc625493f3d3bddbefd6ea Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 6 Jun 2024 10:15:33 +0200 Subject: [PATCH 1282/1610] fix(keys): buffer-local nop mappings --- lua/lazy/core/handler/keys.lua | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index a6e9475..57fbc18 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -102,6 +102,11 @@ function M.opts(keys) return opts end +---@param keys LazyKeys +function M.is_nop(keys) + return type(keys.rhs) == "string" and (keys.rhs == "" or keys.rhs:lower() == "<nop>") +end + ---@param keys LazyKeys function M:_add(keys) local lhs = keys.lhs @@ -109,7 +114,7 @@ function M:_add(keys) ---@param buf? number local function add(buf) - if type(keys.rhs) == "string" and (keys.rhs == "" or keys.rhs:lower() == "<nop>") then + if M.is_nop(keys) then return self:_set(keys, buf) end @@ -147,7 +152,7 @@ function M:_add(keys) vim.api.nvim_create_autocmd("FileType", { pattern = keys.ft, callback = function(event) - if self.active[keys.id] then + if self.active[keys.id] and not M.is_nop(keys) then add(event.buf) else -- Only create the mapping if its managed by lazy From 70f2c090d3ffb14f8702d468e05beb240b768881 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:47:53 +0200 Subject: [PATCH 1283/1610] chore(main): release 10.22.2 (#1500) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78cfcad..6d21386 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [10.22.2](https://github.com/folke/lazy.nvim/compare/v10.22.1...v10.22.2) (2024-06-06) + + +### Bug Fixes + +* **keys:** buffer-local nop mappings ([ff90417](https://github.com/folke/lazy.nvim/commit/ff904178089582f90fdc625493f3d3bddbefd6ea)) +* **keys:** never lazy-load `<nop>` or empty rhs keymaps ([3e4c795](https://github.com/folke/lazy.nvim/commit/3e4c795cec32481bc6d0b30c05125fdf7ef2d412)) + ## [10.22.1](https://github.com/folke/lazy.nvim/compare/v10.22.0...v10.22.1) (2024-06-02) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 17ce2bd..f01e6a9 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -182,7 +182,7 @@ M.defaults = { debug = false, } -M.version = "10.22.1" -- x-release-please-version +M.version = "10.22.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 74fd3611f291a2506c5534109689bb7b028f0566 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 6 Jun 2024 23:23:49 +0200 Subject: [PATCH 1284/1610] feat(util): opts merging now supports lists extending by tagging a table with __extend = true. Use with care --- lua/lazy/core/util.lua | 14 +++++++++++++- tests/core/util_spec.lua | 12 ++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index e51e670..e76f0c4 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -387,6 +387,10 @@ local function can_merge(v) return type(v) == "table" and (vim.tbl_isempty(v) or not M.is_list(v)) end +local function can_extend(v) + return type(v) == "table" and v.__extend +end + --- Merges the values similar to vim.tbl_deep_extend with the **force** behavior, --- but the values can be any type, in which case they override the values on the left. --- Values will me merged in-place in the first left-most table. If you want the result to be in @@ -402,7 +406,15 @@ function M.merge(...) end for i = 2, select("#", ...) do local value = select(i, ...) - if can_merge(ret) and can_merge(value) then + local are_t = type(ret) == "table" and type(value) == "table" + if are_t and (can_extend(ret) or can_extend(value)) then + for k, v in pairs(value) do + if k ~= "__extend" then + table.insert(ret, v) + end + end + ret.__extend = true + elseif are_t and can_merge(ret) and can_merge(value) then for k, v in pairs(value) do ret[k] = M.merge(ret[k], v) end diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index 643304d..f76f185 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -134,6 +134,18 @@ describe("util", function() input = { { a = 1 }, { b = 2, a = vim.NIL } }, output = { b = 2 }, }, + { + input = { { 1, 2, __extend = true }, { 3, 4 } }, + output = { 1, 2, 3, 4, __extend = true }, + }, + { + input = { { 1, 2, __extend = true }, { __extend = true, 3, 4 } }, + output = { 1, 2, 3, 4, __extend = true }, + }, + { + input = { { 1, 2 }, { 3, 4, __extend = true } }, + output = { 1, 2, 3, 4, __extend = true }, + }, } for _, test in ipairs(tests) do From 89ddc59d19513c5c19c8f8d2ad8573890bd00eef Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 6 Jun 2024 23:27:29 +0200 Subject: [PATCH 1285/1610] Revert "feat(util): opts merging now supports lists extending by tagging a table with __extend = true. Use with care" This reverts commit 74fd3611f291a2506c5534109689bb7b028f0566. --- lua/lazy/core/util.lua | 14 +------------- tests/core/util_spec.lua | 12 ------------ 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index e76f0c4..e51e670 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -387,10 +387,6 @@ local function can_merge(v) return type(v) == "table" and (vim.tbl_isempty(v) or not M.is_list(v)) end -local function can_extend(v) - return type(v) == "table" and v.__extend -end - --- Merges the values similar to vim.tbl_deep_extend with the **force** behavior, --- but the values can be any type, in which case they override the values on the left. --- Values will me merged in-place in the first left-most table. If you want the result to be in @@ -406,15 +402,7 @@ function M.merge(...) end for i = 2, select("#", ...) do local value = select(i, ...) - local are_t = type(ret) == "table" and type(value) == "table" - if are_t and (can_extend(ret) or can_extend(value)) then - for k, v in pairs(value) do - if k ~= "__extend" then - table.insert(ret, v) - end - end - ret.__extend = true - elseif are_t and can_merge(ret) and can_merge(value) then + if can_merge(ret) and can_merge(value) then for k, v in pairs(value) do ret[k] = M.merge(ret[k], v) end diff --git a/tests/core/util_spec.lua b/tests/core/util_spec.lua index f76f185..643304d 100644 --- a/tests/core/util_spec.lua +++ b/tests/core/util_spec.lua @@ -134,18 +134,6 @@ describe("util", function() input = { { a = 1 }, { b = 2, a = vim.NIL } }, output = { b = 2 }, }, - { - input = { { 1, 2, __extend = true }, { 3, 4 } }, - output = { 1, 2, 3, 4, __extend = true }, - }, - { - input = { { 1, 2, __extend = true }, { __extend = true, 3, 4 } }, - output = { 1, 2, 3, 4, __extend = true }, - }, - { - input = { { 1, 2 }, { 3, 4, __extend = true } }, - output = { 1, 2, 3, 4, __extend = true }, - }, } for _, test in ipairs(tests) do From 1f7b720cffa6d8f00ebb040bc60e8e056e0a6002 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 7 Jun 2024 09:02:52 +0200 Subject: [PATCH 1286/1610] feat(plugin): `opts_extend` can be a list of dotted keys that will be extended instead of merged --- lua/lazy/core/plugin.lua | 22 +++++++++++++++++++++- lua/lazy/core/util.lua | 31 +++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 905c078..91b36d3 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -667,7 +667,27 @@ function M._values(root, plugin, prop, is_list) end values = type(values) == "table" and values or { values } - return is_list and Util.extend(ret, values) or Util.merge(ret, values) + if is_list then + return Util.extend(ret, values) + else + ---@type {path:string[], list:any[]}[] + local lists = {} + for _, key in ipairs(plugin[prop .. "_extend"] or {}) do + local path = vim.split(key, ".", { plain = true }) + local r = Util.key_get(ret, path) + local v = Util.key_get(values, path) + if type(r) == "table" and type(v) == "table" then + lists[key] = { path = path, list = {} } + vim.list_extend(lists[key].list, r) + vim.list_extend(lists[key].list, v) + end + end + local t = Util.merge(ret, values) + for _, list in pairs(lists) do + Util.key_set(t, list.path, list.list) + end + return t + end end return M diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index e51e670..fe22abe 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -428,4 +428,35 @@ function M.lazy_require(module) }) end +---@param t table +---@param key string|string[] +---@return any +function M.key_get(t, key) + local path = type(key) == "table" and key or vim.split(key, ".", true) + local value = t + for _, k in ipairs(path) do + if type(value) ~= "table" then + return value + end + value = value[k] + end + return value +end + +---@param t table +---@param key string|string[] +---@param value any +function M.key_set(t, key, value) + local path = type(key) == "table" and key or vim.split(key, ".", true) + local last = t + for i = 1, #path - 1 do + local k = path[i] + if type(last[k]) ~= "table" then + last[k] = {} + end + last = last[k] + end + last[path[#path]] = value +end + return M From e0bc9a07e463bf849ac549b93f46363de58ffa29 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 07:03:28 +0000 Subject: [PATCH 1287/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b07aad4..fdd1cc1 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 06 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 07 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From fafe1f7c640aed75e70a10e6649612cd96f39149 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 10:54:20 +0200 Subject: [PATCH 1288/1610] chore(main): release 10.23.0 (#1502) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d21386..6bebedc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [10.23.0](https://github.com/folke/lazy.nvim/compare/v10.22.2...v10.23.0) (2024-06-07) + + +### Features + +* **plugin:** `opts_extend` can be a list of dotted keys that will be extended instead of merged ([1f7b720](https://github.com/folke/lazy.nvim/commit/1f7b720cffa6d8f00ebb040bc60e8e056e0a6002)) +* **util:** opts merging now supports lists extending by tagging a table with __extend = true. Use with care ([74fd361](https://github.com/folke/lazy.nvim/commit/74fd3611f291a2506c5534109689bb7b028f0566)) + ## [10.22.2](https://github.com/folke/lazy.nvim/compare/v10.22.1...v10.22.2) (2024-06-06) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f01e6a9..8b42617 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -182,7 +182,7 @@ M.defaults = { debug = false, } -M.version = "10.22.2" -- x-release-please-version +M.version = "10.23.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 034b03c80390ad67929f236871cff3ee4c6b3ba4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 7 Jun 2024 16:23:47 +0200 Subject: [PATCH 1289/1610] ci: Create dependabot.yml --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..2a76c71 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "Github Actions" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" From 938e1951085b5a141184fa00543ddf6f138e0963 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 7 Jun 2024 16:26:38 +0200 Subject: [PATCH 1290/1610] ci: Update dependabot.yml --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 2a76c71..0d08e26 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,7 +5,7 @@ version: 2 updates: - - package-ecosystem: "Github Actions" # See documentation for possible values + - package-ecosystem: "github-actions" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "weekly" From 0aac19ccc7a09b397808e25a74034a95d38be71b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:28:42 +0200 Subject: [PATCH 1291/1610] build(deps): bump stefanzweifel/git-auto-commit-action from 4 to 5 (#1506) Bumps [stefanzweifel/git-auto-commit-action](https://github.com/stefanzweifel/git-auto-commit-action) from 4 to 5. - [Release notes](https://github.com/stefanzweifel/git-auto-commit-action/releases) - [Changelog](https://github.com/stefanzweifel/git-auto-commit-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4...v5) --- updated-dependencies: - dependency-name: stefanzweifel/git-auto-commit-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e290ce..3cf4007 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,7 +40,7 @@ jobs: demojify: true treesitter: true - name: Push changes - uses: stefanzweifel/git-auto-commit-action@v4 + uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "chore(build): auto-generate vimdoc" commit_user_name: "github-actions[bot]" From db5c465509a96267476e6fce7a2a2739d35f968d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:28:52 +0200 Subject: [PATCH 1292/1610] build(deps): bump actions/checkout from 3 to 4 (#1508) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3cf4007..378c2b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: os: [ubuntu-latest] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install Neovim shell: bash run: | @@ -31,7 +31,7 @@ jobs: needs: tests if: ${{ github.ref == 'refs/heads/main' }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: panvimdoc uses: kdheepak/panvimdoc@main with: @@ -61,7 +61,7 @@ jobs: package-name: lazy.nvim extra-files: | lua/lazy/core/config.lua - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: tag stable versions if: ${{ steps.release.outputs.release_created }} run: | From eb4957442e3182f051b0ae11da32e06d22c190e3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 7 Jun 2024 16:31:18 +0200 Subject: [PATCH 1293/1610] ci: update release please. Fixes #1504 --- .github/workflows/ci.yml | 4 +--- release-please-config.json | 7 +++++++ 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 release-please-config.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 378c2b3..ee6e838 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,13 +54,11 @@ jobs: - tests runs-on: ubuntu-latest steps: - - uses: google-github-actions/release-please-action@v3 + - uses: googleapis/release-please-action@v4 id: release with: release-type: simple package-name: lazy.nvim - extra-files: | - lua/lazy/core/config.lua - uses: actions/checkout@v4 - name: tag stable versions if: ${{ steps.release.outputs.release_created }} diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..c8e5a10 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "simple", + "extra-files": [ + "lua/lazy/core/config.lua" + ] +} From 067fd41933c9f59eb3445eb942052c651a4c9a62 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 15 Jun 2024 09:11:36 +0200 Subject: [PATCH 1294/1610] fix(plugin): check optional plugins again after resolving enabled. Fixes #1402 --- lua/lazy/core/plugin.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 91b36d3..8039b87 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -319,6 +319,9 @@ function Spec:fix_disabled() end end + -- check optional plugins again + self:fix_optional() + -- rebuild any plugin specs that were modified self:rebuild() end From 6944b105cbf263ae1817267254b329bdcb37c979 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 15 Jun 2024 07:12:11 +0000 Subject: [PATCH 1295/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index fdd1cc1..f9d810a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 07 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 15 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From e2e10d9cbe133265ccdcc44cafa7c10773d96837 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 15 Jun 2024 09:28:56 +0200 Subject: [PATCH 1296/1610] feat: find local_spec in parent directories as well. Closes #1519 --- lua/lazy/core/plugin.lua | 44 ++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 8039b87..3f4acc7 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -403,7 +403,7 @@ function Spec:import(spec) ---@type string[] local modnames = {} - if spec.import == M.LOCAL_SPEC then + if spec.import:find(M.LOCAL_SPEC, 1, true) then modnames = { spec.import } else Util.lsmod(spec.import, function(modname) @@ -414,15 +414,19 @@ function Spec:import(spec) for _, modname in ipairs(modnames) do imported = imported + 1 - Util.track({ import = modname }) + local name = modname + if modname:find(M.LOCAL_SPEC, 1, true) then + name = vim.fn.fnamemodify(modname, ":~:.") + end + Util.track({ import = name }) 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 = nil - if modname == M.LOCAL_SPEC then - mod = M.local_spec() + if modname:find(M.LOCAL_SPEC, 1, true) then + mod = M.local_spec(modname) else mod = require(modname) end @@ -546,26 +550,48 @@ function M.update_state() end end -function M.local_spec() - local filepath = vim.fn.fnamemodify(".lazy.lua", ":p") - local file = vim.secure.read(filepath) +---@param path string +function M.local_spec(path) + local file = vim.secure.read(path) if file then return loadstring(file)() end return {} end +---@return string? +function M.find_local_spec() + if not Config.options.local_spec then + return + end + local path = vim.uv.cwd() + while path ~= "" do + local file = path .. "/" .. M.LOCAL_SPEC + if vim.fn.filereadable(file) == 1 then + return file + end + local p = vim.fn.fnamemodify(path, ":h") + if p == path then + break + end + path = p + end +end + function M.load() M.loading = true -- load specs Util.track("spec") Config.spec = Spec.new() + + local local_spec = M.find_local_spec() + Config.spec:parse({ vim.deepcopy(Config.options.spec), { - import = ".lazy.lua", + import = local_spec or M.LOCAL_SPEC, cond = function() - return Config.options.local_spec and vim.fn.filereadable(M.LOCAL_SPEC) == 1 + return local_spec ~= nil end, }, { "folke/lazy.nvim" }, From 4c6479e98ad643cd584e9e7c4095c463e0d810eb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 15 Jun 2024 09:54:45 +0200 Subject: [PATCH 1297/1610] chore(main): release 10.24.0 (#1522) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bebedc..c8a18b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [10.24.0](https://github.com/folke/lazy.nvim/compare/v10.23.0...v10.24.0) (2024-06-15) + + +### Features + +* find local_spec in parent directories as well. Closes [#1519](https://github.com/folke/lazy.nvim/issues/1519) ([e2e10d9](https://github.com/folke/lazy.nvim/commit/e2e10d9cbe133265ccdcc44cafa7c10773d96837)) + + +### Bug Fixes + +* **plugin:** check optional plugins again after resolving enabled. Fixes [#1402](https://github.com/folke/lazy.nvim/issues/1402) ([067fd41](https://github.com/folke/lazy.nvim/commit/067fd41933c9f59eb3445eb942052c651a4c9a62)) + ## [10.23.0](https://github.com/folke/lazy.nvim/compare/v10.22.2...v10.23.0) (2024-06-07) From be5dfba54216ccb80959df24d48540f07ee127a3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 16 Jun 2024 07:09:33 +0200 Subject: [PATCH 1298/1610] fix(plugin): better way of dealing with local specs. Fixes #1524 --- lua/lazy/core/plugin.lua | 78 +++++++++++++++++++++------------------- lua/lazy/types.lua | 3 +- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 3f4acc7..c7716b6 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -383,10 +383,18 @@ function Spec:import(spec) if spec.import == "lazy" then return self:error("You can't name your plugins module `lazy`.") end - if type(spec.import) ~= "string" then + if type(spec.import) == "function" then + if not spec.name then + return self:error("Invalid import spec. Missing name: " .. vim.inspect(spec)) + end + elseif type(spec.import) ~= "string" then return self:error("Invalid import spec. `import` should be a string: " .. vim.inspect(spec)) end - if vim.tbl_contains(self.modules, spec.import) then + + local import_name = spec.name or spec.import + ---@cast import_name string + + if vim.tbl_contains(self.modules, import_name) then return end if spec.cond == false or (type(spec.cond) == "function" and not spec.cond()) then @@ -396,40 +404,34 @@ function Spec:import(spec) return end - self.modules[#self.modules + 1] = spec.import + self.modules[#self.modules + 1] = import_name + + local import = spec.import local imported = 0 - ---@type string[] - local modnames = {} + ---@type (string|(fun():LazyPluginSpec))[] + local modspecs = {} - if spec.import:find(M.LOCAL_SPEC, 1, true) then - modnames = { spec.import } - else - Util.lsmod(spec.import, function(modname) - modnames[#modnames + 1] = modname + if type(import) == "string" then + Util.lsmod(import, function(modname) + modspecs[#modspecs + 1] = modname end) - table.sort(modnames) + table.sort(modspecs) + else + modspecs = { spec.import } end - for _, modname in ipairs(modnames) do + for _, modspec in ipairs(modspecs) do imported = imported + 1 - local name = modname - if modname:find(M.LOCAL_SPEC, 1, true) then - name = vim.fn.fnamemodify(modname, ":~:.") - end - Util.track({ import = name }) + local modname = type(modspec) == "string" and modspec or import_name + 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 = nil - if modname:find(M.LOCAL_SPEC, 1, true) then - mod = M.local_spec(modname) - else - mod = require(modname) - end + local mod = type(modspec) == "function" and modspec() or require(modspec) if type(mod) ~= "table" then self.importing = nil return self:error( @@ -559,7 +561,7 @@ function M.local_spec(path) return {} end ----@return string? +---@return LazySpecImport? function M.find_local_spec() if not Config.options.local_spec then return @@ -568,7 +570,16 @@ function M.find_local_spec() while path ~= "" do local file = path .. "/" .. M.LOCAL_SPEC if vim.fn.filereadable(file) == 1 then - return file + return { + name = vim.fn.fnamemodify(file, ":~:."), + import = function() + local data = vim.secure.read(file) + if data then + return loadstring(data)() + end + return {} + end, + } end local p = vim.fn.fnamemodify(path, ":h") if p == path then @@ -584,18 +595,13 @@ function M.load() Util.track("spec") Config.spec = Spec.new() - local local_spec = M.find_local_spec() - - Config.spec:parse({ + local specs = { vim.deepcopy(Config.options.spec), - { - import = local_spec or M.LOCAL_SPEC, - cond = function() - return local_spec ~= nil - end, - }, - { "folke/lazy.nvim" }, - }) + } + specs[#specs + 1] = M.find_local_spec() + specs[#specs + 1] = { "folke/lazy.nvim" } + + Config.spec:parse(specs) -- override some lazy props local lazy = Config.spec.plugins["lazy.nvim"] diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 9926aee..30bf9e5 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -78,6 +78,7 @@ ---@alias LazySpec string|LazyPluginSpec|LazySpecImport|LazySpec[] ---@class LazySpecImport ----@field import string spec module to import +---@field import string|(fun():LazyPluginSpec) spec module to import +---@field name? string ---@field enabled? boolean|(fun():boolean) ---@field cond? boolean|(fun():boolean) From 5da0245f0530f004283a66c0594efded7244c0f1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Jun 2024 05:10:11 +0000 Subject: [PATCH 1299/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f9d810a..b0c4003 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 15 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 16 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 38d6b74b63dc410ac5d7f4bb4c62dfeec74e366a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Jun 2024 07:15:01 +0200 Subject: [PATCH 1300/1610] chore(main): release 10.24.1 (#1525) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8a18b2..1edb3e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.24.1](https://github.com/folke/lazy.nvim/compare/v10.24.0...v10.24.1) (2024-06-16) + + +### Bug Fixes + +* **plugin:** better way of dealing with local specs. Fixes [#1524](https://github.com/folke/lazy.nvim/issues/1524) ([be5dfba](https://github.com/folke/lazy.nvim/commit/be5dfba54216ccb80959df24d48540f07ee127a3)) + ## [10.24.0](https://github.com/folke/lazy.nvim/compare/v10.23.0...v10.24.0) (2024-06-15) From b4316da7310682144c279c5f0451e59ee5f6c9d1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 16 Jun 2024 15:52:21 +0200 Subject: [PATCH 1301/1610] fix(plugin): rebuild optional when needed and remove frags from parent deps. Fixes #1402 --- lua/lazy/core/plugin.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index c7716b6..8d18e33 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -232,6 +232,15 @@ function Spec:remove_fragments(id, opts) else local plugin = self.plugins[id] repeat + if plugin._.fpid then + local parent = self.fragments[plugin._.fpid] + if parent then + parent._.fdeps = vim.tbl_filter(function(fid) + return fid ~= plugin._.fid + end, parent._.fdeps) + self.dirty[parent.name] = true + end + end fids[#fids + 1] = plugin._.fid plugin = plugin._.super until not plugin @@ -318,11 +327,10 @@ function Spec:fix_disabled() self.disabled[plugin.name] = plugin end end + self:rebuild() -- check optional plugins again self:fix_optional() - - -- rebuild any plugin specs that were modified self:rebuild() end From c501b429cf995c645454539b924aaefae45bb9eb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Jun 2024 16:25:23 +0200 Subject: [PATCH 1302/1610] chore(main): release 10.24.2 (#1526) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1edb3e3..bf69e91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.24.2](https://github.com/folke/lazy.nvim/compare/v10.24.1...v10.24.2) (2024-06-16) + + +### Bug Fixes + +* **plugin:** rebuild optional when needed and remove frags from parent deps. Fixes [#1402](https://github.com/folke/lazy.nvim/issues/1402) ([b4316da](https://github.com/folke/lazy.nvim/commit/b4316da7310682144c279c5f0451e59ee5f6c9d1)) + ## [10.24.1](https://github.com/folke/lazy.nvim/compare/v10.24.0...v10.24.1) (2024-06-16) From 025520d083c61baa7cd1f45807f5fe1ac9fbb50d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 18 Jun 2024 00:35:56 +0200 Subject: [PATCH 1303/1610] fix(util): dump --- lua/lazy/util.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 705ca39..970b066 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -237,6 +237,8 @@ function M._dump(value, result) table.insert(result, tostring(value)) elseif t == "string" then table.insert(result, ("%q"):format(value)) + elseif t == "table" and value._raw then + table.insert(result, value._raw) elseif t == "table" then table.insert(result, "{") local i = 1 @@ -244,7 +246,11 @@ function M._dump(value, result) for k, v in pairs(value) do if k == i then elseif type(k) == "string" then - table.insert(result, ("[%q]="):format(k)) + if k:match("^[a-zA-Z]+$") then + table.insert(result, ("%s="):format(k)) + else + table.insert(result, ("[%q]="):format(k)) + end else table.insert(result, k .. "=") end From f4d57485b051e90fecf93ce16059b8dcdb9ceb12 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 18 Jun 2024 00:36:11 +0200 Subject: [PATCH 1304/1610] refactor: reloader --- lua/lazy/core/util.lua | 3 +++ lua/lazy/manage/reloader.lua | 29 +++++++++++++++++------------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index fe22abe..f72ab21 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -92,7 +92,10 @@ function M.pretty_trace(opts) return #trace > 0 and ("\n\n# stacktrace:\n" .. table.concat(trace, "\n")) or "" end +---@generic R +---@param fn fun():R ---@param opts? string|{msg:string, on_error:fun(msg)} +---@return R function M.try(fn, opts) opts = type(opts) == "string" and { msg = opts } or opts or {} local msg = opts.msg diff --git a/lua/lazy/manage/reloader.lua b/lua/lazy/manage/reloader.lua index ef9305c..1a2b042 100644 --- a/lua/lazy/manage/reloader.lua +++ b/lua/lazy/manage/reloader.lua @@ -84,19 +84,24 @@ function M.check(start) end if not (start or #changes == 0) then - vim.schedule(function() - if Config.options.change_detection.notify and not Config.headless() then - local lines = { "# Config Change Detected. Reloading...", "" } - for _, change in ipairs(changes) do - table.insert(lines, "- **" .. change.what .. "**: `" .. vim.fn.fnamemodify(change.file, ":p:~:.") .. "`") - end - Util.warn(lines) - end - Plugin.load() - vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) - vim.api.nvim_exec_autocmds("User", { pattern = "LazyReload", modeline = false }) - end) + M.reload(changes) end end +---@param {file:string, what:string}[] +function M.reload(changes) + vim.schedule(function() + if Config.options.change_detection.notify and not Config.headless() then + local lines = { "# Config Change Detected. Reloading...", "" } + for _, change in ipairs(changes) do + table.insert(lines, "- **" .. change.what .. "**: `" .. vim.fn.fnamemodify(change.file, ":p:~:.") .. "`") + end + Util.warn(lines) + end + Plugin.load() + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) + vim.api.nvim_exec_autocmds("User", { pattern = "LazyReload", modeline = false }) + end) +end + return M From cd6a8293430a7fadf6a093dfdfbdb1ddbaf8ae7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 22:36:50 +0000 Subject: [PATCH 1305/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b0c4003..b3517d7 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 16 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 17 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 1325119e85d361db17644989fd2f2a9321ae0628 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 18 Jun 2024 23:21:42 +0200 Subject: [PATCH 1306/1610] ci: docs --- .github/workflows/docs.yaml | 51 +++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/docs.yaml diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml new file mode 100644 index 0000000..baa6ad4 --- /dev/null +++ b/.github/workflows/docs.yaml @@ -0,0 +1,51 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: + - docs + # Review gh actions docs if you want to further define triggers, paths, etc + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on + +jobs: + build: + name: Build Docusaurus + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version: 18 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Build website + run: pnpm build + + - name: Upload Build Artifact + uses: actions/upload-pages-artifact@v3 + with: + path: build + + deploy: + name: Deploy to GitHub Pages + needs: build + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From 07269d494e50ec96a7bbde4ad51087e5ec8d7970 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 21:22:17 +0000 Subject: [PATCH 1307/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b3517d7..10657ea 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 17 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 18 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From acc0449d833a1a7410b10cd771455777b82ef971 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 18 Jun 2024 23:36:59 +0200 Subject: [PATCH 1308/1610] ci: docs deploy --- .github/workflows/{docs.yaml => deploy.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{docs.yaml => deploy.yaml} (100%) diff --git a/.github/workflows/docs.yaml b/.github/workflows/deploy.yaml similarity index 100% rename from .github/workflows/docs.yaml rename to .github/workflows/deploy.yaml From bc620783663ab09d16bff9fdecc07da65b2a1528 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 18 Jun 2024 23:48:55 +0200 Subject: [PATCH 1309/1610] ci: remove deploy --- .github/workflows/deploy.yaml | 51 ----------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 .github/workflows/deploy.yaml diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml deleted file mode 100644 index baa6ad4..0000000 --- a/.github/workflows/deploy.yaml +++ /dev/null @@ -1,51 +0,0 @@ -name: Deploy to GitHub Pages - -on: - push: - branches: - - docs - # Review gh actions docs if you want to further define triggers, paths, etc - # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on - -jobs: - build: - name: Build Docusaurus - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - uses: actions/setup-node@v4 - with: - node-version: 18 - cache: pnpm - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Build website - run: pnpm build - - - name: Upload Build Artifact - uses: actions/upload-pages-artifact@v3 - with: - path: build - - deploy: - name: Deploy to GitHub Pages - needs: build - - # Grant GITHUB_TOKEN the permissions required to make a Pages deployment - permissions: - pages: write # to deploy to Pages - id-token: write # to verify the deployment originates from an appropriate source - - # Deploy to the github-pages environment - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - - runs-on: ubuntu-latest - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 From 6994ee3751778bbd84ffa62c03b280cd8bbd5e11 Mon Sep 17 00:00:00 2001 From: Ben Elan <no-reply@benelan.dev> Date: Sat, 22 Jun 2024 21:59:54 -0700 Subject: [PATCH 1310/1610] ci(release): fix version bumping in extra-file (#1534) * ci(release): fix version bumping in extra-file Release Please's doc is either incorrect or they have a bug, but this resolves the issue. * ci(release): use manifest file --- .github/.release-please-manifest.json | 3 +++ .github/release-please-config.json | 9 +++++++++ .github/workflows/ci.yml | 4 ++-- release-please-config.json | 7 ------- 4 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 .github/.release-please-manifest.json create mode 100644 .github/release-please-config.json delete mode 100644 release-please-config.json diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json new file mode 100644 index 0000000..47a48fe --- /dev/null +++ b/.github/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "10.24.2" +} diff --git a/.github/release-please-config.json b/.github/release-please-config.json new file mode 100644 index 0000000..18c3d65 --- /dev/null +++ b/.github/release-please-config.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "packages": { + ".": { + "release-type": "simple", + "extra-files": ["lua/lazy/core/config.lua"] + } + } +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee6e838..c7d3156 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,8 +57,8 @@ jobs: - uses: googleapis/release-please-action@v4 id: release with: - release-type: simple - package-name: lazy.nvim + config-file: .github/release-please-config.json + manifest-file: .github/.release-please-manifest.json - uses: actions/checkout@v4 - name: tag stable versions if: ${{ steps.release.outputs.release_created }} diff --git a/release-please-config.json b/release-please-config.json deleted file mode 100644 index c8e5a10..0000000 --- a/release-please-config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "release-type": "simple", - "extra-files": [ - "lua/lazy/core/config.lua" - ] -} From 849890c2c4fcd89133b6f4c43eeae13e18c8c550 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 23 Jun 2024 05:00:24 +0000 Subject: [PATCH 1311/1610] chore(build): auto-generate vimdoc --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 10657ea..876ea0a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,4 +1,4 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 18 +*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 23 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* From 4ea9fe060042f345960ad0c01aa7bca91405e10a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 23 Jun 2024 07:38:56 +0200 Subject: [PATCH 1312/1610] chore(main): release 10.24.3 (#1529) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 47a48fe..5596560 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "10.24.2" + ".": "10.24.3" } diff --git a/CHANGELOG.md b/CHANGELOG.md index bf69e91..1ad4080 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [10.24.3](https://github.com/folke/lazy.nvim/compare/v10.24.2...v10.24.3) (2024-06-23) + + +### Bug Fixes + +* **util:** dump ([025520d](https://github.com/folke/lazy.nvim/commit/025520d083c61baa7cd1f45807f5fe1ac9fbb50d)) + ## [10.24.2](https://github.com/folke/lazy.nvim/compare/v10.24.1...v10.24.2) (2024-06-16) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 8b42617..943505b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -182,7 +182,7 @@ M.defaults = { debug = false, } -M.version = "10.23.0" -- x-release-please-version +M.version = "10.24.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 8eba74c3fc41e1a364225f744022f8b3ff11d796 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 18 Jun 2024 19:40:58 +0200 Subject: [PATCH 1313/1610] feat: packspec --- lua/lazy/core/config.lua | 13 ++++ lua/lazy/core/packspec.lua | 125 +++++++++++++++++++++++++++++++++++++ lua/lazy/core/plugin.lua | 27 +++++++- lua/lazy/manage/init.lua | 2 + lua/lazy/view/commands.lua | 16 ++++- tests/core/plugin_spec.lua | 9 +++ 6 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 lua/lazy/core/packspec.lua diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 943505b..d843db2 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -179,6 +179,11 @@ M.defaults = { -- Track each new require in the Lazy profiling tab require = false, }, + packspec = { + enabled = true, + versions = true, -- Honor dependency versions in packspecs + path = vim.fn.stdpath("state") .. "/lazy/packspec.lua", + }, debug = false, } @@ -281,6 +286,14 @@ function M.setup(opts) require("lazy.manage.checker").start() end, 10) end + + -- useful for plugin developers when making changes to a packspec file + vim.api.nvim_create_autocmd("BufWritePost", { + pattern = "package.lua", + callback = function() + require("lazy.view.commands").cmd("packspec") + end, + }) end, }) diff --git a/lua/lazy/core/packspec.lua b/lua/lazy/core/packspec.lua new file mode 100644 index 0000000..75217d1 --- /dev/null +++ b/lua/lazy/core/packspec.lua @@ -0,0 +1,125 @@ +local Config = require("lazy.core.config") +local Util = require("lazy.util") + +---@class PackSpec +---@field dependencies? table<string, string> +---@field lazy? LazyPluginSpec +local M = {} + +M.lazy_file = "lazy.lua" +M.pkg_file = "pkg.json" +M.enable_lazy_file = false + +---@alias LazyPkg {lazy?:(fun():LazySpec), pkg?:PackSpec} + +---@type table<string, LazyPkg> +M.packspecs = nil +---@type table<string, LazySpec> +M.specs = {} + +---@param spec LazyPkg +---@param plugin LazyPlugin +---@return LazySpec? +local function convert(plugin, spec) + ---@type LazySpec + local ret = {} + + local pkg = spec.pkg + if pkg then + if pkg.dependencies then + for url, version in pairs(pkg.dependencies) do + if (not Config.options.packspec.versions) or version == "*" or version == "" then + version = nil + end + -- HACK: Add `.git` to github urls + if url:find("github") and not url:match("%.git$") then + url = url .. ".git" + end + ret[#ret + 1] = { url = url, version = version } + end + end + local p = pkg.lazy + if p then + p.url = p.url or plugin.url + p.dir = p.dir or plugin.dir + ret[#ret + 1] = p + end + end + + if spec.lazy then + ret[#ret + 1] = spec.lazy() + end + + return ret +end + +local function load() + Util.track("packspec") + M.packspecs = {} + if vim.loop.fs_stat(Config.options.packspec.path) then + Util.try(function() + M.packspecs = loadfile(Config.options.packspec.path)() + end, "Error loading packspecs:") + end + Util.track() +end + +---@param plugin LazyPlugin +---@return LazySpec? +function M.get(plugin) + if not M.packspecs then + load() + end + + if not M.packspecs[plugin.dir] then + return + end + M.specs[plugin.dir] = M.specs[plugin.dir] or convert(plugin, M.packspecs[plugin.dir]) + return vim.deepcopy(M.specs[plugin.dir]) +end + +function M.update() + local ret = {} + for _, plugin in pairs(Config.plugins) do + local spec = { + pkg = M.pkg(plugin), + lazy = M.enable_lazy_file and M.lazy_pkg(plugin) or nil, + } + if not vim.tbl_isempty(spec) then + ret[plugin.dir] = spec + end + end + local code = "return " .. Util.dump(ret) + Util.write_file(Config.options.packspec.path, code) + M.packspecs = nil + M.specs = {} +end + +---@param plugin LazyPlugin +function M.lazy_pkg(plugin) + local file = Util.norm(plugin.dir .. "/" .. M.lazy_file) + if Util.file_exists(file) then + ---@type LazySpec + local chunk = Util.try(function() + return loadfile(file) + end, "`" .. M.lazy_file .. "` for **" .. plugin.name .. "** has errors:") + if chunk then + return { _raw = ([[function() %s end]]):format(Util.read_file(file)) } + else + Util.error("Invalid `package.lua` for **" .. plugin.name .. "**") + end + end +end + +---@param plugin LazyPlugin +function M.pkg(plugin) + local file = Util.norm(plugin.dir .. "/" .. M.pkg_file) + if Util.file_exists(file) then + ---@type PackSpec + return Util.try(function() + return vim.json.decode(Util.read_file(file)) + end, "`" .. M.pkg_file .. "` for **" .. plugin.name .. "** has errors:") + end +end + +return M diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 8d18e33..3de712f 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,4 +1,5 @@ local Config = require("lazy.core.config") +local Packspec = require("lazy.core.packspec") local Util = require("lazy.core.util") ---@class LazyCorePlugin @@ -15,6 +16,8 @@ M.loading = false ---@field notifs {msg:string, level:number, file?:string}[] ---@field importing? string ---@field optional? boolean +---@field packspecs table<string, boolean> +---@field names table<string,string> local Spec = {} M.Spec = Spec M.last_fid = 0 @@ -32,7 +35,9 @@ function Spec.new(spec, opts) self.dirty = {} self.notifs = {} self.ignore_installed = {} + self.packspecs = {} self.optional = opts and opts.optional + self.names = {} if spec then self:parse(spec) end @@ -45,6 +50,7 @@ function Spec:parse(spec) end -- PERF: optimized code to get package name without using lua patterns +---@return string function Spec.get_name(pkg) local name = pkg:sub(-4) == ".git" and pkg:sub(1, -5) or pkg name = name:sub(-1) == "/" and name:sub(1, -2) or name @@ -83,7 +89,17 @@ function Spec:add(plugin, results) -- local plugin plugin.name = plugin.name or Spec.get_name(plugin.dir) elseif plugin.url then - plugin.name = plugin.name or Spec.get_name(plugin.url) + if plugin.name then + self.names[plugin.url] = plugin.name + local name = Spec.get_name(plugin.url) + if name and self.plugins[name] then + self.plugins[name].name = plugin.name + self.plugins[plugin.name] = self.plugins[name] + self.plugins[name] = nil + end + else + plugin.name = self.names[plugin.url] or Spec.get_name(plugin.url) + end -- check for dev plugins if plugin.dev == nil then for _, pattern in ipairs(Config.options.dev.patterns) do @@ -156,6 +172,15 @@ function Spec:add(plugin, results) table.remove(M.fid_stack) end + -- import the plugin's spec + if Config.options.packspec.enabled and plugin.dir and not self.packspecs[plugin.dir] then + self.packspecs[plugin.dir] = true + local packspec = Packspec.get(plugin) + if packspec then + self:normalize(packspec, nil, true) + end + end + if self.plugins[plugin.name] then plugin = self:merge(self.plugins[plugin.name], plugin) end diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 897bdbf..f5a96a9 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -92,6 +92,7 @@ function M.install(opts) }, opts):wait(function() require("lazy.manage.lock").update() require("lazy.help").update() + require("lazy.core.packspec").update() end) end @@ -116,6 +117,7 @@ function M.update(opts) }, opts):wait(function() require("lazy.manage.lock").update() require("lazy.help").update() + require("lazy.core.packspec").update() end) end -- diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 1210917..13c5070 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -34,6 +34,20 @@ M.commands = { health = function() vim.cmd.checkhealth("lazy") end, + pkg = function(opts) + local Pkg = require("lazy.core.packspec") + Pkg.update() + require("lazy.manage.reloader").reload({ + { + file = "packspec", --Config.options.packspec.path, + what = "changed", + }, + }) + for _, plugin in pairs(opts and opts.plugins or {}) do + local spec = Pkg.get(plugin) + Util.info(vim.inspect(spec), { lang = "lua", title = plugin.name }) + end + end, home = function() View.show("home") end, @@ -74,7 +88,7 @@ M.commands = { } function M.complete(cmd, prefix) - if not (ViewConfig.commands[cmd] or {}).plugins then + if not (ViewConfig.commands[cmd] or {}).plugins and cmd ~= "pkg" then return end ---@type string[] diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 51f6e03..c15505f 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -30,6 +30,14 @@ describe("plugin spec url/name", function() { { "foo/bar", name = "foobar" }, { [1] = "foo/bar", name = "foobar", url = "https://github.com/foo/bar.git" } }, { { "foo/bar", url = "123" }, { [1] = "foo/bar", name = "123", url = "123" } }, { { url = "https://foobar" }, { name = "foobar", url = "https://foobar" } }, + { + { { url = "https://foo", name = "foobar" }, { url = "https://foo" } }, + { name = "foobar", url = "https://foo" }, + }, + { + { { url = "https://foo" }, { url = "https://foo", name = "foobar" } }, + { name = "foobar", url = "https://foo" }, + }, { { url = "ssh://foobar" }, { name = "foobar", url = "ssh://foobar" } }, { "foo/bar", { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } }, { { { { "foo/bar" } } }, { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } }, @@ -46,6 +54,7 @@ describe("plugin spec url/name", function() plugins[1]._ = {} assert(#spec.notifs == 0) assert.equal(1, #plugins) + plugins[1]._.super = nil assert.same(test[2], plugins[1]) end) end From f1ba2e3d057ae5c03d04134a9d538d0b2251f13b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 18 Jun 2024 19:39:47 +0200 Subject: [PATCH 1314/1610] feat: luarocks support --- lua/lazy/core/config.lua | 17 +++++++ lua/lazy/core/loader.lua | 7 ++- lua/lazy/core/plugin.lua | 2 + lua/lazy/manage/init.lua | 4 +- lua/lazy/manage/rocks.lua | 89 ++++++++++++++++++++++++++++++++++ lua/lazy/manage/task/rocks.lua | 57 ++++++++++++++++++++++ lua/lazy/types.lua | 3 ++ 7 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 lua/lazy/manage/rocks.lua create mode 100644 lua/lazy/manage/task/rocks.lua diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index d843db2..58f9e10 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -31,6 +31,9 @@ M.defaults = { -- increase downloads a lot. filter = true, }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + }, dev = { ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects path = "~/projects", @@ -212,6 +215,9 @@ M.mapleader = nil ---@type string M.maplocalleader = nil +---@type {specs:string, tree:string, path:string, cpath:string} +M.rocks = {} + function M.headless() return #vim.api.nvim_list_uis() == 0 end @@ -262,6 +268,17 @@ function M.setup(opts) M.mapleader = vim.g.mapleader M.maplocalleader = vim.g.maplocalleader + M.rocks = { + specs = M.options.rocks.root .. "/specs", + tree = M.options.rocks.root .. "/tree", + path = M.options.rocks.root .. "/tree/share/lua/5.1", + cpath = M.options.rocks.root .. "/tree/lib/lua/5.1", + } + vim.fn.mkdir(M.rocks.specs, "p") + vim.fn.mkdir(M.rocks.tree, "p") + package.path = package.path .. ";" .. M.rocks.path .. "/?.lua;" .. M.rocks.path .. "/?/init.lua;" + package.cpath = package.cpath .. ";" .. M.rocks.cpath .. "/?." .. (jit.os:find("Windows") and "dll" or "so") .. ";" + if M.headless() then require("lazy.view.commands").setup() end diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index e07328c..ffd8753 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -44,6 +44,7 @@ function M.setup() while M.install_missing() do count = count + 1 if count > 5 then + Util.error("Too many rounds of missing plugins") break end end @@ -66,7 +67,11 @@ end -- multiple rounds can happen when importing a spec from a missing plugin function M.install_missing() for _, plugin in pairs(Config.plugins) do - if not (plugin._.installed or Plugin.has_errors(plugin)) then + local installed = plugin._.installed + local has_errors = Plugin.has_errors(plugin) + local rocks_installed = plugin._.rocks_installed ~= false + + if not has_errors and not (installed and rocks_installed) then for _, colorscheme in ipairs(Config.options.install.colorscheme) do if colorscheme == "default" then break diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 3de712f..6c8d7da 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -570,6 +570,8 @@ function M.update_state() installed[name] = nil end + require("lazy.manage.rocks").update_state() + Config.to_clean = {} for pack, dir_type in pairs(installed) do table.insert(Config.to_clean, { diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index f5a96a9..308930e 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -82,12 +82,13 @@ function M.install(opts) pipeline = { "git.clone", { "git.checkout", lockfile = opts.lockfile }, + "rocks.install", "plugin.docs", "wait", "plugin.build", }, plugins = function(plugin) - return plugin.url and not plugin._.installed + return plugin.url and not (plugin._.installed and plugin._.rocks_installed ~= false) end, }, opts):wait(function() require("lazy.manage.lock").update() @@ -106,6 +107,7 @@ function M.update(opts) "git.fetch", "git.status", { "git.checkout", lockfile = opts.lockfile }, + "rocks.install", "plugin.docs", "wait", "plugin.build", diff --git a/lua/lazy/manage/rocks.lua b/lua/lazy/manage/rocks.lua new file mode 100644 index 0000000..efad65d --- /dev/null +++ b/lua/lazy/manage/rocks.lua @@ -0,0 +1,89 @@ +--# selene:allow(incorrect_standard_library_use) + +local Config = require("lazy.core.config") +local Util = require("lazy.core.util") + +---@class LazyRock +---@field plugin string +---@field name string +---@field spec string +---@field installed boolean + +local M = {} +---@type LazyRock[] +M.rocks = {} + +---@param ... string +---@return string[] +function M.args(...) + local ret = { "--tree", Config.rocks.tree, "--lua-version", "5.1" } + vim.list_extend(ret, { ... }) + return ret +end + +function M.parse(rockspec_file) + local rockspec = {} + local ret, err = loadfile(rockspec_file, "t", rockspec) + if not ret then + error(err) + end + ret() + return rockspec +end + +-- dd(M.parse("/home/folke/.local/share/nvim/lazy/neorg/neorg-scm-1.rockspec")) + +---@param plugin LazyPlugin +function M.get_rockspec(plugin) + assert(plugin.rocks and #plugin.rocks > 0, plugin.name .. " has no rocks") + local rockspec_file = Config.rocks.specs .. "/lazy-" .. plugin.name .. "-0.0-0.rockspec" + require("lazy.util").write_file( + rockspec_file, + ([[ +rockspec_format = "3.0" +package = "lazy-%s" +version = "0.0-0" +source = { url = "%s" } +dependencies = %s +build = { type = "builtin" } +]]):format(plugin.name, plugin.url, vim.inspect(plugin.rocks)) + ) + return rockspec_file +end + +function M.update_state() + local root = Config.rocks.tree .. "/lib/luarocks/rocks-5.1" + ---@type table<string,string> + local installed = {} + Util.ls(root, function(_, name, type) + if type == "directory" then + installed[name] = name + end + end) + + ---@type LazyRock[] + local rocks = {} + M.rocks = rocks + + for _, plugin in pairs(Config.plugins) do + if plugin.rocks then + plugin._.rocks = {} + plugin._.rocks_installed = true + for _, spec in ipairs(plugin.rocks) do + spec = vim.trim(spec) + local name = spec:gsub("%s.*", "") + local rock = { + plugin = plugin.name, + name = name, + spec = spec, + installed = installed[name] ~= nil, + } + plugin._.rocks_installed = plugin._.rocks_installed and rock.installed + table.insert(plugin._.rocks, rock) + table.insert(rocks, rock) + end + end + end +end + +return M diff --git a/lua/lazy/manage/task/rocks.lua b/lua/lazy/manage/task/rocks.lua new file mode 100644 index 0000000..b2f61bf --- /dev/null +++ b/lua/lazy/manage/task/rocks.lua @@ -0,0 +1,57 @@ +local Rocks = require("lazy.manage.rocks") + +---@type table<string, LazyTaskDef> +local M = {} + +local running = false +local has_rocks = nil ---@type boolean? + +M.install = { + skip = function(plugin) + return plugin._.rocks_installed ~= false + end, + run = function(self) + if has_rocks == nil then + has_rocks = vim.fn.executable("luarocks") == 1 + end + if not has_rocks then + self.error = "This plugin has luarocks dependencies,\nbut the `luarocks` executable is not found.\nPlease install https://luarocks.org/ to continue.\n" + .. "luarock deps: " + .. vim.inspect(self.plugin.rocks) + return + end + + local started = false + + local function install() + started = true + self.status = "luarocks (install)" + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) + self:spawn("luarocks", { + args = Rocks.args("install", "--deps-mode", "one", "--deps-only", Rocks.get_rockspec(self.plugin)), + on_exit = function(ok) + running = false + if ok then + self.plugin._.rocks_installed = true + end + end, + }) + end + + local timer = vim.uv.new_timer() + timer:start(0, 100, function() + if not running then + running = true + timer:stop() + vim.schedule(install) + end + end) + self.status = "luarocks (pending)" + + table.insert(self._running, function() + return not started + end) + end, +} + +return M diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 30bf9e5..831327e 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -24,6 +24,8 @@ ---@field rtp_loaded? boolean ---@field handlers? LazyPluginHandlers ---@field cache? table<string,any> +---@field rocks? LazyRock[] +---@field rocks_installed? boolean ---@alias PluginOpts table|fun(self:LazyPlugin, opts:table):table? @@ -60,6 +62,7 @@ ---@field lazy? boolean ---@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[] ---@class LazyPlugin: LazyPluginBase,LazyPluginHandlers,LazyPluginHooks,LazyPluginRef ---@field dependencies? string[] From 3be55a46158cde17e2b853e531d260f3738a5346 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 18 Jun 2024 21:54:54 +0200 Subject: [PATCH 1315/1610] feat: added support for plugin packages by lazy, rockspec and packspec --- lua/lazy/core/config.lua | 20 +++--- lua/lazy/core/packspec.lua | 125 ------------------------------------- lua/lazy/core/plugin.lua | 16 ++--- lua/lazy/manage/init.lua | 4 +- lua/lazy/manage/rocks.lua | 39 ++++++------ lua/lazy/pkg/init.lua | 92 +++++++++++++++++++++++++++ lua/lazy/pkg/lazy.lua | 28 +++++++++ lua/lazy/pkg/packspec.lua | 54 ++++++++++++++++ lua/lazy/pkg/rockspec.lua | 55 ++++++++++++++++ lua/lazy/util.lua | 15 +++-- lua/lazy/view/commands.lua | 4 +- 11 files changed, 281 insertions(+), 171 deletions(-) delete mode 100644 lua/lazy/core/packspec.lua create mode 100644 lua/lazy/pkg/init.lua create mode 100644 lua/lazy/pkg/lazy.lua create mode 100644 lua/lazy/pkg/packspec.lua create mode 100644 lua/lazy/pkg/rockspec.lua diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 58f9e10..db79250 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -31,8 +31,19 @@ M.defaults = { -- increase downloads a lot. filter = true, }, + pkg = { + enabled = true, + cache = vim.fn.stdpath("state") .. "/lazy/pkg-cache.lua", + versions = true, -- Honor versions in pkg sources + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, rocks = { root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", }, dev = { ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects @@ -182,11 +193,6 @@ M.defaults = { -- Track each new require in the Lazy profiling tab require = false, }, - packspec = { - enabled = true, - versions = true, -- Honor dependency versions in packspecs - path = vim.fn.stdpath("state") .. "/lazy/packspec.lua", - }, debug = false, } @@ -306,9 +312,9 @@ function M.setup(opts) -- useful for plugin developers when making changes to a packspec file vim.api.nvim_create_autocmd("BufWritePost", { - pattern = "package.lua", + pattern = "lazy.lua", callback = function() - require("lazy.view.commands").cmd("packspec") + require("lazy.view.commands").cmd("pkg") end, }) end, diff --git a/lua/lazy/core/packspec.lua b/lua/lazy/core/packspec.lua deleted file mode 100644 index 75217d1..0000000 --- a/lua/lazy/core/packspec.lua +++ /dev/null @@ -1,125 +0,0 @@ -local Config = require("lazy.core.config") -local Util = require("lazy.util") - ----@class PackSpec ----@field dependencies? table<string, string> ----@field lazy? LazyPluginSpec -local M = {} - -M.lazy_file = "lazy.lua" -M.pkg_file = "pkg.json" -M.enable_lazy_file = false - ----@alias LazyPkg {lazy?:(fun():LazySpec), pkg?:PackSpec} - ----@type table<string, LazyPkg> -M.packspecs = nil ----@type table<string, LazySpec> -M.specs = {} - ----@param spec LazyPkg ----@param plugin LazyPlugin ----@return LazySpec? -local function convert(plugin, spec) - ---@type LazySpec - local ret = {} - - local pkg = spec.pkg - if pkg then - if pkg.dependencies then - for url, version in pairs(pkg.dependencies) do - if (not Config.options.packspec.versions) or version == "*" or version == "" then - version = nil - end - -- HACK: Add `.git` to github urls - if url:find("github") and not url:match("%.git$") then - url = url .. ".git" - end - ret[#ret + 1] = { url = url, version = version } - end - end - local p = pkg.lazy - if p then - p.url = p.url or plugin.url - p.dir = p.dir or plugin.dir - ret[#ret + 1] = p - end - end - - if spec.lazy then - ret[#ret + 1] = spec.lazy() - end - - return ret -end - -local function load() - Util.track("packspec") - M.packspecs = {} - if vim.loop.fs_stat(Config.options.packspec.path) then - Util.try(function() - M.packspecs = loadfile(Config.options.packspec.path)() - end, "Error loading packspecs:") - end - Util.track() -end - ----@param plugin LazyPlugin ----@return LazySpec? -function M.get(plugin) - if not M.packspecs then - load() - end - - if not M.packspecs[plugin.dir] then - return - end - M.specs[plugin.dir] = M.specs[plugin.dir] or convert(plugin, M.packspecs[plugin.dir]) - return vim.deepcopy(M.specs[plugin.dir]) -end - -function M.update() - local ret = {} - for _, plugin in pairs(Config.plugins) do - local spec = { - pkg = M.pkg(plugin), - lazy = M.enable_lazy_file and M.lazy_pkg(plugin) or nil, - } - if not vim.tbl_isempty(spec) then - ret[plugin.dir] = spec - end - end - local code = "return " .. Util.dump(ret) - Util.write_file(Config.options.packspec.path, code) - M.packspecs = nil - M.specs = {} -end - ----@param plugin LazyPlugin -function M.lazy_pkg(plugin) - local file = Util.norm(plugin.dir .. "/" .. M.lazy_file) - if Util.file_exists(file) then - ---@type LazySpec - local chunk = Util.try(function() - return loadfile(file) - end, "`" .. M.lazy_file .. "` for **" .. plugin.name .. "** has errors:") - if chunk then - return { _raw = ([[function() %s end]]):format(Util.read_file(file)) } - else - Util.error("Invalid `package.lua` for **" .. plugin.name .. "**") - end - end -end - ----@param plugin LazyPlugin -function M.pkg(plugin) - local file = Util.norm(plugin.dir .. "/" .. M.pkg_file) - if Util.file_exists(file) then - ---@type PackSpec - return Util.try(function() - return vim.json.decode(Util.read_file(file)) - end, "`" .. M.pkg_file .. "` for **" .. plugin.name .. "** has errors:") - end -end - -return M diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 6c8d7da..de6d228 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,5 +1,5 @@ local Config = require("lazy.core.config") -local Packspec = require("lazy.core.packspec") +local Pkg = require("lazy.pkg") local Util = require("lazy.core.util") ---@class LazyCorePlugin @@ -16,7 +16,7 @@ M.loading = false ---@field notifs {msg:string, level:number, file?:string}[] ---@field importing? string ---@field optional? boolean ----@field packspecs table<string, boolean> +---@field pkgs table<string, boolean> ---@field names table<string,string> local Spec = {} M.Spec = Spec @@ -35,7 +35,7 @@ function Spec.new(spec, opts) self.dirty = {} self.notifs = {} self.ignore_installed = {} - self.packspecs = {} + self.pkgs = {} self.optional = opts and opts.optional self.names = {} if spec then @@ -173,11 +173,11 @@ function Spec:add(plugin, results) end -- import the plugin's spec - if Config.options.packspec.enabled and plugin.dir and not self.packspecs[plugin.dir] then - self.packspecs[plugin.dir] = true - local packspec = Packspec.get(plugin) - if packspec then - self:normalize(packspec, nil, true) + if Config.options.pkg.enabled and plugin.dir and not self.pkgs[plugin.dir] then + self.pkgs[plugin.dir] = true + local pkg = Pkg.get_spec(plugin) + if pkg then + self:normalize(pkg, nil) end end diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 308930e..3e145c8 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -93,7 +93,7 @@ function M.install(opts) }, opts):wait(function() require("lazy.manage.lock").update() require("lazy.help").update() - require("lazy.core.packspec").update() + require("lazy.pkg").update() end) end @@ -119,7 +119,7 @@ function M.update(opts) }, opts):wait(function() require("lazy.manage.lock").update() require("lazy.help").update() - require("lazy.core.packspec").update() + require("lazy.pkg").update() end) end -- diff --git a/lua/lazy/manage/rocks.lua b/lua/lazy/manage/rocks.lua index efad65d..3e1bc6e 100644 --- a/lua/lazy/manage/rocks.lua +++ b/lua/lazy/manage/rocks.lua @@ -16,33 +16,32 @@ M.rocks = {} ---@param ... string ---@return string[] function M.args(...) - local ret = { "--tree", Config.rocks.tree, "--lua-version", "5.1" } + local ret = { + "--tree", + Config.rocks.tree, + "--server", + Config.options.rocks.server, + "--dev", + "--lua-version", + "5.1", + } vim.list_extend(ret, { ... }) return ret end -function M.parse(rockspec_file) - local rockspec = {} - local ret, err = loadfile(rockspec_file, "t", rockspec) - if not ret then - error(err) - end - ret() - return rockspec -end - --- dd(M.parse("/home/folke/.local/share/nvim/lazy/neorg/neorg-scm-1.rockspec")) - ---@param plugin LazyPlugin function M.get_rockspec(plugin) - assert(plugin.rocks and #plugin.rocks > 0, plugin.name .. " has no rocks") - local rockspec_file = Config.rocks.specs .. "/lazy-" .. plugin.name .. "-0.0-0.rockspec" + local rocks = vim.tbl_map(function(rock) + return rock.name + end, plugin._.rocks) + assert(rocks and #rocks > 0, plugin.name .. " has no rocks") + local rockspec_file = Config.rocks.specs .. "/lazy-" .. plugin.name .. "-scm-1.rockspec" require("lazy.util").write_file( rockspec_file, ([[ rockspec_format = "3.0" package = "lazy-%s" -version = "0.0-0" +version = "scm-1" source = { url = "%s" } dependencies = %s build = { type = "builtin" } @@ -78,9 +77,11 @@ function M.update_state() spec = spec, installed = installed[name] ~= nil, } - plugin._.rocks_installed = plugin._.rocks_installed and rock.installed - table.insert(plugin._.rocks, rock) - table.insert(rocks, rock) + if rock.name ~= "lua" then + plugin._.rocks_installed = plugin._.rocks_installed and rock.installed + table.insert(plugin._.rocks, rock) + table.insert(rocks, rock) + end end end end diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua new file mode 100644 index 0000000..f09afbc --- /dev/null +++ b/lua/lazy/pkg/init.lua @@ -0,0 +1,92 @@ +local Config = require("lazy.core.config") +local Util = require("lazy.util") + +local M = {} + +---@alias LazyPkgSpec LazySpec | fun():LazySpec + +---@class LazyPkg +---@field source string +---@field file string +---@field spec? LazySpec +---@field chunk? string|fun():LazySpec + +---@class LazyPkgSource +---@field get fun(plugin:LazyPlugin):LazyPkg + +---@type table<string, LazyPkg>? +M.cache = nil + +function M.update() + ---@type LazyPkgSource[] + local sources = {} + for _, s in ipairs(Config.options.pkg.sources) do + sources[#sources + 1] = require("lazy.pkg." .. s) + end + + ---@type table<string, LazyPkg> + local ret = {} + for _, plugin in pairs(Config.plugins) do + for _, source in ipairs(sources) do + local spec = source.get(plugin) + if spec then + if type(spec.chunk) == "function" then + spec.chunk = string.dump(spec.chunk) + end + ret[plugin.dir] = spec + break + end + end + end + local code = "return " .. Util.dump(ret) + Util.write_file(Config.options.pkg.cache, code) + M.cache = nil +end + +local function _load() + Util.track("pkg") + M.cache = {} + if vim.uv.fs_stat(Config.options.pkg.cache) then + Util.try(function() + local chunk, err = loadfile(Config.options.pkg.cache) + if not chunk then + error(err) + end + M.cache = chunk() + end, "Error loading pkg:") + end + Util.track() +end + +---@param plugin LazyPlugin +---@return LazyPkg? +function M.get(plugin) + if not M.cache then + _load() + end + + local ret = M.cache[plugin.dir] + if not ret then + return + end + + if ret.chunk and not ret.spec then + if type(ret.chunk) == "string" then + ret.chunk = load(ret.chunk, "@" .. plugin.dir) + end + ret.spec = ret.chunk() + ret.chunk = nil + end + + return ret +end + +---@param plugin LazyPlugin +---@return LazySpec? +function M.get_spec(plugin) + local pkg = M.get(plugin) + local spec = pkg and pkg.spec + return spec and type(spec) == "table" and vim.deepcopy(spec) or spec +end + +return M diff --git a/lua/lazy/pkg/lazy.lua b/lua/lazy/pkg/lazy.lua new file mode 100644 index 0000000..07b0491 --- /dev/null +++ b/lua/lazy/pkg/lazy.lua @@ -0,0 +1,28 @@ +local Util = require("lazy.util") + +local M = {} + +M.lazy_file = "lazy.lua" + +---@param plugin LazyPlugin +---@return LazyPkg? +function M.get(plugin) + local file = Util.norm(plugin.dir .. "/" .. M.lazy_file) + if Util.file_exists(file) then + ---@type fun(): LazySpec + local chunk = Util.try(function() + local ret, err = loadfile(file) + return err and error(err) or ret + end, "`" .. M.lazy_file .. "` for **" .. plugin.name .. "** has errors:") + if not chunk then + Util.error("Invalid `" .. M.lazy_file .. "` for **" .. plugin.name .. "**") + end + return { + source = "lazy", + file = M.lazy_file, + chunk = chunk, + } + end +end + +return M diff --git a/lua/lazy/pkg/packspec.lua b/lua/lazy/pkg/packspec.lua new file mode 100644 index 0000000..c9f2042 --- /dev/null +++ b/lua/lazy/pkg/packspec.lua @@ -0,0 +1,54 @@ +local Util = require("lazy.util") + +---@class PackSpec +---@field dependencies? table<string, string> +---@field lazy? LazyPluginSpec +--- +local M = {} + +M.pkg_file = "pkg.json" + +---@param plugin LazyPlugin +---@return LazyPkg? +function M.get(plugin) + local file = Util.norm(plugin.dir .. "/" .. M.pkg_file) + if not Util.file_exists(file) then + return + end + ---@type PackSpec + local pkg = Util.try(function() + return vim.json.decode(Util.read_file(file)) + end, "`" .. M.pkg_file .. "` for **" .. plugin.name .. "** has errors:") + + if not pkg then + return + end + + ---@type LazySpec + local ret = {} + if pkg.dependencies then + for url, version in pairs(pkg.dependencies) do + -- HACK: Add `.git` to github urls + if url:find("github") and not url:match("%.git$") then + url = url .. ".git" + end + ret[#ret + 1] = { url = url, version = version } + end + end + local p = pkg.lazy + if p then + p.url = p.url or plugin.url + p.dir = p.dir or plugin.dir + ret[#ret + 1] = p + end + if pkg.lazy then + ret[#ret + 1] = pkg.lazy + end + return { + source = "lazy", + file = M.pkg_file, + spec = ret, + } +end + +return M diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua new file mode 100644 index 0000000..7a0c752 --- /dev/null +++ b/lua/lazy/pkg/rockspec.lua @@ -0,0 +1,55 @@ +--# selene:allow(incorrect_standard_library_use) + +local Util = require("lazy.core.util") + +local M = {} + +M.dev_suffix = "-scm-1.rockspec" +M.skip = { "lua" } + +---@class RockSpec +---@field rockspec_format string +---@field package string +---@field version string +---@field dependencies string[] + +---@param plugin LazyPlugin +---@return LazyPkg? +function M.get(plugin) + local rockspec_file ---@type string? + Util.ls(plugin.dir, function(path, name, t) + if t == "file" and name:sub(-#M.dev_suffix) == M.dev_suffix then + rockspec_file = path + return false + end + end) + + if not rockspec_file then + return + end + + ---@type RockSpec? + local rockspec = {} + local ret, err = loadfile(rockspec_file, "t", rockspec) + if not ret then + error(err) + end + ret() + return rockspec + and rockspec.package + and { + source = "rockspec", + file = rockspec_file, + spec = { + dir = plugin.dir, + url = plugin.url, + rocks = vim.tbl_filter(function(dep) + local name = dep:gsub("%s.*", "") + return not vim.tbl_contains(M.skip, name) + end, rockspec.dependencies), + }, + } + or nil +end + +return M diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 970b066..755c1cd 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -241,22 +241,21 @@ function M._dump(value, result) table.insert(result, value._raw) elseif t == "table" then table.insert(result, "{") - local i = 1 + for _, v in ipairs(value) do + M._dump(v, result) + table.insert(result, ",") + end ---@diagnostic disable-next-line: no-unknown for k, v in pairs(value) do - if k == i then - elseif type(k) == "string" then + if type(k) == "string" then if k:match("^[a-zA-Z]+$") then table.insert(result, ("%s="):format(k)) else table.insert(result, ("[%q]="):format(k)) end - else - table.insert(result, k .. "=") + M._dump(v, result) + table.insert(result, ",") end - M._dump(v, result) - table.insert(result, ",") - i = i + 1 end table.insert(result, "}") else diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 13c5070..6b828a5 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -35,11 +35,11 @@ M.commands = { vim.cmd.checkhealth("lazy") end, pkg = function(opts) - local Pkg = require("lazy.core.packspec") + local Pkg = require("lazy.pkg") Pkg.update() require("lazy.manage.reloader").reload({ { - file = "packspec", --Config.options.packspec.path, + file = "pkg", what = "changed", }, }) From 8d35e60eeb83a53ad75399c38de4b5d044e5e15a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 18 Jun 2024 22:09:49 +0200 Subject: [PATCH 1316/1610] test: fix spec tests --- tests/core/plugin_spec.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index c15505f..548b5f5 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -52,7 +52,10 @@ describe("plugin spec url/name", function() local spec = Plugin.Spec.new(test[1]) local plugins = vim.tbl_values(spec.plugins) plugins[1]._ = {} - assert(#spec.notifs == 0) + local notifs = vim.tbl_filter(function(notif) + return notif.level > 3 + end, spec.notifs) + assert(#notifs == 0, vim.inspect(spec.notifs)) assert.equal(1, #plugins) plugins[1]._.super = nil assert.same(test[2], plugins[1]) From 75ffe56f70faac43f077796b91178d2f1419f8ce Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 22 Jun 2024 22:18:26 +0200 Subject: [PATCH 1317/1610] feat: rewrite of spec resolving --- lua/lazy/core/fragments.lua | 159 +++++++++++++++ lua/lazy/core/loader.lua | 8 +- lua/lazy/core/meta.lua | 245 +++++++++++++++++++++++ lua/lazy/core/plugin.lua | 375 +++-------------------------------- lua/lazy/core/util.lua | 2 +- lua/lazy/health.lua | 18 -- lua/lazy/types.lua | 51 +++-- tests/core/plugin_spec.lua | 128 ++++++++---- tests/handlers/keys_spec.lua | 1 + 9 files changed, 558 insertions(+), 429 deletions(-) create mode 100644 lua/lazy/core/fragments.lua create mode 100644 lua/lazy/core/meta.lua diff --git a/lua/lazy/core/fragments.lua b/lua/lazy/core/fragments.lua new file mode 100644 index 0000000..7096f55 --- /dev/null +++ b/lua/lazy/core/fragments.lua @@ -0,0 +1,159 @@ +local Config = require("lazy.core.config") + +local M = {} + +M._fid = 0 + +local function next_id() + M._fid = M._fid + 1 + return M._fid +end + +---@class LazyFragments +---@field fragments table<number, LazyFragment> +---@field frag_stack number[] +---@field dep_stack number[] +---@field dirty table<number, boolean> +---@field spec LazySpecLoader +local F = {} + +---@param spec LazySpecLoader +---@return LazyFragments +function M.new(spec) + local self = setmetatable({}, { __index = F }) + self.fragments = {} + self.frag_stack = {} + self.dep_stack = {} + self.spec = spec + self.dirty = {} + return self +end + +---@param id number +function F:get(id) + return self.fragments[id] +end + +---@param id number +function F:del(id) + -- del fragment + local fragment = self.fragments[id] + if not fragment then + return + end + + self.dirty[id] = true + + -- remove from parent + local pid = fragment.pid + if pid then + local parent = self.fragments[pid] + if parent.frags then + ---@param fid number + parent.frags = vim.tbl_filter(function(fid) + return fid ~= id + end, parent.frags) + end + if parent.deps then + ---@param fid number + parent.deps = vim.tbl_filter(function(fid) + return fid ~= id + end, parent.deps) + end + self.dirty[pid] = true + end + + -- remove children + if fragment.frags then + for _, fid in ipairs(fragment.frags) do + self:del(fid) + end + end + + self.fragments[id] = nil +end + +---@param plugin LazyPluginSpec +function F:add(plugin) + local id = next_id() + + local pid = self.frag_stack[#self.frag_stack] + + ---@type LazyFragment + local fragment = { + id = id, + pid = pid, + name = plugin.name, + url = plugin.url, + dir = plugin.dir, + spec = plugin --[[@as LazyPlugin]], + } + + -- short url / ref + if plugin[1] then + local slash = plugin[1]:find("/", 1, true) + if slash then + local prefix = plugin[1]:sub(1, 4) + if prefix == "http" or prefix == "git@" then + fragment.url = fragment.url or plugin[1] + else + fragment.name = fragment.name or plugin[1]:sub(slash + 1) + fragment.url = fragment.url or Config.options.git.url_format:format(plugin[1]) + end + else + fragment.name = fragment.name or plugin[1] + end + end + + -- name + fragment.name = fragment.name + or fragment.url and self.spec.get_name(fragment.url) + or fragment.dir and self.spec.get_name(fragment.dir) + if not fragment.name then + return self.spec:error("Invalid plugin spec " .. vim.inspect(plugin)) + end + + if type(plugin.config) == "table" then + self.spec:warn( + "{" .. fragment.name .. "}: setting a table to `Plugin.config` is deprecated. Please use `Plugin.opts` instead" + ) + ---@diagnostic disable-next-line: assign-type-mismatch + plugin.opts = plugin.config + plugin.config = nil + end + + self.fragments[id] = fragment + + -- add to parent + if pid then + local parent = self.fragments[pid] + parent.frags = parent.frags or {} + table.insert(parent.frags, id) + end + + -- add to parent's deps + local did = self.dep_stack[#self.dep_stack] + if did and did == pid then + fragment.dep = true + local parent = self.fragments[did] + parent.deps = parent.deps or {} + table.insert(parent.deps, id) + end + + table.insert(self.frag_stack, id) + -- dependencies + if plugin.dependencies then + table.insert(self.dep_stack, id) + self.spec:normalize(plugin.dependencies) + table.remove(self.dep_stack) + end + -- child specs + if plugin.specs then + self.spec:normalize(plugin.specs) + end + table.remove(self.frag_stack) + + return fragment +end + +return M diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index ffd8753..a0233ad 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -105,7 +105,7 @@ function M.startup() M.source(vim.env.VIMRUNTIME .. "/filetype.lua") -- backup original rtp - local rtp = vim.opt.rtp:get() + local rtp = vim.opt.rtp:get() --[[@as string[] ]] -- 1. run plugin init Util.track({ start = "init" }) @@ -136,7 +136,7 @@ function M.startup() if not path:find("after/?$") then -- these paths don't will already have their ftdetect ran, -- by sourcing filetype.lua above, so skip them - M.did_ftdetect[path] = true + M.did_ftdetect[path] = path M.packadd(path) end end @@ -144,7 +144,9 @@ function M.startup() -- 4. load after plugins Util.track({ start = "after" }) - for _, path in ipairs(vim.opt.rtp:get()) do + for _, path in + ipairs(vim.opt.rtp:get() --[[@as string[] ]]) + do if path:find("after/?$") then M.source_runtime(path, "plugin") end diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua new file mode 100644 index 0000000..9c40238 --- /dev/null +++ b/lua/lazy/core/meta.lua @@ -0,0 +1,245 @@ +local Config = require("lazy.core.config") +local Util = require("lazy.core.util") + +---@class LazyMeta +---@field plugins table<string, LazyPlugin> +---@field str_to_meta table<string, LazyPlugin> +---@field frag_to_meta table<number, LazyPlugin> +---@field dirty table<string, boolean> +---@field spec LazySpecLoader +---@field fragments LazyFragments +local M = {} + +---@param spec LazySpecLoader +---@return LazyMeta +function M.new(spec) + local self = setmetatable({}, { __index = M }) + self.spec = spec + self.fragments = require("lazy.core.fragments").new(spec) + self.plugins = {} + self.frag_to_meta = {} + self.str_to_meta = {} + self.dirty = {} + return self +end + +---@param name string +function M:del(name) + local meta = self.plugins[name] + if not meta then + return + end + for _, fid in ipairs(meta._.frags or {}) do + self.fragments:del(fid) + end + self.plugins[name] = nil +end + +---@param plugin LazyPluginSpec +function M:add(plugin) + local fragment = self.fragments:add(plugin) + if not fragment then + return + end + + local meta = self.plugins[fragment.name] + or fragment.url and self.str_to_meta[fragment.url] + or fragment.dir and self.str_to_meta[fragment.dir] + + if not meta then + meta = { name = fragment.name, _ = { frags = {} } } + local url, dir = fragment.url, fragment.dir + -- add to index + if url then + self.str_to_meta[url] = meta + end + if dir then + self.str_to_meta[dir] = meta + end + end + + table.insert(meta._.frags, fragment.id) + + if plugin.name then + -- handle renames + if meta.name ~= plugin.name then + self.plugins[meta.name] = nil + meta.name = plugin.name + end + end + + self.plugins[meta.name] = meta + self.frag_to_meta[fragment.id] = meta + self.dirty[meta.name] = true +end + +function M:rebuild() + for fid in pairs(self.fragments.dirty) do + local meta = self.frag_to_meta[fid] + if meta then + if self.fragments:get(fid) then + -- fragment still exists, so mark plugin as dirty + self.dirty[meta.name] = true + else + -- fragment was deleted, so remove it from plugin + ---@param f number + meta._.frags = vim.tbl_filter(function(f) + return f ~= fid + end, meta._.frags) + -- if no fragments left, delete plugin + if #meta._.frags == 0 then + self:del(meta.name) + else + self.dirty[meta.name] = true + end + end + end + end + self.fragments.dirty = {} + for n, _ in pairs(self.dirty) do + self:_rebuild(n) + end +end + +---@param name string +function M:_rebuild(name) + local plugin = self.plugins[name] + if not plugin or #plugin._.frags == 0 then + self.plugins[name] = nil + return + end + setmetatable(plugin, nil) + plugin.dependencies = {} + + local super = nil + plugin.url = nil + plugin._.dep = true + plugin.optional = true + + assert(#plugin._.frags > 0, "no fragments found for plugin " .. name) + + for _, fid in ipairs(plugin._.frags) do + local fragment = self.fragments:get(fid) + assert(fragment, "fragment " .. fid .. " not found, for plugin " .. name) + ---@diagnostic disable-next-line: no-unknown + super = setmetatable(fragment.spec, super and { __index = super } or nil) + plugin._.dep = plugin._.dep and fragment.dep + plugin.optional = plugin.optional and (rawget(fragment.spec, "optional") == true) + plugin.url = fragment.url or plugin.url + + -- dependencies + for _, dep in ipairs(fragment.deps or {}) do + table.insert(plugin.dependencies, self.fragments:get(dep).name) + end + end + + super = super or {} + + -- dir / dev + plugin.dev = super.dev + plugin.dir = super.dir + if plugin.dir then + plugin.dir = Util.norm(plugin.dir) + else + if plugin.dev == nil and plugin.url then + for _, pattern in ipairs(Config.options.dev.patterns) do + if plugin.url:find(pattern, 1, true) then + plugin.dev = true + break + end + end + end + if plugin.dev == true then + local dev_dir = type(Config.options.dev.path) == "string" and Config.options.dev.path .. "/" .. plugin.name + or Util.norm(Config.options.dev.path(plugin)) + if not Config.options.dev.fallback or vim.fn.isdirectory(dev_dir) == 1 then + plugin.dir = dev_dir + else + plugin.dev = false + end + end + plugin.dir = plugin.dir or Config.options.root .. "/" .. plugin.name + end + + if #plugin.dependencies == 0 and not super.dependencies then + plugin.dependencies = nil + end + if not plugin.optional and not super.optional then + plugin.optional = nil + end + setmetatable(plugin, { __index = super }) + + self.dirty[plugin.name] = nil + return plugin +end + +---@param plugin LazyPlugin +function M:disable(plugin) + plugin._.kind = "disabled" + self:del(plugin.name) + self.spec.disabled[plugin.name] = plugin +end + +function M:fix_cond() + for _, plugin in pairs(self.plugins) do + local cond = plugin.cond + if cond == nil then + cond = Config.options.defaults.cond + end + if cond == false or (type(cond) == "function" and not cond(plugin)) then + plugin._.cond = false + local stack = { plugin } + while #stack > 0 do + local p = table.remove(stack) --[[@as LazyPlugin]] + if not self.spec.ignore_installed[p.name] then + for _, dep in ipairs(p.dependencies or {}) do + table.insert(stack, self.plugins[dep]) + end + self.spec.ignore_installed[p.name] = true + end + end + plugin.enabled = false + end + end +end + +function M:fix_optional() + if self.spec.optional then + return 0 + end + local changes = 0 + for _, plugin in pairs(self.plugins) do + if plugin.optional then + changes = changes + 1 + self:del(plugin.name) + end + end + self:rebuild() + return changes +end + +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) + end + end + self:rebuild() + return changes +end + +function M:fix() + Util.track("resolve plugins") + self:rebuild() + + self:fix_cond() + + -- selene: allow(empty_loop) + while self:fix_disabled() + self:fix_optional() > 0 do + end + Util.track() +end + +return M diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index de6d228..6aec6f1 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,4 +1,5 @@ local Config = require("lazy.core.config") +local Meta = require("lazy.core.meta") local Pkg = require("lazy.pkg") local Util = require("lazy.core.util") @@ -7,46 +8,49 @@ local M = {} M.loading = false ---@class LazySpecLoader +---@field meta LazyMeta ---@field plugins table<string, LazyPlugin> ----@field fragments table<number, LazyPlugin> ---@field disabled table<string, LazyPlugin> ----@field dirty table<string, true> ---@field ignore_installed table<string, true> ---@field modules string[] ---@field notifs {msg:string, level:number, file?:string}[] ---@field importing? string ---@field optional? boolean ---@field pkgs table<string, boolean> ----@field names table<string,string> local Spec = {} M.Spec = Spec -M.last_fid = 0 -M.fid_stack = {} ---@type number[] M.LOCAL_SPEC = ".lazy.lua" ---@param spec? LazySpec ---@param opts? {optional?:boolean} function Spec.new(spec, opts) - local self = setmetatable({}, { __index = Spec }) - self.plugins = {} - self.fragments = {} + local self = setmetatable({}, Spec) + self.meta = Meta.new(self) self.disabled = {} self.modules = {} - self.dirty = {} self.notifs = {} self.ignore_installed = {} self.pkgs = {} self.optional = opts and opts.optional - self.names = {} if spec then self:parse(spec) end return self end +function Spec:__index(key) + if Spec[key] then + return Spec[key] + end + if key == "plugins" then + self.meta:rebuild() + return self.meta.plugins + end +end + function Spec:parse(spec) self:normalize(spec) - self:fix_disabled() + self.meta:fix() end -- PERF: optimized code to get package name without using lua patterns @@ -58,136 +62,22 @@ function Spec.get_name(pkg) return slash and name:sub(#name - slash + 2) or pkg:gsub("%W+", "_") end ----@param plugin LazyPlugin ----@param results? string[] -function Spec:add(plugin, results) - -- check if we already processed this spec. Can happen when a user uses the same instance of a spec in multiple specs - -- see https://github.com/folke/lazy.nvim/issues/45 - if rawget(plugin, "_") then - if results then - table.insert(results, plugin.name) - end - return plugin - end +---@param plugin LazyPluginSpec +function Spec:add(plugin) + self.meta:add(plugin) - local is_ref = plugin[1] and not plugin[1]:find("/", 1, true) - - if not plugin.url and not is_ref and plugin[1] then - local prefix = plugin[1]:sub(1, 4) - if prefix == "http" or prefix == "git@" then - plugin.url = plugin[1] - else - plugin.url = Config.options.git.url_format:format(plugin[1]) - end - end - - ---@type string? - local dir - - if plugin.dir then - dir = Util.norm(plugin.dir) - -- local plugin - plugin.name = plugin.name or Spec.get_name(plugin.dir) - elseif plugin.url then - if plugin.name then - self.names[plugin.url] = plugin.name - local name = Spec.get_name(plugin.url) - if name and self.plugins[name] then - self.plugins[name].name = plugin.name - self.plugins[plugin.name] = self.plugins[name] - self.plugins[name] = nil - end - else - plugin.name = self.names[plugin.url] or Spec.get_name(plugin.url) - end - -- check for dev plugins - if plugin.dev == nil then - for _, pattern in ipairs(Config.options.dev.patterns) do - if plugin.url:find(pattern, 1, true) then - plugin.dev = true - break - end - end - end - elseif is_ref then - plugin.name = plugin[1] - else - self:error("Invalid plugin spec " .. vim.inspect(plugin)) - return - end - - if not plugin.name or plugin.name == "" then - self:error("Plugin spec " .. vim.inspect(plugin) .. " has no name") - return - end - - -- dev plugins - if plugin.dev then - local dir_dev - if type(Config.options.dev.path) == "string" then - dir_dev = Config.options.dev.path .. "/" .. plugin.name - else - dir_dev = Util.norm(Config.options.dev.path(plugin)) - end - if not Config.options.dev.fallback or vim.fn.isdirectory(dir_dev) == 1 then - dir = dir_dev - end - elseif plugin.dev == false then - -- explicitly select the default path - dir = Config.options.root .. "/" .. plugin.name - end - - if type(plugin.config) == "table" then - self:warn( - "{" .. plugin.name .. "}: setting a table to `Plugin.config` is deprecated. Please use `Plugin.opts` instead" - ) - ---@diagnostic disable-next-line: assign-type-mismatch - plugin.opts = plugin.config - plugin.config = nil - end - - local fpid = M.fid_stack[#M.fid_stack] - - M.last_fid = M.last_fid + 1 - plugin._ = { - dir = dir, - fid = M.last_fid, - fpid = fpid, - dep = fpid ~= nil, - module = self.importing, - } - self.fragments[plugin._.fid] = plugin - -- remote plugin - plugin.dir = plugin._.dir or (plugin.name and (Config.options.root .. "/" .. plugin.name)) or nil - - if fpid then - local parent = self.fragments[fpid] - parent._.fdeps = parent._.fdeps or {} - table.insert(parent._.fdeps, plugin._.fid) - end - - if plugin.dependencies then - table.insert(M.fid_stack, plugin._.fid) - plugin.dependencies = self:normalize(plugin.dependencies, {}) - table.remove(M.fid_stack) - end + ---@diagnostic disable-next-line: cast-type-mismatch + ---@cast plugin LazyPlugin -- import the plugin's spec if Config.options.pkg.enabled and plugin.dir and not self.pkgs[plugin.dir] then self.pkgs[plugin.dir] = true local pkg = Pkg.get_spec(plugin) if pkg then - self:normalize(pkg, nil) + self:normalize(pkg) end end - if self.plugins[plugin.name] then - plugin = self:merge(self.plugins[plugin.name], plugin) - end - self.plugins[plugin.name] = plugin - if results then - table.insert(results, plugin.name) - end return plugin end @@ -199,166 +89,6 @@ function Spec:warn(msg) self:log(msg, vim.log.levels.WARN) end ---- Rebuilds a plugin spec excluding any removed fragments ----@param name? string -function Spec:rebuild(name) - if not name then - for n, _ in pairs(self.dirty) do - self:rebuild(n) - end - self.dirty = {} - end - local plugin = self.plugins[name] - if not plugin then - return - end - - local fragments = {} ---@type LazyPlugin[] - - repeat - local super = plugin._.super - if self.fragments[plugin._.fid] then - plugin._.dep = plugin._.fpid ~= nil - plugin._.super = nil - if plugin._.fdeps then - plugin.dependencies = {} - for _, cid in ipairs(plugin._.fdeps) do - if self.fragments[cid] then - table.insert(plugin.dependencies, self.fragments[cid].name) - end - end - end - setmetatable(plugin, nil) - table.insert(fragments, 1, plugin) - end - plugin = super - until not plugin - - if #fragments == 0 then - self.plugins[name] = nil - return - end - - plugin = fragments[1] - for i = 2, #fragments do - plugin = self:merge(plugin, fragments[i]) - end - self.plugins[name] = plugin -end - ---- Recursively removes all fragments from a plugin spec or a given fragment ----@param id string|number Plugin name or fragment id ----@param opts {self: boolean} -function Spec:remove_fragments(id, opts) - local fids = {} ---@type number[] - - if type(id) == "number" then - fids[1] = id - else - local plugin = self.plugins[id] - repeat - if plugin._.fpid then - local parent = self.fragments[plugin._.fpid] - if parent then - parent._.fdeps = vim.tbl_filter(function(fid) - return fid ~= plugin._.fid - end, parent._.fdeps) - self.dirty[parent.name] = true - end - end - fids[#fids + 1] = plugin._.fid - plugin = plugin._.super - until not plugin - end - - for _, fid in ipairs(fids) do - local fragment = self.fragments[fid] - if fragment then - for _, cid in ipairs(fragment._.fdeps or {}) do - self:remove_fragments(cid, { self = true }) - end - if opts.self then - self.fragments[fid] = nil - end - self.dirty[fragment.name] = true - end - end -end - -function Spec:fix_cond() - for _, plugin in pairs(self.plugins) do - local cond = plugin.cond - if cond == nil then - cond = Config.options.defaults.cond - end - if cond == false or (type(cond) == "function" and not cond(plugin)) then - plugin._.cond = false - local stack = { plugin } - while #stack > 0 do - local p = table.remove(stack) - if not self.ignore_installed[p.name] then - for _, dep in ipairs(p.dependencies or {}) do - table.insert(stack, self.plugins[dep]) - end - self.ignore_installed[p.name] = true - end - end - plugin.enabled = false - end - end -end - -function Spec:fix_optional() - if not self.optional then - ---@param plugin LazyPlugin - local function all_optional(plugin) - return (not plugin) or (rawget(plugin, "optional") and all_optional(plugin._.super)) - end - - -- handle optional plugins - for _, plugin in pairs(self.plugins) do - if plugin.optional and all_optional(plugin) then - -- remove all optional fragments - self:remove_fragments(plugin.name, { self = true }) - self.plugins[plugin.name] = nil - end - end - end -end - -function Spec:fix_disabled() - for _, plugin in pairs(self.plugins) do - if not plugin.name or not plugin.dir then - self:error("Plugin spec for **" .. plugin.name .. "** not found.\n```lua\n" .. vim.inspect(plugin) .. "\n```") - self.plugins[plugin.name] = nil - end - end - - self:fix_optional() - self:rebuild() - - self:fix_cond() - self:rebuild() - - self.dirty = {} - - for _, plugin in pairs(self.plugins) do - local disabled = plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled()) - if disabled then - plugin._.kind = "disabled" - -- remove all child fragments - self:remove_fragments(plugin.name, { self = false }) - self.plugins[plugin.name] = nil - self.disabled[plugin.name] = plugin - end - end - self:rebuild() - - -- check optional plugins again - self:fix_optional() - self:rebuild() -end - ---@param msg string ---@param level number function Spec:log(msg, level) @@ -378,25 +108,17 @@ function Spec:report(level) end ---@param spec LazySpec|LazySpecImport ----@param results? string[] -function Spec:normalize(spec, results) +function Spec:normalize(spec) if type(spec) == "string" then - if not spec:find("/", 1, true) then - -- spec is a plugin name - if results then - table.insert(results, spec) - end - else - self:add({ spec }, results) - end + self:add({ spec }) elseif #spec > 1 or Util.is_list(spec) then ---@cast spec LazySpec[] for _, s in ipairs(spec) do - self:normalize(s, results) + self:normalize(s) end elseif spec[1] or spec.dir or spec.url then - ---@cast spec LazyPlugin - local plugin = self:add(spec, results) + ---@cast spec LazyPluginSpec + local plugin = self:add(spec) ---@diagnostic disable-next-line: cast-type-mismatch ---@cast plugin LazySpecImport if plugin and plugin.import then @@ -408,7 +130,6 @@ function Spec:normalize(spec, results) else self:error("Invalid plugin spec " .. vim.inspect(spec)) end - return results end ---@param spec LazySpecImport @@ -492,41 +213,6 @@ function Spec:import(spec) end end ----@param old LazyPlugin ----@param new LazyPlugin ----@return LazyPlugin -function Spec:merge(old, new) - new._.dep = old._.dep and new._.dep - - if new.url and old.url and new.url ~= old.url then - self:warn("Two plugins with the same name and different url:\n" .. vim.inspect({ old = old, new = new })) - end - - if new.dependencies and old.dependencies then - Util.extend(new.dependencies, old.dependencies) - end - - local new_dir = new._.dir or old._.dir or (new.name and (Config.options.root .. "/" .. new.name)) or nil - if new_dir ~= old.dir then - local msg = "Plugin `" .. new.name .. "` changed `dir`:\n- from: `" .. old.dir .. "`\n- to: `" .. new_dir .. "`" - if new._.rtp_loaded or old._.rtp_loaded then - msg = msg - .. "\n\nThis plugin was already partially loaded, so we did not change it's `dir`.\nPlease fix your config." - self:error(msg) - new_dir = old.dir - else - self:warn(msg) - end - end - new.dir = new_dir - new._.rtp_loaded = new._.rtp_loaded or old._.rtp_loaded - - new._.super = old - setmetatable(new, { __index = old }) - - return new -end - function M.update_state() ---@type string[] local cloning = {} @@ -631,6 +317,7 @@ function M.load() Config.spec = Spec.new() local specs = { + ---@diagnostic disable-next-line: param-type-mismatch vim.deepcopy(Config.options.spec), } specs[#specs + 1] = M.find_local_spec() @@ -655,10 +342,10 @@ function M.load() for name, plugin in pairs(existing) do if Config.plugins[name] then local dep = Config.plugins[name]._.dep - local super = Config.plugins[name]._.super + local frags = Config.plugins[name]._.frags Config.plugins[name]._ = plugin._ Config.plugins[name]._.dep = dep - Config.plugins[name]._.super = super + Config.plugins[name]._.frags = frags end end Util.track() @@ -725,8 +412,9 @@ function M._values(root, plugin, prop, is_list) if not plugin[prop] then return {} end + local super = getmetatable(plugin) ---@type table - local ret = plugin._.super and M._values(root, plugin._.super, prop, is_list) or {} + local ret = super and M._values(root, super.__index, prop, is_list) or {} local values = rawget(plugin, prop) if not values then @@ -742,6 +430,7 @@ function M._values(root, plugin, prop, is_list) else ---@type {path:string[], list:any[]}[] local lists = {} + ---@diagnostic disable-next-line: no-unknown for _, key in ipairs(plugin[prop .. "_extend"] or {}) do local path = vim.split(key, ".", { plain = true }) local r = Util.key_get(ret, path) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index f72ab21..d4fa47c 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -93,7 +93,7 @@ function M.pretty_trace(opts) end ---@generic R ----@param fn fun():R +---@param fn fun():R? ---@param opts? string|{msg:string, on_error:fun(msg)} ---@return R function M.try(fn, opts) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 7b06f1d..6202de6 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -59,7 +59,6 @@ function M.check() else for _, plugin in pairs(spec.plugins) do M.check_valid(plugin) - M.check_override(plugin) end if #spec.notifs > 0 then error("Issues were reported when loading your specs:") @@ -88,23 +87,6 @@ function M.check_valid(plugin) end end ----@param plugin LazyPlugin -function M.check_override(plugin) - if not plugin._.super then - return - end - - local Handler = require("lazy.core.handler") - local skip = { "dependencies", "_", "opts", 1 } - vim.list_extend(skip, vim.tbl_values(Handler.types)) - - for key, value in pairs(plugin._.super) do - if not vim.tbl_contains(skip, key) and plugin[key] and plugin[key] ~= value then - warn("{" .. plugin.name .. "}: overriding <" .. key .. ">") - end - end -end - M.valid = { 1, "_", diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 831327e..dabfa58 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -2,30 +2,26 @@ ---@alias LazyPluginKind "normal"|"clean"|"disabled" ---@class LazyPluginState ----@field fid number id of the plugin spec fragment ----@field fpid? number parent id of the plugin spec fragment ----@field fdeps? number[] children ids of the fragment ----@field loaded? {[string]:string}|{time:number} ----@field installed? boolean ----@field tasks? LazyTask[] ----@field working? boolean ----@field dirty? boolean ----@field updated? {from:string, to:string} ----@field is_local? boolean ----@field updates? {from:GitInfo, to:GitInfo} ----@field cloned? boolean ----@field outdated? boolean ----@field kind? LazyPluginKind ----@field dep? boolean True if this plugin is only in the spec as a dependency ----@field cond? boolean ----@field super? LazyPlugin ----@field module? string ----@field dir? string Explicit dir or dev set for this plugin ----@field rtp_loaded? boolean ----@field handlers? LazyPluginHandlers ---@field cache? table<string,any> +---@field cloned? boolean +---@field cond? boolean +---@field dep? boolean True if this plugin is only in the spec as a dependency +---@field dir? string Explicit dir or dev set for this plugin +---@field dirty? boolean +---@field frags? number[] +---@field handlers? LazyPluginHandlers +---@field installed? boolean +---@field is_local? boolean +---@field kind? LazyPluginKind +---@field loaded? {[string]:string}|{time:number} +---@field outdated? boolean ---@field rocks? LazyRock[] ---@field rocks_installed? boolean +---@field rtp_loaded? boolean +---@field tasks? LazyTask[] +---@field updated? {from:string, to:string} +---@field updates? {from:GitInfo, to:GitInfo} +---@field working? boolean ---@alias PluginOpts table|fun(self:LazyPlugin, opts:table):table? @@ -66,6 +62,7 @@ ---@class LazyPlugin: LazyPluginBase,LazyPluginHandlers,LazyPluginHooks,LazyPluginRef ---@field dependencies? string[] +---@field specs? string|string[]|LazyPluginSpec[] ---@field _ LazyPluginState ---@class LazyPluginSpecHandlers @@ -77,6 +74,7 @@ ---@class LazyPluginSpec: LazyPluginBase,LazyPluginSpecHandlers,LazyPluginHooks,LazyPluginRef ---@field dependencies? string|string[]|LazyPluginSpec[] +---@field specs? string|string[]|LazyPluginSpec[] ---@alias LazySpec string|LazyPluginSpec|LazySpecImport|LazySpec[] @@ -85,3 +83,14 @@ ---@field name? string ---@field enabled? boolean|(fun():boolean) ---@field cond? boolean|(fun():boolean) + +---@class LazyFragment +---@field id number +---@field pid? number +---@field deps? number[] +---@field frags? number[] +---@field dep? boolean +---@field name string +---@field url? string +---@field dir? string +---@field spec LazyPlugin diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 548b5f5..4a09bb9 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -6,6 +6,10 @@ local assert = require("luassert") Config.setup() +local function inspect(obj) + return vim.inspect(obj):gsub("%s+", " ") +end + ---@param plugins LazyPlugin[]|LazyPlugin local function clean(plugins) local p = plugins @@ -14,6 +18,7 @@ local function clean(plugins) plugin._.fid = nil plugin._.fpid = nil plugin._.fdeps = nil + plugin._.frags = nil if plugin._.dep == false then plugin._.dep = nil end @@ -28,7 +33,7 @@ describe("plugin spec url/name", function() { { "foo/bar" }, { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } }, { { "https://foo.bar" }, { [1] = "https://foo.bar", name = "foo.bar", url = "https://foo.bar" } }, { { "foo/bar", name = "foobar" }, { [1] = "foo/bar", name = "foobar", url = "https://github.com/foo/bar.git" } }, - { { "foo/bar", url = "123" }, { [1] = "foo/bar", name = "123", url = "123" } }, + { { "foo/bar", url = "123" }, { [1] = "foo/bar", name = "bar", url = "123" } }, { { url = "https://foobar" }, { name = "foobar", url = "https://foobar" } }, { { { url = "https://foo", name = "foobar" }, { url = "https://foo" } }, @@ -45,18 +50,22 @@ describe("plugin spec url/name", function() for _, test in ipairs(tests) do test[2]._ = {} - it("parses " .. vim.inspect(test[1]):gsub("%s+", " "), function() + it("parses " .. inspect(test[1]), function() if not test[2].dir then test[2].dir = Config.options.root .. "/" .. test[2].name end local spec = Plugin.Spec.new(test[1]) - local plugins = vim.tbl_values(spec.plugins) - plugins[1]._ = {} + local all = vim.deepcopy(spec.plugins) + local plugins = vim.tbl_values(all) + plugins = vim.tbl_map(function(plugin) + plugin._ = {} + return plugin + end, plugins) local notifs = vim.tbl_filter(function(notif) return notif.level > 3 end, spec.notifs) assert(#notifs == 0, vim.inspect(spec.notifs)) - assert.equal(1, #plugins) + assert.equal(1, #plugins, vim.inspect(all)) plugins[1]._.super = nil assert.same(test[2], plugins[1]) end) @@ -90,7 +99,40 @@ describe("plugin spec dir", function() for _, test in ipairs(tests) do local dir = vim.fn.expand(test[1]) local input = vim.list_slice(test, 2) - it("parses dir " .. vim.inspect(input):gsub("%s+", " "), function() + it("parses dir " .. inspect(input), function() + local spec = Plugin.Spec.new(input) + local plugins = vim.tbl_values(spec.plugins) + assert(spec:report() == 0) + assert.equal(1, #plugins) + assert.same(dir, plugins[1].dir) + end) + end +end) + +describe("plugin dev", function() + local tests = { + { + { "lewis6991/gitsigns.nvim", opts = {}, dev = true }, + { "lewis6991/gitsigns.nvim" }, + }, + { + { "lewis6991/gitsigns.nvim", opts = {}, dev = true }, + { "gitsigns.nvim" }, + }, + { + { "lewis6991/gitsigns.nvim", opts = {} }, + { "lewis6991/gitsigns.nvim", dev = true }, + }, + { + { "lewis6991/gitsigns.nvim", opts = {} }, + { "gitsigns.nvim", dev = true }, + }, + } + + for _, test in ipairs(tests) do + local dir = vim.fn.expand("~/projects/gitsigns.nvim") + local input = test + it("parses dir " .. inspect(input), function() local spec = Plugin.Spec.new(input) local plugins = vim.tbl_values(spec.plugins) assert(spec:report() == 0) @@ -126,7 +168,7 @@ describe("plugin spec opt", function() for _, plugin in pairs(spec.plugins) do plugin.dir = nil end - assert.same(clean(spec.plugins), { + assert.same({ bar = { "foo/bar", _ = {}, @@ -150,7 +192,7 @@ describe("plugin spec opt", function() name = "dep2", url = "https://github.com/foo/dep2.git", }, - }) + }, clean(spec.plugins)) end end) @@ -369,45 +411,45 @@ describe("plugin spec opt", function() end) describe("plugin opts", function() - it("correctly parses opts", function() - ---@type {spec:LazySpec, opts:table}[] - local tests = { - { - spec = { { "foo/foo", opts = { a = 1, b = 1 } }, { "foo/foo", opts = { a = 2 } } }, - opts = { a = 2, b = 1 }, - }, - { - spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", opts = { a = 2 } } }, - opts = { a = 2, b = 1 }, - }, - { - spec = { { "foo/foo", opts = { a = 1, b = 1 } }, { "foo/foo", config = { a = 2 } } }, - opts = { a = 2, b = 1 }, - }, - { - spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", config = { a = 2 } } }, - opts = { a = 2, b = 1 }, - }, - { - spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", config = { a = vim.NIL } } }, - opts = { b = 1 }, - }, - { - spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo" } }, - opts = { a = 1, b = 1 }, - }, - { - spec = { { "foo/foo" }, { "foo/foo" } }, - opts = {}, - }, - } + ---@type {spec:LazySpec, opts:table}[] + local tests = { + { + spec = { { "foo/foo", opts = { a = 1, b = 1 } }, { "foo/foo", opts = { a = 2 } } }, + opts = { a = 2, b = 1 }, + }, + { + spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", opts = { a = 2 } } }, + opts = { a = 2, b = 1 }, + }, + { + spec = { { "foo/foo", opts = { a = 1, b = 1 } }, { "foo/foo", config = { a = 2 } } }, + opts = { a = 2, b = 1 }, + }, + { + spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", config = { a = 2 } } }, + opts = { a = 2, b = 1 }, + }, + { + spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", config = { a = vim.NIL } } }, + opts = { b = 1 }, + }, + { + spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo" } }, + opts = { a = 1, b = 1 }, + }, + { + spec = { { "foo/foo" }, { "foo/foo" } }, + opts = {}, + }, + } - for _, test in ipairs(tests) do + for _, test in ipairs(tests) do + it("correctly parses opts for " .. inspect(test.spec), function() local spec = Plugin.Spec.new(test.spec) assert(spec.plugins.foo) assert.same(test.opts, Plugin.values(spec.plugins.foo, "opts")) - end - end) + end) + end end) describe("plugin spec", function() diff --git a/tests/handlers/keys_spec.lua b/tests/handlers/keys_spec.lua index 6254db8..d6a9df4 100644 --- a/tests/handlers/keys_spec.lua +++ b/tests/handlers/keys_spec.lua @@ -1,3 +1,4 @@ +---@module 'luassert' local Keys = require("lazy.core.handler.keys") describe("keys", function() From c1912e23481ba72a8d8f7a5c736f5e2547e6853e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 22 Jun 2024 22:18:47 +0200 Subject: [PATCH 1318/1610] feat(pkg): import package specs in the scope of the plugin --- lua/lazy/pkg/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index f09afbc..9858ad7 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -86,7 +86,11 @@ end function M.get_spec(plugin) local pkg = M.get(plugin) local spec = pkg and pkg.spec - return spec and type(spec) == "table" and vim.deepcopy(spec) or spec + if not spec then + return + end + spec = type(spec) == "table" and vim.deepcopy(spec) or spec + return { plugin.name, specs = spec } end return M From d2bea9eefd1d99d3bfeebd0c848fa62488ef0461 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 22 Jun 2024 22:30:20 +0200 Subject: [PATCH 1319/1610] docs: added doc comments --- lua/lazy/core/fragments.lua | 7 +++++++ lua/lazy/core/meta.lua | 22 +++++++++++++++++++++- lua/lazy/core/plugin.lua | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/fragments.lua b/lua/lazy/core/fragments.lua index 7096f55..1ca018c 100644 --- a/lua/lazy/core/fragments.lua +++ b/lua/lazy/core/fragments.lua @@ -9,6 +9,9 @@ local function next_id() return M._fid end +--- This class is used to manage the fragments of a plugin spec. +--- It keeps track of the fragments and their relations to other fragments. +--- A fragment can be a dependency (dependencies) or a child (specs) of another fragment. ---@class LazyFragments ---@field fragments table<number, LazyFragment> ---@field frag_stack number[] @@ -34,6 +37,8 @@ function F:get(id) return self.fragments[id] end +--- Remove a fragment and all its children. +--- This will also remove the fragment from its parent's children list. ---@param id number function F:del(id) -- del fragment @@ -73,6 +78,8 @@ function F:del(id) self.fragments[id] = nil end +--- Add a fragment to the fragments list. +--- This also resolves its name, url, dir, dependencies and child specs. ---@param plugin LazyPluginSpec function F:add(plugin) local id = next_id() diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 9c40238..35006d7 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -1,6 +1,8 @@ local Config = require("lazy.core.config") local Util = require("lazy.core.util") +--- This class is used to manage the plugins. +--- A plugin is a collection of fragments that are related to each other. ---@class LazyMeta ---@field plugins table<string, LazyPlugin> ---@field str_to_meta table<string, LazyPlugin> @@ -23,6 +25,7 @@ function M.new(spec) return self end +--- Remove a plugin and all its fragments. ---@param name string function M:del(name) local meta = self.plugins[name] @@ -35,6 +38,9 @@ function M:del(name) self.plugins[name] = nil end +--- Add a fragment to a plugin. +--- This will create a new plugin if it does not exist. +--- It also keeps track of renames. ---@param plugin LazyPluginSpec function M:add(plugin) local fragment = self.fragments:add(plugin) @@ -73,6 +79,8 @@ function M:add(plugin) self.dirty[meta.name] = true end +--- Rebuild all plugins based on dirty fragments, +--- or dirty plugins. Will remove plugins that no longer have fragments. function M:rebuild() for fid in pairs(self.fragments.dirty) do local meta = self.frag_to_meta[fid] @@ -101,6 +109,9 @@ function M:rebuild() end end +--- Rebuild a single plugin. +--- This will resolve the plugin based on its fragments using metatables. +--- This also resolves dependencies, dep, optional, dir, dev, and url. ---@param name string function M:_rebuild(name) local plugin = self.plugins[name] @@ -161,18 +172,23 @@ function M:_rebuild(name) plugin.dir = plugin.dir or Config.options.root .. "/" .. plugin.name end + -- dependencies if #plugin.dependencies == 0 and not super.dependencies then plugin.dependencies = nil end + + -- optional if not plugin.optional and not super.optional then plugin.optional = nil end + setmetatable(plugin, { __index = super }) self.dirty[plugin.name] = nil return plugin end +--- Disable a plugin. ---@param plugin LazyPlugin function M:disable(plugin) plugin._.kind = "disabled" @@ -180,6 +196,7 @@ function M:disable(plugin) self.spec.disabled[plugin.name] = plugin end +--- Check if a plugin should be disabled, but ignore uninstalling it. function M:fix_cond() for _, plugin in pairs(self.plugins) do local cond = plugin.cond @@ -203,6 +220,7 @@ function M:fix_cond() end end +--- Removes plugins for which all its fragments are optional. function M:fix_optional() if self.spec.optional then return 0 @@ -218,6 +236,7 @@ function M:fix_optional() return changes end +--- Removes plugins that are disabled. function M:fix_disabled() local changes = 0 for _, plugin in pairs(self.plugins) do @@ -230,7 +249,8 @@ function M:fix_disabled() return changes end -function M:fix() +--- Resolve all plugins, based on cond, enabled and optional. +function M:resolve() Util.track("resolve plugins") self:rebuild() diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 6aec6f1..355d3d5 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -50,7 +50,7 @@ end function Spec:parse(spec) self:normalize(spec) - self.meta:fix() + self.meta:resolve() end -- PERF: optimized code to get package name without using lua patterns From 05e31ad0593063823f99d4d8145bca7893b37bed Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 23 Jun 2024 10:28:51 +0200 Subject: [PATCH 1320/1610] docs: added comment on package source order --- lua/lazy/core/config.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index db79250..46fbfd5 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -35,6 +35,7 @@ M.defaults = { enabled = true, 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. sources = { "lazy", "rockspec", From ee2ca39f672a2d6f4cbb683b525e6b3d91f3fc0c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 23 Jun 2024 17:48:10 +0200 Subject: [PATCH 1321/1610] feat(meta): check for dir changes for plugins already added to the rtp --- lua/lazy/core/meta.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 35006d7..0deeb89 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -66,6 +66,17 @@ function M:add(plugin) table.insert(meta._.frags, fragment.id) + if meta._ and meta._.rtp_loaded then + local old_dir = meta.dir + self:_rebuild(meta.name) + local new_dir = meta.dir + if old_dir ~= new_dir then + local msg = "Plugin `" .. meta.name .. "` changed `dir`:\n- from: `" .. old_dir .. "`\n- to: `" .. new_dir .. "`" + msg = msg .. "\n\nThis plugin was already partially loaded, so things may break.\nPlease fix your config." + self.spec:error(msg) + end + end + if plugin.name then -- handle renames if meta.name ~= plugin.name then From 4326d4b487d4facc19b375ca30cd633cf56d88ed Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 23 Jun 2024 17:49:19 +0200 Subject: [PATCH 1322/1610] fix(pkg): correctly pre-load package specs and remove them when needed during resolve --- lua/lazy/core/meta.lua | 42 +++++++++++++++++++++++++++++++++++++++ lua/lazy/core/plugin.lua | 33 ++++++------------------------ lua/lazy/pkg/init.lua | 21 ++++++++++++++++++++ lua/lazy/pkg/rockspec.lua | 25 +++++++++++++---------- lua/lazy/types.lua | 1 + selene.toml | 3 +++ 6 files changed, 87 insertions(+), 38 deletions(-) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 0deeb89..533ec27 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -1,4 +1,5 @@ local Config = require("lazy.core.config") +local Pkg = require("lazy.pkg") local Util = require("lazy.core.util") --- This class is used to manage the plugins. @@ -10,6 +11,7 @@ local Util = require("lazy.core.util") ---@field dirty table<string, boolean> ---@field spec LazySpecLoader ---@field fragments LazyFragments +---@field pkgs table<string, number> local M = {} ---@param spec LazySpecLoader @@ -22,9 +24,30 @@ function M.new(spec) self.frag_to_meta = {} self.str_to_meta = {} self.dirty = {} + self.pkgs = {} return self end +-- import package specs +function M:load_pkgs() + if not Config.options.pkg.enabled then + return + end + local specs = Pkg.spec() + for dir, spec in pairs(specs) do + local meta, fragment = self:add(spec) + if meta and fragment then + -- tag all package fragments as optional + for _, fid in ipairs(meta._.frags) do + local frag = self.fragments:get(fid) + frag.spec.optional = true + end + -- keep track of the top-level package fragment + self.pkgs[dir] = fragment.id + end + end +end + --- Remove a plugin and all its fragments. ---@param name string function M:del(name) @@ -88,6 +111,7 @@ function M:add(plugin) self.plugins[meta.name] = meta self.frag_to_meta[fragment.id] = meta self.dirty[meta.name] = true + return meta, fragment end --- Rebuild all plugins based on dirty fragments, @@ -101,6 +125,7 @@ function M:rebuild() self.dirty[meta.name] = true else -- fragment was deleted, so remove it from plugin + self.frag_to_meta[fid] = nil ---@param f number meta._.frags = vim.tbl_filter(function(f) return f ~= fid @@ -260,11 +285,28 @@ function M:fix_disabled() return changes end +--- Removes package fragments for plugins that no longer use the same directory. +function M:fix_pkgs() + for dir, fid in pairs(self.pkgs) do + local plugin = self.frag_to_meta[fid] + plugin = plugin and self.plugins[plugin.name] + if plugin then + -- check if plugin is still in the same directory + if plugin.dir ~= dir then + self.fragments:del(fid) + end + end + end + self:rebuild() +end + --- Resolve all plugins, based on cond, enabled and optional. function M:resolve() Util.track("resolve plugins") self:rebuild() + self:fix_pkgs() + self:fix_cond() -- selene: allow(empty_loop) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 355d3d5..713e54c 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,6 +1,5 @@ local Config = require("lazy.core.config") local Meta = require("lazy.core.meta") -local Pkg = require("lazy.pkg") local Util = require("lazy.core.util") ---@class LazyCorePlugin @@ -16,7 +15,6 @@ M.loading = false ---@field notifs {msg:string, level:number, file?:string}[] ---@field importing? string ---@field optional? boolean ----@field pkgs table<string, boolean> local Spec = {} M.Spec = Spec M.LOCAL_SPEC = ".lazy.lua" @@ -30,8 +28,8 @@ function Spec.new(spec, opts) self.modules = {} self.notifs = {} self.ignore_installed = {} - self.pkgs = {} self.optional = opts and opts.optional + self.meta:load_pkgs() if spec then self:parse(spec) end @@ -62,25 +60,6 @@ function Spec.get_name(pkg) return slash and name:sub(#name - slash + 2) or pkg:gsub("%W+", "_") end ----@param plugin LazyPluginSpec -function Spec:add(plugin) - self.meta:add(plugin) - - ---@diagnostic disable-next-line: cast-type-mismatch - ---@cast plugin LazyPlugin - - -- import the plugin's spec - if Config.options.pkg.enabled and plugin.dir and not self.pkgs[plugin.dir] then - self.pkgs[plugin.dir] = true - local pkg = Pkg.get_spec(plugin) - if pkg then - self:normalize(pkg) - end - end - - return plugin -end - function Spec:error(msg) self:log(msg, vim.log.levels.ERROR) end @@ -110,7 +89,7 @@ end ---@param spec LazySpec|LazySpecImport function Spec:normalize(spec) if type(spec) == "string" then - self:add({ spec }) + self.meta:add({ spec }) elseif #spec > 1 or Util.is_list(spec) then ---@cast spec LazySpec[] for _, s in ipairs(spec) do @@ -118,11 +97,11 @@ function Spec:normalize(spec) end elseif spec[1] or spec.dir or spec.url then ---@cast spec LazyPluginSpec - local plugin = self:add(spec) + self.meta:add(spec) ---@diagnostic disable-next-line: cast-type-mismatch - ---@cast plugin LazySpecImport - if plugin and plugin.import then - self:import(plugin) + ---@cast spec LazySpecImport + if spec and spec.import then + self:import(spec) end elseif spec.import then ---@cast spec LazySpecImport diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index 9858ad7..bee9b42 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -7,6 +7,7 @@ local M = {} ---@class LazyPkg ---@field source string +---@field name string ---@field file string ---@field spec? LazySpec ---@field chunk? string|fun():LazySpec @@ -30,6 +31,7 @@ function M.update() for _, source in ipairs(sources) do local spec = source.get(plugin) if spec then + spec.name = plugin.name if type(spec.chunk) == "function" then spec.chunk = string.dump(spec.chunk) end @@ -81,6 +83,25 @@ function M.get(plugin) return ret end +function M.spec() + if not M.cache then + _load() + end + ---@type table<string,LazyPluginSpec> + local ret = {} + + for dir in pairs(M.cache) do + local pkg = M.get({ dir = dir }) + local spec = pkg and pkg.spec + if pkg and spec then + spec = type(spec) == "table" and vim.deepcopy(spec) or spec + ret[dir] = { pkg.name, specs = spec } + end + end + + return ret +end + ---@param plugin LazyPlugin ---@return LazySpec? function M.get_spec(plugin) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 7a0c752..5732fbf 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -29,24 +29,27 @@ function M.get(plugin) end ---@type RockSpec? + ---@diagnostic disable-next-line: missing-fields local rockspec = {} - local ret, err = loadfile(rockspec_file, "t", rockspec) - if not ret then + local load, err = loadfile(rockspec_file, "t", rockspec) + if not load then error(err) end - ret() - return rockspec - and rockspec.package + load() + + ---@param dep string + local rocks = vim.tbl_filter(function(dep) + local name = dep:gsub("%s.*", "") + return not vim.tbl_contains(M.skip, name) + end, rockspec and rockspec.dependencies or {}) + + return #rocks > 0 and { source = "rockspec", file = rockspec_file, spec = { - dir = plugin.dir, - url = plugin.url, - rocks = vim.tbl_filter(function(dep) - local name = dep:gsub("%s.*", "") - return not vim.tbl_contains(M.skip, name) - end, rockspec.dependencies), + plugin.name, + rocks = rocks, }, } or nil diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index dabfa58..cbff124 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -86,6 +86,7 @@ ---@class LazyFragment ---@field id number +---@field pkg? boolean ---@field pid? number ---@field deps? number[] ---@field frags? number[] diff --git a/selene.toml b/selene.toml index 7312a91..5867a2a 100644 --- a/selene.toml +++ b/selene.toml @@ -1 +1,4 @@ std="vim" + +[lints] +mixed_table="allow" From 183f59e2e85dea0c38ed7d16c7c7e543c0b739c7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 23 Jun 2024 21:07:44 +0200 Subject: [PATCH 1323/1610] feat!: new docs for v11.0 --- .github/workflows/ci.yml | 21 - README.md | 845 ++--------------------------- doc/.keep | 0 doc/lazy.nvim.txt | 1101 ++++++++++++++++++++++---------------- lua/lazy/core/config.lua | 7 +- 5 files changed, 674 insertions(+), 1300 deletions(-) create mode 100644 doc/.keep diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c7d3156..05b9111 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,31 +26,10 @@ jobs: nvim --version [ ! -d tests ] && exit 0 nvim --headless -u tests/init.lua -c "PlenaryBustedDirectory tests/ {minimal_init = 'tests/init.lua', sequential = true}" - docs: - runs-on: ubuntu-latest - needs: tests - if: ${{ github.ref == 'refs/heads/main' }} - steps: - - uses: actions/checkout@v4 - - name: panvimdoc - uses: kdheepak/panvimdoc@main - with: - vimdoc: lazy.nvim - version: "Neovim >= 0.8.0" - demojify: true - treesitter: true - - name: Push changes - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: "chore(build): auto-generate vimdoc" - commit_user_name: "github-actions[bot]" - commit_user_email: "github-actions[bot]@users.noreply.github.com" - commit_author: "github-actions[bot] <github-actions[bot]@users.noreply.github.com>" release: name: release if: ${{ github.ref == 'refs/heads/main' }} needs: - - docs - tests runs-on: ubuntu-latest steps: diff --git a/README.md b/README.md index 9bde4f9..a950b94 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,36 @@ -# 💤 lazy.nvim +<h4 align="center"> + <a href="https://lazy.folke.io/installation">Install</a> + · + <a href="https://lazy.folke.io/configuration">Configure</a> + · + <a href="https://lazy.folke.io">Docs</a> +</h4> + +<div align="center"><p> + <a href="https://github.com/folke/lazy.nvim/releases/latest"> + <img alt="Latest release" src="https://img.shields.io/github/v/release/folke/lazy.nvim?style=for-the-badge&logo=starship&color=C9CBFF&logoColor=D9E0EE&labelColor=302D41&include_prerelease&sort=semver" /> + </a> + <a href="https://github.com/folke/lazy.nvim/pulse"> + <img alt="Last commit" src="https://img.shields.io/github/last-commit/folke/lazy.nvim?style=for-the-badge&logo=starship&color=8bd5ca&logoColor=D9E0EE&labelColor=302D41"/> + </a> + <a href="https://github.com/folke/lazy.nvim/blob/main/LICENSE"> + <img alt="License" src="https://img.shields.io/github/license/folke/lazy.nvim?style=for-the-badge&logo=starship&color=ee999f&logoColor=D9E0EE&labelColor=302D41" /> + </a> + <a href="https://github.com/folke/lazy.nvim/stargazers"> + <img alt="Stars" src="https://img.shields.io/github/stars/folke/lazy.nvim?style=for-the-badge&logo=starship&color=c69ff5&logoColor=D9E0EE&labelColor=302D41" /> + </a> + <a href="https://github.com/folke/lazy.nvim/issues"> + <img alt="Issues" src="https://img.shields.io/github/issues/folke/lazy.nvim?style=for-the-badge&logo=bilibili&color=F5E0DC&logoColor=D9E0EE&labelColor=302D41" /> + </a> + <a href="https://github.com/folke/lazy.nvim"> + <img alt="Repo Size" src="https://img.shields.io/github/repo-size/folke/lazy.nvim?color=%23DDB6F2&label=SIZE&logo=codesandbox&style=for-the-badge&logoColor=D9E0EE&labelColor=302D41" /> + </a> + <a href="https://twitter.com/intent/follow?screen_name=folke"> + <img alt="follow on Twitter" src="https://img.shields.io/twitter/follow/folke?style=for-the-badge&logo=twitter&color=8aadf3&logoColor=D9E0EE&labelColor=302D41" /> + </a> +</div> + + **lazy.nvim** is a modern plugin manager for Neovim. @@ -30,813 +62,6 @@ - Git >= **2.19.0** (for partial clones support) - a [Nerd Font](https://www.nerdfonts.com/) **_(optional)_** -## 📦 Installation +## 🚀 Getting Started -You can add the following Lua code to your `init.lua` to bootstrap **lazy.nvim**: - -<!-- bootstrap:start --> - -```lua -local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" -if not (vim.uv or vim.loop).fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "https://github.com/folke/lazy.nvim.git", - "--branch=stable", -- latest stable release - lazypath, - }) -end -vim.opt.rtp:prepend(lazypath) -``` - -<!-- bootstrap:end --> - -Next step is to add **lazy.nvim** below the code added in the prior step in `init.lua`: - -```lua -require("lazy").setup(plugins, opts) -``` - -- **plugins**: this should be a `table` or a `string` - - `table`: a list with your [Plugin Spec](#-plugin-spec) - - `string`: a Lua module name that contains your [Plugin Spec](#-plugin-spec). See [Structuring Your Plugins](#-structuring-your-plugins) -- **opts**: see [Configuration](#%EF%B8%8F-configuration) **_(optional)_** - -```lua --- Example using a list of specs with the default options -vim.g.mapleader = " " -- Make sure to set `mapleader` before lazy so your mappings are correct -vim.g.maplocalleader = "\\" -- Same for `maplocalleader` - -require("lazy").setup({ - "folke/which-key.nvim", - { "folke/neoconf.nvim", cmd = "Neoconf" }, - "folke/neodev.nvim", -}) -``` - -ℹ️ It is recommended to run `:checkhealth lazy` after installation. - -## 🔌 Plugin Spec - -| Property | Type | Description | -| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **[1]** | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **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` | -| **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 | -| **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 `fun(LazyPlugin):boolean` | When `false`, or if the `function` returns false, then this plugin will not be loaded. Useful to disable some plugins in vscode, or firenvim for example. | -| **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. | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **opts** | `table` or `fun(LazyPlugin, opts:table)` | `opts` should be a table (will be merged with parent 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)` or `true` | `config` is executed when the plugin loads. The default 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**. See also `opts`. To use the default implementation without `opts` set `config` to `true`. | -| **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 a list of build commands | `build` is executed when a plugin is installed or updated. Before running `build`, a plugin is first loaded. If it's a string it will be run as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands. Some plugins provide their own `build.lua` which is automatically used by lazy. So no need to specify a build step for those plugins. | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` or `false` to override the default | Version to use from the repository. Full [Semver](https://devhints.io/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` | -| **event** | `string?` or `string[]` or `fun(self:LazyPlugin, event:string[]):string[]` or `{event:string[]\|string, pattern?:string[]\|string}` | Lazy-load on event. Events can be specified as `BufEnter` or with a pattern like `BufEnter *.lua` | -| **cmd** | `string?` or `string[]` or `fun(self:LazyPlugin, cmd:string[]):string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` or `fun(self:LazyPlugin, ft:string[]):string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeysSpec[]` or `fun(self:LazyPlugin, keys:string[]):(string \| LazyKeysSpec)[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | -| **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. | -| **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 | - -### Lazy Loading - -**lazy.nvim** automagically lazy-loads Lua modules, so it is not needed to -specify `module=...` everywhere in your plugin specification. 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. - -If you don't want this behavior for a certain plugin, you can specify that with `module=false`. -You can then manually load the plugin with `:Lazy load foobar.nvim`. - -You can configure **lazy.nvim** to lazy-load all plugins by default with `config.defaults.lazy = true`. - -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`. - -> **NOTE:** since **start** plugins can possibly change existing highlight groups, -> it's important to make sure that your main **colorscheme** is loaded first. -> To ensure this you can use the `priority=1000` field. **_(see the examples)_** - -#### ⌨️ 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, -} -``` - -### Versioning - -If you want to install a specific revision of a plugin, you can use `commit`, -`tag`, `branch`, `version`. - -The `version` property supports [Semver](https://semver.org/) ranges. - -<details> -<summary>Click to see some examples</summary> - -- `*`: 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 - -</details> - -You can set `config.defaults.version = "*"` to install the latest stable -version of plugins that support Semver. - -### Examples - -<!-- spec:start --> - -```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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 }, -} -``` - -<!-- spec:end --> - -## ⚙️ Configuration - -**lazy.nvim** comes with the following defaults: - -<!-- config:start --> - -```lua -{ - root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed - defaults = { - lazy = false, -- should plugins be lazy-loaded? - version = nil, - -- 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 - -- version = "*", -- enable this to try installing the latest stable versions of plugins - }, - -- 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, - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - event = " ", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont have docs - skip_if_doc_exists = true, - }, - state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things - build = { - -- Plugins can provide a `build.lua` file that will be executed when the plugin is installed - -- or updated. When the plugin spec also has a `build` command, the plugin's `build.lua` not be - -- executed. In this case, a warning message will be shown. - warn_on_override = true, - }, - -- 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, - }, -} -``` - -<!-- config:end --> - -<details> -<summary>If you don't want to use a Nerd Font, you can replace the icons with Unicode symbols.</summary> - -```lua -{ - ui = { - icons = { - cmd = "⌘", - config = "🛠", - event = "📅", - ft = "📂", - init = "⚙", - keys = "🗝", - plugin = "🔌", - runtime = "💻", - require = "🌙", - source = "📄", - start = "🚀", - task = "📌", - lazy = "💤 ", - }, - }, -} -``` - -</details> - -## 🚀 Usage - -Plugins are managed with the `:Lazy` command. -Open the help with `<?>` to see all the key mappings. - -You can press `<CR>` on a plugin to show its details. Most properties -can be hovered with `<K>` 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: - -<!-- commands:start --> - -| 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 | - -<!-- commands:end --> - -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()`): - -<!-- stats:start --> - -```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<string, number> - times = {}, -} -``` - -<!-- stats:end --> - -**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. - -<details> -<summary>Example of configuring <a href="https://github.com/nvim-lualine/lualine.nvim">lualine.nvim</a></summary> - -```lua -require("lualine").setup({ - sections = { - lualine_x = { - { - require("lazy.status").updates, - cond = require("lazy.status").has_updates, - color = { fg = "#ff9e64" }, - }, - }, - }, -}) - -``` - -</details> - -### 📆 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. - -## 🔒 Lockfile `lazy-lock.json` - -After every **update**, the local lockfile 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. - -## ⚡ Performance - -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](https://github.com/lewis6991/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. - -![image](https://user-images.githubusercontent.com/292349/208301766-5c400561-83c3-4811-9667-1ec4bb3c43b8.png) - -## 🐛 Debug - -See an overview of active lazy-loading handlers and what's in the module cache. - -![image](https://user-images.githubusercontent.com/292349/208301790-7eedbfa5-d202-4e70-852e-de68aa47233b.png) - -## ▶️ 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](https://neovim.io/doc/user/starting.html#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. - -## 📂 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](https://github.com/LazyVim/LazyVim) and more specifically: - -- [lazyvim.plugins](https://github.com/LazyVim/LazyVim/tree/main/lua/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. - -## 📦 Migration Guide - -### [packer.nvim](https://github.com/wbthomason/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 [different](#%EF%B8%8F-lazy-key-mappings) -- `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](https://github.com/savq/paq-nvim) - -- `as` ➡️ `name` -- `opt` ➡️ `lazy` -- `run` ➡️ `build` - -## ❌ 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. - -## 🌈 Highlight Groups - -<details> -<summary>Click to see all highlight groups</summary> - -<!-- colors:start --> - -| Highlight Group | Default Group | Description | -| --------------------- | -------------------------- | --------------------------------------------------- | -| **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 | -| **LazyH1** | **_IncSearch_** | home button | -| **LazyH2** | **_Bold_** | titles | -| **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_** | | -| **LazyTaskError** | **_ErrorMsg_** | task errors | -| **LazyTaskOutput** | **_MsgArea_** | task output | -| **LazyUrl** | **_@markup.link_** | url | -| **LazyValue** | **_@string_** | value of a property | - -<!-- colors:end --> - -</details> - -## 📚 Plugin Authors - -If your plugin needs a build step, you can create a file `build.lua` or `build/init.lua` -in the root of your repo. This file will be loaded when the plugin is installed or updated. - -This makes it easier for users, as they no longer need to specify a `build` command. - -## 📦 Other Neovim Plugin Managers in Lua - -- [pckr.nvim](https://github.com/lewis6991/pckr.nvim) -- [packer.nvim](https://github.com/wbthomason/packer.nvim) -- [paq-nvim](https://github.com/savq/paq-nvim) -- [neopm](https://github.com/ii14/neopm) -- [dep](https://github.com/chiyadev/dep) -- [optpack.nvim](https://github.com/notomo/optpack.nvim) -- [pact.nvim](https://github.com/rktjmp/pact.nvim) +Check the [documentation website](https://lazy.folke.io/) for more information. \ No newline at end of file diff --git a/doc/.keep b/doc/.keep new file mode 100644 index 0000000..e69de29 diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 876ea0a..14d4a16 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,307 +1,324 @@ -*lazy.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 23 +*lazy.nvim.txt* A modern plugin manager for Neovim ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -1. lazy.nvim |lazy.nvim-lazy.nvim| - - Features |lazy.nvim-lazy.nvim-features| - - Requirements |lazy.nvim-lazy.nvim-requirements| - - Installation |lazy.nvim-lazy.nvim-installation| - - Plugin Spec |lazy.nvim-lazy.nvim-plugin-spec| - - Configuration |lazy.nvim-lazy.nvim-configuration| - - Usage |lazy.nvim-lazy.nvim-usage| - - Lockfile lazy-lock.json |lazy.nvim-lazy.nvim-lockfile-lazy-lock.json| - - Performance |lazy.nvim-lazy.nvim-performance| - - Debug |lazy.nvim-lazy.nvim-debug| - - Startup Sequence |lazy.nvim-lazy.nvim-startup-sequence| - - Structuring Your Plugins |lazy.nvim-lazy.nvim-structuring-your-plugins| - - Migration Guide |lazy.nvim-lazy.nvim-migration-guide| - - Uninstalling |lazy.nvim-lazy.nvim-uninstalling| - - Highlight Groups |lazy.nvim-lazy.nvim-highlight-groups| - - Plugin Authors |lazy.nvim-lazy.nvim-plugin-authors| - - Other Neovim Plugin Managers in Lua|lazy.nvim-lazy.nvim-other-neovim-plugin-managers-in-lua| -2. Links |lazy.nvim-links| +1. 🚀 Getting Started |lazy.nvim-🚀-getting-started| + - ✨ Features |lazy.nvim-🚀-getting-started-✨-features| + - ⚡️ Requirements |lazy.nvim-🚀-getting-started-⚡️-requirements| +2. 🛠️ Installation |lazy.nvim-🛠️-installation| + - Structured Setup |lazy.nvim-🛠️-installation-structured-setup| + - Single File Setup |lazy.nvim-🛠️-installation-single-file-setup| +3. 🔌 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| +4. 📦 Packages |lazy.nvim-📦-packages| + - Lazy |lazy.nvim-📦-packages-lazy| + - Rockspec |lazy.nvim-📦-packages-rockspec| + - Packspec |lazy.nvim-📦-packages-packspec| +5. ⚙️ Configuration |lazy.nvim-⚙️-configuration| + - 🌈 Highlight Groups|lazy.nvim-⚙️-configuration-🌈-highlight-groups| +6. 🚀 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| +7. 📚 Plugin Developers |lazy.nvim-📚-plugin-developers| +8. Links |lazy.nvim-links| ============================================================================== -1. lazy.nvim *lazy.nvim-lazy.nvim* +1. 🚀 Getting Started *lazy.nvim-🚀-getting-started* **lazy.nvim** is a modern plugin manager for Neovim. -FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- 📈 Statusline component to see the number of pending updates +- 🎨 Automatically lazy-loads colorschemes -REQUIREMENTS *lazy.nvim-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) - a Nerd Font <https://www.nerdfonts.com/> **(optional)** -INSTALLATION *lazy.nvim-lazy.nvim-installation* +============================================================================== +2. 🛠️ Installation *lazy.nvim-🛠️-installation* -You can add the following Lua code to your `init.lua` to bootstrap -**lazy.nvim** +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 </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 - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "https://github.com/folke/lazy.nvim.git", - "--branch=stable", -- latest stable release - lazypath, - }) + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) end vim.opt.rtp:prepend(lazypath) -< - -Nextstep is to add **lazy.nvim** below the code added in the prior step in -`init.lua` - ->lua - require("lazy").setup(plugins, opts) -< - -- **plugins**this should be a `table` or a `string` - - `table`a list with your |lazy.nvim-plugin-spec| - - `string`a Lua module name that contains your |lazy.nvim-plugin-spec|. See |lazy.nvim-structuring-your-plugins| -- **opts**see |lazy.nvim-configuration| **(optional)** - ->lua - -- Example using a list of specs with the default options - vim.g.mapleader = " " -- Make sure to set `mapleader` before lazy so your mappings are correct - vim.g.maplocalleader = "\\" -- Same for `maplocalleader` + -- 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({ - "folke/which-key.nvim", - { "folke/neoconf.nvim", cmd = "Neoconf" }, - "folke/neodev.nvim", + -- 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 }, }) < -It is recommended to run `:checkhealth lazy` after installation. +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 </usage/structuring> -PLUGIN SPEC *lazy.nvim-lazy.nvim-plugin-spec* - - ------------------------------------------------------------------------------------------------------------------------------------ - Property Type Description - -------------- ---------------------------------------------------------------- ---------------------------------------------------- - [1] string? Short plugin url. Will be expanded using - config.git.url_format - - 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 - - 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 - - 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 fun(LazyPlugin):boolean When false, or if the function returns false, then - this plugin will not be loaded. Useful to disable - some plugins in vscode, or firenvim for example. - - 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. - - init fun(LazyPlugin) init functions are always executed during startup - - opts table or fun(LazyPlugin, opts:table) opts should be a table (will be merged with parent - 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) or true config is executed when the plugin loads. The - default 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. See also opts. To use the default - implementation without opts set config to true. - - 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 a list of build commands build is executed when a plugin is installed or - updated. Before running build, a plugin is first - loaded. If it’s a string it will be run as a shell - command. When prefixed with : it is a Neovim - command. You can also specify a list to executed - multiple build commands. Some plugins provide their - own build.lua which is automatically used by lazy. - So no need to specify a build step for those - plugins. - - branch string? Branch of the repository - - tag string? Tag of the repository - - commit string? Commit of the repository - - version string? or false to override the default Version to use from the repository. Full 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 - - event string? or string[] or Lazy-load on event. Events can be specified as - fun(self:LazyPlugin, event:string[]):string[] or BufEnter or with a pattern like BufEnter *.lua - {event:string[]\|string, pattern?:string[]\|string} - - 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)[] - - module false? Do not automatically load this Lua module when it’s - required somewhere - - 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. - - 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 - ------------------------------------------------------------------------------------------------------------------------------------ - -LAZY LOADING ~ - -**lazy.nvim** automagically lazy-loads Lua modules, so it is not needed to -specify `module=...` everywhere in your plugin specification. 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. - -If you don’t want this behavior for a certain plugin, you can specify that -with `module=false`. You can then manually load the plugin with `:Lazy load -foobar.nvim`. - -You can configure **lazy.nvim** to lazy-load all plugins by default with -`config.defaults.lazy = true`. - -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` - -- Theplugin 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`. - - - **NOTE:** since **start** plugins can possibly change existing highlight - groups, it’s important to make sure that your main **colorscheme** is loaded - first. To ensure this you can use the `priority=1000` field. **(see the - examples)** - -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. +SINGLE FILE SETUP *lazy.nvim-🛠️-installation-single-file-setup* >lua - -- Example for neo-tree.nvim - { - "nvim-neo-tree/neo-tree.nvim", - keys = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } + -- 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" + vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + 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 }, + }) < -VERSIONING ~ - -If you want to install a specific revision of a plugin, you can use `commit`, -`tag`, `branch`, `version`. - -The `version` property supports Semver <https://semver.org/> ranges. - -Click to see some 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 - -You can set `config.defaults.version = "*"` to install the latest stable -version of plugins that support Semver. +============================================================================== +3. 🔌 Plugin Spec *lazy.nvim-🔌-plugin-spec* -EXAMPLES ~ +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 + + opts table or opts should be a table (will be merged with parent specs), + fun(LazyPlugin, opts:table) 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. See also + opts. To use the default implementation without opts set + config to true. + + 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. + a list of build commands Before running build, a plugin is first loaded. If it’s a + string it will be run as a shell command. When prefixed with + : it is a Neovim command. You can also specify a list to + executed multiple build commands. Some plugins provide their + own build.lua which is automatically used by lazy. So no + need to specify a build step for those plugins. + + rocks string[]? Add any luarocks dependencies. + ----------------------------------------------------------------------------------------------------- + +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 { @@ -394,7 +411,120 @@ EXAMPLES ~ < -CONFIGURATION *lazy.nvim-lazy.nvim-configuration* +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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 + + +============================================================================== +4. 📦 Packages *lazy.nvim-📦-packages* + +**lazy.nvim** supports three ways for plugins to define their dependencies and +configuration. + +- **Lazy**: `lazy.lua` file +- **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 `*-scm-1.rockspec` file, **lazy.nvim** will +automatically load its `rocks` </spec#setup> dependencies. + + +PACKSPEC *lazy.nvim-📦-packages-packspec* + +Supports the pkg.json +<https://github.com/nvim-lua/nvim-package-specification/issues/41> format, with +a lazy extension in `lazy`. `lazy` can contain any valid lazy spec fields. They +will be added to the plugin’s spec. + + +============================================================================== +5. ⚙️ Configuration *lazy.nvim-⚙️-configuration* **lazy.nvim** comes with the following defaults: @@ -402,8 +532,13 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* { root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed defaults = { + -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. + -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. lazy = false, -- should plugins be lazy-loaded? - version = nil, + -- 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 @@ -426,6 +561,21 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* -- increase downloads a lot. filter = true, }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, dev = { ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects path = "~/projects", @@ -455,6 +605,7 @@ CONFIGURATION *lazy.nvim-lazy.nvim-configuration* cmd = " ", config = "", event = " ", + favorite = " ", ft = " ", init = " ", import = " ", @@ -601,7 +752,101 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s < -USAGE *lazy.nvim-lazy.nvim-usage* +🌈 HIGHLIGHT GROUPS *lazy.nvim-⚙️-configuration-🌈-highlight-groups* + + ----------------------------------------------------------------------- + Highlight Group Default Group Description + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +6. 🚀 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. @@ -616,14 +861,17 @@ 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 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 clean [plugins] require("lazy").clean(opts?) Clean plugins that are + no longer needed :Lazy clear require("lazy").clear() Clear finished tasks @@ -637,24 +885,36 @@ function: :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 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 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 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 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 - -------------------------------------------------------------------------------------------------------------- + :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: @@ -664,10 +924,10 @@ example, if you want to sync lazy from the cmdline, you can use: `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 +- **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()`): @@ -707,34 +967,47 @@ Example of configuring lualine.nvim ~ < -USER EVENTS ~ +📆 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. +- **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. -LOCKFILE LAZY-LOCK.JSON *lazy.nvim-lazy.nvim-lockfile-lazy-lock.json* +❌ UNINSTALLING *lazy.nvim-🚀-usage-❌-uninstalling* -After every **update**, the local lockfile is updated with the installed -revisions. It is recommended to have this file under version control. +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. @@ -743,7 +1016,49 @@ If you are on another machine, you can do `:Lazy restore`, to update all your plugins to the version from the lockfile. -PERFORMANCE *lazy.nvim-lazy.nvim-performance* +📦 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 @@ -758,29 +1073,13 @@ improve performance. The profiling view shows you why and how long it took to load your plugins. -DEBUG *lazy.nvim-lazy.nvim-debug* +🐛 DEBUG ~ See an overview of active lazy-loading handlers and what’s in the module cache. -STARTUP SEQUENCE *lazy.nvim-lazy.nvim-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. - - -STRUCTURING YOUR PLUGINS *lazy.nvim-lazy.nvim-structuring-your-plugins* +📂 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 @@ -820,7 +1119,7 @@ For a real-life example, you can check LazyVim - lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/plugins> contains all the plugin specs that will be loaded -IMPORTING SPECS, CONFIG & OPTS ~ +↩️ 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: @@ -852,155 +1151,21 @@ the parent spec. Any other property will override the property from the parent spec. -MIGRATION GUIDE *lazy.nvim-lazy.nvim-migration-guide* +============================================================================== +7. 📚 Plugin Developers *lazy.nvim-📚-plugin-developers* +To make it easier for users to install your plugin, you can include a package +spec </packages> in your repo. -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` - - -UNINSTALLING *lazy.nvim-lazy.nvim-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. - -HIGHLIGHT GROUPS *lazy.nvim-lazy.nvim-highlight-groups* - -Click to see all highlight groups ~ - - --------------------------------------------------------------------------------- - Highlight Group Default Group Description - ------------------- ------------------------ ------------------------------------ - LazyButton CursorLine - - LazyButtonActive Visual - - LazyComment Comment - - LazyCommit _@variable.builtin_ commitref - - LazyCommitIssue Number - - LazyCommitScope Italic conventional commit scope - - LazyCommitType Title conventional commit type - - LazyDimmed Conceal property - - LazyDir _@markup.link_ directory - - LazyH1 IncSearch homebutton - - LazyH2 Bold titles - - 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_ - - LazyTaskError ErrorMsg taskerrors - - LazyTaskOutput MsgArea task output - - LazyUrl _@markup.link_ url - - LazyValue _@string_ valueof a property - --------------------------------------------------------------------------------- - -PLUGIN AUTHORS *lazy.nvim-lazy.nvim-plugin-authors* - -If your plugin needs a build step, you can create a file `build.lua` or -`build/init.lua` in the root of your repo. This file will be loaded when the -plugin is installed or updated. +If your plugin needs a build step, you can specify this in your **package +file**, or create a file `build.lua` or `build/init.lua` in the root of your +repo. This file will be loaded when the plugin is installed or updated. This makes it easier for users, as they no longer need to specify a `build` command. - -OTHER NEOVIM PLUGIN MANAGERS IN LUA*lazy.nvim-lazy.nvim-other-neovim-plugin-managers-in-lua* - -- pckr.nvim <https://github.com/lewis6991/pckr.nvim> -- packer.nvim <https://github.com/wbthomason/packer.nvim> -- paq-nvim <https://github.com/savq/paq-nvim> -- neopm <https://github.com/ii14/neopm> -- dep <https://github.com/chiyadev/dep> -- optpack.nvim <https://github.com/notomo/optpack.nvim> -- pact.nvim <https://github.com/rktjmp/pact.nvim> - ============================================================================== -2. Links *lazy.nvim-links* +8. 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 diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 46fbfd5..1b5d734 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -7,8 +7,13 @@ local M = {} M.defaults = { root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed defaults = { + -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. + -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. lazy = false, -- should plugins be lazy-loaded? - version = nil, + -- 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 From fd8229d6e312e83d6bafda256adf0e650b13ca01 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 23 Jun 2024 22:00:48 +0200 Subject: [PATCH 1324/1610] fix(pkg): versioning and reload specs when pkg-cache is dirty --- lua/lazy/core/plugin.lua | 7 +++ lua/lazy/pkg/init.lua | 92 +++++++++++++++++++------------------- lua/lazy/pkg/lazy.lua | 3 +- lua/lazy/pkg/rockspec.lua | 2 +- lua/lazy/view/commands.lua | 3 +- 5 files changed, 59 insertions(+), 48 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 713e54c..878ed3f 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -1,5 +1,6 @@ local Config = require("lazy.core.config") local Meta = require("lazy.core.meta") +local Pkg = require("lazy.pkg") local Util = require("lazy.core.util") ---@class LazyCorePlugin @@ -332,6 +333,12 @@ function M.load() Util.track("state") M.update_state() Util.track() + + if Config.options.pkg.enabled and Pkg.dirty then + Pkg.update() + return M.load() + end + M.loading = false vim.api.nvim_exec_autocmds("User", { pattern = "LazyPlugins", modeline = false }) end diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index bee9b42..781f66a 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -2,6 +2,8 @@ local Config = require("lazy.core.config") local Util = require("lazy.util") local M = {} +M.VERSION = 7 +M.dirty = false ---@alias LazyPkgSpec LazySpec | fun():LazySpec @@ -10,10 +12,13 @@ local M = {} ---@field name string ---@field file string ---@field spec? LazySpec ----@field chunk? string|fun():LazySpec + +---@class LazyPkgInput: LazyPkg +---@field spec? LazySpec|fun():LazySpec +---@field code? string ---@class LazyPkgSource ----@field get fun(plugin:LazyPlugin):LazyPkg +---@field get fun(plugin:LazyPlugin):LazyPkgInput? ---@type table<string, LazyPkg>? M.cache = nil @@ -25,76 +30,78 @@ function M.update() sources[#sources + 1] = require("lazy.pkg." .. s) end - ---@type table<string, LazyPkg> - local ret = {} + M.cache = {} for _, plugin in pairs(Config.plugins) do - for _, source in ipairs(sources) do - local spec = source.get(plugin) - if spec then - spec.name = plugin.name - if type(spec.chunk) == "function" then - spec.chunk = string.dump(spec.chunk) + if plugin._.installed then + for _, source in ipairs(sources) do + local spec = source.get(plugin) + if spec then + spec.name = plugin.name + if type(spec.code) == "string" then + spec.spec = { _raw = spec.code } + spec.code = nil + end + M.cache[plugin.dir] = spec + break end - ret[plugin.dir] = spec - break end end end - local code = "return " .. Util.dump(ret) + local code = "return " .. Util.dump({ version = M.VERSION, specs = M.cache }) Util.write_file(Config.options.pkg.cache, code) + M.dirty = false M.cache = nil end local function _load() Util.track("pkg") - M.cache = {} + M.cache = nil if vim.uv.fs_stat(Config.options.pkg.cache) then Util.try(function() local chunk, err = loadfile(Config.options.pkg.cache) if not chunk then error(err) end - M.cache = chunk() + local ret = chunk() + if ret and ret.version == M.VERSION then + M.cache = ret.specs + end end, "Error loading pkg:") end + if rawget(M, "cache") then + M.dirty = false + else + M.cache = {} + M.dirty = true + end Util.track() end ----@param plugin LazyPlugin +---@param dir string ---@return LazyPkg? -function M.get(plugin) - if not M.cache then - _load() - end - - local ret = M.cache[plugin.dir] +function M.get(dir) + local ret = M.cache[dir] if not ret then return end - if ret.chunk and not ret.spec then - if type(ret.chunk) == "string" then - ret.chunk = load(ret.chunk, "@" .. plugin.dir) - end - ret.spec = ret.chunk() - ret.chunk = nil + if type(ret.spec) == "function" then + ret.spec = ret.spec() end return ret end function M.spec() - if not M.cache then - _load() - end ---@type table<string,LazyPluginSpec> local ret = {} for dir in pairs(M.cache) do - local pkg = M.get({ dir = dir }) + local pkg = M.get(dir) local spec = pkg and pkg.spec if pkg and spec then spec = type(spec) == "table" and vim.deepcopy(spec) or spec + ---@cast spec LazySpec ret[dir] = { pkg.name, specs = spec } end end @@ -102,16 +109,11 @@ function M.spec() return ret end ----@param plugin LazyPlugin ----@return LazySpec? -function M.get_spec(plugin) - local pkg = M.get(plugin) - local spec = pkg and pkg.spec - if not spec then - return - end - spec = type(spec) == "table" and vim.deepcopy(spec) or spec - return { plugin.name, specs = spec } -end - -return M +return setmetatable(M, { + __index = function(_, key) + if key == "cache" then + _load() + return M.cache + end + end, +}) diff --git a/lua/lazy/pkg/lazy.lua b/lua/lazy/pkg/lazy.lua index 07b0491..9ca0637 100644 --- a/lua/lazy/pkg/lazy.lua +++ b/lua/lazy/pkg/lazy.lua @@ -16,11 +16,12 @@ function M.get(plugin) end, "`" .. M.lazy_file .. "` for **" .. plugin.name .. "** has errors:") if not chunk then Util.error("Invalid `" .. M.lazy_file .. "` for **" .. plugin.name .. "**") + return end return { source = "lazy", file = M.lazy_file, - chunk = chunk, + code = "function()\n" .. Util.read_file(file) .. "\nend", } end end diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 5732fbf..c0e5ec3 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -46,7 +46,7 @@ function M.get(plugin) return #rocks > 0 and { source = "rockspec", - file = rockspec_file, + file = vim.fn.fnamemodify(rockspec_file, ":t"), spec = { plugin.name, rocks = rocks, diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 6b828a5..9791924 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -34,6 +34,7 @@ M.commands = { health = function() vim.cmd.checkhealth("lazy") end, + ---@param opts ManagerOpts pkg = function(opts) local Pkg = require("lazy.pkg") Pkg.update() @@ -44,7 +45,7 @@ M.commands = { }, }) for _, plugin in pairs(opts and opts.plugins or {}) do - local spec = Pkg.get(plugin) + local spec = Pkg.get(plugin.dir) Util.info(vim.inspect(spec), { lang = "lua", title = plugin.name }) end end, From 3515cb518f61c02b41cd3a8d8135c9a5862a982f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 23 Jun 2024 22:04:32 +0200 Subject: [PATCH 1325/1610] fix(pkg): make sure state dir exists --- lua/lazy/pkg/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index 781f66a..c43a53f 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -48,6 +48,7 @@ function M.update() end end local code = "return " .. Util.dump({ version = M.VERSION, specs = M.cache }) + vim.fn.mkdir(vim.fn.fnamemodify(Config.options.pkg.cache, ":h"), "p") Util.write_file(Config.options.pkg.cache, code) M.dirty = false M.cache = nil From 7b6ddbfc137ad5d8b178a3bbf5a1338630f30625 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 23 Jun 2024 22:15:10 +0200 Subject: [PATCH 1326/1610] fix(pkg): automatically update pkgs when editing a pkg file --- lua/lazy/core/config.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1b5d734..a7ac3c8 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -318,9 +318,13 @@ function M.setup(opts) -- useful for plugin developers when making changes to a packspec file vim.api.nvim_create_autocmd("BufWritePost", { - pattern = "lazy.lua", + pattern = { "lazy.lua", "pkg.json", "*.rockspec" }, callback = function() - require("lazy.view.commands").cmd("pkg") + require("lazy").pkg({ + plugins = { + require("lazy.core.plugin").find(vim.uv.cwd() .. "/lua/"), + }, + }) end, }) end, From 502600d3e693bf84eb7dac753e0f6999d62fa1b0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 06:44:33 +0200 Subject: [PATCH 1327/1610] docs: fix default lazy-loading comment --- lua/lazy/core/config.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index a7ac3c8..83634be 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -7,8 +7,8 @@ local M = {} M.defaults = { root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed defaults = { - -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. - -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. + -- If you know what you're doing, you can 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. @@ -17,7 +17,6 @@ M.defaults = { -- 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 - -- version = "*", -- enable this to try installing the latest stable versions of plugins }, -- leave nil when passing the spec as the first argument to setup() spec = nil, ---@type LazySpec From 23c2851265ca11a4e92f5f506fd154bbe5431ddb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 05:10:36 +0000 Subject: [PATCH 1328/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 14d4a16..e6fda3d 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -532,8 +532,8 @@ will be added to the plugin’s spec. { root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed defaults = { - -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. - -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. + -- If you know what you're doing, you can 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. @@ -542,7 +542,6 @@ will be added to the plugin’s spec. -- 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 - -- version = "*", -- enable this to try installing the latest stable versions of plugins }, -- leave nil when passing the spec as the first argument to setup() spec = nil, ---@type LazySpec From d498f81b8ca81179d82a2f20c3c4bc5935a60bee Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 07:12:32 +0200 Subject: [PATCH 1329/1610] style: wording --- lua/lazy/core/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 83634be..1fb28bb 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -7,7 +7,7 @@ local M = {} M.defaults = { root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed defaults = { - -- If you know what you're doing, you can set this to `true` to have all your plugins lazy-loaded by default. + -- 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, From d4c07d062dde09cf4e0f716bbf2815052783a3ba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 05:13:25 +0000 Subject: [PATCH 1330/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e6fda3d..8562034 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -532,7 +532,7 @@ will be added to the plugin’s spec. { root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed defaults = { - -- If you know what you're doing, you can set this to `true` to have all your plugins lazy-loaded by default. + -- 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, From b3ee5b96f242a86962371df6708bf598fed56e82 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 06:35:54 +0000 Subject: [PATCH 1331/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 56 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 8562034..ed9bcad 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -3,13 +3,15 @@ ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -1. 🚀 Getting Started |lazy.nvim-🚀-getting-started| +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| -2. 🛠️ Installation |lazy.nvim-🛠️-installation| +3. 🛠️ Installation |lazy.nvim-🛠️-installation| - Structured Setup |lazy.nvim-🛠️-installation-structured-setup| - Single File Setup |lazy.nvim-🛠️-installation-single-file-setup| -3. 🔌 Plugin Spec |lazy.nvim-🔌-plugin-spec| +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| @@ -19,13 +21,13 @@ Table of Contents *lazy.nvim-table-of-contents* - Examples |lazy.nvim-🔌-plugin-spec-examples| - Lazy Loading |lazy.nvim-🔌-plugin-spec-lazy-loading| - Versioning |lazy.nvim-🔌-plugin-spec-versioning| -4. 📦 Packages |lazy.nvim-📦-packages| +5. 📦 Packages |lazy.nvim-📦-packages| - Lazy |lazy.nvim-📦-packages-lazy| - Rockspec |lazy.nvim-📦-packages-rockspec| - Packspec |lazy.nvim-📦-packages-packspec| -5. ⚙️ Configuration |lazy.nvim-⚙️-configuration| +6. ⚙️ Configuration |lazy.nvim-⚙️-configuration| - 🌈 Highlight Groups|lazy.nvim-⚙️-configuration-🌈-highlight-groups| -6. 🚀 Usage |lazy.nvim-🚀-usage| +7. 🚀 Usage |lazy.nvim-🚀-usage| - ▶️ Startup Sequence |lazy.nvim-🚀-usage-▶️-startup-sequence| - 🚀 Commands |lazy.nvim-🚀-usage-🚀-commands| - 📆 User Events |lazy.nvim-🚀-usage-📆-user-events| @@ -34,11 +36,33 @@ Table of Contents *lazy.nvim-table-of-contents* - 📦 Migration Guide |lazy.nvim-🚀-usage-📦-migration-guide| - ⚡ Profiling & Debug |lazy.nvim-🚀-usage-⚡-profiling-&-debug| - 📂 Structuring Your Plugins|lazy.nvim-🚀-usage-📂-structuring-your-plugins| -7. 📚 Plugin Developers |lazy.nvim-📚-plugin-developers| -8. Links |lazy.nvim-links| +8. 📚 Plugin Developers |lazy.nvim-📚-plugin-developers| +9. Links |lazy.nvim-links| ============================================================================== -1. 🚀 Getting Started *lazy.nvim-🚀-getting-started* +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 lazy.nvim <https://lazy.folke.io/>. 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. +- `rocks`: specs can now specify a list of rocks (luarocks + <https://luarocks.org/>) that should be installed. +- Packages <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + + +============================================================================== +2. 🚀 Getting Started *lazy.nvim-🚀-getting-started* **lazy.nvim** is a modern plugin manager for Neovim. @@ -72,7 +96,7 @@ Table of Contents *lazy.nvim-table-of-contents* ============================================================================== -2. 🛠️ Installation *lazy.nvim-🛠️-installation* +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 @@ -161,7 +185,7 @@ SINGLE FILE SETUP *lazy.nvim-🛠️-installation-single-file-setup* ============================================================================== -3. 🔌 Plugin Spec *lazy.nvim-🔌-plugin-spec* +4. 🔌 Plugin Spec *lazy.nvim-🔌-plugin-spec* SPEC SOURCE *lazy.nvim-🔌-plugin-spec-spec-source* @@ -488,7 +512,7 @@ EXAMPLES ~ ============================================================================== -4. 📦 Packages *lazy.nvim-📦-packages* +5. 📦 Packages *lazy.nvim-📦-packages* **lazy.nvim** supports three ways for plugins to define their dependencies and configuration. @@ -524,7 +548,7 @@ will be added to the plugin’s spec. ============================================================================== -5. ⚙️ Configuration *lazy.nvim-⚙️-configuration* +6. ⚙️ Configuration *lazy.nvim-⚙️-configuration* **lazy.nvim** comes with the following defaults: @@ -826,7 +850,7 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s ----------------------------------------------------------------------- ============================================================================== -6. 🚀 Usage *lazy.nvim-🚀-usage* +7. 🚀 Usage *lazy.nvim-🚀-usage* ▶️ STARTUP SEQUENCE *lazy.nvim-🚀-usage-▶️-startup-sequence* @@ -1151,7 +1175,7 @@ spec. ============================================================================== -7. 📚 Plugin Developers *lazy.nvim-📚-plugin-developers* +8. 📚 Plugin Developers *lazy.nvim-📚-plugin-developers* To make it easier for users to install your plugin, you can include a package spec </packages> in your repo. @@ -1164,7 +1188,7 @@ This makes it easier for users, as they no longer need to specify a `build` command. ============================================================================== -8. Links *lazy.nvim-links* +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 From fcfd54835da5af64c6046060f4db62c4626d209c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 14:14:41 +0200 Subject: [PATCH 1332/1610] feat: spec.rocks is no longer needed & added support for installing any luarock --- lua/lazy/core/config.lua | 14 ------ lua/lazy/core/loader.lua | 16 +++++- lua/lazy/core/meta.lua | 32 +++++++----- lua/lazy/core/plugin.lua | 27 ++++++++-- lua/lazy/manage/init.lua | 6 +-- lua/lazy/manage/rocks.lua | 90 ---------------------------------- lua/lazy/manage/task/rocks.lua | 57 --------------------- lua/lazy/pkg/init.lua | 89 +++++++++++++++++---------------- lua/lazy/pkg/rockspec.lua | 18 +++++-- lua/lazy/types.lua | 6 +-- 10 files changed, 120 insertions(+), 235 deletions(-) delete mode 100644 lua/lazy/manage/rocks.lua delete mode 100644 lua/lazy/manage/task/rocks.lua diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1fb28bb..624ce35 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -226,9 +226,6 @@ M.mapleader = nil ---@type string M.maplocalleader = nil ----@type {specs:string, tree:string, path:string, cpath:string} -M.rocks = {} - function M.headless() return #vim.api.nvim_list_uis() == 0 end @@ -279,17 +276,6 @@ function M.setup(opts) M.mapleader = vim.g.mapleader M.maplocalleader = vim.g.maplocalleader - M.rocks = { - specs = M.options.rocks.root .. "/specs", - tree = M.options.rocks.root .. "/tree", - path = M.options.rocks.root .. "/tree/share/lua/5.1", - cpath = M.options.rocks.root .. "/tree/lib/lua/5.1", - } - vim.fn.mkdir(M.rocks.specs, "p") - vim.fn.mkdir(M.rocks.tree, "p") - package.path = package.path .. ";" .. M.rocks.path .. "/?.lua;" .. M.rocks.path .. "/?/init.lua;" - package.cpath = package.cpath .. ";" .. M.rocks.cpath .. "/?." .. (jit.os:find("Windows") and "dll" or "so") .. ";" - if M.headless() then require("lazy.view.commands").setup() end diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index a0233ad..6f426d9 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -69,9 +69,8 @@ function M.install_missing() for _, plugin in pairs(Config.plugins) do local installed = plugin._.installed local has_errors = Plugin.has_errors(plugin) - local rocks_installed = plugin._.rocks_installed ~= false - if not has_errors and not (installed and rocks_installed) then + if not has_errors and not (installed and not plugin._.build) then for _, colorscheme in ipairs(Config.options.install.colorscheme) do if colorscheme == "default" then break @@ -344,6 +343,10 @@ function M._load(plugin, reason, opts) M.add_to_rtp(plugin) + if plugin._.pkg and plugin._.pkg.source == "rockspec" then + M.add_to_luapath(plugin) + end + if plugin.dependencies then Util.try(function() M.load(plugin.dependencies, {}) @@ -487,6 +490,15 @@ function M.add_to_rtp(plugin) vim.opt.rtp = rtp end +---@param plugin LazyPlugin +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" + package.path = package.path .. ";" .. path .. "/?.lua;" .. path .. "/?/init.lua;" + package.cpath = package.cpath .. ";" .. cpath .. "/?." .. (jit.os:find("Windows") and "dll" or "so") .. ";" +end + function M.source(path) Util.track({ runtime = path }) Util.try(function() diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 533ec27..43bd642 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -33,10 +33,11 @@ function M:load_pkgs() if not Config.options.pkg.enabled then return end - local specs = Pkg.spec() - for dir, spec in pairs(specs) do - local meta, fragment = self:add(spec) + local specs = Pkg.get() + for dir, pkg in pairs(specs) do + local meta, fragment = self:add(pkg.spec) if meta and fragment then + meta._.pkg = pkg -- tag all package fragments as optional for _, fid in ipairs(meta._.frags) do local frag = self.fragments:get(fid) @@ -165,18 +166,23 @@ function M:_rebuild(name) assert(#plugin._.frags > 0, "no fragments found for plugin " .. name) + ---@type table<number, boolean> + local done = {} for _, fid in ipairs(plugin._.frags) do - local fragment = self.fragments:get(fid) - assert(fragment, "fragment " .. fid .. " not found, for plugin " .. name) - ---@diagnostic disable-next-line: no-unknown - super = setmetatable(fragment.spec, super and { __index = super } or nil) - plugin._.dep = plugin._.dep and fragment.dep - plugin.optional = plugin.optional and (rawget(fragment.spec, "optional") == true) - plugin.url = fragment.url or plugin.url + if not done[fid] then + done[fid] = true + local fragment = self.fragments:get(fid) + assert(fragment, "fragment " .. fid .. " not found, for plugin " .. name) + ---@diagnostic disable-next-line: no-unknown + super = setmetatable(fragment.spec, super and { __index = super } or nil) + plugin._.dep = plugin._.dep and fragment.dep + plugin.optional = plugin.optional and (rawget(fragment.spec, "optional") == true) + plugin.url = fragment.url or plugin.url - -- dependencies - for _, dep in ipairs(fragment.deps or {}) do - table.insert(plugin.dependencies, self.fragments:get(dep).name) + -- dependencies + for _, dep in ipairs(fragment.deps or {}) do + table.insert(plugin.dependencies, self.fragments:get(dep).name) + end end end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 878ed3f..875b580 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -236,7 +236,7 @@ function M.update_state() installed[name] = nil end - require("lazy.manage.rocks").update_state() + M.update_rocks_state() Config.to_clean = {} for pack, dir_type in pairs(installed) do @@ -253,6 +253,23 @@ function M.update_state() end end +function M.update_rocks_state() + local root = Config.options.rocks.root + ---@type table<string,string> + local installed = {} + Util.ls(root, function(_, name, type) + if type == "directory" then + installed[name] = name + end + end) + + for _, plugin in pairs(Config.plugins) do + if plugin._.pkg and plugin._.pkg.source == "rockspec" then + plugin._.build = not installed[plugin.name] + end + end +end + ---@param path string function M.local_spec(path) local file = vim.secure.read(path) @@ -321,11 +338,11 @@ function M.load() -- copy state. This wont do anything during startup for name, plugin in pairs(existing) do if Config.plugins[name] then - local dep = Config.plugins[name]._.dep - local frags = Config.plugins[name]._.frags + local new_state = Config.plugins[name]._ Config.plugins[name]._ = plugin._ - Config.plugins[name]._.dep = dep - Config.plugins[name]._.frags = frags + Config.plugins[name]._.dep = new_state.dep + Config.plugins[name]._.frags = new_state.frags + -- Config.plugins[name]._.tasks = new_state.tasks end end Util.track() diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 3e145c8..01c9a54 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -82,13 +82,12 @@ function M.install(opts) pipeline = { "git.clone", { "git.checkout", lockfile = opts.lockfile }, - "rocks.install", "plugin.docs", "wait", "plugin.build", }, plugins = function(plugin) - return plugin.url and not (plugin._.installed and plugin._.rocks_installed ~= false) + return plugin.url and not (plugin._.installed and not plugin._.build) end, }, opts):wait(function() require("lazy.manage.lock").update() @@ -107,7 +106,6 @@ function M.update(opts) "git.fetch", "git.status", { "git.checkout", lockfile = opts.lockfile }, - "rocks.install", "plugin.docs", "wait", "plugin.build", @@ -224,7 +222,7 @@ function M.clear(plugins) if plugin._.tasks then ---@param task LazyTask plugin._.tasks = vim.tbl_filter(function(task) - return task:is_running() + return task:is_running() or task.error end, plugin._.tasks) end end diff --git a/lua/lazy/manage/rocks.lua b/lua/lazy/manage/rocks.lua deleted file mode 100644 index 3e1bc6e..0000000 --- a/lua/lazy/manage/rocks.lua +++ /dev/null @@ -1,90 +0,0 @@ ---# selene:allow(incorrect_standard_library_use) - -local Config = require("lazy.core.config") -local Util = require("lazy.core.util") - ----@class LazyRock ----@field plugin string ----@field name string ----@field spec string ----@field installed boolean - -local M = {} ----@type LazyRock[] -M.rocks = {} - ----@param ... string ----@return string[] -function M.args(...) - local ret = { - "--tree", - Config.rocks.tree, - "--server", - Config.options.rocks.server, - "--dev", - "--lua-version", - "5.1", - } - vim.list_extend(ret, { ... }) - return ret -end - ----@param plugin LazyPlugin -function M.get_rockspec(plugin) - local rocks = vim.tbl_map(function(rock) - return rock.name - end, plugin._.rocks) - assert(rocks and #rocks > 0, plugin.name .. " has no rocks") - local rockspec_file = Config.rocks.specs .. "/lazy-" .. plugin.name .. "-scm-1.rockspec" - require("lazy.util").write_file( - rockspec_file, - ([[ -rockspec_format = "3.0" -package = "lazy-%s" -version = "scm-1" -source = { url = "%s" } -dependencies = %s -build = { type = "builtin" } -]]):format(plugin.name, plugin.url, vim.inspect(plugin.rocks)) - ) - return rockspec_file -end - -function M.update_state() - local root = Config.rocks.tree .. "/lib/luarocks/rocks-5.1" - ---@type table<string,string> - local installed = {} - Util.ls(root, function(_, name, type) - if type == "directory" then - installed[name] = name - end - end) - - ---@type LazyRock[] - local rocks = {} - M.rocks = rocks - - for _, plugin in pairs(Config.plugins) do - if plugin.rocks then - plugin._.rocks = {} - plugin._.rocks_installed = true - for _, spec in ipairs(plugin.rocks) do - spec = vim.trim(spec) - local name = spec:gsub("%s.*", "") - local rock = { - plugin = plugin.name, - name = name, - spec = spec, - installed = installed[name] ~= nil, - } - if rock.name ~= "lua" then - plugin._.rocks_installed = plugin._.rocks_installed and rock.installed - table.insert(plugin._.rocks, rock) - table.insert(rocks, rock) - end - end - end - end -end - -return M diff --git a/lua/lazy/manage/task/rocks.lua b/lua/lazy/manage/task/rocks.lua deleted file mode 100644 index b2f61bf..0000000 --- a/lua/lazy/manage/task/rocks.lua +++ /dev/null @@ -1,57 +0,0 @@ -local Rocks = require("lazy.manage.rocks") - ----@type table<string, LazyTaskDef> -local M = {} - -local running = false -local has_rocks = nil ---@type boolean? - -M.install = { - skip = function(plugin) - return plugin._.rocks_installed ~= false - end, - run = function(self) - if has_rocks == nil then - has_rocks = vim.fn.executable("luarocks") == 1 - end - if not has_rocks then - self.error = "This plugin has luarocks dependencies,\nbut the `luarocks` executable is not found.\nPlease install https://luarocks.org/ to continue.\n" - .. "luarock deps: " - .. vim.inspect(self.plugin.rocks) - return - end - - local started = false - - local function install() - started = true - self.status = "luarocks (install)" - vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) - self:spawn("luarocks", { - args = Rocks.args("install", "--deps-mode", "one", "--deps-only", Rocks.get_rockspec(self.plugin)), - on_exit = function(ok) - running = false - if ok then - self.plugin._.rocks_installed = true - end - end, - }) - end - - local timer = vim.uv.new_timer() - timer:start(0, 100, function() - if not running then - running = true - timer:stop() - vim.schedule(install) - end - end) - self.status = "luarocks (pending)" - - table.insert(self._running, function() - return not started - end) - end, -} - -return M diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index c43a53f..48e755c 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -2,23 +2,28 @@ local Config = require("lazy.core.config") local Util = require("lazy.util") local M = {} -M.VERSION = 7 +M.VERSION = 8 M.dirty = false ----@alias LazyPkgSpec LazySpec | fun():LazySpec - ---@class LazyPkg ----@field source string ---@field name string +---@field dir string +---@field source "lazy" | "packspec" | "rockspec" +---@field file string +---@field spec LazyPluginSpec + +---@class LazyPkgSpec ---@field file string ---@field spec? LazySpec - ----@class LazyPkgInput: LazyPkg ----@field spec? LazySpec|fun():LazySpec ---@field code? string ---@class LazyPkgSource ----@field get fun(plugin:LazyPlugin):LazyPkgInput? +---@field name string +---@field get fun(plugin:LazyPlugin):LazyPkgSpec? + +---@class LazyPkgCache +---@field pkgs LazyPkg[] +---@field version number ---@type table<string, LazyPkg>? M.cache = nil @@ -27,27 +32,40 @@ function M.update() ---@type LazyPkgSource[] local sources = {} for _, s in ipairs(Config.options.pkg.sources) do - sources[#sources + 1] = require("lazy.pkg." .. s) + sources[#sources + 1] = { + name = s, + get = require("lazy.pkg." .. s).get, + } end - M.cache = {} + ---@type LazyPkgCache + local ret = { + version = M.VERSION, + pkgs = {}, + } for _, plugin in pairs(Config.plugins) do if plugin._.installed then for _, source in ipairs(sources) do local spec = source.get(plugin) if spec then - spec.name = plugin.name + ---@type LazyPkg + local pkg = { + name = plugin.name, + dir = plugin.dir, + source = source.name, + file = spec.file, + spec = spec.spec or {}, + } if type(spec.code) == "string" then - spec.spec = { _raw = spec.code } - spec.code = nil + pkg.spec = { _raw = spec.code } end - M.cache[plugin.dir] = spec + table.insert(ret.pkgs, pkg) break end end end end - local code = "return " .. Util.dump({ version = M.VERSION, specs = M.cache }) + local code = "return " .. Util.dump(ret) vim.fn.mkdir(vim.fn.fnamemodify(Config.options.pkg.cache, ":h"), "p") Util.write_file(Config.options.pkg.cache, code) M.dirty = false @@ -63,9 +81,18 @@ local function _load() if not chunk then error(err) end + ---@type LazyPkgCache? local ret = chunk() if ret and ret.version == M.VERSION then - M.cache = ret.specs + M.cache = {} + for _, pkg in ipairs(ret.pkgs) do + if type(pkg.spec) == "function" then + pkg.spec = pkg.spec() + end + -- wrap in the scope of the plugin + pkg.spec = { pkg.name, specs = pkg.spec } + M.cache[pkg.dir] = pkg + end end end, "Error loading pkg:") end @@ -80,34 +107,12 @@ end ---@param dir string ---@return LazyPkg? +---@overload fun():table<string, LazyPkg> function M.get(dir) - local ret = M.cache[dir] - if not ret then - return + if dir then + return M.cache[dir] end - - if type(ret.spec) == "function" then - ret.spec = ret.spec() - end - - return ret -end - -function M.spec() - ---@type table<string,LazyPluginSpec> - local ret = {} - - for dir in pairs(M.cache) do - local pkg = M.get(dir) - local spec = pkg and pkg.spec - if pkg and spec then - spec = type(spec) == "table" and vim.deepcopy(spec) or spec - ---@cast spec LazySpec - ret[dir] = { pkg.name, specs = spec } - end - end - - return ret + return M.cache end return setmetatable(M, { diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index c0e5ec3..ba4a692 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -4,7 +4,7 @@ local Util = require("lazy.core.util") local M = {} -M.dev_suffix = "-scm-1.rockspec" +M.dev_suffix = "-1.rockspec" M.skip = { "lua" } ---@class RockSpec @@ -14,7 +14,7 @@ M.skip = { "lua" } ---@field dependencies string[] ---@param plugin LazyPlugin ----@return LazyPkg? +---@return LazyPkgSpec? function M.get(plugin) local rockspec_file ---@type string? Util.ls(plugin.dir, function(path, name, t) @@ -43,13 +43,21 @@ function M.get(plugin) return not vim.tbl_contains(M.skip, name) end, rockspec and rockspec.dependencies or {}) - return #rocks > 0 + local use = #rocks > 0 + use = true + + local lazy = nil + if not vim.uv.fs_stat(plugin.dir .. "/lua") then + lazy = false + end + + return use and { - source = "rockspec", file = vim.fn.fnamemodify(rockspec_file, ":t"), spec = { plugin.name, - rocks = rocks, + build = "rockspec", + lazy = lazy, }, } or nil diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index cbff124..4fd033c 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -8,6 +8,7 @@ ---@field dep? boolean True if this plugin is only in the spec as a dependency ---@field dir? string Explicit dir or dev set for this plugin ---@field dirty? boolean +---@field build? boolean ---@field frags? number[] ---@field handlers? LazyPluginHandlers ---@field installed? boolean @@ -15,13 +16,12 @@ ---@field kind? LazyPluginKind ---@field loaded? {[string]:string}|{time:number} ---@field outdated? boolean ----@field rocks? LazyRock[] ----@field rocks_installed? boolean ---@field rtp_loaded? boolean ---@field tasks? LazyTask[] ---@field updated? {from:string, to:string} ---@field updates? {from:GitInfo, to:GitInfo} ---@field working? boolean +---@field pkg? LazyPkg ---@alias PluginOpts table|fun(self:LazyPlugin, opts:table):table? @@ -29,7 +29,7 @@ ---@field init? fun(self:LazyPlugin) Will always be run ---@field deactivate? fun(self:LazyPlugin) Unload/Stop a plugin ---@field config? fun(self:LazyPlugin, opts:table)|true Will be executed when loading the plugin ----@field build? string|fun(self:LazyPlugin)|(string|fun(self:LazyPlugin))[] +---@field build? string|async fun(self:LazyPlugin)|(string|async fun(self:LazyPlugin))[] ---@field opts? PluginOpts ---@class LazyPluginHandlers From 368747bc9a314b4f0745547ebdcc3fbc4d100c0a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 14:16:00 +0200 Subject: [PATCH 1333/1610] feat(build): build files and functions are now async. use coroutine.yield to interrupt and report progress --- lua/lazy/core/config.lua | 6 --- lua/lazy/manage/task/init.lua | 26 +++++++++ lua/lazy/manage/task/plugin.lua | 96 ++++++++++++++++++++++----------- lua/lazy/util.lua | 12 +++++ 4 files changed, 102 insertions(+), 38 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 624ce35..0919cab 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -183,12 +183,6 @@ M.defaults = { skip_if_doc_exists = true, }, state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things - build = { - -- Plugins can provide a `build.lua` file that will be executed when the plugin is installed - -- or updated. When the plugin spec also has a `build` command, the plugin's `build.lua` not be - -- executed. In this case, a warning message will be shown. - warn_on_override = true, - }, -- Enable profiling of lazy.nvim. This will add some overhead, -- so only enable this when you are debugging lazy.nvim profiling = { diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 2397cdf..d86ef5f 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -74,6 +74,32 @@ function Task:start() self:_check() end +---@param fn async fun() +function Task:async(fn) + local co = coroutine.create(fn) + local check = vim.uv.new_check() + check:start(vim.schedule_wrap(function() + local status = coroutine.status(co) + if status == "dead" then + check:stop() + self:_check() + elseif status == "suspended" then + local ok, res = coroutine.resume(co) + if not ok then + error(res) + elseif res then + self.status = res + self.output = self.output .. "\n" .. res + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) + end + end + end)) + + table.insert(self._running, function() + return check:is_active() + end) +end + ---@private function Task:_check() for _, state in ipairs(self._running) do diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index e058c50..cd01a25 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -8,25 +8,67 @@ local M = {} ---@param plugin LazyPlugin local function get_build_file(plugin) for _, path in ipairs({ "build.lua", "build/init.lua" }) do - path = plugin.dir .. "/" .. path - if Util.file_exists(path) then + if Util.file_exists(plugin.dir .. "/" .. path) then return path end end end +local B = {} + +---@param task LazyTask +function B.rockspec(task) + local root = Config.options.rocks.root .. "/" .. task.plugin.name + vim.fn.mkdir(root, "p") + task:spawn("luarocks", { + args = { + "--tree", + root, + "--server", + Config.options.rocks.server, + "--dev", + "--lua-version", + "5.1", + "make", + "--force-fast", + }, + cwd = task.plugin.dir, + }) +end + +---@param task LazyTask +---@param build string +function B.cmd(task, build) + local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) --[[@as vim.api.keyset.cmd]] + task.output = vim.api.nvim_cmd(cmd, { output = true }) +end + +---@param task LazyTask +---@param build string +function B.shell(task, build) + local shell = vim.env.SHELL or vim.o.shell + local shell_args = shell:find("cmd.exe", 1, true) and "/c" or "-c" + + task:spawn(shell, { + args = { shell_args, build }, + cwd = task.plugin.dir, + }) +end + M.build = { ---@param opts? {force:boolean} skip = function(plugin, opts) if opts and opts.force then return false end - return not (plugin._.dirty and (plugin.build or get_build_file(plugin))) + return not ((plugin._.dirty or plugin._.build) and (plugin.build or get_build_file(plugin))) end, run = function(self) vim.cmd([[silent! runtime plugin/rplugin.vim]]) - Loader.load(self.plugin, { task = "build" }) + if self.plugin.build ~= "rockspec" then + Loader.load(self.plugin, { task = "build" }) + end local builders = self.plugin.build @@ -35,39 +77,29 @@ M.build = { return end - local build_file = get_build_file(self.plugin) - if build_file then - if builders then - if Config.options.build.warn_on_override then - Util.warn( - ("Plugin **%s** provides its own build script, but you also defined a `build` command.\nThe `build.lua` file will not be used"):format( - self.plugin.name - ) - ) - end - else - builders = function() - Loader.source(build_file) - end - end - end + builders = builders or get_build_file(self.plugin) + if builders then builders = type(builders) == "table" and builders or { builders } ---@cast builders (string|fun(LazyPlugin))[] for _, build in ipairs(builders) do - if type(build) == "string" and build:sub(1, 1) == ":" then - local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) - self.output = vim.api.nvim_cmd(cmd, { output = true }) - elseif type(build) == "function" then - build(self.plugin) + if type(build) == "function" then + self:async(function() + build(self.plugin) + end) + elseif build == "rockspec" then + B.rockspec(self) + elseif build:sub(1, 1) == ":" then + B.cmd(self, build) + elseif build:match("%.lua$") then + local file = self.plugin.dir .. "/" .. build + local chunk, err = loadfile(file) + if not chunk or err then + error(err) + end + self:async(chunk) else - local shell = vim.env.SHELL or vim.o.shell - local shell_args = shell:find("cmd.exe", 1, true) and "/c" or "-c" - - self:spawn(shell, { - args = { shell_args, build }, - cwd = self.plugin.dir, - }) + B.shell(self, build) end end end diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 755c1cd..813b4d9 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -231,6 +231,18 @@ function M.markdown(msg, opts) ) end +---@async +---@param ms number +function M.sleep(ms) + local continue = false + vim.defer_fn(function() + continue = true + end, ms) + while not continue do + coroutine.yield() + end +end + function M._dump(value, result) local t = type(value) if t == "number" or t == "boolean" then From b73c57ed9ec8e63bbb867d21a3f3a865224b25d4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 14:27:29 +0200 Subject: [PATCH 1334/1610] fix(luarocks): cleanup luarocks when deleting a plugin --- lua/lazy/manage/task/fs.lua | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/lua/lazy/manage/task/fs.lua b/lua/lazy/manage/task/fs.lua index c99c8bf..3401c29 100644 --- a/lua/lazy/manage/task/fs.lua +++ b/lua/lazy/manage/task/fs.lua @@ -4,6 +4,19 @@ local Util = require("lazy.util") ---@type table<string, LazyTaskDef> local M = {} +local function rm(dir) + local stat = vim.uv.fs_lstat(dir) + assert(stat and stat.type == "directory", dir .. " should be a directory!") + Util.walk(dir, function(path, _, type) + if type == "directory" then + vim.uv.fs_rmdir(path) + else + vim.uv.fs_unlink(path) + end + end) + vim.uv.fs_rmdir(dir) +end + M.clean = { skip = function(plugin) return plugin._.is_local @@ -11,18 +24,12 @@ M.clean = { run = function(self) local dir = self.plugin.dir:gsub("/+$", "") assert(dir:find(Config.options.root, 1, true) == 1, self.plugin.dir .. " should be under packpath!") + rm(dir) - local stat = vim.uv.fs_lstat(dir) - assert(stat and stat.type == "directory", self.plugin.dir .. " should be a directory!") - - Util.walk(dir, function(path, _, type) - if type == "directory" then - vim.uv.fs_rmdir(path) - else - vim.uv.fs_unlink(path) - end - end) - vim.uv.fs_rmdir(dir) + local rock_root = Config.options.rocks.root .. "/" .. self.plugin.name + if vim.uv.fs_stat(rock_root) then + rm(rock_root) + end self.plugin._.installed = false end, From fd04bc62f95fd26de7a6df4ad5a8088e88e35626 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 13:12:26 +0000 Subject: [PATCH 1335/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 86 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 25 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ed9bcad..b31fb4e 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -36,7 +36,9 @@ Table of Contents *lazy.nvim-table-of-contents* - 📦 Migration Guide |lazy.nvim-🚀-usage-📦-migration-guide| - ⚡ Profiling & Debug |lazy.nvim-🚀-usage-⚡-profiling-&-debug| - 📂 Structuring Your Plugins|lazy.nvim-🚀-usage-📂-structuring-your-plugins| -8. 📚 Plugin Developers |lazy.nvim-📚-plugin-developers| +8. 🔥 Developers |lazy.nvim-🔥-developers| + - Best Practices |lazy.nvim-🔥-developers-best-practices| + - Building |lazy.nvim-🔥-developers-building| 9. Links |lazy.nvim-links| ============================================================================== @@ -46,19 +48,28 @@ Table of Contents *lazy.nvim-table-of-contents* 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 lazy.nvim <https://lazy.folke.io/>. 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. + documentation. Check it out at <https://lazy.folke.io>. 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. -- `rocks`: specs can now specify a list of rocks (luarocks - <https://luarocks.org/>) that should be installed. - Packages <https://lazy.folke.io/packages> can now specify their dependencies and configuration using one of: - **Lazy**: `lazy.lua` file - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) +- 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. ============================================================================== @@ -235,9 +246,9 @@ SPEC LOADING *lazy.nvim-🔌-plugin-spec-spec-loading* SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup* - ----------------------------------------------------------------------------------------------------- + ---------------------------------------------------------------------------------------------------- Property Type Description - ---------- ----------------------------- ------------------------------------------------------------ + ---------- ----------------------------- ----------------------------------------------------------- init fun(LazyPlugin) init functions are always executed during startup opts table or opts should be a table (will be merged with parent specs), @@ -258,15 +269,8 @@ SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup* config() build fun(LazyPlugin) or string or build is executed when a plugin is installed or updated. - a list of build commands Before running build, a plugin is first loaded. If it’s a - string it will be run as a shell command. When prefixed with - : it is a Neovim command. You can also specify a list to - executed multiple build commands. Some plugins provide their - own build.lua which is automatically used by lazy. So no - need to specify a build step for those plugins. - - rocks string[]? Add any luarocks dependencies. - ----------------------------------------------------------------------------------------------------- + a list of build commands See Building for more information. + ---------------------------------------------------------------------------------------------------- SPEC LAZY LOADING *lazy.nvim-🔌-plugin-spec-spec-lazy-loading* @@ -535,8 +539,8 @@ dependencies and configuration. Syntax is the same as any plugin spec. ROCKSPEC *lazy.nvim-📦-packages-rockspec* -When a plugin contains a `*-scm-1.rockspec` file, **lazy.nvim** will -automatically load its `rocks` </spec#setup> dependencies. +When a plugin contains a `*-1.rockspec` file, **lazy.nvim** will automatically +build the rock and its dependencies. PACKSPEC *lazy.nvim-📦-packages-packspec* @@ -1175,17 +1179,49 @@ spec. ============================================================================== -8. 📚 Plugin Developers *lazy.nvim-📚-plugin-developers* +8. 🔥 Developers *lazy.nvim-🔥-developers* To make it easier for users to install your plugin, you can include a package spec </packages> in your repo. -If your plugin needs a build step, you can specify this in your **package -file**, or create a file `build.lua` or `build/init.lua` in the root of your -repo. This file will be loaded when the plugin is installed or updated. -This makes it easier for users, as they no longer need to specify a `build` -command. +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 } + < +- 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(status_msg)` 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 </packages> 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(status_msg)` 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. + ============================================================================== 9. Links *lazy.nvim-links* From dbffad6f44674a3c1b23c649a0abab299d7349d8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 16:42:57 +0200 Subject: [PATCH 1336/1610] fix(fragments): prevent adding the same spec instance more than once --- lua/lazy/core/fragments.lua | 40 ++++++++++++++++++++++--------------- lua/lazy/core/meta.lua | 13 ++++++------ lua/lazy/core/plugin.lua | 19 +++++++++--------- lua/lazy/core/util.lua | 14 +++++++++++++ lua/lazy/pkg/init.lua | 16 +++++++++++---- 5 files changed, 65 insertions(+), 37 deletions(-) diff --git a/lua/lazy/core/fragments.lua b/lua/lazy/core/fragments.lua index 1ca018c..e0e6723 100644 --- a/lua/lazy/core/fragments.lua +++ b/lua/lazy/core/fragments.lua @@ -1,13 +1,5 @@ local Config = require("lazy.core.config") - -local M = {} - -M._fid = 0 - -local function next_id() - M._fid = M._fid + 1 - return M._fid -end +local Util = require("lazy.core.util") --- This class is used to manage the fragments of a plugin spec. --- It keeps track of the fragments and their relations to other fragments. @@ -17,30 +9,39 @@ end ---@field frag_stack number[] ---@field dep_stack number[] ---@field dirty table<number, boolean> +---@field plugins table<LazyPlugin, number> ---@field spec LazySpecLoader -local F = {} +local M = {} + +M._fid = 0 + +local function next_id() + M._fid = M._fid + 1 + return M._fid +end ---@param spec LazySpecLoader ---@return LazyFragments function M.new(spec) - local self = setmetatable({}, { __index = F }) + local self = setmetatable({}, { __index = M }) self.fragments = {} self.frag_stack = {} self.dep_stack = {} self.spec = spec self.dirty = {} + self.plugins = {} return self end ---@param id number -function F:get(id) +function M:get(id) return self.fragments[id] end --- Remove a fragment and all its children. --- This will also remove the fragment from its parent's children list. ---@param id number -function F:del(id) +function M:del(id) -- del fragment local fragment = self.fragments[id] if not fragment then @@ -55,13 +56,13 @@ function F:del(id) local parent = self.fragments[pid] if parent.frags then ---@param fid number - parent.frags = vim.tbl_filter(function(fid) + parent.frags = Util.filter(function(fid) return fid ~= id end, parent.frags) end if parent.deps then ---@param fid number - parent.deps = vim.tbl_filter(function(fid) + parent.deps = Util.filter(function(fid) return fid ~= id end, parent.deps) end @@ -81,8 +82,15 @@ end --- Add a fragment to the fragments list. --- This also resolves its name, url, dir, dependencies and child specs. ---@param plugin LazyPluginSpec -function F:add(plugin) +function M:add(plugin) + if self.plugins[plugin] then + return self.fragments[self.plugins[plugin]] + end + local id = next_id() + setmetatable(plugin, nil) + + self.plugins[plugin] = id local pid = self.frag_stack[#self.frag_stack] diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 43bd642..679a16f 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -33,8 +33,7 @@ function M:load_pkgs() if not Config.options.pkg.enabled then return end - local specs = Pkg.get() - for dir, pkg in pairs(specs) do + for _, pkg in ipairs(Pkg.get()) do local meta, fragment = self:add(pkg.spec) if meta and fragment then meta._.pkg = pkg @@ -44,7 +43,7 @@ function M:load_pkgs() frag.spec.optional = true end -- keep track of the top-level package fragment - self.pkgs[dir] = fragment.id + self.pkgs[pkg.dir] = fragment.id end end end @@ -128,7 +127,7 @@ function M:rebuild() -- fragment was deleted, so remove it from plugin self.frag_to_meta[fid] = nil ---@param f number - meta._.frags = vim.tbl_filter(function(f) + meta._.frags = Util.filter(function(f) return f ~= fid end, meta._.frags) -- if no fragments left, delete plugin @@ -167,10 +166,10 @@ function M:_rebuild(name) assert(#plugin._.frags > 0, "no fragments found for plugin " .. name) ---@type table<number, boolean> - local done = {} + local added = {} for _, fid in ipairs(plugin._.frags) do - if not done[fid] then - done[fid] = true + if not added[fid] then + added[fid] = true local fragment = self.fragments:get(fid) assert(fragment, "fragment " .. fid .. " not found, for plugin " .. name) ---@diagnostic disable-next-line: no-unknown diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 875b580..e93555c 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -170,10 +170,10 @@ function Spec:import(spec) self.importing = nil return self:error( "Invalid spec module: `" - .. modname - .. "`\nExpected a `table` of specs, but a `" - .. type(mod) - .. "` was returned instead" + .. modname + .. "`\nExpected a `table` of specs, but a `" + .. type(mod) + .. "` was returned instead" ) end self:normalize(mod) @@ -216,11 +216,11 @@ function M.update_state() plugin._ = plugin._ or {} if plugin.lazy == nil then local lazy = plugin._.dep - or Config.options.defaults.lazy - or plugin.event - or plugin.keys - or plugin.ft - or plugin.cmd + or Config.options.defaults.lazy + or plugin.event + or plugin.keys + or plugin.ft + or plugin.cmd plugin.lazy = lazy and true or false end if plugin.dir:find(Config.options.root, 1, true) == 1 then @@ -342,7 +342,6 @@ function M.load() Config.plugins[name]._ = plugin._ Config.plugins[name]._.dep = new_state.dep Config.plugins[name]._.frags = new_state.frags - -- Config.plugins[name]._.tasks = new_state.tasks end end Util.track() diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index d4fa47c..0504dd8 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -28,6 +28,20 @@ function M.track(data, time) end end +---@generic T +---@param list T[] +---@param fn fun(v: T):boolean? +---@return T[] +function M.filter(fn, list) + local ret = {} + for _, v in ipairs(list) do + if fn(v) then + table.insert(ret, v) + end + end + return ret +end + ---@generic F: fun() ---@param data (string|{[string]:string})? ---@param fn F diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index 48e755c..0037b26 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -25,7 +25,7 @@ M.dirty = false ---@field pkgs LazyPkg[] ---@field version number ----@type table<string, LazyPkg>? +---@type LazyPkg[]? M.cache = nil function M.update() @@ -65,6 +65,9 @@ function M.update() end end end + table.sort(ret.pkgs, function(a, b) + return a.name < b.name + end) local code = "return " .. Util.dump(ret) vim.fn.mkdir(vim.fn.fnamemodify(Config.options.pkg.cache, ":h"), "p") Util.write_file(Config.options.pkg.cache, code) @@ -91,8 +94,8 @@ local function _load() end -- wrap in the scope of the plugin pkg.spec = { pkg.name, specs = pkg.spec } - M.cache[pkg.dir] = pkg end + M.cache = ret.pkgs end end, "Error loading pkg:") end @@ -107,10 +110,15 @@ end ---@param dir string ---@return LazyPkg? ----@overload fun():table<string, LazyPkg> +---@overload fun():LazyPkg[] function M.get(dir) if dir then - return M.cache[dir] + for _, pkg in ipairs(M.cache) do + if pkg.dir == dir then + return pkg + end + end + return end return M.cache end From 9a6c21982638b6e2ea498514baee9186c0e60d82 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 17:07:25 +0200 Subject: [PATCH 1337/1610] fix(rocks): only build rockspec when it has deps or an advanced build step --- lua/lazy/pkg/init.lua | 2 +- lua/lazy/pkg/rockspec.lua | 43 ++++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index 0037b26..2d5b7d9 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -2,7 +2,7 @@ local Config = require("lazy.core.config") local Util = require("lazy.util") local M = {} -M.VERSION = 8 +M.VERSION = 10 M.dirty = false ---@class LazyPkg diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index ba4a692..58fc2c5 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -12,6 +12,7 @@ M.skip = { "lua" } ---@field package string ---@field version string ---@field dependencies string[] +---@field build? {build_type?: string, modules?: any[]} ---@param plugin LazyPlugin ---@return LazyPkgSpec? @@ -37,30 +38,44 @@ function M.get(plugin) end load() + if not rockspec then + return + end + + local has_lua = not not vim.uv.fs_stat(plugin.dir .. "/lua") + ---@param dep string local rocks = vim.tbl_filter(function(dep) local name = dep:gsub("%s.*", "") return not vim.tbl_contains(M.skip, name) - end, rockspec and rockspec.dependencies or {}) + end, rockspec.dependencies or {}) - local use = #rocks > 0 - use = true + local use = not has_lua + or #rocks > 0 + or ( + rockspec.build + and rockspec.build.build_type + and rockspec.build.build_type ~= "none" + and not (rockspec.build.build_type == "builtin" and not rockspec.build.modules) + ) + + if not use then + return + end local lazy = nil - if not vim.uv.fs_stat(plugin.dir .. "/lua") then + if not has_lua then lazy = false end - return use - and { - file = vim.fn.fnamemodify(rockspec_file, ":t"), - spec = { - plugin.name, - build = "rockspec", - lazy = lazy, - }, - } - or nil + return { + file = vim.fn.fnamemodify(rockspec_file, ":t"), + spec = { + plugin.name, + build = "rockspec", + lazy = lazy, + }, + } or nil end return M From eb26e95debd7056d8c7e6e2859b5a21e522b11c4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:14:48 +0000 Subject: [PATCH 1338/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b31fb4e..d16353c 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -542,6 +542,12 @@ 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* @@ -736,12 +742,6 @@ will be added to the plugin’s spec. skip_if_doc_exists = true, }, state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things - build = { - -- Plugins can provide a `build.lua` file that will be executed when the plugin is installed - -- or updated. When the plugin spec also has a `build` command, the plugin's `build.lua` not be - -- executed. In this case, a warning message will be shown. - warn_on_override = true, - }, -- Enable profiling of lazy.nvim. This will add some overhead, -- so only enable this when you are debugging lazy.nvim profiling = { From c33b9fbf8d314ac972772792391a5ddd3df933e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:16:50 +0200 Subject: [PATCH 1339/1610] chore(main): release 11.0.0 (#1537) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 30 +++++++++++++++++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 5596560..4981afa 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "10.24.3" + ".": "11.0.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ad4080..61c2a44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,35 @@ # Changelog +## [11.0.0](https://github.com/folke/lazy.nvim/compare/v10.24.3...v11.0.0) (2024-06-24) + + +### ⚠ BREAKING CHANGES + +* new docs for v11.0 + +### Features + +* added support for plugin packages by lazy, rockspec and packspec ([3be55a4](https://github.com/folke/lazy.nvim/commit/3be55a46158cde17e2b853e531d260f3738a5346)) +* **build:** build files and functions are now async. use coroutine.yield to interrupt and report progress ([368747b](https://github.com/folke/lazy.nvim/commit/368747bc9a314b4f0745547ebdcc3fbc4d100c0a)) +* luarocks support ([f1ba2e3](https://github.com/folke/lazy.nvim/commit/f1ba2e3d057ae5c03d04134a9d538d0b2251f13b)) +* **meta:** check for dir changes for plugins already added to the rtp ([ee2ca39](https://github.com/folke/lazy.nvim/commit/ee2ca39f672a2d6f4cbb683b525e6b3d91f3fc0c)) +* new docs for v11.0 ([183f59e](https://github.com/folke/lazy.nvim/commit/183f59e2e85dea0c38ed7d16c7c7e543c0b739c7)) +* packspec ([8eba74c](https://github.com/folke/lazy.nvim/commit/8eba74c3fc41e1a364225f744022f8b3ff11d796)) +* **pkg:** import package specs in the scope of the plugin ([c1912e2](https://github.com/folke/lazy.nvim/commit/c1912e23481ba72a8d8f7a5c736f5e2547e6853e)) +* rewrite of spec resolving ([75ffe56](https://github.com/folke/lazy.nvim/commit/75ffe56f70faac43f077796b91178d2f1419f8ce)) +* spec.rocks is no longer needed & added support for installing any luarock ([fcfd548](https://github.com/folke/lazy.nvim/commit/fcfd54835da5af64c6046060f4db62c4626d209c)) + + +### Bug Fixes + +* **fragments:** prevent adding the same spec instance more than once ([dbffad6](https://github.com/folke/lazy.nvim/commit/dbffad6f44674a3c1b23c649a0abab299d7349d8)) +* **luarocks:** cleanup luarocks when deleting a plugin ([b73c57e](https://github.com/folke/lazy.nvim/commit/b73c57ed9ec8e63bbb867d21a3f3a865224b25d4)) +* **pkg:** automatically update pkgs when editing a pkg file ([7b6ddbf](https://github.com/folke/lazy.nvim/commit/7b6ddbfc137ad5d8b178a3bbf5a1338630f30625)) +* **pkg:** correctly pre-load package specs and remove them when needed during resolve ([4326d4b](https://github.com/folke/lazy.nvim/commit/4326d4b487d4facc19b375ca30cd633cf56d88ed)) +* **pkg:** make sure state dir exists ([3515cb5](https://github.com/folke/lazy.nvim/commit/3515cb518f61c02b41cd3a8d8135c9a5862a982f)) +* **pkg:** versioning and reload specs when pkg-cache is dirty ([fd8229d](https://github.com/folke/lazy.nvim/commit/fd8229d6e312e83d6bafda256adf0e650b13ca01)) +* **rocks:** only build rockspec when it has deps or an advanced build step ([9a6c219](https://github.com/folke/lazy.nvim/commit/9a6c21982638b6e2ea498514baee9186c0e60d82)) + ## [10.24.3](https://github.com/folke/lazy.nvim/compare/v10.24.2...v10.24.3) (2024-06-23) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 0919cab..7aa69b4 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -195,7 +195,7 @@ M.defaults = { debug = false, } -M.version = "10.24.3" -- x-release-please-version +M.version = "11.0.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 146de4e801f9169e79052a51365eaae789094611 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 17:36:59 +0200 Subject: [PATCH 1340/1610] fix(rocks): dont trigger rebuild for luarocks when build is overriden --- lua/lazy/core/plugin.lua | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index e93555c..f409294 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -170,10 +170,10 @@ function Spec:import(spec) self.importing = nil return self:error( "Invalid spec module: `" - .. modname - .. "`\nExpected a `table` of specs, but a `" - .. type(mod) - .. "` was returned instead" + .. modname + .. "`\nExpected a `table` of specs, but a `" + .. type(mod) + .. "` was returned instead" ) end self:normalize(mod) @@ -216,11 +216,11 @@ function M.update_state() plugin._ = plugin._ or {} if plugin.lazy == nil then local lazy = plugin._.dep - or Config.options.defaults.lazy - or plugin.event - or plugin.keys - or plugin.ft - or plugin.cmd + or Config.options.defaults.lazy + or plugin.event + or plugin.keys + or plugin.ft + or plugin.cmd plugin.lazy = lazy and true or false end if plugin.dir:find(Config.options.root, 1, true) == 1 then @@ -264,7 +264,7 @@ function M.update_rocks_state() end) for _, plugin in pairs(Config.plugins) do - if plugin._.pkg and plugin._.pkg.source == "rockspec" then + if plugin._.pkg and plugin._.pkg.source == "rockspec" and plugin.build == "rockspec" then plugin._.build = not installed[plugin.name] end end From 7f52977c1dda8fd1301f5d8a78ce154d52fd82be Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:39:01 +0200 Subject: [PATCH 1341/1610] chore(main): release 11.0.1 (#1538) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 4981afa..c656ffb 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.0.0" + ".": "11.0.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 61c2a44..060e1cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [11.0.1](https://github.com/folke/lazy.nvim/compare/v11.0.0...v11.0.1) (2024-06-24) + + +### Bug Fixes + +* **rocks:** dont trigger rebuild for luarocks when build is overriden ([146de4e](https://github.com/folke/lazy.nvim/commit/146de4e801f9169e79052a51365eaae789094611)) + ## [11.0.0](https://github.com/folke/lazy.nvim/compare/v10.24.3...v11.0.0) (2024-06-24) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 7aa69b4..3c81704 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -195,7 +195,7 @@ M.defaults = { debug = false, } -M.version = "11.0.0" -- x-release-please-version +M.version = "11.0.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From cd3581efd125c3a246a730cd0a2f7683461f486d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:42:27 +0000 Subject: [PATCH 1342/1610] chore(build): auto-generate docs --- README.md | 2 ++ doc/lazy.nvim.txt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index a950b94..7403668 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) - a [Nerd Font](https://www.nerdfonts.com/) **_(optional)_** +- [luarocks](https://luarocks.org/) to install rockspecs. + You can remove `rockspec` from `opts.pkg.sources` to disable this feature. ## 🚀 Getting Started diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index d16353c..a81b0f5 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -104,6 +104,8 @@ Table of Contents *lazy.nvim-table-of-contents* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) - a Nerd Font <https://www.nerdfonts.com/> **(optional)** +- luarocks <https://luarocks.org/> to install rockspecs. + You can remove `rockspec` from `opts.pkg.sources` to disable this feature. ============================================================================== From 79afa96b909051be1a782865171a91edd2ca71fc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 17:46:59 +0200 Subject: [PATCH 1343/1610] style: remove pkg.versions --- lua/lazy/core/config.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 3c81704..831695a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -38,7 +38,6 @@ M.defaults = { pkg = { enabled = true, 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. sources = { "lazy", From 79c2efc8d828a8ac45495624c51ca081a3243415 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:49:09 +0000 Subject: [PATCH 1344/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index a81b0f5..22e4d4b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -59,6 +59,29 @@ Table of Contents *lazy.nvim-table-of-contents* - **Lazy**: `lazy.lua` file - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + } + < +- Installing neorg <https://github.com/nvim-neorg/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 From 0f45c0d0623b4850716898a5e399c844466690f6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 17:50:27 +0200 Subject: [PATCH 1345/1610] fix(health): added luarocks check to health --- lua/lazy/health.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 6202de6..42d7f62 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -13,9 +13,15 @@ function M.check() start("lazy.nvim") if vim.fn.executable("git") == 1 then - ok("Git installed") + ok("'git' installed") else - error("Git not installed?") + error("'git' not installed?") + end + + if vim.fn.executable("luarocks") == 1 then + ok("'luarocks' installed") + else + error("'luarocks' not installed") end local sites = vim.opt.packpath:get() From 656d3d1f5b5910e50af3d67286999ff7088ebfb6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 18:02:54 +0200 Subject: [PATCH 1346/1610] feat: show rockspec deps in plugin details --- lua/lazy/pkg/rockspec.lua | 19 +++++++++++++++++-- lua/lazy/view/render.lua | 5 +++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 58fc2c5..3d0745e 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -1,12 +1,27 @@ --# selene:allow(incorrect_standard_library_use) - -local Util = require("lazy.core.util") +local Config = require("lazy.core.config") +local Util = require("lazy.util") local M = {} M.dev_suffix = "-1.rockspec" M.skip = { "lua" } +---@param plugin LazyPlugin +function M.deps(plugin) + local root = Config.options.rocks.root .. "/" .. plugin.name + local manifest_file = root .. "/lib/luarocks/rocks-5.1/manifest" + local manifest = {} + local ok = pcall(function() + local load, err = loadfile(manifest_file, "t", manifest) + if not load then + error(err) + end + load() + end) + return manifest and vim.tbl_keys(manifest.repository or {}) +end + ---@class RockSpec ---@field rockspec_format string ---@field package string diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index a34456c..7d91dd8 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -511,6 +511,11 @@ function M:details(plugin) table.insert(props, { "commit", git.commit:sub(1, 7), "LazyCommit" }) end end + local rocks = require("lazy.pkg.rockspec").deps(plugin) + if not vim.tbl_isempty(rocks) then + table.insert(props, { "rocks", vim.inspect(rocks) }) + end + if Util.file_exists(plugin.dir .. "/README.md") then table.insert(props, { "readme", "README.md" }) end From 105d4805ad58875d0b0fafe1185679539b8bc69a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 19:38:33 +0200 Subject: [PATCH 1347/1610] fix(runner): sync package specs after installing and before building --- lua/lazy/core/plugin.lua | 1 + lua/lazy/manage/init.lua | 18 +++++++++--- lua/lazy/manage/runner.lua | 59 ++++++++++++++++++++++++++------------ lua/lazy/pkg/rockspec.lua | 4 +-- 4 files changed, 58 insertions(+), 24 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f409294..ecf6d64 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -342,6 +342,7 @@ function M.load() Config.plugins[name]._ = plugin._ Config.plugins[name]._.dep = new_state.dep Config.plugins[name]._.frags = new_state.frags + Config.plugins[name]._.pkg = new_state.pkg end end Util.track() diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 01c9a54..9737538 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -83,7 +83,13 @@ function M.install(opts) "git.clone", { "git.checkout", lockfile = opts.lockfile }, "plugin.docs", - "wait", + { + "wait", + sync = function() + require("lazy.pkg").update() + Plugin.load() + end, + }, "plugin.build", }, plugins = function(plugin) @@ -92,7 +98,6 @@ function M.install(opts) }, opts):wait(function() require("lazy.manage.lock").update() require("lazy.help").update() - require("lazy.pkg").update() end) end @@ -107,7 +112,13 @@ function M.update(opts) "git.status", { "git.checkout", lockfile = opts.lockfile }, "plugin.docs", - "wait", + { + "wait", + sync = function() + require("lazy.pkg").update() + Plugin.load() + end, + }, "plugin.build", { "git.log", updated = true }, }, @@ -117,7 +128,6 @@ function M.update(opts) }, opts):wait(function() require("lazy.manage.lock").update() require("lazy.help").update() - require("lazy.pkg").update() end) end -- diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 7e3a39d..930dbc8 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -8,13 +8,15 @@ local Util = require("lazy.util") ---@field concurrency? number ---@alias PipelineStep {task:string, opts?:TaskOptions} ----@alias LazyRunnerTask {co:thread, status: {task?:LazyTask, waiting?:boolean}, plugin: LazyPlugin} +---@alias LazyRunnerTask {co:thread, status: {task?:LazyTask, waiting?:boolean}, plugin: string} ---@class Runner ----@field _plugins LazyPlugin[] +---@field _plugins string[] ---@field _running LazyRunnerTask[] ---@field _pipeline PipelineStep[] +---@field _sync PipelineStep[] ---@field _on_done fun()[] +---@field _syncing boolean ---@field _opts RunnerOpts local Runner = {} @@ -24,13 +26,11 @@ function Runner.new(opts) self._opts = opts or {} local plugins = self._opts.plugins - if type(plugins) == "function" then - self._plugins = vim.tbl_filter(plugins, Config.plugins) - else - self._plugins = plugins or Config.plugins - end + self._plugins = vim.tbl_map(function(plugin) + return plugin.name + end, type(plugins) == "function" and vim.tbl_filter(plugins, Config.plugins) or plugins or Config.plugins) table.sort(self._plugins, function(a, b) - return a.name < b.name + return a < b end) self._running = {} self._on_done = {} @@ -40,6 +40,10 @@ function Runner.new(opts) return type(step) == "string" and { task = step } or { task = step[1], opts = step } end, self._opts.pipeline) + self._sync = vim.tbl_filter(function(step) + return step.task == "wait" + end, self._pipeline) + return self end @@ -57,14 +61,31 @@ function Runner:_resume(entry) end function Runner:resume(waiting) + if self._syncing then + return true + end if waiting then - for _, entry in ipairs(self._running) do - if entry.status then - if entry.status.waiting then - entry.status.waiting = false - entry.plugin._.working = true + local sync = self._sync[1] + table.remove(self._sync, 1) + if sync then + self._syncing = true + vim.schedule(function() + if sync.opts and type(sync.opts.sync) == "function" then + sync.opts.sync(self) end - end + for _, entry in ipairs(self._running) do + if entry.status then + if entry.status.waiting then + entry.status.waiting = false + local plugin = Config.plugins[entry.plugin] + if plugin then + plugin._.working = true + end + end + end + end + self._syncing = false + end) end end local running = 0 @@ -78,7 +99,7 @@ function Runner:resume(waiting) end end end - return running > 0 or (not waiting and self:resume(true)) + return self._syncing or running > 0 or (not waiting and self:resume(true)) end function Runner:start() @@ -88,7 +109,7 @@ function Runner:start() if ok then table.insert(self._running, { co = co, status = {}, plugin = plugin }) else - Util.error("Could not start tasks for " .. plugin.name .. "\n" .. err) + Util.error("Could not start tasks for " .. plugin .. "\n" .. err) end end @@ -107,8 +128,9 @@ function Runner:start() end ---@async ----@param plugin LazyPlugin -function Runner:run_pipeline(plugin) +---@param name string +function Runner:run_pipeline(name) + local plugin = Config.plugins[name] plugin._.working = true coroutine.yield() for _, step in ipairs(self._pipeline) do @@ -117,6 +139,7 @@ function Runner:run_pipeline(plugin) coroutine.yield({ waiting = true }) plugin._.working = true else + plugin = Config.plugins[name] or plugin local task = self:queue(plugin, step.task, step.opts) if task then coroutine.yield({ task = task }) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 3d0745e..72defae 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -12,14 +12,14 @@ function M.deps(plugin) local root = Config.options.rocks.root .. "/" .. plugin.name local manifest_file = root .. "/lib/luarocks/rocks-5.1/manifest" local manifest = {} - local ok = pcall(function() + pcall(function() local load, err = loadfile(manifest_file, "t", manifest) if not load then error(err) end load() end) - return manifest and vim.tbl_keys(manifest.repository or {}) + return vim.tbl_keys(manifest.repository or {}) end ---@class RockSpec From 07c067a1a82bb0988179e1887bba9df4721b3ea7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 19:44:07 +0200 Subject: [PATCH 1348/1610] feat: make it easier to disable luarocks --- lua/lazy/core/config.lua | 3 ++- lua/lazy/pkg/init.lua | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 831695a..bb0e2fa 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -41,11 +41,12 @@ M.defaults = { -- the first package source that is found for a plugin will be used. sources = { "lazy", - "rockspec", + "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/", }, diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index 2d5b7d9..ee0daa4 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -32,10 +32,12 @@ function M.update() ---@type LazyPkgSource[] local sources = {} for _, s in ipairs(Config.options.pkg.sources) do - sources[#sources + 1] = { - name = s, - get = require("lazy.pkg." .. s).get, - } + if s ~= "rockspec" or Config.options.rocks.enabled then + sources[#sources + 1] = { + name = s, + get = require("lazy.pkg." .. s).get, + } + end end ---@type LazyPkgCache From e3ee51b6680a116649da56f6c651d53c3e47be4e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 19:44:22 +0200 Subject: [PATCH 1349/1610] fix(health): show missing luarocks as warning --- lua/lazy/health.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 42d7f62..3bfc3f5 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -21,7 +21,7 @@ function M.check() if vim.fn.executable("luarocks") == 1 then ok("'luarocks' installed") else - error("'luarocks' not installed") + warn("'luarocks' not installed") end local sites = vim.opt.packpath:get() From bd397ff1e3c5411ca4adbdbb5cc54b86b5768a6f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:45:13 +0000 Subject: [PATCH 1350/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 22e4d4b..ab6a6f4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -68,11 +68,12 @@ Table of Contents *lazy.nvim-table-of-contents* -- the first package source that is found for a plugin will be used. sources = { "lazy", - "rockspec", + "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/", }, From 77edda11bf82864585875cecb0c370e31bb06a85 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 19:55:09 +0200 Subject: [PATCH 1351/1610] test: fixes --- lua/lazy/manage/runner.lua | 40 +++++++++++++++++++++++++------------- tests/manage/task_spec.lua | 2 +- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 930dbc8..9b766df 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -11,7 +11,7 @@ local Util = require("lazy.util") ---@alias LazyRunnerTask {co:thread, status: {task?:LazyTask, waiting?:boolean}, plugin: string} ---@class Runner ----@field _plugins string[] +---@field _plugins table<string,LazyPlugin> ---@field _running LazyRunnerTask[] ---@field _pipeline PipelineStep[] ---@field _sync PipelineStep[] @@ -26,12 +26,17 @@ function Runner.new(opts) self._opts = opts or {} local plugins = self._opts.plugins - self._plugins = vim.tbl_map(function(plugin) - return plugin.name - end, type(plugins) == "function" and vim.tbl_filter(plugins, Config.plugins) or plugins or Config.plugins) - table.sort(self._plugins, function(a, b) - return a < b - end) + ---@type LazyPlugin[] + local pp = {} + if type(plugins) == "function" then + pp = vim.tbl_filter(plugins, Config.plugins) + else + pp = plugins or Config.plugins + end + self._plugins = {} + for _, plugin in ipairs(pp) do + self._plugins[plugin.name] = plugin + end self._running = {} self._on_done = {} @@ -47,6 +52,10 @@ function Runner.new(opts) return self end +function Runner:plugin(name) + return Config.plugins[name] or self._plugins[name] +end + ---@param entry LazyRunnerTask function Runner:_resume(entry) if entry.status.task and not entry.status.task:is_done() then @@ -77,7 +86,7 @@ function Runner:resume(waiting) if entry.status then if entry.status.waiting then entry.status.waiting = false - local plugin = Config.plugins[entry.plugin] + local plugin = self:plugin(entry.plugin) if plugin then plugin._.working = true end @@ -103,13 +112,16 @@ function Runner:resume(waiting) end function Runner:start() - for _, plugin in pairs(self._plugins) do + ---@type string[] + local names = vim.tbl_keys(self._plugins) + table.sort(names) + for _, name in pairs(names) do local co = coroutine.create(self.run_pipeline) - local ok, err = coroutine.resume(co, self, plugin) + local ok, err = coroutine.resume(co, self, name) if ok then - table.insert(self._running, { co = co, status = {}, plugin = plugin }) + table.insert(self._running, { co = co, status = {}, plugin = name }) else - Util.error("Could not start tasks for " .. plugin .. "\n" .. err) + Util.error("Could not start tasks for " .. name .. "\n" .. err) end end @@ -130,7 +142,7 @@ end ---@async ---@param name string function Runner:run_pipeline(name) - local plugin = Config.plugins[name] + local plugin = self:plugin(name) plugin._.working = true coroutine.yield() for _, step in ipairs(self._pipeline) do @@ -139,7 +151,7 @@ function Runner:run_pipeline(name) coroutine.yield({ waiting = true }) plugin._.working = true else - plugin = Config.plugins[name] or plugin + plugin = self:plugin(name) local task = self:queue(plugin, step.task, step.opts) if task then coroutine.yield({ task = task }) diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index 76608af..bbb8704 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -102,7 +102,7 @@ describe("task", function() task:start() assert(task:is_running()) task:wait() - assert(task.output == "foo\nbar\n" or task.output == "bar\nfoo\n") + assert(task.output == "foo\nbar\n" or task.output == "bar\nfoo\n", task.output) assert(done) assert(not task.error) end) From ae4881d36e7f589124f8eb7febfc6a8b58f8e027 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 20:03:00 +0200 Subject: [PATCH 1352/1610] fix(health): only check for luarocks when luarocks is enabled. --- lua/lazy/health.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 3bfc3f5..c0a8981 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -18,10 +18,12 @@ function M.check() error("'git' not installed?") end - if vim.fn.executable("luarocks") == 1 then - ok("'luarocks' installed") - else - warn("'luarocks' not installed") + if Config.options.rocks.enabled then + if vim.fn.executable("luarocks") == 1 then + ok("'luarocks' installed") + else + error("'luarocks' not installed. Either install it or set opts.rocks.enabled = false") + end end local sites = vim.opt.packpath:get() From b6b0c4c15c8a247eb7baace4f408b76d595c448a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 20:06:31 +0200 Subject: [PATCH 1353/1610] chore(main): release 11.1.0 (#1539) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 16 ++++++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index c656ffb..8d8b6a5 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.0.1" + ".": "11.1.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 060e1cd..b2af7be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [11.1.0](https://github.com/folke/lazy.nvim/compare/v11.0.1...v11.1.0) (2024-06-24) + + +### Features + +* make it easier to disable luarocks ([07c067a](https://github.com/folke/lazy.nvim/commit/07c067a1a82bb0988179e1887bba9df4721b3ea7)) +* show rockspec deps in plugin details ([656d3d1](https://github.com/folke/lazy.nvim/commit/656d3d1f5b5910e50af3d67286999ff7088ebfb6)) + + +### Bug Fixes + +* **health:** added luarocks check to health ([0f45c0d](https://github.com/folke/lazy.nvim/commit/0f45c0d0623b4850716898a5e399c844466690f6)) +* **health:** only check for luarocks when luarocks is enabled. ([ae4881d](https://github.com/folke/lazy.nvim/commit/ae4881d36e7f589124f8eb7febfc6a8b58f8e027)) +* **health:** show missing luarocks as warning ([e3ee51b](https://github.com/folke/lazy.nvim/commit/e3ee51b6680a116649da56f6c651d53c3e47be4e)) +* **runner:** sync package specs after installing and before building ([105d480](https://github.com/folke/lazy.nvim/commit/105d4805ad58875d0b0fafe1185679539b8bc69a)) + ## [11.0.1](https://github.com/folke/lazy.nvim/compare/v11.0.0...v11.0.1) (2024-06-24) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index bb0e2fa..4d1aa2b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -195,7 +195,7 @@ M.defaults = { debug = false, } -M.version = "11.0.1" -- x-release-please-version +M.version = "11.1.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 0081c95aeea1b758568834be1ccacee7299bfb47 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 20:22:57 +0200 Subject: [PATCH 1354/1610] style: allow false for build --- lua/lazy/types.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 4fd033c..0a10467 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -29,7 +29,7 @@ ---@field init? fun(self:LazyPlugin) Will always be run ---@field deactivate? fun(self:LazyPlugin) Unload/Stop a plugin ---@field config? fun(self:LazyPlugin, opts:table)|true Will be executed when loading the plugin ----@field build? string|async fun(self:LazyPlugin)|(string|async fun(self:LazyPlugin))[] +---@field build? false|string|async fun(self:LazyPlugin)|(string|async fun(self:LazyPlugin))[] ---@field opts? PluginOpts ---@class LazyPluginHandlers From 972baa615b89e84a67faa62f364c9bf2d18f1736 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 18:23:56 +0000 Subject: [PATCH 1355/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ab6a6f4..e88747b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -272,9 +272,9 @@ SPEC LOADING *lazy.nvim-🔌-plugin-spec-spec-loading* SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup* - ---------------------------------------------------------------------------------------------------- + --------------------------------------------------------------------------------------------------- Property Type Description - ---------- ----------------------------- ----------------------------------------------------------- + ---------- ----------------------------- ---------------------------------------------------------- init fun(LazyPlugin) init functions are always executed during startup opts table or opts should be a table (will be merged with parent specs), @@ -285,18 +285,19 @@ SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup* 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. See also - opts. To use the default implementation without opts set - config to true. + Lazy uses several heuristics to determine the plugin’s + MAIN module automatically based on the plugin’s name. See + also opts. To use the default implementation without opts + set config to true. main string? You can specify the main module to use for config() and - opts(), in case it can not be determined automatically. See - config() + 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. - a list of build commands See Building for more information. - ---------------------------------------------------------------------------------------------------- + false or a list of build See Building for more information. + commands + --------------------------------------------------------------------------------------------------- SPEC LAZY LOADING *lazy.nvim-🔌-plugin-spec-spec-lazy-loading* From 1446f6cfbb4ca0a7ee0baf3acc86ab5e4be5ab22 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 21:56:43 +0200 Subject: [PATCH 1356/1610] perf: minimize meta rebuild when loading specs --- lua/lazy/core/loader.lua | 10 ++++++++-- lua/lazy/core/meta.lua | 16 ++++++++++++++- lua/lazy/core/plugin.lua | 11 ++++++++-- lua/lazy/core/util.lua | 43 ++++++++++++++++++++++++++++++++-------- 4 files changed, 67 insertions(+), 13 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 6f426d9..7209362 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -524,7 +524,7 @@ function M.colorscheme(name) end function M.auto_load(modname, modpath) - local plugin = Plugin.find(modpath) + local plugin = Plugin.find(modpath, { fast = not M.did_handlers }) if plugin and modpath:find(plugin.dir, 1, true) == 1 then plugin._.rtp_loaded = true -- don't load if: @@ -545,8 +545,14 @@ end ---@param modname string function M.loader(modname) - local paths = Util.get_unloaded_rtp(modname) + local paths, cached = Util.get_unloaded_rtp(modname, { cache = true }) local ret = Cache.find(modname, { rtp = false, paths = paths })[1] + + if not ret and cached then + paths = Util.get_unloaded_rtp(modname) + ret = Cache.find(modname, { rtp = false, paths = paths })[1] + end + if ret then M.auto_load(modname, ret.modpath) local mod = package.loaded[modname] diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 679a16f..4645f1b 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -117,6 +117,14 @@ end --- Rebuild all plugins based on dirty fragments, --- or dirty plugins. Will remove plugins that no longer have fragments. function M:rebuild() + local frag_count = vim.tbl_count(self.fragments.dirty) + local plugin_count = vim.tbl_count(self.dirty) + if frag_count == 0 and plugin_count == 0 then + return + end + if Config.options.debug then + Util.track("rebuild plugins frags=" .. frag_count .. " plugins=" .. plugin_count) + end for fid in pairs(self.fragments.dirty) do local meta = self.frag_to_meta[fid] if meta then @@ -143,6 +151,9 @@ function M:rebuild() for n, _ in pairs(self.dirty) do self:_rebuild(n) end + if Config.options.debug then + Util.track() + end end --- Rebuild a single plugin. @@ -150,6 +161,10 @@ end --- This also resolves dependencies, dep, optional, dir, dev, and url. ---@param name string function M:_rebuild(name) + if not self.dirty[name] then + return + end + self.dirty[name] = nil local plugin = self.plugins[name] if not plugin or #plugin._.frags == 0 then self.plugins[name] = nil @@ -225,7 +240,6 @@ function M:_rebuild(name) setmetatable(plugin, { __index = super }) - self.dirty[plugin.name] = nil return plugin end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index ecf6d64..062d5d2 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -362,17 +362,24 @@ end -- Finds the plugin that has this path ---@param path string -function M.find(path) +---@param opts? {fast?:boolean} +function M.find(path, opts) if not Config.spec then return end + opts = opts or {} local lua = path:find("/lua/", 1, true) if lua then local name = path:sub(1, lua - 1) local slash = name:reverse():find("/", 1, true) if slash then name = name:sub(#name - slash + 2) - return name and Config.plugins[name] or Config.spec.plugins[name] or nil + if name then + if opts.fast then + return Config.spec.meta.plugins[name] + end + return Config.spec.plugins[name] + end end end end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 0504dd8..9a65a85 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -238,18 +238,33 @@ function M.walkmods(root, fn, modname) end ---@param modname string -function M.get_unloaded_rtp(modname) - modname = modname:gsub("/", ".") - local idx = modname:find(".", 1, true) - local topmod = idx and modname:sub(1, idx - 1) or modname - topmod = M.normname(topmod) +---@return string +function M.topmod(modname) + return modname:match("^[^./]+") or modname +end +---@type table<string, string[]> +M.unloaded_cache = {} + +---@param modname string +---@param opts? {cache?:boolean} +function M.get_unloaded_rtp(modname, opts) + opts = opts or {} + + local topmod = M.topmod(modname) + if opts.cache and M.unloaded_cache[topmod] then + return M.unloaded_cache[topmod], true + end + + local norm = M.normname(topmod) + + ---@type string[] local rtp = {} 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 topmod == M.normname(plugin.name) then + if norm == M.normname(plugin.name) then table.insert(rtp, 1, plugin.dir) else table.insert(rtp, plugin.dir) @@ -257,15 +272,27 @@ function M.get_unloaded_rtp(modname) end end end - return rtp + M.unloaded_cache[topmod] = rtp + return rtp, false end function M.find_root(modname) + local paths, cached = M.get_unloaded_rtp(modname, { cache = true }) + local ret = require("lazy.core.cache").find(modname, { rtp = true, - paths = M.get_unloaded_rtp(modname), + paths = paths, patterns = { "", ".lua" }, })[1] + + if not ret and cached then + paths = M.get_unloaded_rtp(modname) + ret = require("lazy.core.cache").find(modname, { + rtp = false, + paths = paths, + patterns = { "", ".lua" }, + })[1] + end if ret then local root = ret.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") return root From a089d43dba7438532c56e1c582c5974713bd48f8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 21:57:34 +0200 Subject: [PATCH 1357/1610] feat: rewrite some known plugins to lazy specs instead of luarocks (plenary.nvim). Closes #1540 --- lua/lazy/pkg/init.lua | 3 ++- lua/lazy/pkg/rockspec.lua | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index ee0daa4..a81ab9c 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -14,6 +14,7 @@ M.dirty = false ---@class LazyPkgSpec ---@field file string +---@field source? string ---@field spec? LazySpec ---@field code? string @@ -54,7 +55,7 @@ function M.update() local pkg = { name = plugin.name, dir = plugin.dir, - source = source.name, + source = spec.source or source.name, file = spec.file, spec = spec.spec or {}, } diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 72defae..0eba34c 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -7,6 +7,10 @@ local M = {} M.dev_suffix = "-1.rockspec" M.skip = { "lua" } +M.rewrites = { + ["plenary.nvim"] = { "nvim-lua/plenary.nvim", lazy = true }, +} + ---@param plugin LazyPlugin function M.deps(plugin) local root = Config.options.rocks.root .. "/" .. plugin.name @@ -32,6 +36,14 @@ end ---@param plugin LazyPlugin ---@return LazyPkgSpec? function M.get(plugin) + if M.rewrites[plugin.name] then + return { + file = "rewrite", + source = "lazy", + spec = M.rewrites[plugin.name], + } + end + local rockspec_file ---@type string? Util.ls(plugin.dir, function(path, name, t) if t == "file" and name:sub(-#M.dev_suffix) == M.dev_suffix then @@ -59,9 +71,16 @@ function M.get(plugin) local has_lua = not not vim.uv.fs_stat(plugin.dir .. "/lua") + ---@type LazyPluginSpec + local rewrites = {} + ---@param dep string local rocks = vim.tbl_filter(function(dep) local name = dep:gsub("%s.*", "") + if M.rewrites[name] then + table.insert(rewrites, M.rewrites[name]) + return false + end return not vim.tbl_contains(M.skip, name) end, rockspec.dependencies or {}) @@ -75,6 +94,12 @@ function M.get(plugin) ) if not use then + if #rewrites > 0 then + return { + file = vim.fn.fnamemodify(rockspec_file, ":t"), + spec = rewrites, + } + end return end @@ -90,7 +115,7 @@ function M.get(plugin) build = "rockspec", lazy = lazy, }, - } or nil + } end return M From 9bcbbc17a77680992fc9afcf3819f3b5c8f06bba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 21:59:16 +0200 Subject: [PATCH 1358/1610] chore(main): release 11.2.0 (#1541) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 8d8b6a5..af8cc29 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.1.0" + ".": "11.2.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index b2af7be..7df3b59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [11.2.0](https://github.com/folke/lazy.nvim/compare/v11.1.0...v11.2.0) (2024-06-24) + + +### Features + +* rewrite some known plugins to lazy specs instead of luarocks (plenary.nvim). Closes [#1540](https://github.com/folke/lazy.nvim/issues/1540) ([a089d43](https://github.com/folke/lazy.nvim/commit/a089d43dba7438532c56e1c582c5974713bd48f8)) + + +### Performance Improvements + +* minimize meta rebuild when loading specs ([1446f6c](https://github.com/folke/lazy.nvim/commit/1446f6cfbb4ca0a7ee0baf3acc86ab5e4be5ab22)) + ## [11.1.0](https://github.com/folke/lazy.nvim/compare/v11.0.1...v11.1.0) (2024-06-24) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4d1aa2b..3312d16 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -195,7 +195,7 @@ M.defaults = { debug = false, } -M.version = "11.1.0" -- x-release-please-version +M.version = "11.2.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 62a47b921fbffb3c1c8088a731029ae234f98851 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 24 Jun 2024 23:42:51 +0200 Subject: [PATCH 1359/1610] fix(loader): no need to check plugin.dir in auto_load --- lua/lazy/core/loader.lua | 2 +- lua/lazy/pkg/init.lua | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 7209362..597933b 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -525,7 +525,7 @@ end function M.auto_load(modname, modpath) local plugin = Plugin.find(modpath, { fast = not M.did_handlers }) - if plugin and modpath:find(plugin.dir, 1, true) == 1 then + if plugin then plugin._.rtp_loaded = true -- don't load if: -- * handlers haven't been setup yet diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index a81ab9c..b9620ca 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -1,5 +1,5 @@ local Config = require("lazy.core.config") -local Util = require("lazy.util") +local Util = require("lazy.core.util") local M = {} M.VERSION = 10 @@ -71,9 +71,10 @@ function M.update() table.sort(ret.pkgs, function(a, b) return a.name < b.name end) - local code = "return " .. Util.dump(ret) + local U = require("lazy.util") + local code = "return " .. U.dump(ret) vim.fn.mkdir(vim.fn.fnamemodify(Config.options.pkg.cache, ":h"), "p") - Util.write_file(Config.options.pkg.cache, code) + U.write_file(Config.options.pkg.cache, code) M.dirty = false M.cache = nil end From 378bfb465673a747e9e9f966e518063499e20cfe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 23:44:20 +0200 Subject: [PATCH 1360/1610] chore(main): release 11.2.1 (#1542) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index af8cc29..60f4637 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.2.0" + ".": "11.2.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 7df3b59..c19d070 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [11.2.1](https://github.com/folke/lazy.nvim/compare/v11.2.0...v11.2.1) (2024-06-24) + + +### Bug Fixes + +* **loader:** no need to check plugin.dir in auto_load ([62a47b9](https://github.com/folke/lazy.nvim/commit/62a47b921fbffb3c1c8088a731029ae234f98851)) + ## [11.2.0](https://github.com/folke/lazy.nvim/compare/v11.1.0...v11.2.0) (2024-06-24) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 3312d16..df520c8 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -195,7 +195,7 @@ M.defaults = { debug = false, } -M.version = "11.2.0" -- x-release-please-version +M.version = "11.2.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From dea1f687fe6e15eb3098557a69d44231ebcb6cf5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 00:31:32 +0200 Subject: [PATCH 1361/1610] fix(fragments): check for empty plugin names --- lua/lazy/core/fragments.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/fragments.lua b/lua/lazy/core/fragments.lua index e0e6723..89b83f5 100644 --- a/lua/lazy/core/fragments.lua +++ b/lua/lazy/core/fragments.lua @@ -124,7 +124,7 @@ function M:add(plugin) fragment.name = fragment.name or fragment.url and self.spec.get_name(fragment.url) or fragment.dir and self.spec.get_name(fragment.dir) - if not fragment.name then + if not fragment.name or fragment.name == "" then return self.spec:error("Invalid plugin spec " .. vim.inspect(plugin)) end From d87da7667939deff2ed8b5a3c198d9ea2e03fee4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 07:55:30 +0200 Subject: [PATCH 1362/1610] feat(rocks): use hererocks to install luarocks when luarocks is not found --- lua/lazy/core/config.lua | 2 ++ lua/lazy/core/meta.lua | 8 ++++++++ lua/lazy/core/plugin.lua | 4 +++- lua/lazy/manage/task/plugin.lua | 20 +++++++++++++++++++- lua/lazy/pkg/init.lua | 26 ++++++++++++++++++++++++++ 5 files changed, 58 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index df520c8..a119737 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -49,6 +49,8 @@ M.defaults = { enabled = true, root = vim.fn.stdpath("data") .. "/lazy-rocks", server = "https://nvim-neorocks.github.io/rocks-binaries/", + -- use hererocks to install luarocks. + hererocks = vim.fn.executable("luarocks") == 0, }, dev = { ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 4645f1b..6978d96 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -33,7 +33,9 @@ function M:load_pkgs() if not Config.options.pkg.enabled then return end + local have_rockspec = false for _, pkg in ipairs(Pkg.get()) do + have_rockspec = have_rockspec or pkg.source == "rockspec" local meta, fragment = self:add(pkg.spec) if meta and fragment then meta._.pkg = pkg @@ -46,6 +48,12 @@ function M:load_pkgs() self.pkgs[pkg.dir] = fragment.id end end + if have_rockspec then + local hererocks = Pkg.hererocks() + if hererocks then + self:add(hererocks) + end + end end --- Remove a plugin and all its fragments. diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 062d5d2..cfc7b62 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -264,8 +264,10 @@ function M.update_rocks_state() end) for _, plugin in pairs(Config.plugins) do - if plugin._.pkg and plugin._.pkg.source == "rockspec" and plugin.build == "rockspec" then + if plugin.build == "rockspec" then plugin._.build = not installed[plugin.name] + elseif plugin.name == "hererocks" then + plugin._.build = not vim.uv.fs_stat(Config.options.rocks.root .. "/hererocks") end end end diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index cd01a25..6803722 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -18,8 +18,25 @@ local B = {} ---@param task LazyTask function B.rockspec(task) + ---@type table<string, string> + local env = {} + + if Config.options.rocks.hererocks then + local hererocks = Config.options.rocks.root .. "/hererocks" + local sep = jit.os:find("Windows") and ";" or ":" + local path = vim.split(vim.env.PATH, sep) + table.insert(path, 1, hererocks .. "/bin") + env = { + PATH = table.concat(path, sep), + } + local plugin = Config.plugins.hererocks + -- hererocks is still building, so skip for now + if plugin and plugin._.build then + return + end + end + local root = Config.options.rocks.root .. "/" .. task.plugin.name - vim.fn.mkdir(root, "p") task:spawn("luarocks", { args = { "--tree", @@ -33,6 +50,7 @@ function B.rockspec(task) "--force-fast", }, cwd = task.plugin.dir, + env = env, }) end diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index b9620ca..3a7dd4c 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -112,6 +112,32 @@ local function _load() Util.track() end +---@return LazyPluginSpec?, string? +function M.hererocks() + if not (Config.options.rocks.enabled and Config.options.rocks.hererocks) then + return + end + + local root = Config.options.rocks.root .. "/hererocks" + + local cmd = { + "python", + "hererocks.py", + "--verbose", + "-l", + "5.1", + "-r", + "latest", + root, + } + + return { + "luarocks/hererocks", + lazy = true, + build = table.concat(cmd, " "), + }, root +end + ---@param dir string ---@return LazyPkg? ---@overload fun():LazyPkg[] From 0a5839ceeaec6d550f0e8d425d4a478daac176ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 05:58:24 +0000 Subject: [PATCH 1363/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e88747b..64dac25 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -624,17 +624,19 @@ will be added to the plugin’s spec. pkg = { enabled = true, 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. sources = { "lazy", - "rockspec", + "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. + hererocks = vim.fn.executable("luarocks") == 0, }, dev = { ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects From 45cd8d3f0fab197e6e0391cffa38879bdda4c2cd Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 06:40:50 +0200 Subject: [PATCH 1364/1610] fix(rocks): hererocks paths on windows --- lua/lazy/manage/task/plugin.lua | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 6803722..cfdf8e0 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -21,14 +21,22 @@ function B.rockspec(task) ---@type table<string, string> local env = {} + local luarocks = "luarocks" if Config.options.rocks.hererocks then - local hererocks = Config.options.rocks.root .. "/hererocks" - local sep = jit.os:find("Windows") and ";" or ":" + local is_win = jit.os:find("Windows") + local sep = is_win and ";" or ":" + local hererocks = Config.options.rocks.root .. "/hererocks/bin" + if is_win then + hererocks = hererocks:gsub("/", "\\") + end local path = vim.split(vim.env.PATH, sep) - table.insert(path, 1, hererocks .. "/bin") + table.insert(path, 1, hererocks) env = { PATH = table.concat(path, sep), } + if is_win then + luarocks = luarocks .. ".bat" + end local plugin = Config.plugins.hererocks -- hererocks is still building, so skip for now if plugin and plugin._.build then @@ -37,7 +45,7 @@ function B.rockspec(task) end local root = Config.options.rocks.root .. "/" .. task.plugin.name - task:spawn("luarocks", { + task:spawn(luarocks, { args = { "--tree", root, From 9005e8ede7ff9e6434818c32d99860d7154d0432 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 06:48:06 +0000 Subject: [PATCH 1365/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 64dac25..e88747b 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -624,19 +624,17 @@ will be added to the plugin’s spec. pkg = { enabled = true, 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. sources = { "lazy", - "rockspec", -- will only be used when rocks.enabled is true + "rockspec", "packspec", }, }, rocks = { - enabled = true, root = vim.fn.stdpath("data") .. "/lazy-rocks", server = "https://nvim-neorocks.github.io/rocks-binaries/", - -- use hererocks to install luarocks. - hererocks = vim.fn.executable("luarocks") == 0, }, dev = { ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects From 7d3f69104fb39d3e6e12f808204b3a7b38f86916 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 13:23:25 +0200 Subject: [PATCH 1366/1610] fix(rocks): better errors / warnings when something goes wrong with luarocks --- lua/lazy/core/loader.lua | 4 +- lua/lazy/core/meta.lua | 8 -- lua/lazy/core/plugin.lua | 14 ++ lua/lazy/core/util.lua | 1 + lua/lazy/health.lua | 79 ++++++++++-- lua/lazy/manage/task/init.lua | 25 ++++ lua/lazy/manage/task/plugin.lua | 49 +------ lua/lazy/pkg/init.lua | 26 ---- lua/lazy/pkg/rockspec.lua | 218 +++++++++++++++++++++++++++----- lua/lazy/view/colors.lua | 15 ++- lua/lazy/view/render.lua | 38 +++++- 11 files changed, 336 insertions(+), 141 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 597933b..c5cdca2 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -464,10 +464,8 @@ function M.add_to_rtp(plugin) local rtp = vim.api.nvim_get_runtime_file("", true) local idx_dir, idx_after - local is_win = jit.os:find("Windows") - for i, path in ipairs(rtp) do - if is_win then + if Util.is_win then path = Util.norm(path) end if path == Config.me then diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 6978d96..4645f1b 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -33,9 +33,7 @@ function M:load_pkgs() if not Config.options.pkg.enabled then return end - local have_rockspec = false for _, pkg in ipairs(Pkg.get()) do - have_rockspec = have_rockspec or pkg.source == "rockspec" local meta, fragment = self:add(pkg.spec) if meta and fragment then meta._.pkg = pkg @@ -48,12 +46,6 @@ function M:load_pkgs() self.pkgs[pkg.dir] = fragment.id end end - if have_rockspec then - local hererocks = Pkg.hererocks() - if hererocks then - self:add(hererocks) - end - end end --- Remove a plugin and all its fragments. diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index cfc7b62..8c746a9 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -335,6 +335,20 @@ function M.load() lazy._.loaded = {} end + -- add hererocks when enabled and needed + if Config.options.rocks.hererocks then + for _, plugin in pairs(Config.spec.plugins) do + if plugin.build == "rockspec" then + Config.spec.meta:add({ + "luarocks/hererocks", + build = "rockspec", + lazy = true, + }) + break + end + end + end + local existing = Config.plugins Config.plugins = Config.spec.plugins -- copy state. This wont do anything during startup diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 9a65a85..f42cf6a 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -5,6 +5,7 @@ local M = {} ---@type LazyProfile[] M._profiles = { { name = "lazy" } } +M.is_win = jit.os:find("Windows") ---@param data (string|{[string]:string})? ---@param time number? diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index c0a8981..3199f75 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -8,23 +8,62 @@ local start = vim.health.start or vim.health.report_start local ok = vim.health.ok or vim.health.report_ok local warn = vim.health.warn or vim.health.report_warn local error = vim.health.error or vim.health.report_error +local info = vim.health.info or vim.health.report_info + +---@class LazyHealth +---@field error? fun(msg:string) +---@field warn? fun(msg:string) +---@field ok? fun(msg:string) + +---@class LazyHealthHave : LazyHealth +---@field version? string +---@field version_pattern? string +---@field optional? boolean + +---@param cmd string|string[] +---@param opts? LazyHealthHave +function M.have(cmd, opts) + opts = vim.tbl_extend("force", { + error = error, + warn = warn, + ok = ok, + version = "--version", + }, opts or {}) + + cmd = type(cmd) == "table" and cmd or { cmd } + ---@cast cmd string[] + ---@type string? + local found + for _, c in ipairs(cmd) do + if vim.fn.executable(c) == 1 then + local version = vim.fn.system(c .. " " .. opts.version) or "" + version = vim.trim(vim.split(version, "\n")[1]) + 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)) + else + found = ("{%s} `%s`"):format(c, version) + break + end + end + end + if found then + opts.ok(found) + return true + else + (opts.optional and opts.warn or opts.error)( + ("{%s} %snot installed"):format( + table.concat(cmd, "} or {"), + opts.version_pattern and "version `" .. opts.version_pattern .. "` " or "" + ) + ) + end +end function M.check() start("lazy.nvim") - if vim.fn.executable("git") == 1 then - ok("'git' installed") - else - error("'git' not installed?") - end - - if Config.options.rocks.enabled then - if vim.fn.executable("luarocks") == 1 then - ok("'luarocks' installed") - else - error("'luarocks' not installed. Either install it or set opts.rocks.enabled = false") - end - end + M.have("git") local sites = vim.opt.packpath:get() local default_site = vim.fn.stdpath("data") .. "/site" @@ -45,7 +84,7 @@ function M.check() ok("no existing packages found by other package managers") end - for _, name in ipairs({ "packer", "plugged", "paq" }) do + for _, name in ipairs({ "packer", "plugged", "paq", "pckr", "mini.deps" }) do for _, path in ipairs(vim.opt.rtp:get()) do if path:find(name, 1, true) then error("Found paths on the rtp from another plugin manager `" .. name .. "`") @@ -82,6 +121,18 @@ function M.check() end end end + + start("luarocks") + if Config.options.rocks.enabled then + if Config.options.rocks.hererocks then + info("checking `hererocks` installation") + else + info("checking `luarocks` installation") + end + require("lazy.pkg.rockspec").check({ error = error, warn = warn, ok = ok }) + else + ok("luarocks disabled") + end end ---@param plugin LazyPlugin diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index d86ef5f..df8e792 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -12,6 +12,7 @@ local Process = require("lazy.manage.process") ---@field output string ---@field status string ---@field error? string +---@field warn? string ---@field private _task fun(task:LazyTask) ---@field private _running LazyPluginState[] ---@field private _started? number @@ -74,6 +75,30 @@ function Task:start() self:_check() end +---@param msg string|string[] +---@param severity? vim.diagnostic.Severity +function Task:notify(msg, severity) + local var = severity == vim.diagnostic.severity.ERROR and "error" + or severity == vim.diagnostic.severity.WARN and "warn" + or "output" + msg = type(msg) == "table" and table.concat(msg, "\n") or msg + ---@cast msg string + ---@diagnostic disable-next-line: no-unknown + self[var] = self[var] and (self[var] .. "\n" .. msg) or msg + self.status = msg + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) +end + +---@param msg string|string[] +function Task:notify_error(msg) + self:notify(msg, vim.diagnostic.severity.ERROR) +end + +---@param msg string|string[] +function Task:notify_warn(msg) + self:notify(msg, vim.diagnostic.severity.WARN) +end + ---@param fn async fun() function Task:async(fn) local co = coroutine.create(fn) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index cfdf8e0..cb426ec 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -1,5 +1,6 @@ local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") +local Rocks = require("lazy.pkg.rockspec") local Util = require("lazy.util") ---@type table<string, LazyTaskDef> @@ -16,52 +17,6 @@ end local B = {} ----@param task LazyTask -function B.rockspec(task) - ---@type table<string, string> - local env = {} - - local luarocks = "luarocks" - if Config.options.rocks.hererocks then - local is_win = jit.os:find("Windows") - local sep = is_win and ";" or ":" - local hererocks = Config.options.rocks.root .. "/hererocks/bin" - if is_win then - hererocks = hererocks:gsub("/", "\\") - end - local path = vim.split(vim.env.PATH, sep) - table.insert(path, 1, hererocks) - env = { - PATH = table.concat(path, sep), - } - if is_win then - luarocks = luarocks .. ".bat" - end - local plugin = Config.plugins.hererocks - -- hererocks is still building, so skip for now - if plugin and plugin._.build then - return - end - end - - local root = Config.options.rocks.root .. "/" .. task.plugin.name - task:spawn(luarocks, { - args = { - "--tree", - root, - "--server", - Config.options.rocks.server, - "--dev", - "--lua-version", - "5.1", - "make", - "--force-fast", - }, - cwd = task.plugin.dir, - env = env, - }) -end - ---@param task LazyTask ---@param build string function B.cmd(task, build) @@ -114,7 +69,7 @@ M.build = { build(self.plugin) end) elseif build == "rockspec" then - B.rockspec(self) + Rocks.build(self) elseif build:sub(1, 1) == ":" then B.cmd(self, build) elseif build:match("%.lua$") then diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index 3a7dd4c..b9620ca 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -112,32 +112,6 @@ local function _load() Util.track() end ----@return LazyPluginSpec?, string? -function M.hererocks() - if not (Config.options.rocks.enabled and Config.options.rocks.hererocks) then - return - end - - local root = Config.options.rocks.root .. "/hererocks" - - local cmd = { - "python", - "hererocks.py", - "--verbose", - "-l", - "5.1", - "-r", - "latest", - root, - } - - return { - "luarocks/hererocks", - lazy = true, - build = table.concat(cmd, " "), - }, root -end - ---@param dir string ---@return LazyPkg? ---@overload fun():LazyPkg[] diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 0eba34c..abbd0ba 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -1,31 +1,8 @@ --# selene:allow(incorrect_standard_library_use) local Config = require("lazy.core.config") +local Health = require("lazy.health") local Util = require("lazy.util") -local M = {} - -M.dev_suffix = "-1.rockspec" -M.skip = { "lua" } - -M.rewrites = { - ["plenary.nvim"] = { "nvim-lua/plenary.nvim", lazy = true }, -} - ----@param plugin LazyPlugin -function M.deps(plugin) - local root = Config.options.rocks.root .. "/" .. plugin.name - local manifest_file = root .. "/lib/luarocks/rocks-5.1/manifest" - local manifest = {} - pcall(function() - local load, err = loadfile(manifest_file, "t", manifest) - if not load then - error(err) - end - load() - end) - return vim.tbl_keys(manifest.repository or {}) -end - ---@class RockSpec ---@field rockspec_format string ---@field package string @@ -33,6 +10,190 @@ end ---@field dependencies string[] ---@field build? {build_type?: string, modules?: any[]} +---@class RockManifest +---@field repository table<string, any> + +local M = {} + +M.dev_suffix = "-1.rockspec" +M.skip = { "lua" } +M.rewrites = { + ["plenary.nvim"] = { "nvim-lua/plenary.nvim", lazy = true }, +} +M.python = { "python3", "python" } + +---@class HereRocks +M.hererocks = {} + +---@param task LazyTask +function M.hererocks.build(task) + local root = Config.options.rocks.root .. "/hererocks" + + ---@param p string + local python = vim.tbl_filter(function(p) + return vim.fn.executable(p) == 1 + end, M.python)[1] + + task:spawn(python, { + args = { + "hererocks.py", + "--verbose", + "-l", + "5.1", + "-r", + "latest", + root, + }, + cwd = task.plugin.dir, + }) +end + +---@param bin string +function M.hererocks.bin(bin) + local hererocks = Config.options.rocks.root .. "/hererocks/bin" + if Util.is_win then + bin = bin .. ".bat" + end + return Util.norm(hererocks .. "/" .. bin) +end + +-- check if hererocks is building +---@return boolean? +function M.hererocks.building() + return vim.tbl_get(Config.plugins.hererocks or {}, "_", "build") +end + +---@param opts? LazyHealth +function M.check(opts) + opts = vim.tbl_extend("force", { + error = Util.error, + warn = Util.warn, + ok = function() end, + }, opts or {}) + + local ok = false + if Config.options.rocks.hererocks then + if M.hererocks.building() then + ok = true + else + ok = Health.have(M.python, opts) + ok = Health.have(M.hererocks.bin("luarocks")) and ok + ok = Health.have( + M.hererocks.bin("lua"), + vim.tbl_extend("force", opts, { + version = "-v", + version_pattern = "5.1", + }) + ) and ok + end + else + ok = Health.have("luarocks", opts) + ok = ( + Health.have( + { "lua5.1", "lua" }, + vim.tbl_extend("force", opts, { + version = "-v", + version_pattern = "5.1", + }) + ) + ) and ok + end + return ok +end + +---@param task LazyTask +function M.build(task) + if + not M.check({ + error = function(msg) + task:notify_error(msg:gsub("[{}]", "`")) + end, + warn = function(msg) + task:notify_warn(msg) + end, + ok = function(msg) end, + }) + then + task:notify_warn({ + "", + "This plugin requires `luarocks`. Try one of the following:", + " - fix your `luarocks` installation", + Config.options.rocks.hererocks and " - disable *hererocks* with `opts.rocks.hererocks = false`" + or " - enable `hererocks` with `opts.rocks.hererocks = true`", + " - disable `luarocks` support completely with `opts.rocks.enabled = false`", + }) + return + end + + if task.plugin.name == "hererocks" then + return M.hererocks.build(task) + end + + local env = {} + local luarocks = "luarocks" + if Config.options.rocks.hererocks then + -- hererocks is still building, so skip for now + -- a new build will happen in the next round + if M.hererocks.building() then + return + end + + local sep = Util.is_win and ";" or ":" + local hererocks = Config.options.rocks.root .. "/hererocks/bin" + if Util.is_win then + hererocks = hererocks:gsub("/", "\\") + end + local path = vim.split(vim.env.PATH, sep) + table.insert(path, 1, hererocks) + env = { + PATH = table.concat(path, sep), + } + if Util.is_win then + luarocks = luarocks .. ".bat" + end + end + + local root = Config.options.rocks.root .. "/" .. task.plugin.name + task:spawn(luarocks, { + args = { + "--tree", + root, + "--server", + Config.options.rocks.server, + "--dev", + "--lua-version", + "5.1", + "make", + "--force-fast", + }, + cwd = task.plugin.dir, + env = env, + }) +end + +---@param file string +---@return table? +function M.parse(file) + local ret = {} + return pcall(function() + loadfile(file, "t", ret)() + end) and ret or nil +end + +---@param plugin LazyPlugin +function M.deps(plugin) + local root = Config.options.rocks.root .. "/" .. plugin.name + ---@type RockManifest? + local manifest = M.parse(root .. "/lib/luarocks/rocks-5.1/manifest") + return manifest and vim.tbl_keys(manifest.repository or {}) +end + +---@param file string +---@return RockSpec? +function M.rockspec(file) + return M.parse(file) +end + ---@param plugin LazyPlugin ---@return LazyPkgSpec? function M.get(plugin) @@ -56,14 +217,7 @@ function M.get(plugin) return end - ---@type RockSpec? - ---@diagnostic disable-next-line: missing-fields - local rockspec = {} - local load, err = loadfile(rockspec_file, "t", rockspec) - if not load then - error(err) - end - load() + local rockspec = M.rockspec(rockspec_file) if not rockspec then return diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index 83269f9..e55c56b 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -31,18 +31,20 @@ M.colors = { ButtonActive = "Visual", TaskOutput = "MsgArea", -- task output TaskError = "ErrorMsg", -- task errors + TaskWarning = "WarningMsg", -- task errors Dir = "@markup.link", -- directory Url = "@markup.link", -- url + Bold = { bold = true }, + Italic = { italic = true }, } M.did_setup = false function M.set_hl() for hl_group, link in pairs(M.colors) do - vim.api.nvim_set_hl(0, "Lazy" .. hl_group, { - link = link, - default = true, - }) + local hl = type(link) == "table" and link or { link = link } + hl.default = true + vim.api.nvim_set_hl(0, "Lazy" .. hl_group, hl) end end @@ -54,6 +56,11 @@ function M.setup() M.did_setup = true M.set_hl() + vim.api.nvim_create_autocmd("VimEnter", { + callback = function() + M.set_hl() + end, + }) vim.api.nvim_create_autocmd("ColorScheme", { callback = function() M.set_hl() diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 7d91dd8..61faca1 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -394,6 +394,11 @@ function M:diagnostics(plugin) message = task.name .. " failed", severity = vim.diagnostic.severity.ERROR, }) + elseif task.warn then + self:diagnostic({ + message = task.name .. " warning", + severity = vim.diagnostic.severity.WARN, + }) end end end @@ -434,6 +439,22 @@ function M:plugin(plugin) { name = plugin.name, from = plugin_start, to = self:row() - 1, kind = plugin._.kind } end +---@param str string +---@param hl? string|Extmark +---@param opts? {indent?: number, prefix?: string, wrap?: boolean} +function M:markdown(str, hl, opts) + local lines = vim.split(str, "\n") + for _, line in ipairs(lines) do + self:append(line, hl, opts):highlight({ + ["`.-`"] = "@markup.raw.markdown_inline", + ["%*.-%*"] = "LazyItalic", + ["%*%*.-%*%*"] = "LazyBold", + ["^%s*-"] = "Special", + }) + self:nl() + end +end + ---@param plugin LazyPlugin function M:tasks(plugin) for _, task in ipairs(plugin._.tasks or {}) do @@ -443,13 +464,16 @@ function M:tasks(plugin) self:nl() end if task.error then - self:append(vim.trim(task.error), "LazyTaskError", { indent = 6 }) - self:nl() - elseif task.name == "log" then + self:markdown(task.error, "LazyTaskError", { indent = 6 }) + end + if task.warn then + self:markdown(task.warn, "LazyTaskWarning", { indent = 6 }) + end + if not task.error and not task.warn and task.name == "log" then self:log(task) - elseif self.view:is_selected(plugin) and task.output ~= "" and task.output ~= task.error then - self:append(vim.trim(task.output), "LazyTaskOutput", { indent = 6 }) - self:nl() + end + if self.view:is_selected(plugin) or (task.error or task.warn) then + self:markdown(vim.trim(task.output), "LazyTaskOutput", { indent = 6 }) end end end @@ -512,7 +536,7 @@ function M:details(plugin) end end local rocks = require("lazy.pkg.rockspec").deps(plugin) - if not vim.tbl_isempty(rocks) then + if rocks then table.insert(props, { "rocks", vim.inspect(rocks) }) end From 4ca3e9aa51c03dda73b40ec9901deac5d4f11c69 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 15:44:13 +0200 Subject: [PATCH 1367/1610] fix(rocks): windows --- lua/lazy/pkg/rockspec.lua | 3 --- 1 file changed, 3 deletions(-) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index abbd0ba..325f22a 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -51,9 +51,6 @@ end ---@param bin string function M.hererocks.bin(bin) local hererocks = Config.options.rocks.root .. "/hererocks/bin" - if Util.is_win then - bin = bin .. ".bat" - end return Util.norm(hererocks .. "/" .. bin) end From 24c832213c505a0d7ca021c0e14bba43e0fef75c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 15:51:40 +0200 Subject: [PATCH 1368/1610] fix(meta): no need to check for old_dir when frags were not built yet. Fixes #1550 --- lua/lazy/core/meta.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 4645f1b..ec3a5b4 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -89,7 +89,7 @@ function M:add(plugin) table.insert(meta._.frags, fragment.id) - if meta._ and meta._.rtp_loaded then + if meta._ and meta._.rtp_loaded and meta.dir then local old_dir = meta.dir self:_rebuild(meta.name) local new_dir = meta.dir From 2ca68f9979dca1a9911b0f7397550a06854ebb27 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:21:15 +0200 Subject: [PATCH 1369/1610] chore(main): release 11.3.0 (#1543) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 16 ++++++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 60f4637..6d2ee11 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.2.1" + ".": "11.3.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index c19d070..028f5ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [11.3.0](https://github.com/folke/lazy.nvim/compare/v11.2.1...v11.3.0) (2024-06-25) + + +### Features + +* **rocks:** use hererocks to install luarocks when luarocks is not found ([d87da76](https://github.com/folke/lazy.nvim/commit/d87da7667939deff2ed8b5a3c198d9ea2e03fee4)) + + +### Bug Fixes + +* **fragments:** check for empty plugin names ([dea1f68](https://github.com/folke/lazy.nvim/commit/dea1f687fe6e15eb3098557a69d44231ebcb6cf5)) +* **meta:** no need to check for old_dir when frags were not built yet. Fixes [#1550](https://github.com/folke/lazy.nvim/issues/1550) ([24c8322](https://github.com/folke/lazy.nvim/commit/24c832213c505a0d7ca021c0e14bba43e0fef75c)) +* **rocks:** better errors / warnings when something goes wrong with luarocks ([7d3f691](https://github.com/folke/lazy.nvim/commit/7d3f69104fb39d3e6e12f808204b3a7b38f86916)) +* **rocks:** hererocks paths on windows ([45cd8d3](https://github.com/folke/lazy.nvim/commit/45cd8d3f0fab197e6e0391cffa38879bdda4c2cd)) +* **rocks:** windows ([4ca3e9a](https://github.com/folke/lazy.nvim/commit/4ca3e9aa51c03dda73b40ec9901deac5d4f11c69)) + ## [11.2.1](https://github.com/folke/lazy.nvim/compare/v11.2.0...v11.2.1) (2024-06-24) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index a119737..6e23b21 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -197,7 +197,7 @@ M.defaults = { debug = false, } -M.version = "11.2.1" -- x-release-please-version +M.version = "11.3.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From b6eba0d02600b678959f90876bc678178b4dd4f6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 17:41:14 +0200 Subject: [PATCH 1370/1610] ci: auto-get rockspec mappings for rock name => github short url or url --- .github/workflows/ci.yml | 30 + .gitignore | 1 + lua/lazy/build.lua | 90 + lua/lazy/community/rocks.lua | 873 + lua/lazy/manage/semver.lua | 2 + lua/lazy/pkg/rockspec.lua | 3 +- manifest | 116407 ++++++++++++++++++++++++++++++++ 7 files changed, 117405 insertions(+), 1 deletion(-) create mode 100644 lua/lazy/build.lua create mode 100644 lua/lazy/community/rocks.lua create mode 100644 manifest diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 05b9111..e7c3dd2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,6 +26,36 @@ jobs: nvim --version [ ! -d tests ] && exit 0 nvim --headless -u tests/init.lua -c "PlenaryBustedDirectory tests/ {minimal_init = 'tests/init.lua', sequential = true}" + community: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install Neovim + shell: bash + run: | + mkdir -p /tmp/nvim + wget -q https://github.com/neovim/neovim/releases/download/nightly/nvim.appimage -O /tmp/nvim/nvim.appimage + cd /tmp/nvim + chmod a+x ./nvim.appimage + ./nvim.appimage --appimage-extract + echo "/tmp/nvim/squashfs-root/usr/bin/" >> $GITHUB_PATH + - name: Rockspec Build + id: rockspec-build + uses: actions/cache@v4 + with: + path: build + key: rockspec-build + - name: Generate Rockspec + if: steps.rockspec-build.cache-hit != 'true' + run: | + nvim -l lua/lazy/build.lua + - name: Push changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: "chore(build): auto-generate rockspec mappings" + commit_user_name: "github-actions[bot]" + commit_user_email: "github-actions[bot]@users.noreply.github.com" + commit_author: "github-actions[bot] <github-actions[bot]@users.noreply.github.com>" release: name: release if: ${{ github.ref == 'refs/heads/main' }} diff --git a/.gitignore b/.gitignore index cc5457a..7217496 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ debug foo.* *.log data +build diff --git a/lua/lazy/build.lua b/lua/lazy/build.lua new file mode 100644 index 0000000..83993aa --- /dev/null +++ b/lua/lazy/build.lua @@ -0,0 +1,90 @@ +vim.opt.rtp:append(".") +local Rocks = require("lazy.pkg.rockspec") +local Semver = require("lazy.manage.semver") +local Util = require("lazy.util") + +local M = {} + +function M.fetch(url, file, prefix) + if not vim.uv.fs_stat(file) then + print((prefix or "") .. "Fetching " .. url .. " to " .. file .. "\n") + vim.cmd.redraw() + local out = vim.fn.system("wget " .. url .. " -O " .. file) + if vim.v.shell_error ~= 0 then + pcall(vim.uv.fs_unlink, file) + error("Failed to fetch " .. url .. ":\n" .. out) + end + end +end + +---@return RockManifest? +function M.fetch_manifest() + local manifest_file = "build/manifest.lua" + M.fetch("https://luarocks.org/manifest", manifest_file) + return Rocks.parse(manifest_file) +end + +function M.fetch_rockspec(name, version, prefix) + version = version or "scm-1" + local url = "https://luarocks.org/" .. name .. "-" .. version .. ".rockspec" + M.fetch(url, "build/" .. name .. ".rockspec", prefix) +end + +function M.build() + vim.fn.mkdir("build", "p") + local manifest = M.fetch_manifest() or {} + ---@type {name:string, version:string, url:string}[] + local nvim_rocks = {} + for rock, vv in pairs(manifest.repository or {}) do + if rock:find("nvim", 1, true) then + local versions = vim.tbl_map(Semver.version, vim.tbl_keys(vv)) + versions = vim.tbl_filter(function(v) + return not not v + end, versions) + local last = Semver.last(versions) or next(vv) + last = type(last) == "table" and last.input or last + table.insert(nvim_rocks, { name = rock, version = last }) + end + end + table.sort(nvim_rocks, function(a, b) + return a.name < b.name + end) + + for r, rock in ipairs(nvim_rocks) do + local progress = string.format("[%d/%d] ", r, #nvim_rocks) + local ok, err = pcall(M.fetch_rockspec, rock.name, rock.version, progress) + if not ok then + err = vim.trim("Error: " .. err) + local lines = vim.split(err, "\n") + lines = vim.tbl_map(function(line) + return " " .. line + end, lines) + print(table.concat(lines, "\n") .. "\n") + end + end + + for _, rock in ipairs(nvim_rocks) do + local rockspec = Rocks.rockspec("build/" .. rock.name .. ".rockspec") + if rockspec then + local url = rockspec.source and rockspec.source.url + -- parse github short url + if url and url:find("^%a+://github.com/") then + url = url:gsub("^%a+://github.com/", "") + local parts = vim.split(url, "/") + url = parts[1] .. "/" .. parts[2] + end + if url then + rock.url = url + print(rock.name .. " " .. url) + else + print("Error: " .. rock.name .. " missing source url\n\n") + print(vim.inspect(rockspec) .. "\n") + end + end + end + Util.write_file("lua/lazy/community/rocks.lua", "return \n" .. vim.inspect(nvim_rocks)) +end + +M.build() + +return M diff --git a/lua/lazy/community/rocks.lua b/lua/lazy/community/rocks.lua new file mode 100644 index 0000000..1b7a361 --- /dev/null +++ b/lua/lazy/community/rocks.lua @@ -0,0 +1,873 @@ +return { + { + name = "15puzzle.nvim", + url = "NStefan002/15puzzle.nvim", + version = "1.4.1-1", + }, + { + name = "aerial.nvim", + url = "stevearc/aerial.nvim", + version = "1.7.0-1", + }, + { + name = "ai.nvim", + url = "S1M0N38/ai.nvim", + version = "0.1.0-1", + }, + { + name = "auto-hlsearch.nvim", + url = "asiryk/auto-hlsearch.nvim", + version = "1.1.0-1", + }, + { + name = "better-escape.nvim", + url = "max397574/better-escape.nvim", + version = "1.0.0-1", + }, + { + name = "bufferline.nvim", + url = "akinsho/bufferline.nvim", + version = "4.6.1-1", + }, + { + name = "ccc.nvim", + url = "uga-rosa/ccc.nvim", + version = "1.6.0-1", + }, + { + name = "ci-template.nvim", + url = "linrongbin16/ci-template.nvim", + version = "8.1.0-1", + }, + { + name = "colorbox.nvim", + url = "linrongbin16/colorbox.nvim", + version = "3.1.0-1", + }, + { + name = "colorbuddy.nvim", + url = "tjdevries/colorbuddy.nvim", + version = "1.0.0-1", + }, + { + name = "colortils.nvim", + url = "nvim-colortils/colortils.nvim", + version = "1.1.0-1", + }, + { + name = "commander.nvim", + url = "FeiyouG/commander.nvim", + version = "0.2.0-1", + }, + { + name = "comment-box.nvim", + url = "LudoPinelli/comment-box.nvim", + version = "1.0.2-1", + }, + { + name = "comment.nvim", + url = "numToStr/Comment.nvim", + version = "0.8.0-1", + }, + { + name = "commons.nvim", + url = "linrongbin16/commons.nvim", + version = "18.0.0-1", + }, + { + name = "conform.nvim", + url = "stevearc/conform.nvim", + version = "6.0.0-1", + }, + { + name = "cybu.nvim", + url = "ghillb/cybu.nvim", + version = "1.0-1", + }, + { + name = "daylight.nvim", + url = "NTBBloodbath/daylight.nvim", + version = "1.1.0-1", + }, + { + name = "deadcolumn.nvim", + url = "Bekaboo/deadcolumn.nvim", + version = "1.0.0-1", + }, + { + name = "decipher.nvim", + url = "MisanthropicBit/decipher.nvim", + version = "1.0.1-1", + }, + { + name = "detour.nvim", + url = "carbon-steel/detour.nvim", + version = "1.4.0-1", + }, + { + name = "dial.nvim", + url = "monaqa/dial.nvim", + version = "0.4.0-1", + }, + { + name = "distant.nvim", + url = "chipsenkbeil/distant.nvim", + version = "0.1.2-1", + }, + { + name = "donut.nvim", + url = "NStefan002/donut.nvim", + version = "2.1.0-1", + }, + { + name = "dressing.nvim", + url = "stevearc/dressing.nvim", + version = "2.2.2-1", + }, + { + name = "dropbar.nvim", + url = "Bekaboo/dropbar.nvim", + version = "8.4.0-1", + }, + { + name = "duck.nvim", + url = "tamton-aquib/duck.nvim", + version = "main-1", + }, + { + name = "easypick.nvim", + url = "axkirillov/easypick.nvim", + version = "0.6.0-1", + }, + { + name = "edgy.nvim", + url = "folke/edgy.nvim", + version = "1.9.1-1", + }, + { + name = "elixir-tools.nvim", + url = "elixir-tools/elixir-tools.nvim", + version = "0.14.3-1", + }, + { + name = "feline.nvim", + url = "freddiehaddad/feline.nvim", + version = "1.6.2-1", + }, + { + name = "fidget.nvim", + url = "j-hui/fidget.nvim", + version = "1.4.1-1", + }, + { + name = "flash.nvim", + url = "folke/flash.nvim", + version = "1.18.3-1", + }, + { + name = "flatten.nvim", + url = "willothy/flatten.nvim", + version = "0.5.1-1", + }, + { + name = "flutter-tools.nvim", + url = "akinsho/flutter-tools.nvim", + version = "1.10.0-1", + }, + { + name = "focus.nvim", + url = "nvim-focus/focus.nvim", + version = "1.0.2-1", + }, + { + name = "freeze-code.nvim", + url = "AlejandroSuero/freeze-code.nvim", + version = "0.2.0-1", + }, + { + name = "fugit2.nvim", + url = "SuperBo/fugit2.nvim", + version = "0.2.0-1", + }, + { + name = "funnyfiles.nvim", + url = "aikooo7/funnyfiles.nvim", + version = "1.0.1-1", + }, + { + name = "fzfx.nvim", + url = "linrongbin16/fzfx.nvim", + version = "6.4.0-1", + }, + { + name = "galileo.nvim", + url = "S1M0N38/galileo.nvim", + version = "0.0.2-1", + }, + { + name = "gentags.nvim", + url = "linrongbin16/gentags.nvim", + version = "3.0.2-1", + }, + { + name = "git-worktree.nvim", + url = "polarmutex/git-worktree.nvim", + version = "1.0.0-1", + }, + { + name = "github-nvim-theme", + url = "projekt0n/github-nvim-theme", + version = "1.0.2-1", + }, + { + name = "gitlinker.nvim", + url = "linrongbin16/gitlinker.nvim", + version = "4.13.1-1", + }, + { + name = "gitsigns.nvim", + url = "lewis6991/gitsigns.nvim", + version = "scm-1", + }, + { + name = "glow.nvim", + url = "ellisonleao/glow.nvim", + version = "0.2.0-1", + }, + { + name = "go.nvim", + url = "ray-x/go.nvim", + version = "0.2.1-1", + }, + { + name = "godo.nvim", + url = "arthuradolfo/godo.nvim", + version = "1.1.0-0", + }, + { + name = "grapple.nvim", + url = "cbochs/grapple.nvim", + version = "0.30.0-1", + }, + { + name = "gruvbox.nvim", + url = "ellisonleao/gruvbox.nvim", + version = "2.0.0-1", + }, + { + name = "haskell-snippets.nvim", + url = "mrcjkb/haskell-snippets.nvim", + version = "1.4.4-1", + }, + { + name = "haskell-tools.nvim", + url = "mrcjkb/haskell-tools.nvim", + version = "3.1.10-1", + }, + { + name = "headlines.nvim", + url = "lukas-reineke/headlines.nvim", + version = "4.0.1-1", + }, + { + name = "heirline.nvim", + url = "rebelot/heirline.nvim", + version = "1.0.6-1", + }, + { + name = "hlchunk.nvim", + url = "shellRaining/hlchunk.nvim", + version = "1.1.0-1", + }, + { + name = "hotpot.nvim", + url = "rktjmp/hotpot.nvim", + version = "0.12.1-1", + }, + { + name = "hydra.nvim", + url = "nvimtools/hydra.nvim", + version = "1.0.2-1", + }, + { + name = "image.nvim", + url = "3rd/image.nvim", + version = "1.3.0-1", + }, + { + name = "incline.nvim", + url = "b0o/incline.nvim", + version = "0.0.1-1", + }, + { + name = "indent-blankline.nvim", + url = "lukas-reineke/indent-blankline.nvim", + version = "3.6.3-1", + }, + { + name = "kai.nvim", + url = "Kamilcuk/kai.nvim", + version = "0.0.6-1", + }, + { + name = "lazy.nvim", + url = "folke/lazy.nvim", + version = "11.2.1-1", + }, + { + name = "leetcode.nvim", + url = "kawre/leetcode.nvim", + version = "0.2.0-1", + }, + { + name = "legendary.nvim", + url = "mrjones2014/legendary.nvim", + version = "2.13.11-1", + }, + { + name = "live-command.nvim", + url = "smjonas/live-command.nvim", + version = "1.2.1-1", + }, + { + name = "logging.nvim", + url = "NTBBloodbath/logging.nvim", + version = "1.1.0-1", + }, + { + name = "love2d.nvim", + url = "S1M0N38/love2d.nvim", + version = "0.2-1", + }, + { + name = "lsp-progress.nvim", + url = "linrongbin16/lsp-progress.nvim", + version = "1.0.12-1", + }, + { + name = "lsp_signature.nvim", + url = "ray-x/lsp_signature.nvim", + version = "0.3.1-1", + }, + { + name = "lua-obfuscator.nvim", + url = "git+ssh://git@github.com/kdssoftware/lua-obfuscator.nvim.git", + version = "1.0.1-1", + }, + { + name = "lua-utils.nvim", + url = "nvim-neorg/lua-utils.nvim", + version = "1.0.2-1", + }, + { + name = "mapx.nvim", + url = "b0o/mapx.nvim", + version = "0.2.1-1", + }, + { + name = "mason-lspconfig.nvim", + url = "williamboman/mason-lspconfig.nvim", + version = "1.29.0-1", + }, + { + name = "mason-nvim-dap.nvim", + url = "jay-babu/mason-nvim-dap.nvim", + version = "2.3.0-1", + }, + { + name = "mason.nvim", + url = "williamboman/mason.nvim", + version = "1.10.0-1", + }, + { + name = "mini.nvim", + url = "echasnovski/mini.nvim", + version = "0.9.0-1", + }, + { + name = "mkdnflow.nvim", + url = "jakewvincent/mkdnflow.nvim", + version = "1.2.0-1", + }, + { + name = "move.nvim", + url = "fedepujol/move.nvim", + version = "2.0.0-1", + }, + { + name = "multicursors.nvim", + url = "smoka7/multicursors.nvim", + version = "1.0.0-1", + }, + { + name = "my-awesome-plugin.nvim", + url = "S1M0N38/my-awesome-plugin.nvim", + version = "0.1.1-1", + }, + { + name = "navigator.nvim", + url = "numToStr/Navigator.nvim", + version = "0.6-1", + }, + { + name = "neo-tree.nvim", + url = "nvim-neo-tree/neo-tree.nvim", + version = "3.26-1", + }, + { + name = "neoconf.nvim", + url = "folke/neoconf.nvim", + version = "1.2.2-1", + }, + { + name = "neodev.nvim", + url = "folke/neodev.nvim", + version = "3.0.0-1", + }, + { + name = "neoscroll.nvim", + url = "karb94/neoscroll.nvim", + version = "0.2.0-1", + }, + { + name = "nightfox.nvim", + url = "EdenEast/nightfox.nvim", + version = "3.9.3-1", + }, + { + name = "no-neck-pain.nvim", + url = "shortcuts/no-neck-pain.nvim", + version = "1.14.0-1", + }, + { + name = "noice.nvim", + url = "folke/noice.nvim", + version = "4.3.0-1", + }, + { + name = "npackages.nvim", + url = "diegofigs/npackages.nvim", + version = "0.1.0-1", + }, + { + name = "nui-components.nvim", + url = "grapp-dev/nui-components.nvim", + version = "1.5.2-1", + }, + { + name = "nui.nvim", + url = "git+https://github.com/MunifTanjim/nui.nvim.git", + version = "0.3.0-1", + }, + { + name = "nvim-client", + url = "neovim/lua-client", + version = "0.2.4-1", + }, + { + 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", + version = "0.4.0-1", + }, + { + name = "nvim-dap", + url = "mfussenegger/nvim-dap", + version = "0.8.0-1", + }, + { + name = "nvim-dap-ui", + url = "rcarriga/nvim-dap-ui", + version = "4.0.0-1", + }, + { + name = "nvim-dbee", + url = "kndndrj/nvim-dbee", + version = "0.1.6-1", + }, + { + name = "nvim-dev-container", + url = "esensar/nvim-dev-container", + version = "0.2.0-1", + }, + { + name = "nvim-java", + url = "nvim-java/nvim-java", + version = "1.0.0-1", + }, + { + name = "nvim-java-core", + url = "nvim-java/nvim-java-core", + version = "1.0.0-1", + }, + { + name = "nvim-java-dap", + url = "nvim-java/nvim-java-dap", + version = "1.0.0-1", + }, + { + name = "nvim-jdtls", + url = "mfussenegger/nvim-jdtls", + version = "0.2.0-1", + }, + { + name = "nvim-jqx", + url = "gennaro-tedesco/nvim-jqx", + version = "0.1.4-1", + }, + { + name = "nvim-lastplace", + url = "mrcjkb/nvim-lastplace", + version = "1.0.0-1", + }, + { + name = "nvim-lightbulb", + url = "kosayoda/nvim-lightbulb", + version = "1.0.0-1", + }, + { + name = "nvim-lspconfig", + url = "neovim/nvim-lspconfig", + version = "0.1.8-1", + }, + { + name = "nvim-metals", + url = "scalameta/nvim-metals", + version = "0.9.x-1", + }, + { + name = "nvim-nio", + url = "nvim-neotest/nvim-nio", + version = "1.9.4-1", + }, + { + name = "nvim-notify", + url = "rcarriga/nvim-notify", + version = "3.13.5-1", + }, + { + name = "nvim-parinfer", + url = "gpanders/nvim-parinfer", + version = "1.2.0-1", + }, + { + name = "nvim-peekup", + url = "gennaro-tedesco/nvim-peekup", + version = "0.1.1-1", + }, + { + name = "nvim-possession", + url = "gennaro-tedesco/nvim-possession", + version = "0.0.13-1", + }, + { + name = "nvim-scrollview", + url = "dstein64/nvim-scrollview", + version = "5.1.0-1", + }, + { + name = "nvim-smuggler", + url = "Klafyvel/nvim-smuggler", + version = "main-1", + }, + { + name = "nvim-snippy", + url = "dcampos/nvim-snippy", + version = "1.0.0-1", + }, + { + name = "nvim-surround", + url = "kylechui/nvim-surround", + version = "2.1.5-1", + }, + { + name = "nvim-tree.lua", + url = "nvim-tree/nvim-tree.lua", + version = "1.4.0-1", + }, + { + name = "nvim-treesitter-legacy-api", + url = "nvim-treesitter/nvim-treesitter", + version = "0.9.2-1", + }, + { + name = "nvim-ufo", + url = "kevinhwang91/nvim-ufo", + version = "1.4.0-1", + }, + { + name = "nvim-web-devicons", + url = "nvim-tree/nvim-web-devicons", + version = "0.100-1", + }, + { + name = "obsidian.nvim", + url = "epwalsh/obsidian.nvim", + version = "3.8.0-1", + }, + { + name = "oil.nvim", + url = "stevearc/oil.nvim", + version = "2.10.0-1", + }, + { + name = "onedarkpro.nvim", + url = "olimorris/onedarkpro.nvim", + version = "0.8.0-1", + }, + { + name = "onenord.nvim", + url = "rmehri01/onenord.nvim", + version = "0.7.0-1", + }, + { + name = "otter.nvim", + url = "jmbuhr/otter.nvim", + version = "1.15.1-1", + }, + { + name = "overseer.nvim", + url = "stevearc/overseer.nvim", + version = "1.4.0-1", + }, + { + name = "oz.nvim", + url = "luxluth/oz.nvim", + version = "0.0.3-1", + }, + { + name = "package-info.nvim", + url = "vuki656/package-info.nvim", + version = "2.0-1", + }, + { + name = "paperplanes.nvim", + url = "rktjmp/paperplanes.nvim", + version = "0.1.6-1", + }, + { + name = "papis.nvim", + url = "jghauser/papis.nvim", + version = "0.5.1-1", + }, + { + name = "paq-nvim", + url = "savq/paq-nvim", + version = "2.0.0-1", + }, + { + name = "pathlib.nvim", + url = "pysan3/pathlib.nvim", + version = "2.2.2-1", + }, + { + name = "persistence.nvim", + url = "folke/persistence.nvim", + version = "2.0.0-1", + }, + { + name = "plenary.nvim", + url = "nvim-lua/plenary.nvim", + version = "0.1.4-1", + }, + { + name = "pretty-fold.nvim", + url = "anuvyklack/pretty-fold.nvim", + version = "3.0-1", + }, + { + name = "rainbow-delimiters.nvim", + url = "HiPhish/rainbow-delimiters.nvim", + version = "0.4.0-1", + }, + { + name = "renamer.nvim", + url = "filipdutescu/renamer.nvim", + version = "5.1.0-1", + }, + { + name = "rest.nvim", + url = "rest-nvim/rest.nvim", + version = "2.0.1-1", + }, + { + name = "rocks-config.nvim", + url = "nvim-neorocks/rocks-config.nvim", + version = "2.0.1-1", + }, + { + name = "rocks-dev.nvim", + url = "nvim-neorocks/rocks-dev.nvim", + version = "1.2.3-1", + }, + { + name = "rocks-git.nvim", + url = "nvim-neorocks/rocks-git.nvim", + version = "1.5.1-1", + }, + { + name = "rocks.nvim", + url = "nvim-neorocks/rocks.nvim", + version = "2.32.0-1", + }, + { + name = "rtp.nvim", + url = "nvim-neorocks/rtp.nvim", + version = "1.0.0-1", + }, + { + name = "rustaceanvim", + url = "mrcjkb/rustaceanvim", + version = "4.25.1-1", + }, + { + name = "schemastore.nvim", + url = "b0o/SchemaStore.nvim", + version = "0.2.0-1", + }, + { + name = "screenkey.nvim", + url = "NStefan002/screenkey.nvim", + version = "2.1.0-1", + }, + { + name = "scrollbar.nvim", + url = "Xuyuanp/scrollbar.nvim", + version = "0.4.0-1", + }, + { + name = "session.nvim", + url = "Kibadda/session.nvim", + version = "2.0.0-1", + }, + { + name = "sg.nvim", + url = "sourcegraph/sg.nvim", + version = "1.1.0-1", + }, + { + name = "smart-splits.nvim", + url = "mrjones2014/smart-splits.nvim", + version = "1.5.0-1", + }, + { + name = "squirrel.nvim", + url = "xiaoshihou514/squirrel.nvim", + version = "1.0.0-1", + }, + { + name = "storm-mode.nvim", + url = "HoppenR/storm-mode.nvim", + version = "1.2.0-1", + }, + { + name = "structlog.nvim", + url = "git+ssh://git@github.com/Tastyep/structlog.nvim.git", + version = "0.1-1", + }, + { + name = "substitute.nvim", + url = "gbprod/substitute.nvim", + version = "2.0.0-1", + }, + { + name = "sweetie.nvim", + url = "NTBBloodbath/sweetie.nvim", + version = "3.1.1-1", + }, + { + name = "tabby.nvim", + url = "nanozuki/tabby.nvim", + version = "2.5.1-1", + }, + { + name = "telescope-zf-native.nvim", + url = "natecraddock/telescope-zf-native.nvim", + version = "1.0.0-1", + }, + { + name = "telescope.nvim", + url = "nvim-telescope/telescope.nvim", + version = "0.1.8-1", + }, + { + name = "todo-comments.nvim", + url = "folke/todo-comments.nvim", + version = "1.2.0-1", + }, + { + name = "toggleterm.nvim", + url = "akinsho/toggleterm.nvim", + version = "2.11.0-1", + }, + { + name = "tokyonight.nvim", + url = "folke/tokyonight.nvim", + version = "3.0.1-1", + }, + { + name = "trouble.nvim", + url = "folke/trouble.nvim", + version = "3.4.3-1", + }, + { + name = "tsc.nvim", + url = "dmmulroy/tsc.nvim", + version = "2.3.0-1", + }, + { + name = "twilight.nvim", + url = "folke/twilight.nvim", + version = "1.0.0-1", + }, + { + name = "unimpaired.nvim", + url = "tummetott/unimpaired.nvim", + version = "0.2.0-1", + }, + { + name = "vgit.nvim", + url = "tanvirtin/vgit.nvim", + version = "0.2.2-1", + }, + { + name = "which-key.nvim", + url = "folke/which-key.nvim", + version = "2.1.0-1", + }, + { + name = "windline.nvim", + url = "windwp/windline.nvim", + version = "1.1.0-1", + }, + { + name = "yanky.nvim", + url = "gbprod/yanky.nvim", + version = "2.0.0-1", + }, + { + name = "yazi.nvim", + url = "mikavilpas/yazi.nvim", + version = "master-1", + }, + { + name = "zen-mode.nvim", + url = "folke/zen-mode.nvim", + version = "1.3.0-1", + }, + { + name = "zk-nvim", + url = "zk-org/zk-nvim", + version = "0.1.0-1", + }, +} + diff --git a/lua/lazy/manage/semver.lua b/lua/lazy/manage/semver.lua index 4e58881..e0a1037 100644 --- a/lua/lazy/manage/semver.lua +++ b/lua/lazy/manage/semver.lua @@ -9,6 +9,7 @@ local M = {} ---@field patch number ---@field prerelease? string ---@field build? string +---@field input? string local Semver = {} Semver.__index = Semver @@ -90,6 +91,7 @@ function M.version(version) patch = patch == "" and 0 or tonumber(patch), prerelease = prerelease ~= "" and prerelease or nil, build = build ~= "" and build or nil, + input = version, }, Semver) end end diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 325f22a..ef6d804 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -9,9 +9,10 @@ local Util = require("lazy.util") ---@field version string ---@field dependencies string[] ---@field build? {build_type?: string, modules?: any[]} +---@field source? {url?: string} ---@class RockManifest ----@field repository table<string, any> +---@field repository table<string, table<string,any>> local M = {} diff --git a/manifest b/manifest new file mode 100644 index 0000000..ec30b4b --- /dev/null +++ b/manifest @@ -0,0 +1,116407 @@ +commands = {} +modules = {} +repository = { + ['15puzzle.nvim'] = { + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['main-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['2048.nvim'] = { + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['main-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['30log'] = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['3rd-party-oauth'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ab-microsensor'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + abelhas = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + abletonlink = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + abstk = { + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['release-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ac-clientoutput'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ac-luaserver'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['access-token-introspection'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + access_file_data = { + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + } + } + }, + accessor = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + act = { + ['0.10.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.11.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.12.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.15.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.16.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['activelua-learningtool'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + } + }, + ['adal-lua'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + add = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['adopure.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ads1015 = { + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['adt.lua'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + adxl345 = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['aerial.nvim'] = { + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + aes_everywhere = { + ['1.1.3-6'] = { + { + arch = "rockspec" + } + }, + ['1.1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + aesfileencrypt = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['afl-lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + aghpb = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ai.nvim'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + aka = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + alfons = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.10-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['nil-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['alfons-dev'] = { + ['5.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['alib.eventbus'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + alien = { + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "win32-x86" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + alive = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1rc3-1'] = { + { + arch = "rockspec" + } + }, + ['0.1rc4-1'] = { + { + arch = "rockspec" + } + } + }, + allonet = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + alnbox = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + alogger = { + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['alt-getopt'] = { + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + altdoc = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + amalg = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['amalg-redis'] = { + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['amber-apigw'] = { + ['2.14.1-0'] = { + { + arch = "rockspec" + } + } + }, + amqp = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['amqp-client'] = { + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['amqp-client-52plus'] = { + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['amqp-client-rpc'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + anim8 = { + ['v2.3.1-1'] = { + { + arch = "rockspec" + } + } + }, + annotate = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ansicolors = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ansicolorsx = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ansikit = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ao = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['api-gateway-request-validation'] = { + ['1.3.12-1'] = { + { + arch = "rockspec" + } + } + }, + ['api7-dkjson'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['api7-lua-protobuf'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['api7-lua-resty-dns-client'] = { + ['7.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['api7-lua-resty-http'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['api7-lua-resty-jwt'] = { + ['0.2.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['api7-lua-tinyyaml'] = { + ['0.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['api7-skywalking-nginx-lua'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['api7-snowflake'] = { + ['2.0-1'] = { + { + arch = "rockspec" + } + } + }, + apicast = { + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + ['apicast-cli'] = { + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + apidemo = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + apioak = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + apisix = { + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.9-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.4.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + } + }, + ['2.3-0'] = { + { + arch = "rockspec" + } + }, + ['2.4-0'] = { + { + arch = "rockspec" + } + } + }, + app_scheduler = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + apply_patch_failed = { + ['1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + arbiter = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + arc4random = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + argexpected = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + argmatcher = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + argon2 = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['argon2-ffi'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + argparse = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + argv = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + } + }, + arluqtools = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + array = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + arrr = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + arweave = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['asciicursor-lua'] = { + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + asklua = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + aspect = { + ['1.10-0'] = { + { + arch = "rockspec" + } + }, + ['1.11-0'] = { + { + arch = "rockspec" + } + }, + ['1.12-0'] = { + { + arch = "rockspec" + } + }, + ['1.13-0'] = { + { + arch = "rockspec" + } + }, + ['1.14-0'] = { + { + arch = "rockspec" + } + }, + ['1.9-0'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + } + }, + ['2.3-0'] = { + { + arch = "rockspec" + } + } + }, + assert = { + ['0.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + } + }, + assertex = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + } + }, + astar = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + async = { + ['1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['async-framework'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['async-utils'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['async.lua'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + } + }, + asyncio = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + atlas = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + atpath = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + audiodataload = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['audit-log'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + auproc = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + aurora = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['auth-plugin-configr'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['auth0-nginx'] = { + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.4.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.4.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.4.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.5.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['authy-lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['auto-hlsearch.nvim'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['auto-session'] = { + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + autoblock = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + away = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['away-dataqueue'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['away-luv'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['awesome-audiowheel'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['awesome-autostart'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['awesome-dovetail'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['devel-1'] = { + { + arch = "rockspec" + } + } + }, + ['awesome-ez'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['devel-1'] = { + { + arch = "rockspec" + } + }, + ['devel-2'] = { + { + arch = "rockspec" + } + } + }, + ['awesome-freedesktop'] = { + git = { + { + arch = "rockspec" + } + } + }, + ['awesome-handy'] = { + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['awesome-launch'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['devel-1'] = { + { + arch = "rockspec" + } + } + }, + ['awesome-pulseaudio-widget'] = { + ['0.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['awesome-scratchpad'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['awesome-viewport'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['devel-1'] = { + { + arch = "rockspec" + } + } + }, + ['awesomewm-autostart'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + awestore = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + babel = { + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + } + } + }, + backup = { + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + bakalang = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['balance-tree'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['barcodes.sile'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + base = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + base2base = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + base45 = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + base58 = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + base64 = { + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + base64mix = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + based = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + basedir = { + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + } + } + }, + basename = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + basexx = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['basic-auth'] = { + ['0.0-1'] = { + { + arch = "rockspec" + } + } + }, + basicauth = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + basics = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + battery_status = { + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + } + }, + bawesome = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bbcode = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bcrypt = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['bcrypt-ffi'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + beemovie = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + behaviour_tree = { + ['0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['benchmark-ips'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + benchmarker = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + benchy = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bencode = { + ['1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.2.0-2'] = { + { + arch = "rockspec" + } + } + }, + ber = { + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['better-escape.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['bgcrypto-aes'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['bgcrypto-hmac'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['bgcrypto-lmd5'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['bgcrypto-pbkdf2'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['bgcrypto-sha'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bigint = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-2'] = { + { + arch = "rockspec" + } + } + }, + bin = { + ['5.0-0'] = { + { + arch = "rockspec" + } + }, + ['5.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1-0'] = { + { + arch = "rockspec" + } + } + }, + binaryheap = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + binarystream = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + binarytree = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + } + } + }, + binser = { + ['0.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bint = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bintrees = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + biohazardcore = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + } + }, + biolua = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bit32 = { + ['5.2.0alpha.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.1.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bitarray = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + } + } + }, + bitlib = { + ['23-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bitness = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['bitop-lua'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['bitsy-format'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bitvec = { + ['2.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['bk-tree'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bkopenssl = { + ['0.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + blackjack = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + } + } + }, + blowfish = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + bme280 = { + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bolt = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['botbye-openresty'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['botway-lua'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + brain = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + brieflz = { + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + brightness = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + brigid = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['brigid-mbedtls'] = { + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['brigid-pcre2'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + brocatel = { + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['brotli-ffi'] = { + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['bufferline.nvim'] = { + ['4.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bufio = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + } + }, + bump = { + ['3.1.5-1'] = { + { + arch = "rockspec" + } + }, + ['3.1.6-1'] = { + { + arch = "rockspec" + } + }, + ['3.1.6-2'] = { + { + arch = "rockspec" + } + }, + ['3.1.7-1'] = { + { + arch = "rockspec" + } + } + }, + ['bump-3dpd'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + busted = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.1-2'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-0'] = { + { + arch = "rockspec" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc0-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc1-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc10-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc10-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc11-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc12-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc13-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.rc3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.rc4-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc5-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc6-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc7-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc8-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.rc9-0'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['busted-codewars'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['busted-ffi'] = { + ['2.0.rc12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['busted-flaky'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['busted-hjtest'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + } + }, + ['busted-htest'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['busted-jsonl'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['busted-stable'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + busted_resty = { + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + bustez = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + butter = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['c-lua-package'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + c3 = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-15'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-17'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-19'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-20'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-21'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-23'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-34'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-37'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-39'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-40'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-42'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + caas = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cache = { + ['1.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['cache-mdbx'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['cache-redis'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + cake = { + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + call = { + ['2024.3.4.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2024.3.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2024.3.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2024.3.6.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2024.3.6.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + callbag = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + canary = { + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + } + } + }, + ['canary-oss'] = { + ['1.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + } + } + }, + candran = { + ['0.14.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['canny-redis'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + caribay = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.1-1'] = { + { + arch = "rockspec" + } + }, + ['3.2-1'] = { + { + arch = "rockspec" + } + }, + ['3.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['3.2.2-1'] = { + { + arch = "rockspec" + } + } + }, + carray = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + } + }, + carrot = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cartesix = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + casbin = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.24.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.24.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.25.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.25.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.26.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.27.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.28.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.29.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.30.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.31.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.32.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.32.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.33.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.34.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.34.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.35.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.35.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.36.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.37.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.38.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.39.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.40.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.40.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.41.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.41.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.41.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.41.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.41.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.41.5-1'] = { + { + arch = "rockspec" + } + }, + ['1.41.6-1'] = { + { + arch = "rockspec" + } + }, + ['1.41.7-1'] = { + { + arch = "rockspec" + } + }, + ['1.41.8-1'] = { + { + arch = "rockspec" + } + } + }, + ['casbin-adapter'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + cascproxy = { + ['scm-0'] = { + { + arch = "rockspec" + } + } + }, + cassandra = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + } + }, + ['0.5-3'] = { + { + arch = "rockspec" + } + }, + ['0.5-4'] = { + { + arch = "rockspec" + } + }, + ['0.5-5'] = { + { + arch = "rockspec" + } + }, + ['0.5-6'] = { + { + arch = "rockspec" + } + }, + ['0.5-7'] = { + { + arch = "rockspec" + } + } + }, + cassowary = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + catchify = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + catppuccin = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + catpuccin = { + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cbuf = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['ccc.nvim'] = { + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ccrunx = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ccrunx-compose'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ccrunx-image'] = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cctea = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cdata_table = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cdb = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['centreon-stream-connectors-lib'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + centrilua = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + cfadmin = { + ['beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cffi-lua'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cfg = { + ['1.2-1'] = { + { + arch = "rockspec" + } + } + }, + cgi = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + cgilua = { + ['5.1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['5.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['5.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['5.1.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cgilua-cli'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + chaboksms = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + chacha = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + chain = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + chalk = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + chameleon = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + chance = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['chandra-toml'] = { + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + charm = { + ['0.0-1'] = { + { + arch = "rockspec" + } + } + }, + chars = { + ['0.0.0'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + chatter = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + chdir = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + checks = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['chess-fen'] = { + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + chroma = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['chrome-devtools-client'] = { + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + } + }, + chronos = { + ['0.1-4'] = { + { + arch = "rockspec" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ci-template.nvim'] = { + ['4.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cincau = { + ['0.10.20220813-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.20220924-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.20230708-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.20210701-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.20210905-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.20210912-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.20210923-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.20211002-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.20211108-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.20211212-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.20220511-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.20220807-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cipher-log'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cirru-parser'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['citeproc-lua'] = { + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + civ = { + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + civix = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + civtest = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cl = { + ['20100607-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['claims-handler'] = { + ['0.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.12-2'] = { + { + arch = "rockspec" + } + }, + ['4.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.9-1'] = { + { + arch = "rockspec" + } + }, + ['4.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['4.1.0-2'] = { + { + arch = "rockspec" + } + }, + ['4.1.1-10'] = { + { + arch = "rockspec" + } + }, + ['4.1.1-11'] = { + { + arch = "rockspec" + } + }, + ['4.1.1-13'] = { + { + arch = "rockspec" + } + }, + ['4.1.1-3'] = { + { + arch = "rockspec" + } + }, + ['4.1.1-4'] = { + { + arch = "rockspec" + } + }, + ['4.1.1-5'] = { + { + arch = "rockspec" + } + } + }, + class = { + ['0.7-1'] = { + { + arch = "rockspec" + } + } + }, + classic = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + classy = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + classyng = { + ['0.3-1'] = { + { + arch = "rockspec" + } + } + }, + cldr = { + ['0.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cli = { + ['1.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['cli-app-base'] = { + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + clock = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + cloud_storage = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cluacov = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + clutch = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cm-lua-resty-kafka'] = { + ['0.20-1'] = { + { + arch = "rockspec" + } + } + }, + cmark = { + ['0.23.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.25.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.26.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.27.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.28.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.28.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.29.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.30.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cmath = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cmd4lua = { + ['0.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cmdbuild = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cmft-base-kong'] = { + ['1.1.0'] = { + { + arch = "rockspec" + } + }, + ['1.2.0'] = { + { + arch = "rockspec" + } + } + }, + ['cmft-kong'] = { + ['1.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['cmp-rg'] = { + ['1.3.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cni = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + codec = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + cognitiologger = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + color = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['colorbox.nvim'] = { + ['1.13.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['colorbuddy.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + colorise = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + colormap = { + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + } + } + }, + colors = { + ['8.05.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + colorswatches = { + ['0.9.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['colortils.nvim'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + colyseus = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-3'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['com.logiceditor.fork.crc32'] = { + ['1.1.5.g84430b6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['com.logiceditor.fork.lxsh'] = { + ['0.8.7.7.g1df4485-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + combine = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['commander.nvim'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + commandlineui = { + ['1.69-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.70-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.71-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.72-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.73-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.74-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.75-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.76-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.77-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.78-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['comment-box.nvim'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['comment.nvim'] = { + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + commonmark = { + ['0.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['commons.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['12.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['12.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['15.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['15.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['15.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['16.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['17.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['17.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['18.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['9.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['9.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['9.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + compat52 = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + compat53 = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['comvita-kong-oidc'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + concurrentlua = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + config = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['config-by-env'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + configer = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + configh = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + configparser = { + ['1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['conform.nvim'] = { + ['5.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + conjure = { + ['4.51.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.52.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.52.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + connman_dbus = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + connman_widget = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + context = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + contract = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cookie = { + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + copas = { + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['copas-async'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['copas-ev'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['copas-sse'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + copastimer = { + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + corenlp = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['coro-http-luv'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + coronalog = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + coronastd = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + coronest = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-14'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-16'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-31'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-35'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-36'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-37'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-40'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + corowatch = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cosmo = { + ['10.03.31-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['10.04.06-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['13.01.30-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.03.04-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['16.06.04-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.02.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['8.04.04-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['8.04.14-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['9.09.22-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + cosock = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cosrun = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cosy-client'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['cosy-instance'] = { + ['0.0-2'] = { + { + arch = "rockspec" + } + } + }, + coutil = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['couyards.sile'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + coxpcall = { + ['1.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cpml-ci'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cpp-compiler-pretty-output'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cppjwt = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cprint = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cpu-widget'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + cputime = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cqueues = { + ['20150119.51-0'] = { + { + arch = "rockspec" + }, { + arch = "linux-x86_64" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['20150119.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150119.52-0'] = { + { + arch = "rockspec" + }, { + arch = "linux-x86_64" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['20150119.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150119.53-0'] = { + { + arch = "rockspec" + } + }, + ['20150119.53-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150907.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150907.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150907.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160316.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160316.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160316.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160808.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160808.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160808.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160812.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160812.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160812.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160812.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160812.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20160812.53-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161018.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161018.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161018.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161214.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161214.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161214.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161215.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161215.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161215.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20171014.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20171014.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20171014.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20190731.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20190731.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20190731.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20190813.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20190813.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20190813.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20200603.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20200603.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20200603.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20200726.51-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20200726.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20200726.53-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20200726.54-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cqueues-pgsql'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + crater = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + crayon = { + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + crc32 = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + createtable = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + crescent = { + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + crimp = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + croissant = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-6'] = { + { + arch = "rockspec" + } + } + }, + csn7 = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + csplit = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + csv = { + ['1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + csv2tensor = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + } + }, + ctc = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ctrim = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ctrl-oidc-transformer'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cue = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cuid = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cw = { + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cwnu-drcom'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.1-0'] = { + { + arch = "rockspec" + } + }, + ['3.2-0'] = { + { + arch = "rockspec" + } + } + }, + cwtest = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cx-gumbo'] = { + ['0.4-1'] = { + { + arch = "rockspec" + } + } + }, + cxt = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cyan = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['cybu.nvim'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + cyrussasl = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-3'] = { + { + arch = "rockspec" + } + } + }, + dado = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.4.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.7.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.8.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-3'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + daemonparts = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dag-to-lua'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + danetool = { + ['4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + darksidesync = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + darwin = { + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + } + }, + data2string = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + } + } + }, + ['datadome-openresty'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + datadumper = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + datafile = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dataframe = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + date = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['daylight.nvim'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dbhys-openresty-skywalking'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dbus_proxy = { + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['dd-lua-tester'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ddt = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['deadcolumn.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['debug.lua'] = { + ['0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + debugger = { + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + debugkit = { + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['debugkit-extra'] = { + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + decasify = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['decipher.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dedlit = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + deimos = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + delaunay = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + denque = { + ['0.5.1-1'] = { + { + arch = "rockspec" + } + } + }, + densearrays = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + depgraph = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + deq = { + ['0.4.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + } + } + }, + deque = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['detour.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dev-roshangeorge-ljsonschema'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + deviant = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dial.nvim'] = { + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dialplan = { + ['0.0-3'] = { + { + arch = "rockspec" + } + } + }, + ['dickens7-snowflake'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + } + } + }, + diff = { + ['8.06.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.06.15-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + digestif = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['digifi-lua-resty-session'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['digiprime-jwt'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + digitalfilter = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dirname = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + discount = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + } + }, + diskop = { + ['1.21.07.29-1'] = { + { + arch = "rockspec" + } + }, + ['1.21.08.13-1'] = { + { + arch = "rockspec" + } + } + }, + diskqueue = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dislua = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['distant.nvim'] = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + djot = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dkjson = { + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dns = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + } + }, + doc = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + doccotest = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + docker = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + docopt = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + docroc = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dogma-core'] = { + ['1.0.alpha1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta11-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta12-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta13-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta13-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta14-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta14-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta14-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta15-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta16-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta16-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta16-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta17-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta17-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta17-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta17-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta18-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta19-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta20-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta21-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta21-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta22-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta23-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta24-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta25-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta25-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta25-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta26-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta27-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta27-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta28-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta29-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta30-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta31-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta31-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta32-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta33-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta34-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc10-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc12-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc12-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc12-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc12-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc12-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc12-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc13-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc14-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc15-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc16-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc17-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc18-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc18-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc18-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc18-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc8-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc8-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dogmac = { + ['1.0.alpha1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.alpha9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta12-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta13-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta14-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta15-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta16-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta17-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta18-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta19-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta20-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta21-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta22-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta23-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta24-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta25-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta26-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta27-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta28-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta29-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta30-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta31-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta31-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta32-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta33-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta34-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.beta9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc12-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc13-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc14-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc15-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc16-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc17-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc18-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.rc9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + domotest = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['donut.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dotenv = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dprint = { + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dr.msgpuck'] = { + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dr.tap'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-14'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-15'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-16'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dressing.nvim'] = { + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-amalgamate'] = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-calendar'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-chunk'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-commons'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.24-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.27-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.28-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.29-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.30-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.31-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.32-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.33-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.34-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.35-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.36-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.37-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.38-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.39-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.40-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.41-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.42-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.43-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.45-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.46-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.47-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.48-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.49-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.50-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.53-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.54-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.55-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.56-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.57-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.58-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.59-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.60-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.61-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.63-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.64-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-compiler'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-curl'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-dom'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-dyld'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-fuse'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-future'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-graph'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.24-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.27-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.28-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.29-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.30-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.31-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.32-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.33-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.34-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.35-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.36-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.37-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.38-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.39-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.40-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.41-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-http'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-image'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-jpeg'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-json'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-lambda'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-multi'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-parser'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-png'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-primitives'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-prl'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-regexp'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-serializer'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-shlex'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-socks'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-sqlite3'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.24-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-tree'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-ubench'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-unix'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.24-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.27-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.28-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.29-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.30-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.31-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.32-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.33-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.34-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.35-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.36-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.37-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.38-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.39-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.40-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.41-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.42-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.43-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.45-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.46-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.47-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.48-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.49-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.50-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.53-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.54-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.55-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.56-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.57-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.58-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.59-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.60-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.61-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.62-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.63-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.64-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.65-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.66-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.67-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.68-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.69-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.70-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.71-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.72-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-utf8'] = { + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-vecmath'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-xml'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dromozoa-zmq'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dropbar.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + drylib = { + ['0.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ds = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dtracing = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['du-bundler'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['du-mocks'] = { + ['0.24.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.25.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.26.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.26.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.28.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.29.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.29.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dub = { + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dublang = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['duck.nvim'] = { + ['main-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dumbluaparser = { + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['dummy.lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dump = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + } + }, + dumper = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + dyana = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['eagle-lua-package'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + eansi = { + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['easy-http'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['easyjevko.lua'] = { + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['easypick.nvim'] = { + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['eaw-abstraction-layer'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ecasound = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + eccles = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + eclass = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + edge = { + ['0.0.1-10'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-11'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-12'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-13'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-6'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-7'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-8'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-9'] = { + { + arch = "rockspec" + } + } + }, + ['edgy.nvim'] = { + ['1.8.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['editorconfig-core'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + eff = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + effil = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + eja = { + ['1-0'] = { + { + arch = "rockspec" + } + } + }, + elasticsearch = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['elasticsearch-lua'] = { + ['1.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ele = { + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + elementslib = { + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + elfmap = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + elfs = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + elfutils = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['elixir-tools.nvim'] = { + ['0.13.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + elprofiler = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + elscheduler = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['embedders.sile'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + emdcriterion = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + emitter = { + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + emma = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + emoji = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['emoji-clock'] = { + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + emojify = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['empty-params-blocker'] = { + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ena = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-2'] = { + { + arch = "rockspec" + } + } + }, + ['enapter-sma'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['enapter-ucm'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['endel-struct'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + enet = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + enum = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + env = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + environ = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + epoll = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + } + }, + erde = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['erento-lua-rfc-4122-uuid-generator'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ergonomic_seed = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + errno = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + } + }, + error = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.10.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + } + } + }, + escher = { + ['0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-15'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-16'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-17'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['esk-lua-resty-auto-ssl'] = { + ['0.13.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + espeon = { + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.9-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.10-0'] = { + { + arch = "rockspec" + } + }, + ['1.11-0'] = { + { + arch = "rockspec" + } + }, + ['1.12-0'] = { + { + arch = "rockspec" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + } + }, + ['1.8-0'] = { + { + arch = "rockspec" + } + }, + ['1.9-0'] = { + { + arch = "rockspec" + } + } + }, + etcd = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + etf = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + etlua = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + evdev = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + eventbus = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + eventemitter = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + evm = { + ['0.10.0-1'] = { + { + arch = "rockspec" + } + } + }, + exaerror = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['exasol-virtual-schema-common-lua'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['exasol-virtual-schema-lua'] = { + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + exec = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + } + } + }, + exists = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + exit = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + expadom = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + expect = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['expect-promise'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['expect-spy'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ext-plugin-proto'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['extend.sile'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['external-auth'] = { + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['external-oauth'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['external-oauth2'] = { + ['1.2-6'] = { + { + arch = "rockspec" + } + } + }, + ['external-oauth3'] = { + ['1.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['external-oid'] = { + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + extname = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ezenv = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + } + }, + ezserv = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + } + }, + f = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['f-strings'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['f.lua'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fa-icons-4'] = { + ['1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + faker = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fakeredis = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + faketorio = { + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + families = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fancytoc.sile'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + fat_error = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fauxo = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fbclient = { + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fcgi = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fd = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + feedparser = { + ['0.71-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.71-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.71-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['feline.nvim'] = { + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fennel = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fennel-ls'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fennel_rblx = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fenster = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ff = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ff-lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fffonion-busted'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fffonion-lua-resty-kafka'] = { + ['0.15-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ffi-bzlib'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ffi-hyperparser'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ffiex = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fhirformats = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['fi-luajit'] = { + ['1.0'] = { + { + arch = "rockspec" + } + } + }, + fiber = { + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fidget.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fifo = { + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + filament = { + ['v1.0-1'] = { + { + arch = "rockspec" + } + }, + ['v1.1-1'] = { + { + arch = "rockspec" + } + } + }, + filekit = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + finally = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + finita = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + fir = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + firebase = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['flash.nvim'] = { + ['1.18.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['flatbuffers-lib'] = { + ['2.0.0-5'] = { + { + arch = "rockspec" + } + } + }, + flatfile = { + ['1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['flatten.nvim'] = { + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + flirt = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['flomesh-kong-plugin-session'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + } + }, + ['2.1.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['flomesh-lua-resty-healthcheck'] = { + ['0.6.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['flomesh-lua-resty-kafka'] = { + ['0.01-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.01-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.01-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.01-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.01-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + flos = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + flot = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + fltk4lua = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + flu = { + ['20101020-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20121106-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20121212-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150331-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20181218-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fluent = { + ['0.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fluidsynth = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['flutter-tools.nvim'] = { + ['1.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fly-bgcrypto-pbkdf2'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fly-bgcrypto-sha'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + flyzip = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fmtstr = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['focus.nvim'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fontproof = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fork = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['fork3-sc-lua-resty-auto-ssl'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + } + } + }, + form = { + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['form-multipart'] = { + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['form-urlencoded'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + forma = { + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + formatter = { + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + formatterfiveone = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fp = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fr = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + freetype = { + ['20140717-1'] = { + { + arch = "rockspec" + } + }, + ['20160824-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['freeze-code.nvim'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fs-utils'] = { + ['1.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fsm = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fsoutcall = { + ['1.0.1-8'] = { + { + arch = "rockspec" + } + } + }, + fsrouter = { + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + } + } + }, + fss = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fstat = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + } + }, + ftcsv = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fugit2.nvim'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fullscript-kong-oidc'] = { + ['1.2.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fun = { + ['0.1.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['fun-alloyed'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['function.lua'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + functional = { + ['0.10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-2'] = { + { + arch = "rockspec" + } + }, + ['0.9-3'] = { + { + arch = "rockspec" + } + }, + ['0.9-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + functorflow = { + ['0'] = { + { + arch = "rockspec" + } + } + }, + ['funnyfiles.nvim'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fusionscript = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fzf-lua'] = { + ['0.0.1000-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1003-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1005-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1007-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1009-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1011-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1013-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1017-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1019-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1021-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1023-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1024-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1026-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1027-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1028-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1031-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1033-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1035-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1037-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1039-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1040-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1046-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1048-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1049-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1052-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1053-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1055-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1058-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1059-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1061-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1064-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1065-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1066-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1067-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1068-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1070-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1071-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1072-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1075-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1076-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1079-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1080-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1084-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1085-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1090-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1091-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1093-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1095-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1097-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1098-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1099-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1100-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1102-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1103-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1106-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1107-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1110-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1111-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1112-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1114-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1117-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1118-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1121-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1131-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1132-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1134-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1136-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1141-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1144-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1147-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1151-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1155-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1161-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1166-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1170-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1171-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1172-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1175-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1179-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1181-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1184-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1186-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1187-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1190-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1191-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1192-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1194-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1195-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1196-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1202-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1207-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1211-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1213-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1216-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1219-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1220-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1221-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1222-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1225-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1226-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1229-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1231-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1232-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1243-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1246-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1253-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1255-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1261-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1264-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1265-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1266-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1268-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1269-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1273-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1274-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1277-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1278-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1283-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1286-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1287-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1288-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1289-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1291-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1294-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1296-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1298-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1301-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1302-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1304-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1309-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1313-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1318-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1320-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1323-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1334-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1337-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1338-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1340-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1341-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1342-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1349-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1350-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.769-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.771-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.776-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.777-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.778-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.780-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.783-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.785-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.788-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.789-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.790-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.794-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.795-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.797-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.798-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.799-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.800-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.804-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.807-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.809-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.810-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.811-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.814-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.815-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.817-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.821-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.823-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.825-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.827-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.831-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.832-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.834-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.837-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.839-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.844-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.847-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.850-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.851-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.853-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.854-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.855-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.856-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.858-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.860-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.863-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.865-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.872-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.874-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.875-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.877-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.878-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.886-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.887-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.888-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.896-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.897-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.898-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.903-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.906-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.912-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.916-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.918-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.921-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.924-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.928-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.929-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.931-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.936-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.939-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.940-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.942-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.943-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.949-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.951-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.954-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.955-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.956-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.958-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.960-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.961-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.964-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.965-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.967-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.968-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.970-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.974-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.975-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.977-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.978-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.981-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.983-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.984-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.986-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.990-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.993-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.996-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['fzfx.nvim'] = { + ['3.7.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + fzy = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['main-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + galconmodslib = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['galileo.nvim'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gambiarra = { + ['0.4.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['game-tools'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-3'] = { + { + arch = "rockspec" + } + } + }, + gamecake = { + ['18-005'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['18-006'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['22-001'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gauge = { + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gbk = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gcfn = { + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + gear = { + ['0.01-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.02-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.03-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + geezifylua = { + ['0.1.3-2'] = { + { + arch = "rockspec" + } + } + }, + ['genesi-password'] = { + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + } + } + }, + genny = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gentags.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + geo = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + geoip2 = { + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gerar_cpf_cnpj = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + getcwd = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + getenv = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + getopt = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-2'] = { + { + arch = "rockspec" + } + } + }, + getopts = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + getpid = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + getsize = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ggram = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gh-md-toc'] = { + ['1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ghl-lua-auto-ssl'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ghl-lua-resty-auto-ssl'] = { + ['0.13.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + giflib = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gimlet-cocktail'] = { + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gimlet-render'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gimple = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gin = { + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + girvel = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['git-worktree.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + github = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['github-nvim-theme'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gitlinker.nvim'] = { + ['4.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.12.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.12.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.12.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.13.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.8.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gitsigns.nvim'] = { + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + giturlparser = { + ['1.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + glass = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + glfw = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['globals-lua'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['glow.nvim'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + glum = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gluu-oauth2-client-auth'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gluu-oauth2-rs'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + glyphify = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gmi = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gntp = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gnucrypt = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['go.nvim'] = { + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gobo-awesome'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gobo-awesome-alttab'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gobo-awesome-battery'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gobo-awesome-bluetooth'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gobo-awesome-gobonet'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gobo-awesome-light'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gobo-awesome-screenlock'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gobo-awesome-sound'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['godo.nvim'] = { + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + golflike = { + ['0.6b-1'] = { + { + arch = "rockspec" + } + } + }, + gomaxmagick = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gonapps-cookie'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + } + } + }, + ['gonapps-jwt'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + } + } + }, + ['gonapps-url-decoder'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + } + } + }, + ['gonapps-url-encoder'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + } + } + }, + ['gonapps-url-query-parser'] = { + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + } + } + }, + ['gonapps-url-router'] = { + ['1.1-2'] = { + { + arch = "rockspec" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + } + }, + gpoll = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + } + } + }, + grapheme = { + ['master-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + graphql = { + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['graphql-parser'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + graphviz = { + ['v1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['grapple.nvim'] = { + ['0.17.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.18.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.18.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.19.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.22.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.25.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.26.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.27.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.28.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.28.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.28.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.28.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.29.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.30.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + grasp = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + grid = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['grpc-client-nginx-module'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gruvbox-baby'] = { + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gruvbox.nvim'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gt-mp-prometheus-plugin'] = { + ['1.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + } + } + }, + guard = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + guardia = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gumbo = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + gversion = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gwa-kong-endpoint'] = { + ['1.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['gxid-bearer'] = { + ['0.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['4.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['4.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['4.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['4.1.2-2'] = { + { + arch = "rockspec" + } + }, + ['4.1.2-60'] = { + { + arch = "rockspec" + } + }, + ['4.1.3-61'] = { + { + arch = "rockspec" + } + }, + ['4.1.3-62'] = { + { + arch = "rockspec" + } + }, + ['4.1.3-63'] = { + { + arch = "rockspec" + } + }, + ['4.1.3-64'] = { + { + arch = "rockspec" + } + }, + ['4.1.3-65'] = { + { + arch = "rockspec" + } + }, + ['4.1.3-72'] = { + { + arch = "rockspec" + } + } + }, + ['gxid-param'] = { + ['1.0.0-2'] = { + { + arch = "rockspec" + } + } + }, + ['gxs-auth'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-2'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-3'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-10'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-4'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-5'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-6'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-7'] = { + { + arch = "rockspec" + } + }, + ['2.0.3-11'] = { + { + arch = "rockspec" + } + }, + ['2.0.3-12'] = { + { + arch = "rockspec" + } + } + }, + h5tk = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + halo = { + ['1.1.8-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['haproxy-lua-acme'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['haproxy-lua-http'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + haricot = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + harpseal = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + } + } + }, + harryplotter = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hash = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['hash-code'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hasher = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hashids = { + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['haskell-snippets.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['haskell-tools.nvim'] = { + ['1.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['haxe-deps'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-6'] = { + { + arch = "rockspec" + } + } + }, + hc = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + hdf5 = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hdrhistogram = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['header-transfer'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['headlines.nvim'] = { + ['4.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + heaps = { + ['1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['hectorm-fork-http'] = { + ['0.3.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['heirline.nvim'] = { + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + heka_mock = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + helloluarocks = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + helloworld = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['heroku-openresty'] = { + ['1.2.8.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hex = { + ['1.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + hexterm = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hfun = { + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['master-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['master-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hglib = { + ['0.8-1'] = { + { + arch = "rockspec" + } + } + }, + ['hires-time'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['hjson-lua'] = { + ['0.1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['hlchunk.nvim'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hmac = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['hmac-auth-okadoc'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + homie = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hook_nt_create_file = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + horchata = { + ['0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + host = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['host-interpolate-by-header'] = { + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hotfix = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['hotfix-gen'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['hotpot.nvim'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hotswap = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['hotswap-ev'] = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['hotswap-hash'] = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['hotswap-http'] = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['hotswap-lfs'] = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + howl = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hprose = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hsluv = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hsm_statechart = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ht16k33 = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + htk = { + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.0-2'] = { + { + arch = "rockspec" + } + }, + ['3.5-1'] = { + { + arch = "rockspec" + } + } + }, + ['html-entities'] = { + ['1.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['html-tags'] = { + ['0.1.20210829-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.20210909-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.20211012-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + htmlparser = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + httoolsp = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + http = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + ['http-digest'] = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + httpclient = { + ['0.1.0-3'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-4'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-5'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-6'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-7'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + httprequestparser = { + ['ver-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['ver-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['ver-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hump = { + ['0.4-2'] = { + { + arch = "rockspec" + } + } + }, + hungarian = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + huntable = { + ['0.9-1'] = { + { + arch = "rockspec" + } + } + }, + hurdy = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + } + } + }, + husl = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + hussar = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['hx-lua-simdjson'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['hydra.nvim'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['hylaa-im-auth'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['hyper-ecs'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + i18n = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.2-1'] = { + { + arch = "rockspec" + } + } + }, + iame = { + ['master-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + icecream = { + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['icecream-lua'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + icu = { + ['0.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + idn2 = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + idna = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ihelp = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['image.nvim'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['master-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + image_handler = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + imagesize = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + imgui = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + immutable = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['imp-appsec-connector'] = { + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['incline.nvim'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['indent-blankline.nvim'] = { + ['3.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + indexedpng = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + inet = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ingress-nginx-safeline'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + inifile = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + inilazy = { + ['1.05-1'] = { + { + arch = "rockspec" + } + } + }, + injarg = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + inline = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + inotify = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + inspect = { + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.0-2'] = { + { + arch = "rockspec" + } + }, + ['3.0-3'] = { + { + arch = "rockspec" + } + }, + ['3.0-4'] = { + { + arch = "rockspec" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.2-0'] = { + { + arch = "rockspec" + } + }, + ['3.1.3-0'] = { + { + arch = "rockspec" + } + } + }, + intconvert = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['io-close'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['io-fileno'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['io-fopen'] = { + ['0.1.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['io-isfile'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['io-reader'] = { + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['io-readn'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['io-tofile'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['io-truncate'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['io-wait'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['io-writer'] = { + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['io-writev'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ioex = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['ios-icons'] = { + ['1.1-1'] = { + { + arch = "rockspec" + } + } + }, + iovec = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + } + }, + ip2location = { + ['8.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ip2locationio = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ip2proxy = { + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ipdb = { + ['beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['beta-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ipipx = { + ['beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ipqs-db-reader'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['irc-engine'] = { + ['5.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.0.pre5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['irc-formatter'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['irc-parser'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ircmess = { + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['iresty-nginx-lua-prometheus'] = { + ['0.20190917-0'] = { + { + arch = "rockspec" + } + } + }, + iris = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + is = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + isa = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + isodd = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + iter = { + ['0.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + itertools = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + itte = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + iwi = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + jeejah = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-3'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-4'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + jestronaut = { + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['jevko.lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + jmespath = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + jnet = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['johngrib.hammerspoon.caffein'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['johngrib.hammerspoon.winmove'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + jps = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + jsmin = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['json-logic-lua'] = { + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['json-lua'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + } + } + }, + ['json-rock'] = { + ['2.0-4'] = { + { + arch = "rockspec" + } + } + }, + ['json-rpc'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['json-threat-protection'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['json.lua'] = { + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + json2lua = { + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + json4lua = { + ['0.9.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.30-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + jsonnet = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + jsonpath = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + jsonrpc4lua = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + jsonschema = { + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.9-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['jsonschema-gitless'] = { + ['0.9-0'] = { + { + arch = "rockspec" + } + } + }, + ['jsonschema-mocker'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + jsregexp = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['jumbleberry-auto-ssl'] = { + ['0.13.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['jumbleberry-dogstatsd'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['jumbleberry-statsd'] = { + ['3.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + jumper = { + ['1.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0'] = { + { + arch = "rockspec" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + jwks_aware_oauth_jwt_access_token_validator = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + jwt = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + } + } + }, + ['jwt-jitsi'] = { + ['0.6-2'] = { + { + arch = "rockspec" + } + } + }, + ['k-stream'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['k-sway'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + kafka = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kai.nvim'] = { + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + kcp = { + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + kcp2 = { + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kemi-test-suite'] = { + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-4'] = { + { + arch = "rockspec" + } + }, + ['0.3-5'] = { + { + arch = "rockspec" + } + }, + ['0.3-6'] = { + { + arch = "rockspec" + } + }, + ['0.3-7'] = { + { + arch = "rockspec" + } + } + }, + keyauthvaluepass = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['keycloak-rbac'] = { + ['1.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + kikgit = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + kiwi = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + klib = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + kong = { + ['0.1.0beta-3'] = { + { + arch = "rockspec" + } + }, + ['0.1.1beta-2'] = { + { + arch = "rockspec" + } + }, + ['0.10.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.10.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.10.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.10.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.10.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.11.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.11.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.11.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.12.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.12.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.13.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.14.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.14.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.8.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.8.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.8.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.8.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.9-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0rc2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-advanced-router'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-aggregator'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['kong-aliyun-http-filter'] = { + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-api-composition'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-auth-key-jwt-server'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-10'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-4'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-5'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-6'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-7'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-8'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-9'] = { + { + arch = "rockspec" + } + } + }, + ['kong-auth-request'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-auth-request-trans'] = { + ['0.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-auth-signature'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-4'] = { + { + arch = "rockspec" + } + } + }, + ['kong-authz-proxy'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-auto-https'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-cassandra'] = { + ['0.5-8'] = { + { + arch = "rockspec" + } + } + }, + ['kong-circuit-breaker'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-client'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-cluster-drain'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-consumer-rate-limiting'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-consumer-route'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-custom-error-handlers'] = { + ['0.3.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-datadog-k8s'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-easter-eggs'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-enhanced-http-log'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-14'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-15'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-16'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-17'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-18'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-19'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-20'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-21'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-22'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-23'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-24'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-25'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-26'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-27'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-28'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-29'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-30'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-31'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-enhanced-oidc'] = { + ['1.0.0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-error-log'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-event-pub'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-event-pub-plugin'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-ext-auth'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-external-auth'] = { + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-external-auth-plugin'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-external-oauth'] = { + ['1.1-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-14'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-15'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-16'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-17'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-file-log-exclusion'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-force-https'] = { + ['0.1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-force-ssl'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-forward-proxy'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-forwarded-user-auth'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-header-access-control'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-http-to-https'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-http-to-https-redirect'] = { + ['0.13.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-https-redirect'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-influxdb'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-ip-location'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-jwt-claim-headers'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-jwt-firebase'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-22'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-23'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-24'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-8'] = { + { + arch = "rockspec" + } + } + }, + ['kong-jwt2header'] = { + ['1.0-3'] = { + { + arch = "rockspec" + } + } + }, + ['kong-jwt2header-raftx24'] = { + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-kafka-custom-log'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-kafka-log'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-keycloak'] = { + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-lapis'] = { + ['1.14.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.7.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-lib-logger'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-log-google'] = { + ['1.4-6'] = { + { + arch = "rockspec" + } + } + }, + ['kong-lua-ffi-zlib'] = { + ['0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-lua-resty-kafka'] = { + ['0.10-0'] = { + { + arch = "rockspec" + } + }, + ['0.11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.18-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.19-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-lua-sandbox'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-luasec'] = { + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-mocking-advanced'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-mtls-validate'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-o2b-ticketing'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-oauth-proxy'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-oauth2-ext'] = { + ['0.0.1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-oidc'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-oidc-adfs'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-oidc-auth'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-oidc-auth-akshay'] = { + ['0.1-3'] = { + { + arch = "rockspec" + } + } + }, + ['kong-oidc-by-prashanth'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-oidc-consumer'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-oidc-forward-host'] = { + ['1.1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-oidc-google-groups'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-10'] = { + { + arch = "rockspec" + } + }, + ['0.1-11'] = { + { + arch = "rockspec" + } + }, + ['0.1-12'] = { + { + arch = "rockspec" + } + }, + ['0.1-13'] = { + { + arch = "rockspec" + } + }, + ['0.1-14'] = { + { + arch = "rockspec" + } + }, + ['0.1-15'] = { + { + arch = "rockspec" + } + }, + ['0.1-16'] = { + { + arch = "rockspec" + } + }, + ['0.1-17'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + } + }, + ['0.1-8'] = { + { + arch = "rockspec" + } + }, + ['0.1-9'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + } + } + }, + ['kong-oidc-ng'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-oidc-test'] = { + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-oidc-v2'] = { + ['2.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-oidc-v3'] = { + ['1.3.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-oidc-ws-rbac'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-opa'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-opa-plugin'] = { + ['0.0.1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-path-allow'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-path-based-routing'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-path-rewrite'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-path-whitelist'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-payload-size-limiting'] = { + ['0.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-pgmoon'] = { + ['1.16.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-phantom-token'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-abac'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-abtesting'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-acl-keycloak'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-acme'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-acp'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.0-5'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['kong-plugin-add-header'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-add-header-to-request'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-add-headers'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-amqp'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-6'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-amqp-rpc'] = { + ['1.0.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-api-key-access-control'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-api-transformer'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-api-version'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-api-version-1'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-apikey-validator'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.9-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-auth-endpoint-config-ishare'] = { + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-authz'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-aws-api-gateway-auth'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-aws-kinesis'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-aws-lambda'] = { + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-aws-lambda-response-transformer'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-aws-lambda-status-code'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-azure-functions'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-bearer'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-cads-jwt-keycloak'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-cads-stash-body-in-ctx'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-check-permissions'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-circuit-breaker'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-concurrent-connections-quota'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-connections-quota'] = { + ['0.1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-consumer-cors'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-cookies-to-headers'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-csp'] = { + ['0.1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-custom'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-custom-rt'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-datadog-tags'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-datadome'] = { + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-dbless-reload'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-ddtrace'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-debug'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-detect-path'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-deviceuid'] = { + ['0.2.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-download-limiter'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-dynamic-route'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-endpoint-access-control'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-escher'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-escher-signer'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-extend-headers'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-file-log-advanced'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-file-log-extended'] = { + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + ['kong-plugin-first-plugin'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-flexible-rate-limit'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-geo-restriction'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-geoip'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-google-cloud-functions'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-google-logging'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-google-recaptcha'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-google-storage-adapter'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.12-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.6-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.7-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-grpc-gateway'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-grpc-web'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-gwa-ip-anonymity'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-hal'] = { + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-header-based-rate-limiting'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-header-based-request-termination'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-header-translator'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-headercheck'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-headers-validation'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-hello'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-hello-world'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-hello-you'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-helloworld'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-html-replacer'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-http-log-multi-body'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-http-log-with-body'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-http-log-with-body-base64'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-http-mirror'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-http301https'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-ice-grpc-gateway'] = { + ['0.0.1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.3'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-3'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-2'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-ice-jaeger'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-idempotency'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-impart'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-inigo'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-jdy-signature'] = { + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jq-transformer'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-json-threat-protection'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jurnal-oauth2'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jwt'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-jwt-auth'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jwt-auth-rbac'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jwt-auth-token-validate'] = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jwt-blacklist'] = { + ['0.1.1-6'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-3'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-2'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-3'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-4'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-5'] = { + { + arch = "rockspec" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.6-2'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-jwt-claims-headers'] = { + ['1.0-2'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-jwt-claims-to-headers'] = { + ['0.2.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jwt-claims-validate'] = { + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jwt-crafter'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['kong-plugin-jwt-crafter-for-ee'] = { + ['1.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-jwt-fetcher'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jwt-keycloak'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-jwt-rbac'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['kong-plugin-jwt-up'] = { + ['1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jwt-validation'] = { + ['1.2-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-jwt-verifier'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-kafka-log'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-key-auth-referer'] = { + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-key-secret'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-keycloak-auth-request'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-kong-plugin-auth'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-kubernetes-sidecar-injector'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-log-extended'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-lua-resty-waf'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + ['kong-plugin-maxmind-geoip2'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-mihelloworld'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-mithril'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-mitm'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-mm-rate-limiting'] = { + ['0.0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-mongologger'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-mpay-jurnal'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-mtls-auth'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-mtls-validate'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-myplugin'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-myplugin1'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-myredirect'] = { + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-newrelic-insights'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-ngsi-ishare-policies'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-oasvalidator'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-oauth2-audience'] = { + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-oauth2-token-introspection-request'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-oidc'] = { + ['1.3.6-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-oidc-acl'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-oidc-acl-fix'] = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-opa'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-opa2'] = { + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-openwhisk'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-optional-jwt'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-ory-kratos'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-param-transformer'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-paseto'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-path-prefix'] = { + ['0.1.0-2'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-path-replacer'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-perimeterx'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-ping-auth'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-pipeline'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-prometheus'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-proxy-cache'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-proxycache'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-queryparams-to-headers'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-ram'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-rate-limiting-quotas'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-rbac'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-redirect'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-redis-auth'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-referer'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-referer-blacklist'] = { + ['2.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-replace-url'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-request-firewall'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-request-response-logging'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-request-start'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-request-transformer'] = { + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-request-validator'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-reroute-after'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-reroute-around'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-reroute-before'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-resource-transformer'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-respond-redirect'] = { + ['0.10.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-response-cache'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-response-transformer-tobase64'] = { + ['1.0-5'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-rewrite'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-route-by-cookie'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-route-by-jsonrpc-method'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-rule-based-header-transformer'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-sa-jwt-claims-validate'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-serverless-functions'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-session'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-shepherd'] = { + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-signalfx'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-skywalking'] = { + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-sliding-window-rate-limiting'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-soap-transform'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-soap4kong'] = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-soap4kong-generator'] = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-static-response'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-stdout-log'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-subdomain-as-header'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-sync-eureka'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-tag-executor'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-template'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-template-transformer'] = { + ['0.10.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-the-fuckman'] = { + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-the-middleman'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-tmim-forward-proxy'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-token-agent'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-token-to-header-extractor'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-traceable'] = { + ['1.0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-universal-jwt'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-uoa-soap-to-rest'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-uppercase-response'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-upstream-auth-basic'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-upstream-basic-auth'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-upstream-environment'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-upstream-google-id-token'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-upstream-oauth2'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-upstream-redirect'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-upstream-selector'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-url-prefix'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-url-regex-rewriter'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-3'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-url-replace'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-url-rewrite'] = { + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-usagelogger'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-user-profile-validation'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-wait'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-wayz-log'] = { + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-wsse'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-xml-search'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-plugin-xml-threat-protection'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugin-zipkin'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-plugins-openidc'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-post-auth-hook'] = { + ['0.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + } + }, + ['kong-pre-auth-hook'] = { + ['0.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.0-3'] = { + { + arch = "rockspec" + } + }, + ['0.0-4'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + } + }, + ['1.1-5'] = { + { + arch = "rockspec" + } + }, + ['1.1-6'] = { + { + arch = "rockspec" + } + }, + ['1.1-7'] = { + { + arch = "rockspec" + } + } + }, + ['kong-prometheus-plugin'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.3.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.3.4-2'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-proxer'] = { + ['2.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.0-3'] = { + { + arch = "rockspec" + } + }, + ['2.0-4'] = { + { + arch = "rockspec" + } + }, + ['2.0-5'] = { + { + arch = "rockspec" + } + }, + ['2.0-6'] = { + { + arch = "rockspec" + } + } + }, + ['kong-proxy-cache-plugin'] = { + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-redis-cluster'] = { + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-request-allow'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-request-header'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-request-intercept'] = { + ['0.1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-request-jwt-header'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-response-log'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-response-size-limiting'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-rhsso'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + } + }, + ['kong-safeline'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-scalable-rate-limiter'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-segment-log'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-service-virtualization'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-signature-and-remove-attr'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-simple-request-validator'] = { + ['0.0.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-siteminder-auth'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-skywalking'] = { + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-slack-hmac'] = { + ['0.12.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-spec-expose'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-splunk-handler'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-splunk-log'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-splunk-log-customized'] = { + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.9-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-startbid-oidc-acl'] = { + ['1.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['kong-timechecking'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-4'] = { + { + arch = "rockspec" + } + } + }, + ['kong-tx-debugger'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-uma-rs'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-upstream-hmac'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-upstream-jwt'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-upstream-jwt-extended'] = { + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['kong-user-agent-based-routing'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['kong-virtual-endpoints'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + kong_injection = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + kong_plugin_salt_sensor = { + ['1.0.0-3'] = { + { + arch = "rockspec" + } + } + }, + kosmo = { + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + kpgmoon = { + ['1.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + kqueue = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + } + }, + krpc = { + ['0.1.11-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.12-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.10-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.11-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.9-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.4-0'] = { + { + arch = "rockspec" + } + } + }, + kvpairs = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['labelrefs.sile'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + lacord = { + ['1569435811-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1569631241-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1574559577-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1574559577-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1582301062-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1590965828-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1617477179-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1618833413-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1619975269-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1622157568-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1627995481-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1627995481.88199-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1629838555-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1637789515-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lacord-client'] = { + ['3174939966-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lain = { + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + lake = { + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lalarm = { + ['20061011-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20090501-1'] = { + { + arch = "rockspec" + } + }, + ['20090501-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120503-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lambda = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lamda = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + landlord = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lanes = { + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.10.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.10.1-1'] = { + { + arch = "rockspec" + } + }, + ['3.11-1'] = { + { + arch = "rockspec" + } + }, + ['3.13.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.13.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.15.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.15.1-0'] = { + { + arch = "rockspec" + } + }, + ['3.16.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.16.1-0'] = { + { + arch = "rockspec" + } + }, + ['3.16.2-0'] = { + { + arch = "rockspec" + } + }, + ['3.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.8.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + language = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + languagedetect = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + lap = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lapis = { + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lapis-annotate'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lapis-bayes'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lapis-cache'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lapis-community'] = { + ['1.36.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.37.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.38.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.40.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.41.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.42.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.42.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.42.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.43.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lapis-console'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lapis-crud'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lapis-eswidget'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lapis-exceptions'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lapis-redis'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lapis-spec-screenshot'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lapis-systemd'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lapis_layout = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + lascii85 = { + ['20070627-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['20100323-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120927-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + latclient = { + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['launchdarkly-server-sdk'] = { + ['2.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['launchdarkly-server-sdk-redis'] = { + ['2.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lauxhlib = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + } + } + }, + laws = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + layeredata = { + ['0.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + } + } + }, + ['lazy.nvim'] = { + ['10.17.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.18.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.19.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.20.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.20.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.20.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.20.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.20.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.21.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.21.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.21.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.22.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.22.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.22.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.23.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.24.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.24.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.24.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10.24.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lazybag = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + lbase64 = { + ['20070628-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['20100323-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120807-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120807-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120820-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lbc = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20070627-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20090529-1'] = { + { + arch = "rockspec" + } + }, + ['20100404-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120420-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120430-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20180729-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lbci = { + ['20090306-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130429-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150629-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lbuffer = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + lbuilder = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lcf = { + ['5.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lcmark = { + ['0.23.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.25.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.26.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.27.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.28.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.29.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.29.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.29.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.29.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.30.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lcolorize = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + lcomplex = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20091103-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20100404-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120430-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20180729-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lcrypt = { + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lcsv = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lcurses = { + ['6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['9.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ldecnumber = { + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ldoc = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.10-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.11-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.8-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.5-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.6-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.6-2'] = { + { + arch = "rockspec" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lecho = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + leda = { + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ledge = { + ['1.26-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.26.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.27-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.27.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.27.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.28-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['leetcode.nvim'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lefthook = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + leg = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + ['legendary.nvim'] = { + ['2.13.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.13.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.13.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.13.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.13.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lerror = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + leste = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + } + } + }, + lester = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lffetch = { + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + } + } + }, + lfsampler = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lfunctimer = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + lgdbm = { + ['20070628-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20100824-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20101030-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130702-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130702-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130702.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130702.52-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150420.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150421.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20211118.52-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lgetchar = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lgetopt = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.8-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lgi = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lgi-async-extra'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lglob = { + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lgmp = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lgsl = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + liba = { + ['0.1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['libcidr-ffi'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + libdeflate = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + libmagic = { + ['5.41-1'] = { + { + arch = "rockspec" + } + }, + ['5.41.1-1'] = { + { + arch = "rockspec" + } + }, + ['5.41.2-1'] = { + { + arch = "rockspec" + } + }, + ['5.41.3-1'] = { + { + arch = "rockspec" + } + } + }, + libmdbx = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.11.13-2'] = { + { + arch = "rockspec" + } + } + }, + libphonenumber = { + ['1.0-2'] = { + { + arch = "rockspec" + } + } + }, + libpq = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + libqrpng = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + } + }, + libsodium = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + libssh = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + libssh2 = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + libtls = { + ['2.5.4-1'] = { + { + arch = "rockspec" + } + }, + ['2.7.3-1'] = { + { + arch = "rockspec" + } + }, + ['2.7.3-2'] = { + { + arch = "rockspec" + } + }, + ['2.7.4-1'] = { + { + arch = "rockspec" + } + }, + ['2.7.4-2'] = { + { + arch = "rockspec" + } + }, + ['2.7.4-3'] = { + { + arch = "rockspec" + } + }, + ['3.4.1-2'] = { + { + arch = "rockspec" + } + }, + ['3.4.1-3'] = { + { + arch = "rockspec" + } + }, + ['3.5.2-1'] = { + { + arch = "rockspec" + } + } + }, + libzmanim = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "kindlepw2" + } + } + }, + ['lice-lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lift = { + ['0.1.0-4'] = { + { + arch = "rockspec" + } + } + }, + lifter_puller = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + light = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lightdrop = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lightningmdb = { + ['0.9-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.17.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.17.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.17.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.18.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.18.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.19.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.22.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lil = { + ['master-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + liluat = { + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + limath = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + linenoise = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['linenoise-windows'] = { + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lingy = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + lini = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['linked-list'] = { + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + linkedlist = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lint64 = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130805.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130805.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20180730-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + linterval = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120501-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120509-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20180729-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + liquid = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + list = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lit = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + litcord = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + literal = { + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['live-command.nvim'] = { + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lj2procfs = { + ['0.1-4'] = { + { + arch = "rockspec" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + } + } + }, + ljack = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ljdns = { + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['2.4-0'] = { + { + arch = "rockspec" + } + } + }, + ljlinenoise = { + ['0.1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ljndpi = { + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ljsonschema = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ljsyscall = { + ['0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10-2'] = { + { + arch = "rockspec" + } + }, + ['0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + llhttp = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + llix = { + ['v0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + llscheck = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + llsocket = { + ['0.10.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.11.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.12.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.14.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.15.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.15.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.15.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.16.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + } + } + }, + llui = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + lluv = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.10-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lluv-curl'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lluv-ftp'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lluv-poll-zmq'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lluv-redis'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lluv-rs232'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lluv-ssl'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lmake = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + lmapm = { + ['20070628-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20090403-2'] = { + { + arch = "rockspec" + } + }, + ['20090403-3'] = { + { + arch = "rockspec" + } + }, + ['20100420-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120501-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120509-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lmathx = { + ['20080423-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20080903-1'] = { + { + arch = "rockspec" + } + }, + ['20090219-1'] = { + { + arch = "rockspec" + } + }, + ['20090808-1'] = { + { + arch = "rockspec" + } + }, + ['20100404-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120430-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120430.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120430.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20140620-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150505-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150624-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lmd5 = { + ['20130228-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130228-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lmpfr = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lmpfrlib = { + ['20170112-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20170112-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ln = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lnet = { + ['4.0-0'] = { + { + arch = "rockspec" + } + } + }, + lnodelist = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + lnotify = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loadchunk = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + } + }, + loadconf = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loader = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loadkit = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lobject = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + localexec = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lockbox = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + locky = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + lodash = { + ['0.02-0'] = { + { + arch = "rockspec" + } + } + }, + log = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['log-request-with-body'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['log.lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + log4l = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + log4lua = { + ['0.0.1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + logface = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loggedkv = { + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + } + } + }, + logger = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['logging.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + logit = { + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loglua = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loldb = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + long = { + ['2.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loop = { + ['2.2alpha-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['2.3beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loopcollections = { + ['1.0beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loopcomp = { + ['1.0beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loopdebugging = { + ['1.0beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loopobjects = { + ['1.0beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loopparsing = { + ['1.0beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loopserializing = { + ['1.0beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loowy = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lor = { + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + los = { + ['0.0.1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + } + }, + losc = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lotus = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lotus-api'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['love-imgui'] = { + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['love-ora'] = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['love-release'] = { + ['2.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.12-2'] = { + { + arch = "rockspec" + } + }, + ['2.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.13-2'] = { + { + arch = "rockspec" + } + }, + ['2.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['love2d.nvim'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lovebird = { + ['0.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loveconsole = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-2'] = { + { + arch = "rockspec" + } + } + }, + loverboy = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + loverocks = { + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lovetoys = { + ['0.2.0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lox = { + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lp = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lpack = { + ['20070629-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + } + }, + lpatch = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + lpath = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lpc = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lpdf = { + ['20070717-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20070717-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130627.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130627.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130702.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130702.52-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lpeg = { + ['0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['0.10-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['0.7-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lpeg_patterns = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lpeglabel = { + ['0.12.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.12.2-2'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.6.2-1'] = { + { + arch = "rockspec" + } + } + }, + lpegrex = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lpm = { + ['0.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.0-3'] = { + { + arch = "rockspec" + } + }, + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + } + }, + lposix = { + ['20031107-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lpresence = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lpty = { + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lpugl = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + } + }, + lpugl_cairo = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + } + }, + lpugl_opengl = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + } + }, + lq = { + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lqd = { + ['20120420-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120430-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lqmath = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lrand = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lrandom = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20070628-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['20090623-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20101118-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120430.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120430.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20180729-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lrbtree = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lrc = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lrdb = { + ['0.1.7-2'] = { + { + arch = "rockspec" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + } + }, + lredux = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lrexlib-gnu'] = { + ['2.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lrexlib-oniguruma'] = { + ['2.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lrexlib-pcre'] = { + ['2.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lrexlib-pcre2'] = { + ['2.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lrexlib-posix'] = { + ['2.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lrexlib-tre'] = { + ['2.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lrexrepl = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + } + }, + lrt = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + } + } + }, + lrtaudio = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + lrtmidi = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + lrunkit = { + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lsh = { + ['0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lsha2 = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + lsleep = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lsm = { + ['0.4-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lsnes-timer'] = { + ['v0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lsocket = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lson = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lsp-progress.nvim'] = { + ['1.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lsp_signature.nvim'] = { + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lspec = { + ['0.0-1'] = { + { + arch = "rockspec" + } + } + }, + lsqlcipher = { + ['0.9.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lsqlite3 = { + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.9.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.9.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.6-1'] = { + { + arch = "rockspec" + } + } + }, + lsqlite3complete = { + ['0.9.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.6-1'] = { + { + arch = "rockspec" + } + } + }, + ltcltk = { + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ltdiff = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ltermbox = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ltest = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ltext = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ltl = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + } + }, + ltreesitter = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ltui = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-1'] = { + { + arch = "rockspec" + } + }, + ['2.7-1'] = { + { + arch = "rockspec" + } + }, + ['2.8-1'] = { + { + arch = "rockspec" + } + } + }, + ltype = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ltypekit = { + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ltypekit-parser'] = { + ['7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-acme'] = { + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-aho-corasick'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-amf3'] = { + ['2.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-amqp'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-amqp-client'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + } + }, + ['lua-anki-connect'] = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-api-gateway-aws'] = { + ['1.7.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-api-gateway-cachemanager'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-api-gateway-hmac'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-aplicado'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-apr'] = { + ['0.18-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.18-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-arangodb'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-argparse'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-askpass'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-avro'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-basex'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-bcrypt'] = { + ['0.01-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-ber'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-bitcask'] = { + ['0.1.20210907-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.20210912-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.20210917-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.20210928-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-boolexpr'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-brotli'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-bsdiff'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-buffet'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-busmt-if'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-bz2'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-c3class'] = { + ['0.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-capnproto'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-captcha'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-casclib'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-cassandra'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-0'] = { + { + arch = "rockspec" + } + }, + ['dev-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-cb0r'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-cbor'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-cc'] = { + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-chan'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-channels'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-chartplot'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-circuit-breaker'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-cjson'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-cjson-219'] = { + ['2.1.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-cjson-ol'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-cjson2'] = { + ['2.1devel-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-class'] = { + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-cli'] = { + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-click'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-cmsgpack'] = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-cn-cbor'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-coat'] = { + ['0.9.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-coatpersistent-lsqlite3'] = { + ['0.2.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-coatpersistent-luasql'] = { + ['0.2.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-codegen'] = { + ['0.3.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-color'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-colorlog'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-conciseserialization'] = { + ['0.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-conciseserialization-lua53'] = { + ['0.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-covid-data'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-crontab'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-crypt'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-csnappy'] = { + ['0.1.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-csv'] = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-curl'] = { + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.8-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-custom-test'] = { + ['0.0-51'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-dancing-links'] = { + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-dataclass'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-db'] = { + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-ddlt'] = { + ['2.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-3'] = { + { + arch = "rockspec" + } + }, + ['2.4-0'] = { + { + arch = "rockspec" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + } + }, + ['2.5-0'] = { + { + arch = "rockspec" + } + }, + ['2.6-0'] = { + { + arch = "rockspec" + } + }, + ['2.7-0'] = { + { + arch = "rockspec" + } + }, + ['2.8-0'] = { + { + arch = "rockspec" + } + }, + ['2.8-1'] = { + { + arch = "rockspec" + } + }, + ['2.8-2'] = { + { + arch = "rockspec" + } + } + }, + ['lua-de'] = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-deresute'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-di'] = { + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-discount'] = { + ['1.2.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.10.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-docx'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-dog'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-dynamic-cors'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-easy-crypto'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-em'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-emoji'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-epoll'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-erento-hmac'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-erento-uuid'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-errhandler'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-espeak'] = { + ['1.36r1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-ev'] = { + ['v1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.4-1'] = { + { + arch = "rockspec" + } + }, + ['v1.5-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-evdev'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-event-dispatcher'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-express'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-express-middlewares'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-exprtk'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-extended'] = { + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-ezlib'] = { + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-fann'] = { + ['0.4-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-fastlz'] = { + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-fastutils'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-ffi-libinjection'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-ffi-zlib'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-filesize'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-fiware-lib'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-floyd-sampling'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-fort'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-fs-module'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-gainer-lib'] = { + ['1.1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-gd'] = { + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-geoip'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-getch'] = { + ['0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-gl'] = { + ['1.15.05.99-01'] = { + { + arch = "rockspec" + } + } + }, + ['lua-glob-pattern'] = { + ['0.2.1.20120406-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-globals'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-gltf'] = { + ['1.0.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-gmod-lib'] = { + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-gnuplot'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-h3'] = { + ['4.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['4.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-hangul'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-hashings-and-nums'] = { + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-help'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-hiredis'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-hiredis-5.2-all-fixed'] = { + ['0.2.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-hiredis-cluster'] = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-hiredis-with-5.2-fix'] = { + ['0.2.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-http-parser'] = { + ['2.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-http2tcp'] = { + ['0.0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-i18n'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-iconv'] = { + ['6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['r3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['r5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['r5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-igt'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-imlib2'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-import'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-industrial-logger'] = { + ['1.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-ini'] = { + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-inih'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-input'] = { + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-irc'] = { + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-jconv'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-jet'] = { + ['v0.10-1'] = { + { + arch = "rockspec" + } + }, + ['v0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-jq'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-json'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-jsonpatch'] = { + ['0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-jwc'] = { + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-jwk2pem'] = { + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-l10n'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-lace'] = { + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-lander'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-laxjson'] = { + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-lcdproc'] = { + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.8-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.8-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-leveldb'] = { + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-lhtmlr'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-libmodbus'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-linear'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-livr'] = { + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-livr-extra'] = { + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-ljson'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-llthreads'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-llthreads2'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-llthreads2-compat'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-log'] = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-log-r'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-logger'] = { + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-long-polling'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-louis'] = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-lru'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-lsp'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-lsw'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-lswcli'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-lz4'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-lzma'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-m6502'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-markdown-extra'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-marshal'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['v1.0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-mastodon'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-maxminddb'] = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mbedtls'] = { + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mc'] = { + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mcrypt'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['lua-messagepack'] = { + ['0.5.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-messagepack-lua53'] = { + ['0.5.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mikrotik'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-minittp'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mnemonic'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mock'] = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mongo'] = { + ['1.2.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mongo-bson'] = { + ['1.2.3-2'] = { + { + arch = "rockspec" + } + } + }, + ['lua-mosquitto'] = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mosquitto-v5'] = { + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mqtt'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mtrace'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-mud'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-multipart-parser'] = { + ['0.1.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-multipart-post'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-myallocator'] = { + ['0.02-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-nanoid'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-netudpif'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-newrelic-integration'] = { + ['0.01-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.01-5'] = { + { + arch = "rockspec" + } + }, + ['0.01-6'] = { + { + arch = "rockspec" + } + }, + ['0.01-7'] = { + { + arch = "rockspec" + } + } + }, + ['lua-nginx-logging'] = { + ['v1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-nng'] = { + ['master-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-nowplaying'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-nucleo'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-nuspell'] = { + ['0.1alpha-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2alpha-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3alpha-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4alpha-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5alpha-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-oast'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-obfuscator.nvim'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-object'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-ocrspace'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + } + } + }, + ['lua-octave'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-openai'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-opencage-geocoder'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-option'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-package'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-parser'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-path'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-payssion'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-periphery'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-pg-dmo'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-pie'] = { + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-promise'] = { + ['0.1-3'] = { + { + arch = "rockspec" + } + } + }, + ['lua-protobuf'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-protobuf-etcd'] = { + ['0.3.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-quickcheck'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-randombytes'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-rbtree'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-readline'] = { + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-recaptcha'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-rectangle'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-reql'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-3'] = { + { + arch = "rockspec" + } + }, + ['0.6-4'] = { + { + arch = "rockspec" + } + }, + ['0.6-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-6'] = { + { + arch = "rockspec" + } + }, + ['0.6-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-requests'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-requests-async'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resp'] = { + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-acme'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-agoradynamickey'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-aries'] = { + ['release-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-auto-ssl'] = { + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-auto-ssl-20200912'] = { + ['0.14.4-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-auto-ssl-de'] = { + ['0.11.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-auto-ssl-instrumented'] = { + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-auto-ssl-multiname'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-aws'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-aws-auth'] = { + ['0.01-0'] = { + { + arch = "rockspec" + } + }, + ['0.11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-aws-email'] = { + ['0.01-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-aws-sdk'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-azure'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-balancer'] = { + ['0.02rc5-0'] = { + { + arch = "rockspec" + } + }, + ['0.04-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-beanstalkd'] = { + ['0.0-5'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-busted'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-busted2'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.4-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-casbin'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-casbin-adapter'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-certificate-sso'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-checkups'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-configure'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-console'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-consul'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-consul-0.3.2'] = { + ['0.3-2'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-consul-event'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-cookie'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-core'] = { + ['0.1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.17-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.17-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.17-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-cors'] = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-couchbase'] = { + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-couchdb'] = { + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-counter'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-crypto'] = { + ['master-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-ctxdump'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-dns'] = { + ['0.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-dns-client'] = { + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-dogstatsd'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-dogstatsd-jb'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-duo-mobile'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-env'] = { + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-etcd'] = { + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.9-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.10.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.4.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.4.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.4.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.4.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.5.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.5.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.5.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-exec'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-execvp'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-expr'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-fastutils'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-feishu-auth'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-fernet'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-ffi'] = { + ['main-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-ffi-python'] = { + ['main-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-fileinfo'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-fluent-logger'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-fluentd'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-ga'] = { + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-gaze'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-gcp'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-github'] = { + ['v1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-global-throttle'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-grpc-gateway'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-hashids'] = { + ['1.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-healthcheck'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-healthcheck-alins'] = { + ['3.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['3.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['3.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.1.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-healthcheck-api7'] = { + ['2.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-healthcheck-iresty'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-2'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-healthcheck-snz1'] = { + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-hipchat'] = { + ['v1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-hmac'] = { + ['v1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-hmac-ffi'] = { + ['0.05-0'] = { + { + arch = "rockspec" + } + }, + ['0.06-0'] = { + { + arch = "rockspec" + } + }, + ['0.06-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-hoedown'] = { + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-hs'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-hs-no-build'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-http'] = { + ['0.06-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.07-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.08-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.09-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.0.beta.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-http2'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-httpipe'] = { + ['0.05-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-influx'] = { + ['0.2.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-influx-mufanh'] = { + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-influx-statistics'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-7'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-info'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-injection'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-ipmatcher'] = { + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.6.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-iputils'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-iyo-auth'] = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-jit-uuid'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-jq'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-jsonrpc-batch'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-jwt'] = { + ['0.1.10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-jwt-48606'] = { + ['0.1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-kafka'] = { + ['0.06-0'] = { + { + arch = "rockspec" + } + }, + ['0.07-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.08-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.09-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.22-0'] = { + { + arch = "rockspec" + } + }, + ['0.23-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-keycloak'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-latch'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-ldap'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-libcjson'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-libr3'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.9-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-limit-rate'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-ljsonschema'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-ljusb'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-lock'] = { + ['0.07-0'] = { + { + arch = "rockspec" + } + }, + ['0.08-0'] = { + { + arch = "rockspec" + } + }, + ['0.08-1'] = { + { + arch = "rockspec" + } + }, + ['0.09-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-logger-socket'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-lrucache'] = { + ['0.09-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.09-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-luasocket'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-macaroons'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-mail'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-maxminddb'] = { + ['1.3.3-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-maxminddb-multi'] = { + ['1.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-mediador'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-memcached'] = { + ['0.13-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-mlcache'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.7.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-mock'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-moesif'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-motan'] = { + ['0.1.5-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-mpd'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-multiplexer'] = { + ['0.02-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-murmurhash2'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-murmurhash3'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-mutex'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-mysql'] = { + ['0.15-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-nanoid'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-nats'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-nettle'] = { + ['0.100-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.101-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.102-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.103-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.104-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.105-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.95-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.96-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.97-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.98-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.99-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-nghttp2'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-nghttp2-asio'] = { + ['1.2.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-ngxvar'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.2-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-ntlm'] = { + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-oakrouting'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-oauth-proxy'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-openidc'] = { + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.6-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-openssl'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0rc0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.10-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.24-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-passwdqc'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-paypal'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-perf'] = { + ['1.0.0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-phantom-token'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-postgres'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-postgres-client'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-prettycjson'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-prometheus'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-pubsub'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-pushover'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-qless'] = { + ['0.07-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.08-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-queue'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-r3'] = { + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-rabbitmqstomp'] = { + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-radixtree'] = { + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.9-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + } + }, + ['1.8-0'] = { + { + arch = "rockspec" + } + }, + ['1.9-0'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + } + }, + ['2.3-0'] = { + { + arch = "rockspec" + } + }, + ['2.4-0'] = { + { + arch = "rockspec" + } + }, + ['2.5-0'] = { + { + arch = "rockspec" + } + }, + ['2.6-0'] = { + { + arch = "rockspec" + } + }, + ['2.6.1-0'] = { + { + arch = "rockspec" + } + }, + ['2.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.7.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.8.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.8.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-readurl'] = { + ['v1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-redis'] = { + ['0.26-0'] = { + { + arch = "rockspec" + } + }, + ['0.27-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-redis-client'] = { + ['0.2.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-redis-cluster'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-redis-connector'] = { + ['0.02-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.03-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.04-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.05-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.06-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.07-0'] = { + { + arch = "rockspec" + } + }, + ['0.07-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.08-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.09-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-redis-util'] = { + ['0.07-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-repl'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-reqargs'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-requests'] = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-resolver'] = { + ['0.05-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-rocketmq'] = { + ['0.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-rollbar'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-rsa'] = { + ['0.04-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-rsa-placeholder'] = { + ['0.05-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-s3'] = { + ['v1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-saml'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-scrypt'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-session'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.24-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0.beta.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0.beta.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0.beta.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-session-zhulx'] = { + ['2.24-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-shcache'] = { + ['0.01-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-shell'] = { + ['0.03-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-signal'] = { + ['0.02-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-snappy'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-sniproxy'] = { + ['0.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-socket'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-sse'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-statsd'] = { + ['3.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-string'] = { + ['0.09-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-struct'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-t1k'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-t1k-main'] = { + ['0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-tags'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-tarpit'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-tasker'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-template'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-test'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-thread'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.6.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.6.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.6.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.6.4-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-timer'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-timer-ng'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-tsort'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-txid'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-uh'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-upload'] = { + ['0.09-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-upstream'] = { + ['0.08-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-upstream-healthcheck-tls'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-upstream-worker'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-urandom'] = { + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-url'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-uuid'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-validation'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-vardump'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-waf'] = { + ['0.10.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.11.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-weauth'] = { + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-websocket'] = { + ['0.07-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-websocket-kong'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-websocket-proxy'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-whitelist'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-wirefilter'] = { + ['v1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-resty-woothee'] = { + ['1.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-worker-events'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-xxhash'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-resty-xxhash-encode'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-rocks-app-project'] = { + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-rotas'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-rote'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-rover'] = { + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-rtmidi'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-rtoml'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-ryaml'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-s7iso'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-salt'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-schema-validation'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-sdl2'] = { + ['2.0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.5.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-secureunionid'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-semver'] = { + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-series'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-shepi'] = { + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-shmem'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-silva'] = { + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-simdjson'] = { + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-simplelog'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-smtps'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-sort'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-spore'] = { + ['0.3.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-sqlite3'] = { + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-ssllabs'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-status'] = { + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-step'] = { + ['v1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-stormlib'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-string'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-string-template'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-string-test'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-struct'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-suncalc'] = { + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-switch'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-syntect'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-table-to-literal'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-telegram-api'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-template'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-term'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-test'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-testassertion'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-testclass'] = { + ['0.01-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-testlongstring'] = { + ['0.2.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-testmore'] = { + ['0.3.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-timeago'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-tinycdb'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-tinyyaml'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-tk'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-toml'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-tree-sitter'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-ttyrant'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-twilio'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-twitter'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-typeof'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lua-tz'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-ubjson'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-ucl'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-udev'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-uri'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-utility'] = { + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-utils'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-utils.nvim'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-value-browser'] = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-vcard'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-vips'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-vosk'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + } + }, + ['1.3-3'] = { + { + arch = "rockspec" + } + }, + ['1.3-4'] = { + { + arch = "rockspec" + } + }, + ['1.3-5'] = { + { + arch = "rockspec" + } + } + }, + ['lua-websockets'] = { + ['v1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v2.1-1'] = { + { + arch = "rockspec" + } + }, + ['v2.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lua-webview'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.4-2'] = { + { + arch = "rockspec" + } + } + }, + ['lua-wolfram'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-xlib'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-xlsxwriter'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-xmlreader'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-xwiimote'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-xxtea'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-yajl'] = { + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-yaml'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-yottadb'] = { + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-zabbix-sender'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-zip'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-zlib'] = { + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + } + } + }, + ['lua-zmq'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-zmq-threads'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua-zstd'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lua2json = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lua5.1.js-file-packer'] = { + ['0.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lua_bufflib = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lua_cliargs = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.rc-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lua_code_formatter = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + lua_fun = { + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-3'] = { + { + arch = "rockspec" + } + }, + ['0.4.0'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-0'] = { + { + arch = "rockspec" + } + } + }, + lua_ip = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + lua_json = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lua_ldap = { + ['1.0.2-0'] = { + { + arch = "rockspec" + } + } + }, + lua_pack = { + ['1.0.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lua_pack_cn = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + lua_redis = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + lua_resty_netacea = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lua_signal = { + ['1.000-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lua_sysenv = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + lua_system_constants = { + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lua_table = { + ['0.4'] = { + { + arch = "rockspec" + } + }, + ['0.4.1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2'] = { + { + arch = "rockspec" + } + }, + ['0.4.3-0'] = { + { + arch = "rockspec" + } + } + }, + lua_to_html = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + lua_uuid = { + ['0.1-8'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + } + } + }, + luabase64 = { + ['0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luabatteries = { + ['0.1'] = { + { + arch = "rockspec" + } + } + }, + luabc = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luabcd = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luabenchmark = { + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luabibtex = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + } + } + }, + luabidi = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luabins = { + ['0.1.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luabitop = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-3'] = { + { + arch = "rockspec" + } + } + }, + ['luabitop-53plus'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luabox = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacasc = { + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacc = { + ['0.9-0'] = { + { + arch = "rockspec" + } + }, + ['0.9-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-4'] = { + { + arch = "rockspec" + } + }, + ['0.9-5'] = { + { + arch = "rockspec" + } + } + }, + luacheck = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.18.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.19.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.19.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.21.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.21.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.21.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.22.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.22.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.25.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.26.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.26.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luacheck-formatter-sonar'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luacheck-formatter-sonarqube'] = { + ['0.3.1-1'] = { + { + arch = "rockspec" + } + } + }, + luachild = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + luacio = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaclass = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaclasses = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + luacoap = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacom = { + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + } + }, + luacom_x86 = { + ['dev.unknown-1'] = { + { + arch = "rockspec" + } + }, + ['dev.unknown-2'] = { + { + arch = "rockspec" + } + } + }, + luaconfig = { + ['0.1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacov = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luacov-cobertura'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luacov-console'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luacov-coveralls'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luacov-html'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luacov-multiple'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + } + }, + ['luacov-reporter-gcovr'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luacov-reporter-lcov'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + ['luacov-summary'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacrc16 = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + luacrypto = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0.20120524-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luacrypto-baikal'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacrypto2 = { + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacryptor = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + luacs = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacsound = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + luactx = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacurl = { + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacv = { + ['0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luacwrap = { + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + } + } + }, + luadaemon = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luadash = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luadate = { + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luadbc = { + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luadbd = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + } + }, + luadbg = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + luadbi = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luadbi-mysql'] = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luadbi-postgresql'] = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luadbi-sqlite3'] = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luadeepcl = { + ['5.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luademorock = { + ['v1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luadist-hello'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luadist2 = { + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + } + }, + luadns = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luadoc = { + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + luadocumentor = { + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaec25519 = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaejdb = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + } + } + }, + luaepnf = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaevent = { + ['0.4.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaex = { + ['0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaexif = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaexpat = { + ['1.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafam = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafan = { + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafanlite = { + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafanmicro = { + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafcgi = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luaffi-tkl'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafft = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + } + }, + luafileno = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafilesystem = { + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.5.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luafilesystem-ffi'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + luaflac = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaflock = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaflow = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafn = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafontmanager = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafp = { + ['1.5-19'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-20'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafruits = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luafudge = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + luagcrypt = { + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + luagearman = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luagl = { + ['1.01-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luagq = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luagraph = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luagraphs = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luahaml = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaharfbuzz = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luahelp = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luahtml = { + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + luahue = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luai = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaidl = { + ['0.8.9beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + luainlua = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + luaipc = { + ['c7b814e-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaipfs = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaircclient = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luaish-windows'] = { + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaiter = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-ahk'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-brotli'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-curl'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-dmon'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-ffi-loader'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['luajit-geoip'] = { + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-gumbo'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['luajit-mail'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-rsync'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-tidy'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-woothee'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-xxhash'] = { + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajit-zstd'] = { + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luajls = { + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-6'] = { + { + arch = "rockspec" + } + }, + ['0.7-3'] = { + { + arch = "rockspec" + } + } + }, + ['luajls-lfs'] = { + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['luajls-luv'] = { + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + luajson = { + ['0.10-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luajudo = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luajwt = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luajwtabcpen = { + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luajwtjitsi = { + ['1.3-5'] = { + { + arch = "rockspec" + } + }, + ['1.3-6'] = { + { + arch = "rockspec" + } + }, + ['1.3-7'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luajwtjitsi-petergood'] = { + ['1.3-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luajwtossl = { + ['1.3-7'] = { + { + arch = "rockspec" + } + } + }, + luakatsu = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luakiwis = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luakube = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0alpha-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luakuroshiro = { + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualame = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualand = { + ['0.0-1'] = { + { + arch = "rockspec" + } + } + }, + lualdap = { + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4.rc1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualgorithms = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualibrarytemplate = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualibusb = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualife = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.4-1'] = { + { + arch = "rockspec" + } + } + }, + lualines = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualink = { + ['0.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualinq = { + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualit = { + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + lualog = { + ['0.1-3'] = { + { + arch = "rockspec" + } + } + }, + lualogging = { + ['1.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualol = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + } + } + }, + luals2dox = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualsx = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualua = { + ['scm-0'] = { + { + arch = "rockspec" + } + } + }, + lualvm = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lualzo = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luamacro = { + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.5.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luamagick = { + ['6.q16-1'] = { + { + arch = "rockspec" + } + } + }, + luamark = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luamidi = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luamine = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + luaminify = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luamon = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luamqtt = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.3-2'] = { + { + arch = "rockspec" + } + }, + ['1.4.3-3'] = { + { + arch = "rockspec" + } + }, + ['1.4.3-4'] = { + { + arch = "rockspec" + } + }, + ['1.4.5-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.6-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.1.0-2'] = { + { + arch = "rockspec" + } + }, + ['3.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['3.1.2-0'] = { + { + arch = "rockspec" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['3.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['3.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['3.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['3.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['3.4.2-2'] = { + { + arch = "rockspec" + } + }, + ['3.4.2-3'] = { + { + arch = "rockspec" + } + }, + ['3.4.2-4'] = { + { + arch = "rockspec" + } + }, + ['3.4.3-1'] = { + { + arch = "rockspec" + } + } + }, + luamqttc = { + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luamqttt = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luandarray = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luanet = { + ['1.1.2-0'] = { + { + arch = "rockspec" + } + } + }, + luanlp = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luanosql-unqlite'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + luanotify = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luanscol = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaobject = { + ['0.1.1-5'] = { + { + arch = "rockspec" + } + } + }, + luaocc = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + luaogg = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaohook = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaoop = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaopus = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaorm = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaossl = { + ['20141028-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150504-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150504-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150727-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20150727-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20151221-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20151221-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161029-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161101-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161208-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161209-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161214-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20170901-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20170903-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20171028-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20180530-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20180708-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20181102-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20181207-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20190612-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20190731-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20200709-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20220711-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luapak = { + ['0.1.0.beta2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0.beta3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0.beta4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0.beta5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luapdu = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + luapgsql = { + ['1.4.10-0'] = { + { + arch = "rockspec" + } + }, + ['1.4.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.6.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + } + } + }, + luaphonenumber = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + luapicohttpparser = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaplot = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + } + }, + luapod = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + luaposix = { + ['29-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['30-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['31-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['32-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['33.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['33.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['33.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['33.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['33.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['34.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['34.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['34.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['34.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['34.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['34.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['34.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['34.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['35.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['35.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['36.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['36.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['36.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['36.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.20-2'] = { + { + arch = "rockspec" + } + }, + ['5.1.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.24-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.27-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.28-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.7-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaprecomp = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luapreprocess = { + ['1.19.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.20.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.21.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luapress = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['3.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.1-0'] = { + { + arch = "rockspec" + } + }, + ['3.2-0'] = { + { + arch = "rockspec" + } + }, + ['3.3-0'] = { + { + arch = "rockspec" + } + }, + ['3.3.1-0'] = { + { + arch = "rockspec" + } + }, + ['3.4-0'] = { + { + arch = "rockspec" + } + }, + ['3.5-0'] = { + { + arch = "rockspec" + } + }, + ['3.5.1-0'] = { + { + arch = "rockspec" + } + }, + ['3.5.2-0'] = { + { + arch = "rockspec" + } + }, + ['4.0-0'] = { + { + arch = "rockspec" + } + }, + ['4.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['4.1-0'] = { + { + arch = "rockspec" + } + }, + ['4.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['4.1.2-0'] = { + { + arch = "rockspec" + } + } + }, + luaproc = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaprofiler = { + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['2.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaprompt = { + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaproxy = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.4-1'] = { + { + arch = "rockspec" + } + } + }, + luapsql = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaqub = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + luarabbit = { + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaredis = { + ['2.0.5-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.5-2'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + luarepl = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-2'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + } + } + }, + luarequest = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + luarestructure = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luarestyredis = { + ['0.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luark = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + luarocks = { + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-builtin-with-command'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-cpp'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['luarocks-build-cyan'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-extended'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['luarocks-build-fennel'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-lr-hooks'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-lrocket'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-lrocket-next'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-rust'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-rust-binary'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-rust-mlua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-treesitter-parser'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-build-xmake'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-14'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-15'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-16'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-17'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-18'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-19'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-20'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-21'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-22'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-23'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-24'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-25'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-26'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-27'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-28'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-fetch-gitrec'] = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luarocks-tag-release'] = { + ['5.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.11.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.13.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.14.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.39-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.40-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.41-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.42-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.43-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.44-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.45-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.46-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.47-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.48-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.49-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.50-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luarocks_helloworld = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luarray = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luars232 = { + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luarunner = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luascope = { + ['0.01-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasec = { + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['0.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luasec-fixed'] = { + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaselenium = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + luaseq = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaserial = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + luaserialization = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + luashell = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasnip = { + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasnmp = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + luasoap = { + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['4.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + luasock99 = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasocket = { + ['2.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['2.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['2.0.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-6'] = { + { + arch = "rockspec" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0rc1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0rc1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luasocket-lanes'] = { + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luasocket-unix'] = { + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasodium = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasofia = { + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasolidstate = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luasql-exasol'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['luasql-firebird'] = { + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luasql-mysql'] = { + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.5-1'] = { + { + arch = "rockspec" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luasql-oci8'] = { + ['2.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luasql-odbc'] = { + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luasql-postgres'] = { + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['2.3.3-1'] = { + { + arch = "rockspec" + } + }, + ['2.3.4-1'] = { + { + arch = "rockspec" + } + }, + ['2.3.5-1'] = { + { + arch = "rockspec" + } + }, + ['2.3.5-2'] = { + { + arch = "rockspec" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luasql-sqlite'] = { + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luasql-sqlite3'] = { + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.5-1'] = { + { + arch = "rockspec" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.6.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.6.1-3'] = { + { + arch = "rockspec" + } + } + }, + luasrcdiet = { + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luassert = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.10-0'] = { + { + arch = "rockspec" + } + }, + ['1.7.11-0'] = { + { + arch = "rockspec" + } + }, + ['1.7.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.7.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.7.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.7.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.6-0'] = { + { + arch = "rockspec" + } + }, + ['1.7.7-0'] = { + { + arch = "rockspec" + } + }, + ['1.7.8-0'] = { + { + arch = "rockspec" + } + }, + ['1.7.9-0'] = { + { + arch = "rockspec" + } + }, + ['1.8.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luastatic = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luastatsd = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luastepper = { + ['1.16.06.17-1'] = { + { + arch = "rockspec" + } + } + }, + luastrava = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + } + }, + luastream = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['@version@-1'] = { + { + arch = "rockspec" + } + } + }, + luastruct = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasvc = { + ['0.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasvn = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasyslog = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luasystem = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luatabledump = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + luatables = { + ['0.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luatbot = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.6-1'] = { + { + arch = "rockspec" + } + } + }, + luaterminal = { + ['1.16.06.16-1'] = { + { + arch = "rockspec" + } + }, + ['1.16.06.16-2'] = { + { + arch = "rockspec" + } + }, + ['1.16.06.16-3'] = { + { + arch = "rockspec" + } + }, + ['1.16.06.16-4'] = { + { + arch = "rockspec" + } + } + }, + luaterminalremote = { + ['1.14.09.10-1'] = { + { + arch = "rockspec" + } + } + }, + luatest = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luatext = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luatexts = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luatools = { + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luatoteal = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luatraverse = { + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luatweetnacl = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + } + }, + luatwit = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luatypechecks = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.4-1'] = { + { + arch = "rockspec" + } + } + }, + luatz = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaucdn = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaunbound = { + ['0-1'] = { + { + arch = "rockspec" + } + }, + ['0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaunit = { + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4-1'] = { + { + arch = "rockspec" + } + } + }, + luaunix = { + ['1.2.7-0'] = { + { + arch = "rockspec" + } + } + }, + luautf8 = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luautils = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luavel = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-3'] = { + { + arch = "rockspec" + } + } + }, + luavenster = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + } + } + }, + luawalker = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + luawav = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luawebsocket = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + luawinapi = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + } + } + }, + luawt = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaxml = { + ['101012-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['101012-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['130610-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaxmlgenerator = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaxmlrpc = { + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaxpath = { + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaxpl = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luaxxhash = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luayaml = { + ['0.5.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luayue = { + ['0.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0.bin-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0.bin-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0.bin-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0.bin-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0.bin-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0.bin-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.1.bin-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.1.bin-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.1.bin-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.1.bin-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luazen = { + ['0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.8-2'] = { + { + arch = "rockspec" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + } + } + }, + luazip = { + ['1.2.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lub = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lubs = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luchia = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ludent = { + ['v0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lugate = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luggage = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luix = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lulpeg = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luma = { + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lumber = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-3'] = { + { + arch = "rockspec" + } + } + }, + lume = { + ['2.3.0-0'] = { + { + arch = "rockspec" + } + } + }, + lumen = { + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lummander = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + } + } + }, + luna = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + } + } + }, + lunadoc = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lunajson = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lunamark = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + } + }, + lunaquery = { + ['0.9-1'] = { + { + arch = "rockspec" + } + }, + ['0.9-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + lunar = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lunary = { + ['20101009-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['20121108-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20121212-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20181002-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lunary-core'] = { + ['20101009-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['20121108-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20121212-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20181002-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lunary-optim'] = { + ['20101009-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20121108-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20121212-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20181002-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lunatest = { + ['0.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luncheon = { + ['0.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lundler = { + ['dev-26'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lunescript = { + ['main-1'] = { + { + arch = "rockspec" + } + } + }, + lunescript51 = { + ['main-1'] = { + { + arch = "rockspec" + } + } + }, + lunit = { + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lunitx = { + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lunix = { + ['20150923-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161026-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161026-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20170511-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20170920-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20170920-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20220331-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luno = { + ['20121129-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130108-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20130304-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20141204-1'] = { + { + arch = "rockspec" + } + }, + ['20170303-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lupe = { + ['latest-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luq = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + } + }, + lure = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + luring = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lurror = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lusc = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lusc_luv = { + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luse = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lust = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lustache = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['lustache-lambdas'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lustaglue = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lustre = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lusty = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.7-2'] = { + { + arch = "rockspec" + } + }, + ['0.7-3'] = { + { + arch = "rockspec" + } + }, + ['0.7-4'] = { + { + arch = "rockspec" + } + }, + ['0.7-6'] = { + { + arch = "rockspec" + } + }, + ['0.7-7'] = { + { + arch = "rockspec" + } + }, + ['0.7-8'] = { + { + arch = "rockspec" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-config'] = { + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-error-status'] = { + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-form'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-html'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lusty-json'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-log'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lusty-log-console'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lusty-mustache'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lusty-nginx'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-request-file'] = { + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lusty-request-pattern'] = { + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-rewrite-param'] = { + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-statsd'] = { + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lusty-store'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-store-mongo'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.10-0'] = { + { + arch = "rockspec" + } + }, + ['0.11-0'] = { + { + arch = "rockspec" + } + }, + ['0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.11-2'] = { + { + arch = "rockspec" + } + }, + ['0.12-0'] = { + { + arch = "rockspec" + } + }, + ['0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.12-2'] = { + { + arch = "rockspec" + } + }, + ['0.13-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.9-0'] = { + { + arch = "rockspec" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-store-mysql'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-2'] = { + { + arch = "rockspec" + } + }, + ['0.4-3'] = { + { + arch = "rockspec" + } + }, + ['0.4-4'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + } + }, + ['lusty-template'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lut = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lutf8proc = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lutrace = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luuid = { + ['20070925-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20090429-1'] = { + { + arch = "rockspec" + } + }, + ['20100303-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20101118-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120501-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120501-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120509-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20120509-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luv = { + ['1.22.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.22.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.25.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.26.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.27.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.28.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.28.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.29.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.29.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.29.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.29.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.30.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.30.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.30.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.32.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.34.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.34.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.34.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.34.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.36.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.2-2'] = { + { + arch = "rockspec" + } + }, + ['1.40.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.41.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.41.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.42.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.42.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.43.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.45.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.47.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.48.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.48.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.6.1-2'] = { + { + arch = "rockspec" + } + }, + ['1.7.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.4-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.48.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['luv-updated'] = { + ['1.9.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lux = { + ['0.2.1-1'] = { + { + arch = "rockspec" + } + } + }, + luxure = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + luxure_static = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lxsh = { + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lyaml = { + ['1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lyretemplates = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['lz.n'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lzfse = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + lzlib = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1.53-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1.53-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1.53-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1.53-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.work3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lzmq = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lzmq-auth'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lzmq-ffi'] = { + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lzmq-pool'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lzmq-timer'] = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lzmq-zmq'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['lzq-kong-oidc'] = { + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + lzt = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-0'] = { + { + arch = "rockspec" + } + } + }, + lzw = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['m3u-parser'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mach = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.0-0'] = { + { + arch = "rockspec" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + } + }, + ['4.0-0'] = { + { + arch = "rockspec" + } + }, + ['4.1-0'] = { + { + arch = "rockspec" + } + }, + ['4.2-0'] = { + { + arch = "rockspec" + } + }, + ['4.3-0'] = { + { + arch = "rockspec" + } + }, + ['4.4-0'] = { + { + arch = "rockspec" + } + }, + ['4.4-1'] = { + { + arch = "rockspec" + } + }, + ['4.5-0'] = { + { + arch = "rockspec" + } + }, + ['4.6-0'] = { + { + arch = "rockspec" + } + }, + ['4.7-0'] = { + { + arch = "rockspec" + } + }, + ['4.8-0'] = { + { + arch = "rockspec" + } + }, + ['5.0-0'] = { + { + arch = "rockspec" + } + }, + ['5.1-0'] = { + { + arch = "rockspec" + } + } + }, + magic = { + ['5.25-1'] = { + { + arch = "rockspec" + } + } + }, + ['magic-apigw'] = { + ['magic-0'] = { + { + arch = "rockspec" + } + }, + ['master-0'] = { + { + arch = "rockspec" + } + } + }, + magick = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['magick-least'] = { + ['1.5.0-2'] = { + { + arch = "rockspec" + } + } + }, + mailgun = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + malvado = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + many2one = { + ['1.14.09.19-1'] = { + { + arch = "rockspec" + } + }, + ['1.14.11.12-1'] = { + { + arch = "rockspec" + } + }, + ['1.14.11.12-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.11.12-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.11.12-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.20.08.23-1'] = { + { + arch = "rockspec" + } + }, + ['1.21.08.13-1'] = { + { + arch = "rockspec" + } + } + }, + map = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mapx.nvim'] = { + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + marcusluatest = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mare = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + markdown = { + ['0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.27-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.30-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.31-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.32-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.32-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.33-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['markdown.sile'] = { + ['1.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + markov = { + ['v1.0-1'] = { + { + arch = "rockspec" + } + }, + ['v1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['markov-text'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mason-lspconfig.nvim'] = { + ['1.26.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.27.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.28.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.29.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mason-nvim-dap.nvim'] = { + ['2.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mason.nvim'] = { + ['1.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + matcher_combinators = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + matchext = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['math-evol'] = { + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.12-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['math-rungekutta'] = { + ['1.07-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.07-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.08-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['math-walshtransform'] = { + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mathparser = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + md = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + md2html = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + md5 = { + ['1.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + } + }, + mecab = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + media_player = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mediator_lua = { + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.2-0'] = { + { + arch = "rockspec" + } + } + }, + mediatypes = { + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + megaqueue = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['meisocafe.hammerspoon.dkb'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + melipayamak = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + memlimit = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + memo = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + memoize = { + ['2.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + memory = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + memreader = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + mendudu = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + } + }, + metaclass = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + metalua = { + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['metalua-compiler'] = { + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['metalua-parser'] = { + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + metamodule = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + } + }, + metaty = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mexbt = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + mfr = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + microlight = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + microscope = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + microsoftsapi = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + middleclass = { + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1-0'] = { + { + arch = "rockspec" + } + }, + ['3.2-0'] = { + { + arch = "rockspec" + } + }, + ['4.0-0'] = { + { + arch = "rockspec" + } + }, + ['4.1-0'] = { + { + arch = "rockspec" + } + }, + ['4.1.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['middleclass-mixin-singleton'] = { + ['0.01-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + middleman = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + middleware = { + ['0.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['1.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + midi = { + ['4.1-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['4.2-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.4-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['5.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + midialsa = { + ['1.00-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.02-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.03-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.04-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.06-0'] = { + { + arch = "rockspec" + } + }, + ['1.09-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.21-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.22-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.23-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.24-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.25-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + millheat = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + milua = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + } + }, + mimetypes = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + minctest = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + } + }, + minheap = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['mini.ai'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.align'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.animate'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.base16'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.basics'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.bracketed'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.bufremove'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.clue'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.colors'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.comment'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.completion'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.cursorword'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.deps'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.diff'] = { + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.doc'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.extra'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.files'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.fuzzy'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.hipatterns'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.hues'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.indentscope'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.jump'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.jump2d'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.map'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.misc'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.move'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.notify'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.nvim'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.operators'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.pairs'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.pick'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.sessions'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.splitjoin'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.starter'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.statusline'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.surround'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.tabline'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.test'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.trailspace'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mini.visits'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + miniblooms = { + ['0.5-1'] = { + { + arch = "rockspec" + } + } + }, + minicurses = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + miniflac = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + minifs = { + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mirrorfs = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['missinglink-sdk'] = { + ['0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.24-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.27-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.28-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.29-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.31-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.32-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.33-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.34-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.35-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.36-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.37-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.38-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.39-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.40-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.41-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.42-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.43-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.44-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.45-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.52-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.53-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.54-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mixlua = { + ['0.2.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mjolnir.7bits.mjomatic'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['mjolnir._asm'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.applistener'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.compat_51'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.data'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.data.base64'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.data.json'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.data.pasteboard'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.eventtap'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.eventtap.event'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.hydra'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.hydra.applescript'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.hydra.dockicon'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.hydra.undocumented'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.ipc'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.ipc.cli'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.modal_hotkey'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.modules'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.notify'] = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.pathwatcher'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.settings'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.sys.audiodevice'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.sys.battery'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.sys.brightness'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.sys.mouse'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.timer'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.ui.notification'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.ui.sound'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.undocumented.bluetooth'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.undocumented.cgsdebug'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.undocumented.coredock'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.utf8_53'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.watcher.battery'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir._asm.watcher.screen'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + }, { + arch = "src" + } + } + }, + ['mjolnir.alert'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + } + }, + ['mjolnir.application'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + } + }, + ['mjolnir.bg.grid'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['mjolnir.chdiza.slateops'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['mjolnir.cmsj.appfinder'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['mjolnir.cmsj.caffeinate'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + } + }, + ['mjolnir.fnutils'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['mjolnir.geometry'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + } + }, + ['mjolnir.grille'] = { + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mjolnir.hotkey'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + } + }, + ['mjolnir.jstevenson.cursor'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + } + }, + ['mjolnir.keycodes'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + } + }, + ['mjolnir.lb.itunes'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['mjolnir.lb.spotify'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['mjolnir.lx.lockscreen'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['mjolnir.pvertenten.cycle'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['mjolnir.screen'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + } + }, + ['mjolnir.sd.grid'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['mjolnir.sk.transform'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + } + }, + ['mjolnir.th.hints'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86_64" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mjolnir.tiling'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['mjolnir.winter'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mkdir = { + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + } + }, + mkdirp = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mkdnflow.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mkdtemp = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + mkstemp = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + mlua = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mm = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mmapfile = { + ['1-1'] = { + { + arch = "rockspec" + } + }, + ['2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mmdblua = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + mnet = { + ['0.3.20210628-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.20210703-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.20220807-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.20230218-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.20230708-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mo = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mobdebug = { + ['0.48-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.49-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.50-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.51-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.55-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.63-1'] = { + { + arch = "rockspec" + } + }, + ['0.64-1'] = { + { + arch = "rockspec" + } + }, + ['0.70-1'] = { + { + arch = "rockspec" + } + }, + ['0.80-1'] = { + { + arch = "rockspec" + } + } + }, + mobile_detect = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mocka = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.9-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.4-1'] = { + { + arch = "rockspec" + } + } + }, + mockagne = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mockuna = { + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-2'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + } + }, + mod11 = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mod_lib_ldap = { + ['35-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mod_storage_ldap = { + ['7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + modern = { + ['0.1'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + modest = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + modjail = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + modsec = { + ['0.0.1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + } + } + }, + molde = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + molly = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mongo = { + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mongorover = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['moon-cache'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['moon-i18n'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['moon-redis'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['moon-watch'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moon_test = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + moonbox = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + moonbreaker = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moonbuild = { + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mooncake = { + ['0.0.3-20210613'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-20210619'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.20210627-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.20210829-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.20210922-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.20210925-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.20211114-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.20220116-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.20220501-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.20220703-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.20220801-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.20221006-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.20221112-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.20221204-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.20221204-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mooncrafts = { + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moonfltk = { + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moongarden = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moonglfw = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + moongrahams = { + ['0.0-1'] = { + { + arch = "rockspec" + } + } + }, + mooni = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moonjson = { + ['0.1.2-1'] = { + { + arch = "rockspec" + } + } + }, + moonpick = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moonplus = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moonrocks = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moonscript = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.2.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moontastic = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moonxml = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.0.0-3'] = { + { + arch = "rockspec" + } + }, + ['3.1.0-3'] = { + { + arch = "rockspec" + } + }, + ['3.2.0-4'] = { + { + arch = "rockspec" + } + }, + ['3.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + moor = { + ['latest-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v4.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + morse = { + ['0.9.1-1'] = { + { + arch = "rockspec" + } + } + }, + moses = { + ['1.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['move.nvim'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mpack = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.11-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.12-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.7-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.8-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mpd = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + mpi = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mpv-netrc'] = { + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['mq-biggerlib'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + mqttudp = { + ['0.4-1'] = { + { + arch = "rockspec" + } + } + }, + ['mrcp-utils'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + mtint = { + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + } + } + }, + mtmsg = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + } + } + }, + mtstates = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + } + } + }, + muck = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + multi = { + ['1.8-2'] = { + { + arch = "rockspec" + } + }, + ['1.8-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['12.2-0'] = { + { + arch = "rockspec" + } + }, + ['12.2-1'] = { + { + arch = "rockspec" + } + }, + ['13.0-0'] = { + { + arch = "rockspec" + } + }, + ['13.1-0'] = { + { + arch = "rockspec" + } + }, + ['14.0-0'] = { + { + arch = "rockspec" + } + }, + ['14.1-0'] = { + { + arch = "rockspec" + } + }, + ['14.2-0'] = { + { + arch = "rockspec" + } + }, + ['14.3-0'] = { + { + arch = "rockspec" + } + }, + ['15.0-0'] = { + { + arch = "rockspec" + } + }, + ['15.1-0'] = { + { + arch = "rockspec" + } + }, + ['15.2-0'] = { + { + arch = "rockspec" + } + }, + ['15.2-1'] = { + { + arch = "rockspec" + } + }, + ['15.3-0'] = { + { + arch = "rockspec" + } + }, + ['15.3-1'] = { + { + arch = "rockspec" + } + }, + ['16.0-0'] = { + { + arch = "rockspec" + } + }, + ['16.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['multicursors.nvim'] = { + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + multikey = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + multimethod = { + ['0.0-1'] = { + { + arch = "rockspec" + } + } + }, + multipart = { + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['multipart-formdata-lib'] = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['multipart-post'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + multirequests = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + multistreamer = { + ['11.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.3.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.5.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.5.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11.6.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['12.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['12.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['12.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['12.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + multitone = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + munin = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + } + }, + murmurhash3 = { + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mwcrng = { + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['my-awesome-plugin.nvim'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + my_library = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + myauth = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.6-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.6-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.7-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mygateway = { + ['0.5-0'] = { + { + arch = "rockspec" + } + } + }, + mymodule = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + } + }, + myplugin = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + mysin = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nacl = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nacl-cli'] = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nana = { + ['0.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nancy = { + ['549-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nanoid = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + nanosleep = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + nanostores_lua = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + } + }, + nanovg = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + native = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nats = { + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['navigator.lua'] = { + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['navigator.nvim'] = { + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ncache = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nclassic = { + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['near-kong-kafka-log'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nef = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nekos-lua-cqueues'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['neo-tree.nvim'] = { + ['3.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['neoconf.nvim'] = { + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['neodev.nvim'] = { + ['2.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + neogen = { + ['2.17.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.17.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + neogit = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + neorg = { + ['0.0.2848-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['neorg-telescope'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['neoscroll.nvim'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + neotest = { + ['4.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['neotest-haskell'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nested = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nested-cli'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + net = { + ['0.22.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.22.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.23.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.24.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.25.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.28.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.31.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.33.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.34.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.34.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.34.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.36.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.37.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.38.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['net-http'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['net-url'] = { + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + netatmo = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + netcheck = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + netfoxpack = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + netlink = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + netstring = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.6-0'] = { + { + arch = "rockspec" + } + } + }, + newstate = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + nextfile = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nginx-lua-exporter'] = { + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nginx-lua-frequency'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nginx-lua-oauth2'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nginx-lua-prometheus'] = { + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-20170303'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-20170610'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20171117-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20171117-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20171117-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20181120-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20181120-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20181120-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20200420-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20200420-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20200523-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20201118-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20201218-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20210206-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20220127-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20220527-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20221218-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20230607-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20240525-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nginx-lua-prometheus-api7'] = { + ['0.20240201-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nginx-lua-waf'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nginx-metrix'] = { + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nginx-resumable-upload'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ngx_lua_datadog = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ngxjsonform = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ngxlogex = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nightfox.nvim'] = { + ['3.9.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nixio = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nlua = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nn = { + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + nnlr = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nnsparse = { + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['no-neck-pain.nvim'] = { + ['1.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nocurses = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['nodejs-path'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['nodemcu-logging'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nodemculuamocks = { + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['noice.nvim'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nokia-fork-lua-cassandra'] = { + ['1.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nokia-fork-lua-resty-dns-client'] = { + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nokia-fork-lua-resty-mysql'] = { + ['0.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nokia-fork-lua-resty-socket'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nomad-lua'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['norgopolis-client.lua'] = { + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['norgopolis-server.lua'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nosigpipe = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + notification = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + notifycenter = { + ['0.0-1'] = { + { + arch = "rockspec" + } + } + }, + nozzle = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['npackages.nvim'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + npssdk = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + npy4th = { + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-3'] = { + { + arch = "rockspec" + } + } + }, + nsenter = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nui-components.nvim'] = { + ['1.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['nui.nvim'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + null = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + numextra = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + numlua = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-client'] = { + ['0.0.1-26'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-client-proxy'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-cmp'] = { + ['0.0.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['nvim-cokeline'] = { + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-dap'] = { + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-dap-ui'] = { + ['3.9.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-dbee'] = { + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-dev-container'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-java'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-java-core'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-java-dap'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-jdtls'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-jqx'] = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-lastplace'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-lightbulb'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-lspconfig'] = { + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-metals'] = { + ['0.8.x-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.x-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-nio'] = { + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-notify'] = { + ['3.13.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.13.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-parinfer'] = { + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-peekup'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-possession'] = { + ['0.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-scrollview'] = { + ['5.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-smuggler'] = { + ['main-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-snippy'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-surround'] = { + ['2.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-tree.lua'] = { + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-treesitter-legacy-api'] = { + ['0.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-ufo'] = { + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nvim-web-devicons'] = { + ['0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.100-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.99-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nvtx = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nwunsch = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['nx-kong-oidc'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['nxx-lua-resty-cookie'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + nysiis = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + oasvalidator = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + oauth = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['oauth-jwks-validator'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + } + }, + ['oauth-token-validate'] = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + oauth2 = { + ['1.16.06.15-1'] = { + { + arch = "rockspec" + } + }, + ['1.16.06.15-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16.06.15-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['oauth2-acl'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + oauth2c = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + oauth_light = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + obey = { + ['0.1.0-7'] = { + { + arch = "rockspec" + } + } + }, + ['objc.lua'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + objectlua = { + ['0.4.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['obsidian.nvim'] = { + ['3.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ocsg = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + octoflow = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + odbc = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['odbc-pool'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + odielak = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-3'] = { + { + arch = "rockspec" + } + } + }, + ohm = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + oil = { + ['0.4beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['oil.nvim'] = { + ['2.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['onedarkpro.nvim'] = { + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['onenord.nvim'] = { + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + onion2web = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + oo = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + oocairo = { + ['1.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + } + } + }, + oop = { + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + oops = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['op-sdk'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['open-tiny-util'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['openblas-conv'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + opencl = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + opencv_lua = { + ['4.10.0-1'] = { + { + arch = "rockspec" + } + }, + ['4.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.8.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.9.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['opencv_lua-contrib'] = { + ['4.10.0-1'] = { + { + arch = "rockspec" + } + } + }, + opendal = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + opendir = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + } + }, + opengl = { + ['1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + openrtm = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['openssh-hash'] = { + ['master-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + openssl = { + ['0.7.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['openssl-baikal'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + opentelemetry = { + ['0.2-3'] = { + { + arch = "rockspec" + } + } + }, + ['opentelemetry-lua'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + } + }, + ['0.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-5'] = { + { + arch = "rockspec" + } + }, + ['0.2-6'] = { + { + arch = "rockspec" + } + }, + ['master-0'] = { + { + arch = "rockspec" + } + } + }, + opentracing = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['opentracing-openresty'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['opeth-all'] = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['opeth-core'] = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['opeth-lasm'] = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['opeth-lvis'] = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['opeth-moonstep'] = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['opeth-opeth'] = { + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + optarg = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + optparse = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + orange = { + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + } + }, + orbit = { + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['2.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['2.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + orderedset = { + ['0.01-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.cbor'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.const.exit'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.const.gopher-types'] = { + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.dns'] = { + ['1.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.env'] = { + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.errno'] = { + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.iconv'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.abnf'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.ascii'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.ascii.char'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.ascii.control'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.ascii.ctrl'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.email'] = { + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.ini'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.ip'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.ip-text'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.iso'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.iso.char'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.iso.control'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.iso.ctrl'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.json'] = { + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.jsons'] = { + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.7-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.soundex'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.strftime'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.url'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.url.gopher'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.url.sip'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.url.siptel'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.url.tel'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.url.url'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.utf8'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.utf8.char'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.utf8.control'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.parsers.utf8.ctrl'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.syslog'] = { + ['1.0.5-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['2.1.2-0'] = { + { + arch = "rockspec" + } + }, + ['2.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.4-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.tls'] = { + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['org.conman.uuid'] = { + ['1.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + orgmode = { + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + orm = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['os-pipe'] = { + ['0.5.0-1'] = { + { + arch = "rockspec" + } + } + }, + osc = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + oscpack = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['osrm-lua-libs'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ossp-uuid'] = { + ['1.6.2-1'] = { + { + arch = "rockspec" + } + } + }, + otom = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['otouto-test'] = { + ['3.11-11'] = { + { + arch = "rockspec" + } + } + }, + otp = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['otter.nvim'] = { + ['1.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + outcome = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['overseer.nvim'] = { + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ovh-api'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + owoify = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['oxd-web-lua'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['oz.nvim'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['package-info.nvim'] = { + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + packer = { + ['0.1.20240307-1'] = { + { + arch = "rockspec" + } + } + }, + ['pai-serverless-kong'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + } + }, + pancake = { + ['1.0.0b11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0b16-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0b17-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0b5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0b7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pandocmeta = { + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + } + }, + panlunatic = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + panpipe = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['paperplanes.nvim'] = { + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['papis.nvim'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['paq-nvim'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + parent = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + parsel = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['parser-gen'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + } + }, + paseto = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pash = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + passer = { + ['0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + patch = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + path = { + ['1.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + pathetic = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['pathlib.nvim'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pato = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + } + } + }, + patok = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + } + }, + payments = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pbc = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pcre2 = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + pdh = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['pe-parser'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-2'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pegasus = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['pegasus-mr'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.0-10'] = { + { + arch = "rockspec" + } + } + }, + pegdebug = { + ['0.40-1'] = { + { + arch = "rockspec" + } + }, + ['0.40-2'] = { + { + arch = "rockspec" + } + }, + ['0.41-1'] = { + { + arch = "rockspec" + } + } + }, + pegex = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pegl = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + penlight = { + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['0.9.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['penlight-ffi'] = { + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + ['percent-encode-encoder'] = { + ['0.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + } + } + }, + ['percent-f-strings'] = { + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + } + } + }, + perihelion = { + ['0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['perimeterx-nginx-plugin'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.10-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.11-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.12-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.13-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.3.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.4.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.5.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['persistence.nvim'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + personnummer = { + ['3.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pesterkit = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + petrisport = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + petrodoc = { + ['10.12.28-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pgmoon = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.15.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['pgmoon-mashape'] = { + ['1.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + pgvector = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + phpass = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + physfs = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['pico8-to-lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + } + } + }, + picohttpparser = { + ['1.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.3-2'] = { + { + arch = "rockspec" + } + } + }, + pidmap = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['piecharts.sile'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['pijaz sdk'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['pijaz-sdk'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + } + }, + ['pilcrow.unito'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pilosa = { + ['0.1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pimp = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.5-2'] = { + { + arch = "rockspec" + } + }, + ['1.5-4'] = { + { + arch = "rockspec" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + } + } + }, + pipe = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pixcrypt = { + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + } + } + }, + pixie = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pkg = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-14'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-15'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pkgrock = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + plain = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + plc = { + ['0.5-1'] = { + { + arch = "rockspec" + } + } + }, + ['plenary.nvim'] = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + plterm = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + } + }, + plut = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + } + }, + pluto = { + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['pm4-sdk-lua'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['pokerhand-eval'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pokitdok = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + poly1305 = { + ['1.0-5'] = { + { + arch = "rockspec" + } + } + }, + pomelo = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pool = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pop3 = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + portutils = { + ['0.1-7'] = { + { + arch = "rockspec" + } + } + }, + postgres = { + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['postgres-auth-server'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['postgres-decode'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + postgrest = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['power-table'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + power_widget = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + powerlog = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ppkit = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pprint = { + ['0.1.0'] = { + { + arch = "rockspec" + } + }, + ['0.1.1'] = { + { + arch = "rockspec" + } + }, + ['0.1.2'] = { + { + arch = "rockspec" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + } + } + }, + prailude = { + ['0.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + prefix_tree = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + preloader = { + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['pretty-csv'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['pretty-fold.nvim'] = { + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + primes = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + print = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + } + }, + print_table = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + printable_chars = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['printoptions.sile'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['privilege-process-demo'] = { + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + procdata = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + process = { + ['1.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.8.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.9.1-1'] = { + { + arch = "rockspec" + } + } + }, + profi = { + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['prom-client'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + promise = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['promise-async'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['scm-0'] = { + { + arch = "rockspec" + } + } + }, + ['promise-async-await'] = { + ['0.7-1'] = { + { + arch = "rockspec" + } + } + }, + ['promise-es6'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['promise-lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['prompt-style'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + properset = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.3b-0'] = { + { + arch = "rockspec" + } + } + }, + proto = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + protobuf = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.2-0'] = { + { + arch = "rockspec" + } + } + }, + protomixin = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + prototype = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + proxyquire = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['prtr-dump'] = { + ['20121106-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20121212-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20161017-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['prtr-path'] = { + ['20121107-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20121212-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20180201-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['prtr-test'] = { + ['20121212-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20151116-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + psl = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ptable.sile'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + pthread = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['pub-sub'] = { + ['0.1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + public_suffix_list = { + ['1.0.201807-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201808-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201809-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201810-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201811-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201812-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201901-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201902-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201903-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201904-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201905-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201906-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201907-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201908-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201909-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201910-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201911-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.201912-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202001-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202002-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202003-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202004-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202005-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202006-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202007-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202008-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202009-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202010-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202011-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202012-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202101-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202102-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202103-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202104-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202105-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.202106-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + puerts = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pulseaudio = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + } + }, + pulseaudio_cli = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pulseaudio_dbus = { + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pulseaudio_widget = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + puretoml = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + push = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + pystring = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + qaluate = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + qlass = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['qrcode.sile'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + qrprinter = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + } + }, + quantum = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + quest = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + queue = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['quick-scope'] = { + ['2.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['r1-lua-resty-waf'] = { + ['r0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + radarchart = { + ['1.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['radical.vim'] = { + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['radix-router'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rainbow-delimiters.nvim'] = { + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + raisin = { + ['3.0-1'] = { + { + arch = "rockspec" + } + } + }, + rake = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + randbytes = { + ['0.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + random = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['random-number'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + randomdist = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rapid-match-domain'] = { + ['1.0.0'] = { + { + arch = "rockspec" + } + } + }, + rapidjson = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + raven = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['raven-knight'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['raven-lua-rjson'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rawterm = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rblx_signal = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rcnb = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + reactivex = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + readkey = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + readline = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + readosm = { + ['1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + realpath = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + } + }, + recaptcha = { + ['8.05.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.07.07-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + reco = { + ['1.4.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + } + } + }, + redis = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['redis-lua'] = { + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['2.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['2.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.4-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + redotenv = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + redstats = { + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + redux = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['redux-lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['redux-props'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ref = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + reflex = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + } + } + }, + refser = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + regex = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + reggae = { + ['0.0-1'] = { + { + arch = "rockspec" + } + } + }, + regkex = { + ['master-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + remdebug = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + remotelog = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + remy = { + ['0.2.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rename = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['renamer.nvim'] = { + ['5.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['repeat.vim'] = { + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['repeatable-random-number'] = { + ['1.0.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + } + } + }, + ['req-content-type-transformer'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + reql = { + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['request-limit-validator'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + require = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['resilient.sile'] = { + ['2.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + resp = { + ['0.3.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.3-2'] = { + { + arch = "rockspec" + } + } + }, + ['rest.nvim'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + restia = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + restserver = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['restserver-xavante'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['resty-casbin-adapter'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['resty-dynacode'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + } + } + }, + ['resty-hostcheck'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['resty-mongol'] = { + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.7-2'] = { + { + arch = "rockspec" + } + }, + ['0.7-3'] = { + { + arch = "rockspec" + } + }, + ['0.7-4'] = { + { + arch = "rockspec" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.8-2'] = { + { + arch = "rockspec" + } + }, + ['0.8-3'] = { + { + arch = "rockspec" + } + }, + ['0.8-4'] = { + { + arch = "rockspec" + } + } + }, + ['resty-newrelic'] = { + ['0.01-0'] = { + { + arch = "rockspec" + } + }, + ['0.01-1'] = { + { + arch = "rockspec" + } + }, + ['0.01-4'] = { + { + arch = "rockspec" + } + }, + ['0.01-5'] = { + { + arch = "rockspec" + } + }, + ['0.01-6'] = { + { + arch = "rockspec" + } + } + }, + ['resty-raven'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['resty-redis-cluster'] = { + ['1.02-4'] = { + { + arch = "rockspec" + } + }, + ['1.04-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.05-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['resty-redis-rate'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['resty-route'] = { + ['0.1'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['resty-shared-session'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['resty-smtp'] = { + ['1.0rc1-1'] = { + { + arch = "rockspec" + } + } + }, + ['resurfaceio-logger'] = { + ['1.2-3'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rez = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + } + } + }, + rfcvalid = { + ['0.6.0-1'] = { + { + arch = "rockspec" + } + } + }, + rgbstr = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + riemoon = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rings = { + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.2.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + riseml = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rjson = { + ['dev-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rkeys = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rl = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rmdir = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + } + }, + rmrf = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rndplugin = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + rnnlib = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + robotstxt = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rock-hello'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rockbuild = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rocketmq = { + ['2.1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rocks-config.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rocks-dev.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rocks-git.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rocks.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.12.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.13.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.15.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.16.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.17.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.18.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.19.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.19.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.20.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.20.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.21.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.21.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.21.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.21.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.22.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.23.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.24.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.25.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.25.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.26.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.27.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.27.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.28.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.29.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.29.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.29.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.30.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.30.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.31.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.31.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.31.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.31.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rocksolver = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + } + } + }, + rockspec2cmake = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['rocktest-foo'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rockwriter = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rollbar-nginx'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['roman-numerls'] = { + ['1.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['rose-pine'] = { + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + router = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rpc-prizm'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rpi-gpio'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rpio = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + } + }, + rs232 = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rsjson = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rtp.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rubato = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + } + } + }, + rubyapi = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + rude = { + ['0.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + runkit = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + runstache = { + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rustaceanvim = { + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.10.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.10.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.10.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.10.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.10.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.12.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.12.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.13.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.15.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.16.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.16.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.16.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.16.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.17.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.17.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.17.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.17.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.6.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.9.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.10.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.10.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.12.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.12.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.14.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.15.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.16.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.17.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.18.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.18.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.18.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.19.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.20.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.21.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.21.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.21.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.22.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.23.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.23.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.23.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.23.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.23.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.23.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.24.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.24.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.25.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.25.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.7.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.7.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rxi-json'] = { + ['dbf4b2d-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['rxi-json-lua'] = { + ['e1dbe93-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + rxlove = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + rxlua = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + } + }, + s3 = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['s3-cjson2'] = { + ['1.0-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + s6ftrig = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + saci = { + ['9.03.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + safer = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sailor = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['sailor-md'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + salt = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + saml = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['samp-events'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['samp-favorites'] = { + ['1.0'] = { + { + arch = "rockspec" + } + } + }, + sample_rtcomponent = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sandbox = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + santoku = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.100-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.101-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.102-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.103-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.104-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.105-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.106-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.107-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.108-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.109-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.110-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.111-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.112-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.113-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.114-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.115-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.116-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.117-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.118-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.119-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.121-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.122-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.123-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.124-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.125-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.126-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.127-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.128-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.129-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.130-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.131-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.132-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.133-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.134-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.135-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.136-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.137-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.138-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.139-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.140-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.141-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.142-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.143-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.144-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.145-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.146-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.147-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.148-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.150-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.151-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.152-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.153-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.154-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.156-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.157-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.158-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.159-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.160-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.161-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.162-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.163-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.164-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.165-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.166-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.167-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.168-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.169-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.170-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.171-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.172-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.173-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.174-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.175-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.176-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.177-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.178-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.179-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.180-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.181-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.182-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.183-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.184-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.185-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.186-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.187-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.188-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.189-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.190-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.191-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.192-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.193-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.194-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.195-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.196-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.197-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.198-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.199-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.200-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.201-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.202-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.203-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.204-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.24-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.25-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.26-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.27-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.28-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.29-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.30-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.31-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.32-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.33-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.34-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.35-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.36-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.37-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.38-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.39-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.40-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.41-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.42-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.43-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.44-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.45-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.46-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.47-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.48-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.49-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.50-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.51-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.52-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.53-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.54-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.55-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.56-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.57-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.58-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.60-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.61-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.62-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.64-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.65-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.66-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.67-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.68-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.69-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.70-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.71-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.72-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.73-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.74-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.76-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.77-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.78-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.79-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.80-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.81-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.82-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.83-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.84-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.85-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.86-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.87-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.88-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.89-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.90-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.91-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.92-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.93-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.94-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.96-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.97-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.98-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.99-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-bert'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-bitmap'] = { + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-bundle'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.24-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.25-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.26-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.27-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.28-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.29-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.30-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-cli'] = { + ['0.0.100-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.101-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.102-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.103-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.104-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.105-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.106-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.107-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.108-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.109-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.110-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.111-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.112-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.113-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.114-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.115-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.116-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.117-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.118-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.119-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.120-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.121-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.122-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.123-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.124-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.125-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.126-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.127-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.128-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.129-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.130-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.131-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.132-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.133-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.134-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.135-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.136-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.137-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.138-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.139-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.140-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.141-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.142-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.143-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.145-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.146-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.147-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.148-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.149-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.150-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.151-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.152-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.153-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.154-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.155-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.156-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.157-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.158-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.159-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.160-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.161-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.162-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.163-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.164-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.165-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.166-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.167-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.167-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.168-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.169-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.170-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.171-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.172-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.173-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.174-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.175-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.176-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.177-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.178-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.179-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.180-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.181-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.182-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.183-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.184-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.185-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.186-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.187-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.188-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.189-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.190-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.191-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.192-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.193-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.194-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.195-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.196-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.197-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.198-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.199-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.200-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.201-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.202-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.203-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.204-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.205-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.206-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.207-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.208-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.24-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.25-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.26-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.27-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.28-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.29-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.30-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.31-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.32-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.33-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.34-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.35-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.36-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.37-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.38-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.39-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.40-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.41-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.42-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.43-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.44-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.45-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.46-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.47-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.48-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.49-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.50-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.51-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.52-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.53-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.54-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.55-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.56-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.57-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.58-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.60-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.61-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.62-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.64-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.65-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.66-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.67-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.68-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.69-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.70-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.71-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.72-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.73-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.74-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.76-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.77-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.78-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.79-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.80-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.81-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.82-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.83-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.84-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.85-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.86-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.87-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.88-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.89-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.90-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.91-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.92-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.93-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.94-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.95-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.96-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.98-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-fs'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.24-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.25-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.26-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.27-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.28-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.29-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.30-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.31-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.32-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-geo-pdf'] = { + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-html'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-iconv'] = { + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-jpeg'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-make'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.25-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.26-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.27-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.28-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.29-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.30-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.31-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.32-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.33-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.34-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.35-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.36-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.37-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.38-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.39-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.40-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.41-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.42-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.43-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.44-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.45-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.46-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.47-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.48-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.49-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.50-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.51-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.52-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.53-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.54-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.55-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.56-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.57-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.58-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.59-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.60-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.61-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.62-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.63-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.64-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.65-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.66-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.67-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.68-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.69-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.70-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-matrix'] = { + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-pdf'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-porter'] = { + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-python'] = { + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.24-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.25-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.26-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.27-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.28-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.29-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.30-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.31-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.32-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.33-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.34-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.35-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.36-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.37-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-sqlite'] = { + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-sqlite-migrate'] = { + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-system'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-template'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.24-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.25-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.26-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-test'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-2'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-test-runner'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-tsetlin'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.24-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.25-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.26-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.29-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.30-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.31-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.32-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.33-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.34-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.35-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.36-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.37-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.38-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.39-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.40-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.41-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.42-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.43-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.44-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.45-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.46-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.47-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.48-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.49-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + ['santoku-web'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.100-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.101-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.102-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.103-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.104-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.105-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.106-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.107-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.108-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.109-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.110-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.111-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.112-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.23-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.24-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.25-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.26-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.27-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.28-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.29-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.30-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.31-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.32-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.33-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.34-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.35-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.36-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.37-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.38-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.39-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.40-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.41-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.42-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.43-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.44-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.45-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.46-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.47-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.48-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.49-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.50-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.51-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.52-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.53-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.55-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.56-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.57-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.58-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.59-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.60-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.61-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.62-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.63-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.64-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.65-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.66-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.67-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.68-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.69-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.70-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.71-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.72-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.73-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.74-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.75-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.76-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.77-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.78-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.79-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.80-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.81-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.82-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.83-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.84-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.85-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.86-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.87-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.88-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.89-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.90-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.91-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.92-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.93-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.94-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.95-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.96-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.97-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.98-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.99-1'] = { + { + arch = "rockspec" + } + } + }, + sass = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + satelito = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['beta-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['beta-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['beta-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + say = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sayit = { + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['sc-lua-resty-auto-ssl'] = { + ['0.13.1-1'] = { + { + arch = "rockspec" + } + } + }, + scaffold = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['scalable-rate-limiter'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + scene = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + schema = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['schemastore.nvim'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + schwartziantransformutils = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + } + } + }, + sci = { + ['1.0.0.beta12-1'] = { + { + arch = "rockspec" + } + } + }, + ['screenkey.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['scrollbar.nvim'] = { + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + scrypt = { + ['0.1.1-0'] = { + { + arch = "rockspec" + } + } + }, + seawolf = { + ['0.8-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + } + } + }, + ['secmc-plugin'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + see = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + seiran = { + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + selectex = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + selene = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + self = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + } + } + }, + semparse = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + semver = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + } + } + }, + sendgrid = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sendmail = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sentry = { + ['0.8.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.1-3'] = { + { + arch = "rockspec" + } + } + }, + ['ser-alloyed'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + serpent = { + ['0.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.27-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.28-1'] = { + { + arch = "rockspec" + } + }, + ['0.30-1'] = { + { + arch = "rockspec" + } + }, + ['0.30-2'] = { + { + arch = "rockspec" + } + } + }, + ['servicekit-posix'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['session.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sessiond_dbus = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['devel-1'] = { + { + arch = "rockspec" + } + } + }, + set = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['set-lua'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['set-upstream-by-header'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + setenv = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + setuid = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['sfcrand-lua5.3'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['sfcrand-luajit'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sfmt = { + ['1.5.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.4-2'] = { + { + arch = "rockspec" + } + } + }, + ['sfn-auth'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sfs = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sfxr = { + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['sg.nvim'] = { + ['1.0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sgp30 = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sh = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sha1 = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sha2 = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + } + }, + ['shape-detector'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + shapeshift = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sharedtensor = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['shell-games'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + shelve = { + ['0.35.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.35.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.35.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.35.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.35.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + shexpand = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + shiki = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + shim = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + shiplog = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sht20 = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sia = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.6-2'] = { + { + arch = "rockspec" + } + }, + ['0.2.6-3'] = { + { + arch = "rockspec" + } + } + }, + sidekiqjobpusher = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + sif = { + ['master-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + signal = { + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + } + } + }, + signalise = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['silex.sile'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['simple-lua-json'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + simple_classes_lua = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + simple_test = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + simpleitk = { + ['0.10-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.2-0'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.2.0-0'] = { + { + arch = "rockspec" + } + } + }, + simulua = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['sinx-lua'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + sirocco = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + } + } + }, + sitegen = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + skewheap = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + skooma = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['skywalking-nginx-lua'] = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['skywalking-nginx-lua-plugin'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['skywalking-nginx-lua-test'] = { + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + } + } + }, + slaxml = { + ['0.8-1'] = { + { + arch = "rockspec" + } + } + }, + sleep = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-3'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + slingshot = { + ['7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sllog = { + ['0.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + slncrypto = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + slnet = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + slnunicode = { + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + slowjson = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + slt2 = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['smart-splits.nvim'] = { + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['smartquotes.sile'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + smaz = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + smithsnmp = { + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + snaphelpers = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sncl = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + snowflake = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + snowplowtracker = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sociallua = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + socks5 = { + ['1.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sofa = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + solr = { + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + somata = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sonata = { + ['0.9-1'] = { + { + arch = "rockspec" + } + } + }, + spaces = { + ['0.3-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-13'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-14'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + spawn = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + specl = { + ['1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.1.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.1.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['14.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['speeddating.vim'] = { + ['20081016-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sphericaldefence = { + ['0.0.3-3'] = { + { + arch = "rockspec" + } + } + }, + split = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sproto = { + ['0.1.20210820-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sputnik = { + ['9.03.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['sqids-lua'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['sql-orm'] = { + ['0.3.20210821-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.20210828-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.20211015-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.20220801-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.20220813-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.20230409-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.20230709-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sql2lua = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + sqlcipher = { + ['4.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['4.4.2-2'] = { + { + arch = "rockspec" + } + } + }, + sqlite = { + ['master-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['sqlite.lua'] = { + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sqlite3 = { + ['0.4.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sqlrocks = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sqltable = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['squall-router'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['squirrel.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + squirt = { + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + srplib = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + srt = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + } + }, + ssh = { + ['0.0.1-0'] = { + { + arch = "rockspec" + } + } + }, + st = { + ['0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + stacktraceplus = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + starwarsnames = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + static = { + ['2.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + statsd = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['std._debug'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['std.functional'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['std.normalize'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['std.prototype'] = { + ['1.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['std.strict'] = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + stdfs = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-2'] = { + { + arch = "rockspec" + } + }, + ['0.4-3'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.8-1'] = { + { + arch = "rockspec" + } + } + }, + stdlib = { + ['17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['24-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['27-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['28-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['29-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['29-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['30-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['31-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['32-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['33-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['34.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['35-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['36-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['37-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['38-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['39-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4-2'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['40-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['41.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['41.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['41.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['41.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['41.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['41.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + steentje = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['storm-mode.nvim'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['stormpath-nginx'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + stp = { + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + str = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + strbuffer = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + streamcsv = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + strictness = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['string-capitalize'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['string-contains'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['string-format'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['string-format-all'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['string-random'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['string-replace'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['string-split'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['string-token'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['string-trim'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + stringdistance = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + stringex = { + ['0.1.0-2'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + } + }, + stringifylua = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + stringio = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['stringizer-lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-10'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + } + } + }, + stringstream = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + stringy = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + striter = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + strong = { + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + strongstring = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + strsubst = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + struct = { + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['struct.lua'] = { + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['structlog.nvim'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + strutil = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + } + } + }, + stuart = { + ['2.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['stuart-ml'] = { + ['2.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['stuart-redis'] = { + ['0.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + submodsearcher = { + ['1-1'] = { + { + arch = "rockspec" + } + } + }, + subproc = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + subprocess = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['substitute.nvim'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + suit = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + sunclass = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + supernova = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + suproxy = { + ['v0.6.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['surround.vim'] = { + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + swapi = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['sweetie.nvim'] = { + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + swef = { + ['1-2'] = { + { + arch = "rockspec" + } + }, + ['1-3'] = { + { + arch = "rockspec" + } + } + }, + switch = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + symdiff = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + symmetric = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sync = { + ['0.1.1-1'] = { + { + arch = "rockspec" + } + } + }, + syntaxhighlight = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sys = { + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + sysdetect = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + t2t = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['tabby.nvim'] = { + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['table-flatten'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + } + }, + table_dump = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + table_goodies = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + table_new = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + tablesalt = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tableshape = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tableutils = { + ['1.21.07.27-1'] = { + { + arch = "rockspec" + } + }, + ['1.21.07.27-2'] = { + { + arch = "rockspec" + } + }, + ['1.21.07.27-3'] = { + { + arch = "rockspec" + } + } + }, + tableview = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tablua = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tabular = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + taggedcoro = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['taggedcoro-purelua'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + talents = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + talua = { + ['1.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + tamale = { + ['1.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tango-complete'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tango-copas'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tanguytestluarocks = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tarantool-checks'] = { + ['3.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['tarantool-errors'] = { + ['2.2.1-1'] = { + { + arch = "rockspec" + } + } + }, + tarantoolapp = { + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tbhss = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.10-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.11-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.12-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.16-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.17-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.18-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.19-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.20-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.21-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.22-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.24-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.25-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.26-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.27-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.29-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.30-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.32-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.34-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.35-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.36-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.39-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.40-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + } + } + }, + tblr = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tcc = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + tcheck = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tcp-body-log'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + tdb = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['tdcli.lua'] = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tdigest = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + teateatea = { + ['1.3-1'] = { + { + arch = "rockspec" + } + } + }, + tekui = { + ['1.05-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.07-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + telegraf = { + ['1.1.2-1'] = { + { + arch = "rockspec" + } + } + }, + telegram = { + ['0.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['telegram-bot-api'] = { + ['3.4.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.5.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['telegram-bot-lua'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.10-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.3.2-0'] = { + { + arch = "rockspec" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9-0'] = { + { + arch = "rockspec" + } + }, + ['1.9-1'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + } + }, + telegraph = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + telescope = { + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['telescope-manix'] = { + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['telescope-zf-native.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['telescope.nvim'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['scm-1'] = { + { + arch = "rockspec" + } + } + }, + teliksandi = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + teml = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + template = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.2-3'] = { + { + arch = "rockspec" + } + } + }, + ['template-text'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + templet = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + terebi = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + termfx = { + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + terminfo = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + terminfofont = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tersen = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tesla = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['test-lua-plugin'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['test-package'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['test-xml-json'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + testcase = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.10.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.11.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.7-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.8-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.9-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.6.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + } + } + }, + testingunit = { + ['0.1-0'] = { + { + arch = "rockspec" + } + } + }, + testy = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-51'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-52'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-53'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tethys = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['textsubsuper.sile'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + } + } + }, + tgbot = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tgen = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + tglua = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + thcsv = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['themer.lua'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + themoonlitknot = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['threat-protection'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ticmap2tmx = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tiktoken_core = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['time-clock'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['time-sleep'] = { + ['0.2.1-1'] = { + { + arch = "rockspec" + } + } + }, + timerfd = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + timerwheel = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tincan = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tiny-ecs'] = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tinyobj = { + ['0.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + tl = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tlcheck = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + tlru = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tls-mailer'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tlua = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tmg-cookie-auth-shim'] = { + ['0.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-2'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-42'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-43'] = { + { + arch = "rockspec" + } + }, + ['1.0.5-44'] = { + { + arch = "rockspec" + } + }, + ['1.0.5-45'] = { + { + arch = "rockspec" + } + }, + ['1.0.6-46'] = { + { + arch = "rockspec" + } + }, + ['1.0.7-47'] = { + { + arch = "rockspec" + } + }, + ['1.0.8-48'] = { + { + arch = "rockspec" + } + } + }, + tn = { + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tnv-kong-plugin-api-transformer'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + toboolean = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + todo = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['todo-comments.nvim'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['toggleterm.nvim'] = { + ['2.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tointeger = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['token-handler'] = { + ['0.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-2'] = { + { + arch = "rockspec" + } + } + }, + tokyocabinet = { + ['1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tokyonight.nvim'] = { + ['3.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tomba = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + } + } + }, + toml = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['toml-edit'] = { + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tonos-client'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.14.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.16.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.17.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.18.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.20.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.20.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.21.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.21.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.22.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.23.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.24.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.25.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.26.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.27.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.28.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.29.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.30.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.31.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.32.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.33.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.33.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.34.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.34.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.34.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.35.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.35.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.36.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.36.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.37.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.37.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.38.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.38.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.39.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.40.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.41.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.42.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.42.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.43.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.43.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.43.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.43.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.44.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.45.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['torch-buffer'] = { + ['0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['torch-dataframe'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.5-0'] = { + { + arch = "rockspec" + } + }, + ['1.6-0'] = { + { + arch = "rockspec" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + } + }, + ['1.7-0'] = { + { + arch = "rockspec" + } + } + }, + ['torch-dir-loader'] = { + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['torch-graph-criterion'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['torch-hdf5-logger'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['torch-word-emb'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + toto = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tpatterns = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tpdu = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tprint = { + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tqdm-lua'] = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + transducers = { + ['0.0-1'] = { + { + arch = "rockspec" + } + } + }, + treap = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + tree = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tree-sitter-norg'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tree-sitter-norg-meta'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tree-sitter-orgmode'] = { + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + treelib = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['trouble.nvim'] = { + ['2.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.4.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + try = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['try-catch-finally'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['try-lua'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tsc.nvim'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tstrict = { + ['0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tsuru-rpaasv2'] = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ttodo = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tulip = { + ['0.0.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.10-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.17-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tulip-cli'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tundrawolf = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + } + } + }, + tuple = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + turbo = { + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + } + }, + ['1.1-4'] = { + { + arch = "rockspec" + } + }, + ['1.1-5'] = { + { + arch = "rockspec" + } + }, + ['1.1-6'] = { + { + arch = "rockspec" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0-2'] = { + { + arch = "rockspec" + } + }, + ['2.0-3'] = { + { + arch = "rockspec" + } + }, + ['2.0-4'] = { + { + arch = "rockspec" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['turbo-fetch'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['turbo-multipart-post'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['turbo-redis'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['turbo-sqlite3'] = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['turbo-telegram'] = { + ['0.9-1'] = { + { + arch = "rockspec" + } + } + }, + tv = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['tw-lua-autocomplete'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + tween = { + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['twilight.nvim'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + twitter = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + type = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + } + } + }, + typecheck = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + typed = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + typedobject = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + typical = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['typst-lua'] = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8-2'] = { + { + arch = "rockspec" + } + } + }, + ['u-test'] = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['uap-lua'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + udev = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-0'] = { + { + arch = "rockspec" + } + } + }, + ufy = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ufylayout = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + uinput = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ulid = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + umdlua = { + ['1.0-2'] = { + { + arch = "rockspec" + } + } + }, + uname = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['unauthorized-handler'] = { + ['0.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-10'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-2'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-9'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-11'] = { + { + arch = "rockspec" + } + }, + ['2.0.2-12'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-13'] = { + { + arch = "rockspec" + } + } + }, + underscore = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['underscore-dot-lua'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['uni-queue'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + unicorndecode = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['unimpaired.nvim'] = { + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['unimpaired.vim'] = { + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + unpack = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + unreliablefs = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['unsplash-lua'] = { + ['0.5-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + unzip = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + upcache = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + upnpclient = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + upower_dbus = { + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['upstream-auth-hmac'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['uriid1-lua-extensions'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + url = { + ['1.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.2.2-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['url-filter'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + urlencode = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + utf8 = { + ['1.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + utf8fix = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + util = { + ['0-0'] = { + { + arch = "rockspec" + } + } + }, + uuid = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + uuidx = { + ['1.0-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + uulua = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['validate-args'] = { + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + validation = { + ['0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + valua = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.2.2-3'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vanilla = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0.rc2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0.rc3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0.rc4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.rc1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vararg = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.patch1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['vararg-lua'] = { + ['1.1.patch1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vectorize = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['verify-token'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + verse = { + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + version = { + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + versium = { + ['9.02.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vert = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vexilla_client = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['vgit.nvim'] = { + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vida = { + ['v0.1-10'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v0.1-11'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v0.1-12'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + video_streaming = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + videur = { + ['0.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + vinspect = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + virtes = { + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['virtual-schema-common-lua'] = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['2.4.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['3.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['4.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vizdoom = { + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vklib = { + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vmake = { + ['1.2.0-2'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-3'] = { + { + arch = "rockspec" + } + }, + ['1.3.0-5'] = { + { + arch = "rockspec" + } + }, + ['1.3.1-6'] = { + { + arch = "rockspec" + } + }, + ['1.4.0-7'] = { + { + arch = "rockspec" + } + }, + ['1.4.1-8'] = { + { + arch = "rockspec" + } + }, + ['1.4.2-9'] = { + { + arch = "rockspec" + } + }, + ['1.5.0-10'] = { + { + arch = "rockspec" + } + }, + ['1.5.1-11'] = { + { + arch = "rockspec" + } + }, + ['1.5.2-12'] = { + { + arch = "rockspec" + } + }, + ['1.5.3-13'] = { + { + arch = "rockspec" + } + }, + ['1.5.4-14'] = { + { + arch = "rockspec" + } + }, + ['1.6.0-15'] = { + { + arch = "rockspec" + } + }, + ['1.7.0-16'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-17'] = { + { + arch = "rockspec" + } + }, + ['2.0.0-18'] = { + { + arch = "rockspec" + } + }, + ['2.0.1-19'] = { + { + arch = "rockspec" + } + }, + ['2.1.0-20'] = { + { + arch = "rockspec" + } + }, + ['3.0.0-21'] = { + { + arch = "rockspec" + } + }, + ['3.1.0-24'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vmod = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + } + }, + void = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['vscode-mobdebug'] = { + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vstruct = { + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + vusted = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wagon = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + waitpid = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + } + } + }, + warn = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + warna = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + warp = { + ['0.1'] = { + { + arch = "rockspec" + } + }, + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + }, + ['2.4-0'] = { + { + arch = "rockspec" + } + } + }, + ['watch-the-new-mutants-online-free'] = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + watcher = { + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wax = { + ['0.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['latest-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['next-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['wayz-kafka-log'] = { + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wch = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wcwidth = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + web = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['web-devicons'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['web-driver'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + web_sanitize = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + webrocks = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "macosx-x86" + }, { + arch = "src" + } + } + }, + websocket = { + ['1.0-1'] = { + { + arch = "rockspec" + } + } + }, + wespike = { + ['0.0-1'] = { + { + arch = "rockspec" + } + } + }, + wezterm_include_launch_items = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + whereami = { + ['1.0.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + } + } + }, + whetlab = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + which = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + ['which-key.nvim'] = { + ['1.6.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['wib-kong'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wildcard_pattern = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + winapi = { + ['1.4.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + windcon = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['windline.nvim'] = { + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + winreg = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wiola = { + ['0.10.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wire = { + ['0.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wires = { + ['1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['wisdom-gateway-oidc-plugin'] = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wluaunit = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wowcig = { + ['0.10-0'] = { + { + arch = "rockspec" + } + }, + ['0.11-0'] = { + { + arch = "rockspec" + } + }, + ['0.12-0'] = { + { + arch = "rockspec" + } + }, + ['0.12.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.12.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.12.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.12.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.12.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.13.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.13.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.14.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.14.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.14.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.15.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.15.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.16.0-0'] = { + { + arch = "rockspec" + } + }, + ['0.16.1-0'] = { + { + arch = "rockspec" + } + }, + ['0.16.2-0'] = { + { + arch = "rockspec" + } + }, + ['0.16.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.16.4-0'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-0'] = { + { + arch = "rockspec" + } + }, + ['0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-0'] = { + { + arch = "rockspec" + } + }, + ['0.6-0'] = { + { + arch = "rockspec" + } + }, + ['0.7-0'] = { + { + arch = "rockspec" + } + }, + ['0.8-0'] = { + { + arch = "rockspec" + } + }, + ['0.9-0'] = { + { + arch = "rockspec" + } + } + }, + wsapi = { + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['wsapi-fcgi'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['wsapi-openresty'] = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['wsapi-xavante'] = { + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + }, { + arch = "win32-x86" + } + }, + ['1.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + wtf = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-action-html_response'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['wtf-action-json_response'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-action-log'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['wtf-action-redirect'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-action-simple_response'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-action-store'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-demo'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-fork-lua-resty-redis'] = { + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-fork-resty-mongol'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-honeybot-core'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-cve_2019_6340'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-asa'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-asa-data'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-drupal'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-drupal-data'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-owa'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-owa-data'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-sonicwall'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-sonicwall-data'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-welcome'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-welcome-data'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['wtf-plugin-honeybot-fake-wordpress'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-fake-wordpress-data'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-sandbox'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-plugin-honeybot-troll_die'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-2'] = { + { + arch = "rockspec" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-storage-mongodb'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + } + }, + ['wtf-storage-redis'] = { + ['0.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + } + } + }, + ['x-lua-api-gateway-aws'] = { + ['1.7.1-0'] = { + { + arch = "rockspec" + } + } + }, + xavante = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['2.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['2.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + }, + ['2.2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + } + }, + ['2.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.4.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xcomposer = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['3.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['xcq-subprocess'] = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xctrl = { + ['20101026-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xerceslua = { + ['1.0-0'] = { + { + arch = "rockspec" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + } + }, + xhmoon = { + ['1.0.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['xls-read'] = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xlsxwriter = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xlua = { + ['1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xml = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['xml-json'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + } + } + }, + xml2lua = { + ['1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.3-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.4-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.5-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.6-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['v1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xml_tree = { + ['1.0-1'] = { + { + arch = "rockspec" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + } + } + }, + xmllpegparser = { + ['2.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xmlparser = { + ['2.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['2.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xmlua = { + ['0.9.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.3-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.4-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.5-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.6-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.7-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.8-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.9-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.0-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.2.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xpcall = { + ['0.2.0-1'] = { + { + arch = "rockspec" + } + } + }, + xpgsql = { + ['0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xssfilter = { + ['10.12.28-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['8.04.20-1'] = { + { + arch = "rockspec" + }, { + arch = "all" + }, { + arch = "src" + } + } + }, + xsys = { + ['1.0.2-1'] = { + { + arch = "rockspec" + } + } + }, + xtype = { + ['1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + xxhash = { + ['v1.0-1'] = { + { + arch = "rockspec" + } + } + }, + xxtea = { + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.1-1'] = { + { + arch = "rockspec" + } + }, + ['1.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + yaml = { + ['0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['1.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + yamlscript = { + ['0.0.16-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + yamlstar = { + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['yanky.nvim'] = { + ['2.0.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['yazi.nvim'] = { + ['master-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['ydauth-test'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.0-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + yoke = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-3'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-4'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-6'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-7'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-8'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-9'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.2-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['yoke-file'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['yoke-imdb'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.0.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['yoke-mail'] = { + ['0.0.1-0'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + yue = { + ['0.0.1'] = { + { + arch = "rockspec" + } + } + }, + yuescript = { + ['0.10.11-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.15-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.10.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.11.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.12.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.13.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.14.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.13-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.18-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.20-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.21-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.23-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.23-5'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.25-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.25-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.26-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.29-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.15.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.16.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.10-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.12-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.17.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.18.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.19.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.19.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.19.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.19.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.19.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.20.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.21.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.21.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.21.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.21.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.22.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.22.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.22.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.22.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.23.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.6.9-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.14-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.8-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.8.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.5-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.9.6-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + yyjson = { + ['0.4.0-1'] = { + { + arch = "rockspec" + } + }, + ['0.5.1-1'] = { + { + arch = "rockspec" + } + }, + ['0.8.0-1'] = { + { + arch = "rockspec" + } + } + }, + zee = { + ['0.7-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7-2'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.7.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + ['zen-mode.nvim'] = { + ['1.3.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + }, + zenroom = { + ['0.9-1'] = { + { + arch = "rockspec" + } + }, + ['0.9-2'] = { + { + arch = "rockspec" + } + }, + ['0.9-3'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-analyzeall'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-autodelimiter'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-autodelimitersurroundselection'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-autoindent'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-autostartdebug'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-blockcursor'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-clippy'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-cloneview'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-closetabsleftright'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-colourpicker'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-cuberite'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-documentmap'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-edgemark'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-editorautofocusbymouse'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-eris'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-escapetoquit'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-extregister'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-filetreeoneclick'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-hidemenu'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-hidemousewhentyping'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-highlightselected'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-launchtime'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-localhelpmenu'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-luadist'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-luarocks'] = { + ['0.4.1-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-maketoolbar'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-markchar'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-moonscript'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-moonscriptlove'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-moveline'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-noblinkcursor'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-openimagefile'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-openra'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-openwithdefault'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-outputclone'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-outputtofile'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-overtype'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-projectsettings'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-realtimewatch'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-redbean'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-redis'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-referencepanel'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-refreshproject'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-remoteedit'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-savealleveryxrunning'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-saveonappswitch'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-saveonfocuslost'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-screenshot'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-shebangtype'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-showluareference'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-showreference'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-striptrailingwhitespace'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-syntaxcheckontype'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-tasks'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-tildemenu'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-todo'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-todoall'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-torch7'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-uniquetabname'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-urho3d'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-verbosesaving'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-wordcount'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-wordwrapmenu'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zerobranepackage-xml'] = { + ['0.1.0-0'] = { + { + arch = "rockspec" + } + } + }, + ['zhangsaizz-skywalking-nginx-lua'] = { + ['master-0'] = { + { + arch = "rockspec" + } + } + }, + zipwriter = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.1-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.2-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.3-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.4-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + }, + ['0.1.5-1'] = { + { + arch = "rockspec" + } + } + }, + ['zk-nvim'] = { + ['0.1.0-1'] = { + { + arch = "rockspec" + }, { + arch = "src" + } + } + } +} From bc7bfb5d361cbb95937876eb5171bb78c1f6b4ee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:42:29 +0000 Subject: [PATCH 1371/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/rocks.lua | 883 ++++++++++++++--------------------- 1 file changed, 358 insertions(+), 525 deletions(-) diff --git a/lua/lazy/community/rocks.lua b/lua/lazy/community/rocks.lua index 1b7a361..a16b088 100644 --- a/lua/lazy/community/rocks.lua +++ b/lua/lazy/community/rocks.lua @@ -1,873 +1,706 @@ -return { - { +return +{ { name = "15puzzle.nvim", url = "NStefan002/15puzzle.nvim", - version = "1.4.1-1", - }, - { + version = "1.4.1-1" + }, { + name = "2048.nvim", + url = "NStefan002/2048.nvim", + version = "2.8.2-1" + }, { + name = "adopure.nvim", + url = "Willem-J-an/adopure.nvim", + version = "1.1.0-1" + }, { name = "aerial.nvim", url = "stevearc/aerial.nvim", - version = "1.7.0-1", - }, - { + version = "1.7.0-1" + }, { name = "ai.nvim", url = "S1M0N38/ai.nvim", - version = "0.1.0-1", - }, - { + version = "0.1.0-1" + }, { name = "auto-hlsearch.nvim", url = "asiryk/auto-hlsearch.nvim", - version = "1.1.0-1", - }, - { + version = "1.1.0-1" + }, { name = "better-escape.nvim", url = "max397574/better-escape.nvim", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "bufferline.nvim", url = "akinsho/bufferline.nvim", - version = "4.6.1-1", - }, - { + version = "4.6.1-1" + }, { name = "ccc.nvim", url = "uga-rosa/ccc.nvim", - version = "1.6.0-1", - }, - { + version = "1.6.0-1" + }, { name = "ci-template.nvim", url = "linrongbin16/ci-template.nvim", - version = "8.1.0-1", - }, - { + version = "8.1.0-1" + }, { name = "colorbox.nvim", url = "linrongbin16/colorbox.nvim", - version = "3.1.0-1", - }, - { + version = "3.1.0-1" + }, { name = "colorbuddy.nvim", url = "tjdevries/colorbuddy.nvim", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "colortils.nvim", url = "nvim-colortils/colortils.nvim", - version = "1.1.0-1", - }, - { + version = "1.1.0-1" + }, { name = "commander.nvim", url = "FeiyouG/commander.nvim", - version = "0.2.0-1", - }, - { + version = "0.2.0-1" + }, { name = "comment-box.nvim", url = "LudoPinelli/comment-box.nvim", - version = "1.0.2-1", - }, - { + version = "1.0.2-1" + }, { name = "comment.nvim", url = "numToStr/Comment.nvim", - version = "0.8.0-1", - }, - { + version = "0.8.0-1" + }, { name = "commons.nvim", url = "linrongbin16/commons.nvim", - version = "18.0.0-1", - }, - { + version = "18.0.0-1" + }, { name = "conform.nvim", url = "stevearc/conform.nvim", - version = "6.0.0-1", - }, - { + version = "6.0.0-1" + }, { name = "cybu.nvim", url = "ghillb/cybu.nvim", - version = "1.0-1", - }, - { + version = "1.0-1" + }, { name = "daylight.nvim", url = "NTBBloodbath/daylight.nvim", - version = "1.1.0-1", - }, - { + version = "1.1.0-1" + }, { name = "deadcolumn.nvim", url = "Bekaboo/deadcolumn.nvim", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "decipher.nvim", url = "MisanthropicBit/decipher.nvim", - version = "1.0.1-1", - }, - { + version = "1.0.1-1" + }, { name = "detour.nvim", url = "carbon-steel/detour.nvim", - version = "1.4.0-1", - }, - { + version = "1.4.0-1" + }, { name = "dial.nvim", url = "monaqa/dial.nvim", - version = "0.4.0-1", - }, - { + version = "0.4.0-1" + }, { name = "distant.nvim", url = "chipsenkbeil/distant.nvim", - version = "0.1.2-1", - }, - { + version = "0.1.2-1" + }, { name = "donut.nvim", url = "NStefan002/donut.nvim", - version = "2.1.0-1", - }, - { + version = "2.1.0-1" + }, { name = "dressing.nvim", url = "stevearc/dressing.nvim", - version = "2.2.2-1", - }, - { + version = "2.2.2-1" + }, { name = "dropbar.nvim", url = "Bekaboo/dropbar.nvim", - version = "8.4.0-1", - }, - { + version = "8.4.0-1" + }, { name = "duck.nvim", url = "tamton-aquib/duck.nvim", - version = "main-1", - }, - { + version = "main-1" + }, { name = "easypick.nvim", url = "axkirillov/easypick.nvim", - version = "0.6.0-1", - }, - { + version = "0.6.0-1" + }, { name = "edgy.nvim", url = "folke/edgy.nvim", - version = "1.9.1-1", - }, - { + version = "1.9.1-1" + }, { name = "elixir-tools.nvim", url = "elixir-tools/elixir-tools.nvim", - version = "0.14.3-1", - }, - { + version = "0.14.3-1" + }, { name = "feline.nvim", url = "freddiehaddad/feline.nvim", - version = "1.6.2-1", - }, - { + version = "1.6.2-1" + }, { name = "fidget.nvim", url = "j-hui/fidget.nvim", - version = "1.4.1-1", - }, - { + version = "1.4.1-1" + }, { name = "flash.nvim", url = "folke/flash.nvim", - version = "1.18.3-1", - }, - { + version = "1.18.3-1" + }, { name = "flatten.nvim", url = "willothy/flatten.nvim", - version = "0.5.1-1", - }, - { + version = "0.5.1-1" + }, { name = "flutter-tools.nvim", url = "akinsho/flutter-tools.nvim", - version = "1.10.0-1", - }, - { + version = "1.10.0-1" + }, { name = "focus.nvim", url = "nvim-focus/focus.nvim", - version = "1.0.2-1", - }, - { + version = "1.0.2-1" + }, { name = "freeze-code.nvim", url = "AlejandroSuero/freeze-code.nvim", - version = "0.2.0-1", - }, - { + version = "0.2.0-1" + }, { name = "fugit2.nvim", url = "SuperBo/fugit2.nvim", - version = "0.2.0-1", - }, - { + version = "0.2.0-1" + }, { name = "funnyfiles.nvim", url = "aikooo7/funnyfiles.nvim", - version = "1.0.1-1", - }, - { + version = "1.0.1-1" + }, { name = "fzfx.nvim", url = "linrongbin16/fzfx.nvim", - version = "6.4.0-1", - }, - { + version = "6.4.0-1" + }, { name = "galileo.nvim", url = "S1M0N38/galileo.nvim", - version = "0.0.2-1", - }, - { + version = "0.0.2-1" + }, { name = "gentags.nvim", url = "linrongbin16/gentags.nvim", - version = "3.0.2-1", - }, - { + version = "3.0.2-1" + }, { name = "git-worktree.nvim", url = "polarmutex/git-worktree.nvim", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "github-nvim-theme", url = "projekt0n/github-nvim-theme", - version = "1.0.2-1", - }, - { + version = "1.0.2-1" + }, { name = "gitlinker.nvim", url = "linrongbin16/gitlinker.nvim", - version = "4.13.1-1", - }, - { + version = "4.13.1-1" + }, { name = "gitsigns.nvim", url = "lewis6991/gitsigns.nvim", - version = "scm-1", - }, - { + version = "scm-1" + }, { name = "glow.nvim", url = "ellisonleao/glow.nvim", - version = "0.2.0-1", - }, - { + version = "0.2.0-1" + }, { name = "go.nvim", url = "ray-x/go.nvim", - version = "0.2.1-1", - }, - { + version = "0.2.1-1" + }, { name = "godo.nvim", url = "arthuradolfo/godo.nvim", - version = "1.1.0-0", - }, - { + version = "1.1.0-0" + }, { name = "grapple.nvim", url = "cbochs/grapple.nvim", - version = "0.30.0-1", - }, - { + version = "0.30.0-1" + }, { name = "gruvbox.nvim", url = "ellisonleao/gruvbox.nvim", - version = "2.0.0-1", - }, - { + version = "2.0.0-1" + }, { name = "haskell-snippets.nvim", url = "mrcjkb/haskell-snippets.nvim", - version = "1.4.4-1", - }, - { + version = "1.4.4-1" + }, { name = "haskell-tools.nvim", url = "mrcjkb/haskell-tools.nvim", - version = "3.1.10-1", - }, - { + version = "3.1.10-1" + }, { name = "headlines.nvim", url = "lukas-reineke/headlines.nvim", - version = "4.0.1-1", - }, - { + version = "4.0.1-1" + }, { name = "heirline.nvim", url = "rebelot/heirline.nvim", - version = "1.0.6-1", - }, - { + version = "1.0.6-1" + }, { name = "hlchunk.nvim", url = "shellRaining/hlchunk.nvim", - version = "1.1.0-1", - }, - { + version = "1.1.0-1" + }, { name = "hotpot.nvim", url = "rktjmp/hotpot.nvim", - version = "0.12.1-1", - }, - { + version = "0.12.1-1" + }, { name = "hydra.nvim", url = "nvimtools/hydra.nvim", - version = "1.0.2-1", - }, - { + version = "1.0.2-1" + }, { name = "image.nvim", url = "3rd/image.nvim", - version = "1.3.0-1", - }, - { + version = "1.3.0-1" + }, { name = "incline.nvim", url = "b0o/incline.nvim", - version = "0.0.1-1", - }, - { + version = "0.0.1-1" + }, { name = "indent-blankline.nvim", url = "lukas-reineke/indent-blankline.nvim", - version = "3.6.3-1", - }, - { + version = "3.6.3-1" + }, { name = "kai.nvim", url = "Kamilcuk/kai.nvim", - version = "0.0.6-1", - }, - { + version = "0.0.6-1" + }, { name = "lazy.nvim", url = "folke/lazy.nvim", - version = "11.2.1-1", - }, - { + version = "11.2.1-1" + }, { name = "leetcode.nvim", url = "kawre/leetcode.nvim", - version = "0.2.0-1", - }, - { + version = "0.2.0-1" + }, { name = "legendary.nvim", url = "mrjones2014/legendary.nvim", - version = "2.13.11-1", - }, - { + version = "2.13.11-1" + }, { name = "live-command.nvim", url = "smjonas/live-command.nvim", - version = "1.2.1-1", - }, - { + version = "1.2.1-1" + }, { name = "logging.nvim", url = "NTBBloodbath/logging.nvim", - version = "1.1.0-1", - }, - { + version = "1.1.0-1" + }, { name = "love2d.nvim", url = "S1M0N38/love2d.nvim", - version = "0.2-1", - }, - { + version = "0.2-1" + }, { name = "lsp-progress.nvim", url = "linrongbin16/lsp-progress.nvim", - version = "1.0.12-1", - }, - { + version = "1.0.12-1" + }, { name = "lsp_signature.nvim", url = "ray-x/lsp_signature.nvim", - version = "0.3.1-1", - }, - { + version = "0.3.1-1" + }, { name = "lua-obfuscator.nvim", url = "git+ssh://git@github.com/kdssoftware/lua-obfuscator.nvim.git", - version = "1.0.1-1", - }, - { + version = "1.0.1-1" + }, { name = "lua-utils.nvim", url = "nvim-neorg/lua-utils.nvim", - version = "1.0.2-1", - }, - { + version = "1.0.2-1" + }, { name = "mapx.nvim", url = "b0o/mapx.nvim", - version = "0.2.1-1", - }, - { + version = "0.2.1-1" + }, { name = "mason-lspconfig.nvim", url = "williamboman/mason-lspconfig.nvim", - version = "1.29.0-1", - }, - { + version = "1.29.0-1" + }, { name = "mason-nvim-dap.nvim", url = "jay-babu/mason-nvim-dap.nvim", - version = "2.3.0-1", - }, - { + version = "2.3.0-1" + }, { name = "mason.nvim", url = "williamboman/mason.nvim", - version = "1.10.0-1", - }, - { + version = "1.10.0-1" + }, { name = "mini.nvim", url = "echasnovski/mini.nvim", - version = "0.9.0-1", - }, - { + version = "0.9.0-1" + }, { name = "mkdnflow.nvim", url = "jakewvincent/mkdnflow.nvim", - version = "1.2.0-1", - }, - { + version = "1.2.0-1" + }, { name = "move.nvim", url = "fedepujol/move.nvim", - version = "2.0.0-1", - }, - { + version = "2.0.0-1" + }, { name = "multicursors.nvim", url = "smoka7/multicursors.nvim", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "my-awesome-plugin.nvim", url = "S1M0N38/my-awesome-plugin.nvim", - version = "0.1.1-1", - }, - { + version = "0.1.1-1" + }, { name = "navigator.nvim", url = "numToStr/Navigator.nvim", - version = "0.6-1", - }, - { + version = "0.6-1" + }, { name = "neo-tree.nvim", url = "nvim-neo-tree/neo-tree.nvim", - version = "3.26-1", - }, - { + version = "3.26-1" + }, { name = "neoconf.nvim", url = "folke/neoconf.nvim", - version = "1.2.2-1", - }, - { + version = "1.2.2-1" + }, { name = "neodev.nvim", url = "folke/neodev.nvim", - version = "3.0.0-1", - }, - { + version = "3.0.0-1" + }, { name = "neoscroll.nvim", url = "karb94/neoscroll.nvim", - version = "0.2.0-1", - }, - { + version = "0.2.0-1" + }, { name = "nightfox.nvim", url = "EdenEast/nightfox.nvim", - version = "3.9.3-1", - }, - { + version = "3.9.3-1" + }, { name = "no-neck-pain.nvim", url = "shortcuts/no-neck-pain.nvim", - version = "1.14.0-1", - }, - { + version = "1.14.0-1" + }, { name = "noice.nvim", url = "folke/noice.nvim", - version = "4.3.0-1", - }, - { + version = "4.3.0-1" + }, { name = "npackages.nvim", url = "diegofigs/npackages.nvim", - version = "0.1.0-1", - }, - { + version = "0.1.0-1" + }, { name = "nui-components.nvim", url = "grapp-dev/nui-components.nvim", - version = "1.5.2-1", - }, - { + version = "1.5.2-1" + }, { name = "nui.nvim", url = "git+https://github.com/MunifTanjim/nui.nvim.git", - version = "0.3.0-1", - }, - { + version = "0.3.0-1" + }, { name = "nvim-client", url = "neovim/lua-client", - version = "0.2.4-1", - }, - { + version = "0.2.4-1" + }, { name = "nvim-client-proxy", url = "hjdivad/nvim-client-proxy", - version = "0.1.0-1", - }, - { + version = "0.1.0-1" + }, { name = "nvim-cmp", url = "hrsh7th/nvim-cmp", - version = "0.0.1-2", - }, - { + version = "0.0.1-2" + }, { name = "nvim-cokeline", url = "willothy/nvim-cokeline", - version = "0.4.0-1", - }, - { + version = "0.4.0-1" + }, { name = "nvim-dap", url = "mfussenegger/nvim-dap", - version = "0.8.0-1", - }, - { + version = "0.8.0-1" + }, { name = "nvim-dap-ui", url = "rcarriga/nvim-dap-ui", - version = "4.0.0-1", - }, - { + version = "4.0.0-1" + }, { name = "nvim-dbee", url = "kndndrj/nvim-dbee", - version = "0.1.6-1", - }, - { + version = "0.1.6-1" + }, { name = "nvim-dev-container", url = "esensar/nvim-dev-container", - version = "0.2.0-1", - }, - { + version = "0.2.0-1" + }, { name = "nvim-java", url = "nvim-java/nvim-java", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "nvim-java-core", url = "nvim-java/nvim-java-core", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "nvim-java-dap", url = "nvim-java/nvim-java-dap", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "nvim-jdtls", url = "mfussenegger/nvim-jdtls", - version = "0.2.0-1", - }, - { + version = "0.2.0-1" + }, { name = "nvim-jqx", url = "gennaro-tedesco/nvim-jqx", - version = "0.1.4-1", - }, - { + version = "0.1.4-1" + }, { name = "nvim-lastplace", url = "mrcjkb/nvim-lastplace", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "nvim-lightbulb", url = "kosayoda/nvim-lightbulb", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "nvim-lspconfig", url = "neovim/nvim-lspconfig", - version = "0.1.8-1", - }, - { + version = "0.1.8-1" + }, { name = "nvim-metals", url = "scalameta/nvim-metals", - version = "0.9.x-1", - }, - { + version = "0.9.x-1" + }, { name = "nvim-nio", url = "nvim-neotest/nvim-nio", - version = "1.9.4-1", - }, - { + version = "1.9.4-1" + }, { name = "nvim-notify", url = "rcarriga/nvim-notify", - version = "3.13.5-1", - }, - { + version = "3.13.5-1" + }, { name = "nvim-parinfer", url = "gpanders/nvim-parinfer", - version = "1.2.0-1", - }, - { + version = "1.2.0-1" + }, { name = "nvim-peekup", url = "gennaro-tedesco/nvim-peekup", - version = "0.1.1-1", - }, - { + version = "0.1.1-1" + }, { name = "nvim-possession", url = "gennaro-tedesco/nvim-possession", - version = "0.0.13-1", - }, - { + version = "0.0.13-1" + }, { name = "nvim-scrollview", url = "dstein64/nvim-scrollview", - version = "5.1.0-1", - }, - { + version = "5.1.0-1" + }, { name = "nvim-smuggler", url = "Klafyvel/nvim-smuggler", - version = "main-1", - }, - { + version = "main-1" + }, { name = "nvim-snippy", url = "dcampos/nvim-snippy", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "nvim-surround", url = "kylechui/nvim-surround", - version = "2.1.5-1", - }, - { + version = "2.1.5-1" + }, { name = "nvim-tree.lua", url = "nvim-tree/nvim-tree.lua", - version = "1.4.0-1", - }, - { + version = "1.4.0-1" + }, { name = "nvim-treesitter-legacy-api", url = "nvim-treesitter/nvim-treesitter", - version = "0.9.2-1", - }, - { + version = "0.9.2-1" + }, { name = "nvim-ufo", url = "kevinhwang91/nvim-ufo", - version = "1.4.0-1", - }, - { + version = "1.4.0-1" + }, { name = "nvim-web-devicons", url = "nvim-tree/nvim-web-devicons", - version = "0.100-1", - }, - { + version = "0.100-1" + }, { name = "obsidian.nvim", url = "epwalsh/obsidian.nvim", - version = "3.8.0-1", - }, - { + version = "3.8.0-1" + }, { name = "oil.nvim", url = "stevearc/oil.nvim", - version = "2.10.0-1", - }, - { + version = "2.10.0-1" + }, { name = "onedarkpro.nvim", url = "olimorris/onedarkpro.nvim", - version = "0.8.0-1", - }, - { + version = "0.8.0-1" + }, { name = "onenord.nvim", url = "rmehri01/onenord.nvim", - version = "0.7.0-1", - }, - { + version = "0.7.0-1" + }, { name = "otter.nvim", url = "jmbuhr/otter.nvim", - version = "1.15.1-1", - }, - { + version = "1.15.1-1" + }, { name = "overseer.nvim", url = "stevearc/overseer.nvim", - version = "1.4.0-1", - }, - { + version = "1.4.0-1" + }, { name = "oz.nvim", url = "luxluth/oz.nvim", - version = "0.0.3-1", - }, - { + version = "0.0.3-1" + }, { name = "package-info.nvim", url = "vuki656/package-info.nvim", - version = "2.0-1", - }, - { + version = "2.0-1" + }, { name = "paperplanes.nvim", url = "rktjmp/paperplanes.nvim", - version = "0.1.6-1", - }, - { + version = "0.1.6-1" + }, { name = "papis.nvim", url = "jghauser/papis.nvim", - version = "0.5.1-1", - }, - { + version = "0.5.1-1" + }, { name = "paq-nvim", url = "savq/paq-nvim", - version = "2.0.0-1", - }, - { + version = "2.0.0-1" + }, { name = "pathlib.nvim", url = "pysan3/pathlib.nvim", - version = "2.2.2-1", - }, - { + version = "2.2.2-1" + }, { name = "persistence.nvim", url = "folke/persistence.nvim", - version = "2.0.0-1", - }, - { + version = "2.0.0-1" + }, { name = "plenary.nvim", url = "nvim-lua/plenary.nvim", - version = "0.1.4-1", - }, - { + version = "0.1.4-1" + }, { name = "pretty-fold.nvim", url = "anuvyklack/pretty-fold.nvim", - version = "3.0-1", - }, - { + version = "3.0-1" + }, { name = "rainbow-delimiters.nvim", url = "HiPhish/rainbow-delimiters.nvim", - version = "0.4.0-1", - }, - { + version = "0.4.0-1" + }, { name = "renamer.nvim", url = "filipdutescu/renamer.nvim", - version = "5.1.0-1", - }, - { + version = "5.1.0-1" + }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", - version = "2.0.1-1", - }, - { + version = "2.0.1-1" + }, { name = "rocks-config.nvim", url = "nvim-neorocks/rocks-config.nvim", - version = "2.0.1-1", - }, - { + version = "2.1.0-1" + }, { name = "rocks-dev.nvim", url = "nvim-neorocks/rocks-dev.nvim", - version = "1.2.3-1", - }, - { + version = "1.2.3-1" + }, { name = "rocks-git.nvim", url = "nvim-neorocks/rocks-git.nvim", - version = "1.5.1-1", - }, - { + version = "1.5.1-1" + }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.32.0-1", - }, - { + version = "2.32.0-1" + }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "4.25.1-1", - }, - { + version = "4.25.1-1" + }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", - version = "0.2.0-1", - }, - { + version = "0.2.0-1" + }, { name = "screenkey.nvim", url = "NStefan002/screenkey.nvim", - version = "2.1.0-1", - }, - { + version = "2.1.0-1" + }, { name = "scrollbar.nvim", url = "Xuyuanp/scrollbar.nvim", - version = "0.4.0-1", - }, - { + version = "0.4.0-1" + }, { name = "session.nvim", url = "Kibadda/session.nvim", - version = "2.0.0-1", - }, - { + version = "2.0.0-1" + }, { name = "sg.nvim", url = "sourcegraph/sg.nvim", - version = "1.1.0-1", - }, - { + version = "1.1.0-1" + }, { name = "smart-splits.nvim", url = "mrjones2014/smart-splits.nvim", - version = "1.5.0-1", - }, - { + version = "1.5.0-1" + }, { name = "squirrel.nvim", url = "xiaoshihou514/squirrel.nvim", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "storm-mode.nvim", url = "HoppenR/storm-mode.nvim", - version = "1.2.0-1", - }, - { + version = "1.2.0-1" + }, { name = "structlog.nvim", url = "git+ssh://git@github.com/Tastyep/structlog.nvim.git", - version = "0.1-1", - }, - { + version = "0.1-1" + }, { name = "substitute.nvim", url = "gbprod/substitute.nvim", - version = "2.0.0-1", - }, - { + version = "2.0.0-1" + }, { name = "sweetie.nvim", url = "NTBBloodbath/sweetie.nvim", - version = "3.1.1-1", - }, - { + version = "3.1.1-1" + }, { name = "tabby.nvim", url = "nanozuki/tabby.nvim", - version = "2.5.1-1", - }, - { + version = "2.5.1-1" + }, { name = "telescope-zf-native.nvim", url = "natecraddock/telescope-zf-native.nvim", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "telescope.nvim", url = "nvim-telescope/telescope.nvim", - version = "0.1.8-1", - }, - { + version = "0.1.8-1" + }, { name = "todo-comments.nvim", url = "folke/todo-comments.nvim", - version = "1.2.0-1", - }, - { + version = "1.2.0-1" + }, { name = "toggleterm.nvim", url = "akinsho/toggleterm.nvim", - version = "2.11.0-1", - }, - { + version = "2.11.0-1" + }, { name = "tokyonight.nvim", url = "folke/tokyonight.nvim", - version = "3.0.1-1", - }, - { + version = "3.0.1-1" + }, { name = "trouble.nvim", url = "folke/trouble.nvim", - version = "3.4.3-1", - }, - { + version = "3.4.3-1" + }, { name = "tsc.nvim", url = "dmmulroy/tsc.nvim", - version = "2.3.0-1", - }, - { + version = "2.3.0-1" + }, { name = "twilight.nvim", url = "folke/twilight.nvim", - version = "1.0.0-1", - }, - { + version = "1.0.0-1" + }, { name = "unimpaired.nvim", url = "tummetott/unimpaired.nvim", - version = "0.2.0-1", - }, - { + version = "0.2.0-1" + }, { name = "vgit.nvim", url = "tanvirtin/vgit.nvim", - version = "0.2.2-1", - }, - { + version = "0.2.2-1" + }, { name = "which-key.nvim", url = "folke/which-key.nvim", - version = "2.1.0-1", - }, - { + version = "2.1.0-1" + }, { name = "windline.nvim", url = "windwp/windline.nvim", - version = "1.1.0-1", - }, - { + version = "1.1.0-1" + }, { name = "yanky.nvim", url = "gbprod/yanky.nvim", - version = "2.0.0-1", - }, - { + version = "2.0.0-1" + }, { name = "yazi.nvim", url = "mikavilpas/yazi.nvim", - version = "master-1", - }, - { + version = "master-1" + }, { name = "zen-mode.nvim", url = "folke/zen-mode.nvim", - version = "1.3.0-1", - }, - { + version = "1.3.0-1" + }, { name = "zk-nvim", url = "zk-org/zk-nvim", - version = "0.1.0-1", - }, -} - + version = "0.1.0-1" + } } \ No newline at end of file From 8abfed457c5b7b7435b0a74ca6d2f718c1df0741 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 17:42:45 +0200 Subject: [PATCH 1372/1610] test: fix tests --- tests/manage/semver_spec.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/manage/semver_spec.lua b/tests/manage/semver_spec.lua index 3b96d99..02036c5 100644 --- a/tests/manage/semver_spec.lua +++ b/tests/manage/semver_spec.lua @@ -14,6 +14,7 @@ describe("semver version", function() ["1.2.3+build"] = { major = 1, minor = 2, patch = 3, build = "build" }, } for input, output in pairs(tests) do + output.input = input it("correctly parses " .. input, function() assert.same(output, v(input)) end) From 88911547e705579ddff57d4b7e5a77a8557a2459 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 17:48:04 +0200 Subject: [PATCH 1373/1610] ci: fix some github urls --- lua/lazy/build.lua | 5 +++-- lua/lazy/community/rocks.lua | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lua/lazy/build.lua b/lua/lazy/build.lua index 83993aa..c30c809 100644 --- a/lua/lazy/build.lua +++ b/lua/lazy/build.lua @@ -68,10 +68,11 @@ function M.build() if rockspec then local url = rockspec.source and rockspec.source.url -- parse github short url - if url and url:find("^%a+://github.com/") then - url = url:gsub("^%a+://github.com/", "") + if url and url:find("://github.com/") then + url = url:gsub("^.*://github.com/", "") local parts = vim.split(url, "/") url = parts[1] .. "/" .. parts[2] + url = url:gsub("%.git$", "") end if url then rock.url = url diff --git a/lua/lazy/community/rocks.lua b/lua/lazy/community/rocks.lua index a16b088..30dc305 100644 --- a/lua/lazy/community/rocks.lua +++ b/lua/lazy/community/rocks.lua @@ -373,7 +373,7 @@ return version = "1.5.2-1" }, { name = "nui.nvim", - url = "git+https://github.com/MunifTanjim/nui.nvim.git", + url = "MunifTanjim/nui.nvim", version = "0.3.0-1" }, { name = "nvim-client", @@ -570,7 +570,7 @@ return }, { name = "rocks-config.nvim", url = "nvim-neorocks/rocks-config.nvim", - version = "2.1.0-1" + version = "2.0.1-1" }, { name = "rocks-dev.nvim", url = "nvim-neorocks/rocks-dev.nvim", From 786a3febc01c31a98163232ab75175e7e8045c7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:48:19 +0000 Subject: [PATCH 1374/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/rocks.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/community/rocks.lua b/lua/lazy/community/rocks.lua index 30dc305..07d5225 100644 --- a/lua/lazy/community/rocks.lua +++ b/lua/lazy/community/rocks.lua @@ -570,7 +570,7 @@ return }, { name = "rocks-config.nvim", url = "nvim-neorocks/rocks-config.nvim", - version = "2.0.1-1" + version = "2.1.0-1" }, { name = "rocks-dev.nvim", url = "nvim-neorocks/rocks-dev.nvim", From 49c0b86a6f831972972a1acc5590c2eb365dcef5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 18:07:26 +0200 Subject: [PATCH 1375/1610] ci: move to _generated.lua --- lua/lazy/build.lua | 2 +- .../community/{rocks.lua => _generated.lua} | 0 lua/lazy/community/init.lua | 25 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) rename lua/lazy/community/{rocks.lua => _generated.lua} (100%) create mode 100644 lua/lazy/community/init.lua diff --git a/lua/lazy/build.lua b/lua/lazy/build.lua index c30c809..f61589e 100644 --- a/lua/lazy/build.lua +++ b/lua/lazy/build.lua @@ -83,7 +83,7 @@ function M.build() end end end - Util.write_file("lua/lazy/community/rocks.lua", "return \n" .. vim.inspect(nvim_rocks)) + Util.write_file("lua/lazy/community/_generated.lua", "return \n" .. vim.inspect(nvim_rocks)) end M.build() diff --git a/lua/lazy/community/rocks.lua b/lua/lazy/community/_generated.lua similarity index 100% rename from lua/lazy/community/rocks.lua rename to lua/lazy/community/_generated.lua diff --git a/lua/lazy/community/init.lua b/lua/lazy/community/init.lua new file mode 100644 index 0000000..4e762ec --- /dev/null +++ b/lua/lazy/community/init.lua @@ -0,0 +1,25 @@ +local M = {} + +---@type table<string, string> +local mapping = nil + +local function _load() + if mapping then + return + end + mapping = {} + ---@type {name:string, url:string, version:string}[] + local gen = require("lazy.community._generated") + for _, rock in ipairs(gen) do + mapping[rock.name] = rock.url + end +end + +---@param rock string +---@return string? +function M.get_url(rock) + _load() + return mapping[rock] +end + +return M From 7cda552c1cd09ec7019960d8d58fd0162bdf1340 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 18:12:39 +0200 Subject: [PATCH 1376/1610] ci: more rockspec patterns --- lua/lazy/build.lua | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lua/lazy/build.lua b/lua/lazy/build.lua index f61589e..c56cbdb 100644 --- a/lua/lazy/build.lua +++ b/lua/lazy/build.lua @@ -5,6 +5,8 @@ local Util = require("lazy.util") local M = {} +M.patterns = { "nvim", "treesitter", "tree-sitter" } + function M.fetch(url, file, prefix) if not vim.uv.fs_stat(file) then print((prefix or "") .. "Fetching " .. url .. " to " .. file .. "\n") @@ -36,7 +38,14 @@ function M.build() ---@type {name:string, version:string, url:string}[] local nvim_rocks = {} for rock, vv in pairs(manifest.repository or {}) do - if rock:find("nvim", 1, true) then + local matches = false + for _, pattern in ipairs(M.patterns) do + if rock:find(pattern, 1, true) then + matches = true + break + end + end + if matches then local versions = vim.tbl_map(Semver.version, vim.tbl_keys(vv)) versions = vim.tbl_filter(function(v) return not not v From 33be7ac3173c7c20b94ce7e1b9734c1a1e85f292 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:13:21 +0000 Subject: [PATCH 1377/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 07d5225..8e5aaad 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -287,14 +287,26 @@ return name = "lsp_signature.nvim", url = "ray-x/lsp_signature.nvim", version = "0.3.1-1" + }, { + name = "ltreesitter", + url = "euclidianAce/ltreesitter", + version = "0.0.7-1" }, { name = "lua-obfuscator.nvim", url = "git+ssh://git@github.com/kdssoftware/lua-obfuscator.nvim.git", version = "1.0.1-1" + }, { + name = "lua-tree-sitter", + url = "xcb-xwii/lua-tree-sitter", + version = "0.1.0-1" }, { name = "lua-utils.nvim", url = "nvim-neorg/lua-utils.nvim", version = "1.0.2-1" + }, { + name = "luarocks-build-treesitter-parser", + url = "nvim-neorocks/luarocks-build-treesitter-parser", + version = "4.1.0-1" }, { name = "mapx.nvim", url = "b0o/mapx.nvim", @@ -659,6 +671,18 @@ return name = "tokyonight.nvim", url = "folke/tokyonight.nvim", version = "3.0.1-1" + }, { + name = "tree-sitter-norg", + url = "nvim-neorg/tree-sitter-norg", + version = "0.2.4-1" + }, { + name = "tree-sitter-norg-meta", + url = "nvim-neorg/tree-sitter-norg-meta", + version = "0.1.0-1" + }, { + name = "tree-sitter-orgmode", + url = "nvim-orgmode/tree-sitter-org", + version = "1.3.2-1" }, { name = "trouble.nvim", url = "folke/trouble.nvim", From aff65371fc0d145c42bc58732242cd9a52ab83bb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 20:35:27 +0200 Subject: [PATCH 1378/1610] ci: add `cmp` to generated luarock mappings --- lua/lazy/build.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/build.lua b/lua/lazy/build.lua index c56cbdb..e8ed7d8 100644 --- a/lua/lazy/build.lua +++ b/lua/lazy/build.lua @@ -5,7 +5,7 @@ local Util = require("lazy.util") local M = {} -M.patterns = { "nvim", "treesitter", "tree-sitter" } +M.patterns = { "nvim", "treesitter", "tree-sitter", "cmp" } function M.fetch(url, file, prefix) if not vim.uv.fs_stat(file) then From aff7ee8e8983947abab94a37aa3eec57f6fc3f6b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 18:35:51 +0000 Subject: [PATCH 1379/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 8e5aaad..9e583e9 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -39,6 +39,10 @@ return name = "ci-template.nvim", url = "linrongbin16/ci-template.nvim", version = "8.1.0-1" + }, { + name = "cmp-rg", + url = "lukas-reineke/cmp-rg", + version = "1.3.9-1" }, { name = "colorbox.nvim", url = "linrongbin16/colorbox.nvim", From 25981e1f3927ee0b22aefea122ebac1cddafdca6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 20:38:16 +0200 Subject: [PATCH 1380/1610] fix(meta): only tag new top-level pkg fragment as optional --- lua/lazy/core/meta.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index ec3a5b4..52b0549 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -34,13 +34,16 @@ function M:load_pkgs() return end for _, pkg in ipairs(Pkg.get()) do + local last_id = self.fragments._fid local meta, fragment = self:add(pkg.spec) if meta and fragment then meta._.pkg = pkg - -- tag all package fragments as optional + -- tag all top-level package fragments that were added as optional for _, fid in ipairs(meta._.frags) do - local frag = self.fragments:get(fid) - frag.spec.optional = true + if fid > last_id then + local frag = self.fragments:get(fid) + frag.spec.optional = true + end end -- keep track of the top-level package fragment self.pkgs[pkg.dir] = fragment.id From be74a8a535fea6a480143fb52b4d6958d9e2da94 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 20:38:50 +0200 Subject: [PATCH 1381/1610] feat(pkg): utils to get rock to url mappings --- lua/lazy/community/init.lua | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/lua/lazy/community/init.lua b/lua/lazy/community/init.lua index 4e762ec..1cd20e8 100644 --- a/lua/lazy/community/init.lua +++ b/lua/lazy/community/init.lua @@ -3,23 +3,22 @@ local M = {} ---@type table<string, string> local mapping = nil -local function _load() - if mapping then - return - end - mapping = {} - ---@type {name:string, url:string, version:string}[] - local gen = require("lazy.community._generated") - for _, rock in ipairs(gen) do - mapping[rock.name] = rock.url +local function load() + if not mapping then + mapping = {} + ---@type {name:string, url:string, version:string}[] + local gen = require("lazy.community._generated") + for _, rock in ipairs(gen) do + mapping[rock.name] = rock.url + end end + return mapping end ---@param rock string ---@return string? function M.get_url(rock) - _load() - return mapping[rock] + return load()[rock] end return M From 6b8bf58ebf9114f8f31fb78cbf057e452cb0e540 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 20:53:42 +0200 Subject: [PATCH 1382/1610] feat(rocks): simple rockspecs are now fully resolved by lazy without luarocks. See #1548 --- lua/lazy/community/init.lua | 4 ++ lua/lazy/community/specs.lua | 7 +++ lua/lazy/core/plugin.lua | 2 +- lua/lazy/pkg/init.lua | 2 +- lua/lazy/pkg/rockspec.lua | 97 +++++++++++++++++++++++++----------- 5 files changed, 80 insertions(+), 32 deletions(-) create mode 100644 lua/lazy/community/specs.lua diff --git a/lua/lazy/community/init.lua b/lua/lazy/community/init.lua index 1cd20e8..f7db48f 100644 --- a/lua/lazy/community/init.lua +++ b/lua/lazy/community/init.lua @@ -21,4 +21,8 @@ function M.get_url(rock) return load()[rock] end +function M.get_spec(name) + return require("lazy.community.specs")[name] +end + return M diff --git a/lua/lazy/community/specs.lua b/lua/lazy/community/specs.lua new file mode 100644 index 0000000..ea16591 --- /dev/null +++ b/lua/lazy/community/specs.lua @@ -0,0 +1,7 @@ +---@type table<string, LazySpec> +return { + ["plenary.nvim"] = { + "nvim-lua/plenary.nvim", + lazy = true, + }, +} diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 8c746a9..a806b0a 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -287,7 +287,7 @@ function M.find_local_spec() return end local path = vim.uv.cwd() - while path ~= "" do + while path and path ~= "" do local file = path .. "/" .. M.LOCAL_SPEC if vim.fn.filereadable(file) == 1 then return { diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index b9620ca..7b52da1 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -2,7 +2,7 @@ local Config = require("lazy.core.config") local Util = require("lazy.core.util") local M = {} -M.VERSION = 10 +M.VERSION = 12 M.dirty = false ---@class LazyPkg diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index ef6d804..7d46034 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -1,4 +1,6 @@ --# selene:allow(incorrect_standard_library_use) +local Community = require("lazy.community") + local Config = require("lazy.core.config") local Health = require("lazy.health") local Util = require("lazy.util") @@ -16,11 +18,11 @@ local Util = require("lazy.util") local M = {} -M.dev_suffix = "-1.rockspec" M.skip = { "lua" } M.rewrites = { ["plenary.nvim"] = { "nvim-lua/plenary.nvim", lazy = true }, } + M.python = { "python3", "python" } ---@class HereRocks @@ -151,6 +153,15 @@ function M.build(task) end end + local pkg = task.plugin._.pkg + assert(pkg, "missing rockspec pkg for " .. task.plugin.name .. "\nThis shouldn't happen, please report.") + + local rockspec = M.rockspec(task.plugin.dir .. "/" .. pkg.file) or {} + assert( + rockspec.package, + "missing rockspec package name for " .. task.plugin.name .. "\nThis shouldn't happen, please report." + ) + local root = Config.options.rocks.root .. "/" .. task.plugin.name task:spawn(luarocks, { args = { @@ -161,8 +172,11 @@ function M.build(task) "--dev", "--lua-version", "5.1", - "make", + "install", -- use install so that we can make use of pre-built rocks "--force-fast", + "--deps-mode", + "one", + rockspec.package, }, cwd = task.plugin.dir, env = env, @@ -192,31 +206,36 @@ function M.rockspec(file) return M.parse(file) end +---@param plugin LazyPlugin +function M.find_rockspec(plugin) + local rockspec_file ---@type string? + Util.ls(plugin.dir, function(path, name, t) + if t == "file" then + for _, suffix in ipairs({ "scm", "git", "dev" }) do + suffix = suffix .. "-1.rockspec" + if name:sub(-#suffix) == suffix then + rockspec_file = path + return false + end + end + end + end) + return rockspec_file +end + ---@param plugin LazyPlugin ---@return LazyPkgSpec? function M.get(plugin) - if M.rewrites[plugin.name] then + if Community.get_spec(plugin.name) then return { - file = "rewrite", + file = "community", source = "lazy", - spec = M.rewrites[plugin.name], + spec = Community.get_spec(plugin.name), } end - local rockspec_file ---@type string? - Util.ls(plugin.dir, function(path, name, t) - if t == "file" and name:sub(-#M.dev_suffix) == M.dev_suffix then - rockspec_file = path - return false - end - end) - - if not rockspec_file then - return - end - - local rockspec = M.rockspec(rockspec_file) - + local rockspec_file = M.find_rockspec(plugin) + local rockspec = rockspec_file and M.rockspec(rockspec_file) if not rockspec then return end @@ -224,20 +243,34 @@ function M.get(plugin) local has_lua = not not vim.uv.fs_stat(plugin.dir .. "/lua") ---@type LazyPluginSpec - local rewrites = {} + local specs = {} ---@param dep string local rocks = vim.tbl_filter(function(dep) local name = dep:gsub("%s.*", "") - if M.rewrites[name] then - table.insert(rewrites, M.rewrites[name]) + local url = Community.get_url(name) + local spec = Community.get_spec(name) + + if spec then + -- community spec + table.insert(specs, spec) + return false + elseif url then + -- Neovim plugin rock + table.insert(specs, { url, lazy = true }) return false end return not vim.tbl_contains(M.skip, name) end, rockspec.dependencies or {}) - local use = not has_lua + local use = + -- package without a /lua directory + not has_lua + -- has dependencies that are not skipped, + -- not in community specs, + -- and don't have a rockspec mapping or #rocks > 0 + -- has a complex build process or ( rockspec.build and rockspec.build.build_type @@ -246,13 +279,17 @@ function M.get(plugin) ) if not use then - if #rewrites > 0 then - return { - file = vim.fn.fnamemodify(rockspec_file, ":t"), - spec = rewrites, - } - end - return + -- community specs only + return #specs > 0 + and { + file = vim.fn.fnamemodify(rockspec_file, ":t"), + spec = { + plugin.name, + specs = specs, + build = false, + }, + } + or nil end local lazy = nil From 9ac375653bbb1f8d91e8f20b238f4f754006a241 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 21:05:40 +0200 Subject: [PATCH 1383/1610] chore(main): release 11.4.0 (#1554) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 6d2ee11..8af0208 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.3.0" + ".": "11.4.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 028f5ab..f53dbe9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [11.4.0](https://github.com/folke/lazy.nvim/compare/v11.3.0...v11.4.0) (2024-06-25) + + +### Features + +* **pkg:** utils to get rock to url mappings ([be74a8a](https://github.com/folke/lazy.nvim/commit/be74a8a535fea6a480143fb52b4d6958d9e2da94)) +* **rocks:** simple rockspecs are now fully resolved by lazy without luarocks. See [#1548](https://github.com/folke/lazy.nvim/issues/1548) ([6b8bf58](https://github.com/folke/lazy.nvim/commit/6b8bf58ebf9114f8f31fb78cbf057e452cb0e540)) + + +### Bug Fixes + +* **meta:** only tag new top-level pkg fragment as optional ([25981e1](https://github.com/folke/lazy.nvim/commit/25981e1f3927ee0b22aefea122ebac1cddafdca6)) + ## [11.3.0](https://github.com/folke/lazy.nvim/compare/v11.2.1...v11.3.0) (2024-06-25) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 6e23b21..cf639f6 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -197,7 +197,7 @@ M.defaults = { debug = false, } -M.version = "11.3.0" -- x-release-please-version +M.version = "11.4.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 0d9fd636beb9e3783edcdba2b31932280bdc05f7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 21:15:50 +0200 Subject: [PATCH 1384/1610] fix(health): show what plugins need luarocks and if none, use warnings instead of errors. See #1551 --- lua/lazy/health.lua | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 3199f75..86e805d 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -129,7 +129,26 @@ function M.check() else info("checking `luarocks` installation") end - require("lazy.pkg.rockspec").check({ error = error, warn = warn, ok = ok }) + local need_luarocks = {} + for _, plugin in pairs(spec.plugins) do + if plugin.build == "rockspec" then + table.insert(need_luarocks, plugin.name) + end + end + if #need_luarocks == 0 then + ok("no plugins require `luarocks`, so you can ignore any warnings below") + else + local lines = vim.tbl_map(function(name) + return " * `" .. name .. "`" + end, need_luarocks) + + info("you have some plugins that require `luarocks`:\n" .. table.concat(lines, "\n")) + end + require("lazy.pkg.rockspec").check({ + error = #need_luarocks > 0 and error or warn, + warn = warn, + ok = ok, + }) else ok("luarocks disabled") end From 3f7368c3ac0c3683030b37aafeb50c54957bd610 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Jun 2024 21:53:56 +0200 Subject: [PATCH 1385/1610] ci: use 5.1 manifest --- lua/lazy/build.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/build.lua b/lua/lazy/build.lua index e8ed7d8..5280c31 100644 --- a/lua/lazy/build.lua +++ b/lua/lazy/build.lua @@ -22,7 +22,7 @@ end ---@return RockManifest? function M.fetch_manifest() local manifest_file = "build/manifest.lua" - M.fetch("https://luarocks.org/manifest", manifest_file) + M.fetch("https://luarocks.org/manifest-5.1", manifest_file) return Rocks.parse(manifest_file) end From 69041bccb70f68408633e93ed33012ee18889bb0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 22:09:17 +0200 Subject: [PATCH 1386/1610] chore(main): release 11.4.1 (#1555) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 8af0208..8aab173 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.4.0" + ".": "11.4.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index f53dbe9..741e766 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [11.4.1](https://github.com/folke/lazy.nvim/compare/v11.4.0...v11.4.1) (2024-06-25) + + +### Bug Fixes + +* **health:** show what plugins need luarocks and if none, use warnings instead of errors. See [#1551](https://github.com/folke/lazy.nvim/issues/1551) ([0d9fd63](https://github.com/folke/lazy.nvim/commit/0d9fd636beb9e3783edcdba2b31932280bdc05f7)) + ## [11.4.0](https://github.com/folke/lazy.nvim/compare/v11.3.0...v11.4.0) (2024-06-25) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index cf639f6..daa9ce3 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -197,7 +197,7 @@ M.defaults = { debug = false, } -M.version = "11.4.0" -- x-release-please-version +M.version = "11.4.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 67e1e8e6a3a8b80357991a5bf58810eb7afa257d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 06:22:21 +0200 Subject: [PATCH 1387/1610] ci: added neo to rockspec patterns --- lua/lazy/build.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/build.lua b/lua/lazy/build.lua index 5280c31..505ce15 100644 --- a/lua/lazy/build.lua +++ b/lua/lazy/build.lua @@ -5,7 +5,7 @@ local Util = require("lazy.util") local M = {} -M.patterns = { "nvim", "treesitter", "tree-sitter", "cmp" } +M.patterns = { "nvim", "treesitter", "tree-sitter", "cmp", "neo" } function M.fetch(url, file, prefix) if not vim.uv.fs_stat(file) then From 6d60dc3c05440f9f79c738058af62c333543329b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 04:22:43 +0000 Subject: [PATCH 1388/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 9e583e9..87b46dd 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -363,10 +363,34 @@ return name = "neodev.nvim", url = "folke/neodev.nvim", version = "3.0.0-1" + }, { + name = "neogen", + url = "danymat/neogen", + version = "2.17.1-1" + }, { + name = "neogit", + url = "NeogitOrg/neogit", + version = "1.0.0-1" + }, { + name = "neorg", + url = "nvim-neorg/neorg", + version = "8.7.1-1" + }, { + name = "neorg-telescope", + url = "nvim-neorg/neorg-telescope", + version = "1.1.0-1" }, { name = "neoscroll.nvim", url = "karb94/neoscroll.nvim", version = "0.2.0-1" + }, { + name = "neotest", + url = "nvim-neotest/neotest", + version = "5.3.3-1" + }, { + name = "neotest-haskell", + url = "mrcjkb/neotest-haskell", + version = "2.0.0-1" }, { name = "nightfox.nvim", url = "EdenEast/nightfox.nvim", From 28e435b7f34eecd8b90bc87ac71c70b79fcb03b3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 07:14:42 +0200 Subject: [PATCH 1389/1610] fix(git): fetch commit from origin or local to check if branch was changed. See #1549 --- lua/lazy/manage/task/git.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 8dd2536..56d2b73 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -127,7 +127,7 @@ M.branch = { return true end local branch = assert(Git.get_branch(plugin)) - return Git.get_commit(plugin.dir, branch) + return Git.get_commit(plugin.dir, branch, true) end, run = function(self) local args = { From e79805d706f815a62467260cb307844c368c3dba Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 07:15:04 +0200 Subject: [PATCH 1390/1610] fix(ui): don't show output when it's the same as error --- lua/lazy/view/render.lua | 44 ++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 61faca1..a2c33c1 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -472,7 +472,7 @@ function M:tasks(plugin) if not task.error and not task.warn and task.name == "log" then self:log(task) end - if self.view:is_selected(plugin) or (task.error or task.warn) then + if (self.view:is_selected(plugin) or (task.error or task.warn)) and task.output ~= task.error then self:markdown(vim.trim(task.output), "LazyTaskOutput", { indent = 6 }) end end @@ -485,27 +485,31 @@ function M:log(task) local lines = vim.split(log, "\n") for _, line in ipairs(lines) do local ref, msg, time = line:match("^(%w+) (.*) (%(.*%))$") - if msg:find("^%S+!:") then - self:diagnostic({ message = "Breaking Changes", severity = vim.diagnostic.severity.WARN }) - end - self:append(ref:sub(1, 7) .. " ", "LazyCommit", { indent = 6 }) - - local dimmed = false - for _, dim in ipairs(ViewConfig.dimmed_commits) do - if msg:find("^" .. dim) then - dimmed = true + if msg then + if msg:find("^%S+!:") then + self:diagnostic({ message = "Breaking Changes", severity = vim.diagnostic.severity.WARN }) end + self:append(ref:sub(1, 7) .. " ", "LazyCommit", { indent = 6 }) + + local dimmed = false + for _, dim in ipairs(ViewConfig.dimmed_commits) do + if msg:find("^" .. dim) then + dimmed = true + end + end + self:append(vim.trim(msg), dimmed and "LazyDimmed" or nil):highlight({ + ["#%d+"] = "LazyCommitIssue", + ["^%S+:"] = dimmed and "Bold" or "LazyCommitType", + ["^%S+(%(.*%))!?:"] = "LazyCommitScope", + ["`.-`"] = "@markup.raw.markdown_inline", + ["%*.-%*"] = "Italic", + ["%*%*.-%*%*"] = "Bold", + }) + self:append(" " .. time, "LazyComment") + self:nl() + -- else + -- self:append(line, "LazyTaskOutput", { indent = 6 }):nl() end - self:append(vim.trim(msg), dimmed and "LazyDimmed" or nil):highlight({ - ["#%d+"] = "LazyCommitIssue", - ["^%S+:"] = dimmed and "Bold" or "LazyCommitType", - ["^%S+(%(.*%))!?:"] = "LazyCommitScope", - ["`.-`"] = "@markup.raw.markdown_inline", - ["%*.-%*"] = "Italic", - ["%*%*.-%*%*"] = "Bold", - }) - self:append(" " .. time, "LazyComment") - self:nl() end self:nl() end From d63e80bae98f42eeb61fa0c21165443bebbb0f2e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 07:18:07 +0200 Subject: [PATCH 1391/1610] test: remove debug output --- tests/core/plugin_spec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 4a09bb9..f922d4b 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -296,7 +296,7 @@ describe("plugin spec opt", function() assert(#spec.notifs == 0) assert(vim.tbl_count(spec.plugins) == 1) Handler.resolve(spec.plugins.bar) - vim.print(spec.plugins.bar._.handlers) + -- vim.print(spec.plugins.bar._.handlers) local events = vim.tbl_keys(spec.plugins.bar._.handlers.event or {}) assert(type(events) == "table") assert(#events == 2) From 473361139cc05936cd5afb08ab68e5bee1ebb5b3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 08:49:42 +0200 Subject: [PATCH 1392/1610] fix(rockspec): dont lazy-load rock deps --- lua/lazy/pkg/rockspec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 7d46034..02c6155 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -257,7 +257,7 @@ function M.get(plugin) return false elseif url then -- Neovim plugin rock - table.insert(specs, { url, lazy = true }) + table.insert(specs, { url }) return false end return not vim.tbl_contains(M.skip, name) From aa1c9572aa1916e582f9b9c3d43e272b4f23b326 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 08:50:06 +0200 Subject: [PATCH 1393/1610] fix(rocks): build.type instead of build.build_type --- lua/lazy/pkg/rockspec.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 02c6155..2cae8a5 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -10,7 +10,7 @@ local Util = require("lazy.util") ---@field package string ---@field version string ---@field dependencies string[] ----@field build? {build_type?: string, modules?: any[]} +---@field build? {type?: string, modules?: any[]} ---@field source? {url?: string} ---@class RockManifest @@ -273,9 +273,9 @@ function M.get(plugin) -- has a complex build process or ( rockspec.build - and rockspec.build.build_type - and rockspec.build.build_type ~= "none" - and not (rockspec.build.build_type == "builtin" and not rockspec.build.modules) + and rockspec.build.type + and rockspec.build.type ~= "none" + and not (rockspec.build.type == "builtin" and not rockspec.build.modules) ) if not use then From 2aa8e061f22579b0cabc74f05a90f7344d92195c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 11:10:43 +0200 Subject: [PATCH 1394/1610] fix(config): dont start checker/change_detection when running headless --- lua/lazy/core/config.lua | 60 ++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index daa9ce3..b7f9c73 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -272,10 +272,6 @@ function M.setup(opts) M.mapleader = vim.g.mapleader M.maplocalleader = vim.g.maplocalleader - if M.headless() then - require("lazy.view.commands").setup() - end - vim.api.nvim_create_autocmd("UIEnter", { once = true, callback = function() @@ -283,33 +279,37 @@ function M.setup(opts) end, }) - vim.api.nvim_create_autocmd("User", { - pattern = "VeryLazy", - once = true, - callback = function() - require("lazy.view.commands").setup() - if M.options.change_detection.enabled then - require("lazy.manage.reloader").enable() - end - if M.options.checker.enabled then - vim.defer_fn(function() - require("lazy.manage.checker").start() - end, 10) - end + if M.headless() then + require("lazy.view.commands").setup() + else + vim.api.nvim_create_autocmd("User", { + pattern = "VeryLazy", + once = true, + callback = function() + require("lazy.view.commands").setup() + if M.options.change_detection.enabled then + require("lazy.manage.reloader").enable() + end + if M.options.checker.enabled then + vim.defer_fn(function() + require("lazy.manage.checker").start() + end, 10) + end - -- useful for plugin developers when making changes to a packspec file - vim.api.nvim_create_autocmd("BufWritePost", { - pattern = { "lazy.lua", "pkg.json", "*.rockspec" }, - callback = function() - require("lazy").pkg({ - plugins = { - require("lazy.core.plugin").find(vim.uv.cwd() .. "/lua/"), - }, - }) - end, - }) - end, - }) + -- useful for plugin developers when making changes to a packspec file + vim.api.nvim_create_autocmd("BufWritePost", { + pattern = { "lazy.lua", "pkg.json", "*.rockspec" }, + callback = function() + require("lazy").pkg({ + plugins = { + require("lazy.core.plugin").find(vim.uv.cwd() .. "/lua/"), + }, + }) + end, + }) + end, + }) + end Util.very_lazy() end From 90e14d158550faab7a410e7c19a6f4044aba572d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 11:11:00 +0200 Subject: [PATCH 1395/1610] refactor(rocks): is_simple_build --- lua/lazy/pkg/rockspec.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 2cae8a5..2eca5bd 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -183,6 +183,12 @@ function M.build(task) }) end +---@param rockspec RockSpec +function M.is_simple_build(rockspec) + local type = vim.tbl_get(rockspec, "build", "type") + return type == nil or type == "none" or (type == "builtin" and not rockspec.build.modules) +end + ---@param file string ---@return table? function M.parse(file) @@ -271,12 +277,7 @@ function M.get(plugin) -- and don't have a rockspec mapping or #rocks > 0 -- has a complex build process - or ( - rockspec.build - and rockspec.build.type - and rockspec.build.type ~= "none" - and not (rockspec.build.type == "builtin" and not rockspec.build.modules) - ) + or not M.is_simple_build(rockspec) if not use then -- community specs only From 707e2e923b341d280f6cc4546715c37fb04da9cb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 11:11:11 +0200 Subject: [PATCH 1396/1610] test: fix init test --- tests/core/init_spec.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/core/init_spec.lua b/tests/core/init_spec.lua index 3a1b4c7..4970871 100644 --- a/tests/core/init_spec.lua +++ b/tests/core/init_spec.lua @@ -1,7 +1,11 @@ +---@module 'luassert' +local Util = require("lazy.core.util") + describe("init", function() it("has correct environment for tests", function() - for _, path in ipairs({ "config", "data", "cache", "state" }) do - assert(vim.fn.stdpath(path):find(".tests/" .. path)) + for _, name in ipairs({ "config", "data", "cache", "state" }) do + local path = Util.norm(vim.fn.stdpath(name) --[[@as string]]) + assert(path:find(".tests/" .. name, 1, true), path .. " not in .tests") end end) end) From 64fd34672815726b60f11a06eb6889b2f5e46b14 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 11:25:04 +0200 Subject: [PATCH 1397/1610] test: cleanup --- tests/core/e2e_spec.lua | 39 -------------------------------------- tests/core/plugin_spec.lua | 6 ++---- 2 files changed, 2 insertions(+), 43 deletions(-) delete mode 100644 tests/core/e2e_spec.lua diff --git a/tests/core/e2e_spec.lua b/tests/core/e2e_spec.lua deleted file mode 100644 index 37cdca5..0000000 --- a/tests/core/e2e_spec.lua +++ /dev/null @@ -1,39 +0,0 @@ -local Git = require("lazy.manage.git") - -describe("lazy", function() - before_each(function() - vim.g.lazy_did_setup = false - vim.go.loadplugins = true - for modname in pairs(package.loaded) do - if modname:find("lazy") == 1 then - package.loaded[modname] = nil - end - end - end) - - local root = ".tests/data/nvim/lazy" - - it("installs plugins", function() - local Lazy = require("lazy") - local Config = require("lazy.core.config") - - local neodev = false - Lazy.setup({ - { - "folke/neodev.nvim", - config = function() - neodev = true - end, - }, - "folke/paint.nvim", - }, { install_missing = true, defaults = { lazy = true } }) - assert(3 == vim.tbl_count(Config.plugins)) - assert(vim.uv.fs_stat(root .. "/paint.nvim/README.md")) - assert(vim.uv.fs_stat(root .. "/neodev.nvim/README.md")) - assert(not neodev) - assert(Config.plugins["neodev.nvim"]._.installed) - assert(not Config.plugins["neodev.nvim"]._.is_local) - assert.equal("https://github.com/folke/neodev.nvim.git", Git.get_origin(Config.plugins["neodev.nvim"].dir)) - assert.equal("https://github.com/folke/paint.nvim.git", Git.get_origin(Config.plugins["paint.nvim"].dir)) - end) -end) diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index f922d4b..87cea77 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -1,11 +1,9 @@ +---@module 'luassert' + local Config = require("lazy.core.config") local Handler = require("lazy.core.handler") local Plugin = require("lazy.core.plugin") -local assert = require("luassert") - -Config.setup() - local function inspect(obj) return vim.inspect(obj):gsub("%s+", " ") end From 36952153ecb5b196c74e2d9a28eb0e01a9eb02fe Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 14:28:22 +0200 Subject: [PATCH 1398/1610] perf(util): improve impl of throttle --- lua/lazy/util.lua | 34 ++++++++++++++++------------------ lua/lazy/view/init.lua | 5 ++++- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 813b4d9..09e4f54 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -74,27 +74,25 @@ end ---@return F function M.throttle(ms, fn) local timer = vim.uv.new_timer() - local running = false - local first = true + local pending = false - return function(...) - local args = { ... } - local wrapped = function() - fn(unpack(args)) + return function() + if timer:is_active() then + pending = true + return end - if not running then - if first then - wrapped() - first = false - end - - timer:start(ms, 0, function() - running = false - vim.schedule(wrapped) + timer:start( + 0, + ms, + vim.schedule_wrap(function() + fn() + if pending then + pending = false + else + timer:stop() + end end) - - running = true - end + ) end end diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 7d349d3..5702531 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -67,7 +67,10 @@ function M.create() self.state = vim.deepcopy(default_state) self.render = Render.new(self) - self.update = Util.throttle(Config.options.ui.throttle, self.update) + local update = self.update + self.update = Util.throttle(Config.options.ui.throttle, function() + update(self) + end) for _, pattern in ipairs({ "LazyRender", "LazyFloatResized" }) do self:on({ "User" }, function() From 0614ca6ca629704cb1846c0d6f9a250b526900b9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 14:28:53 +0200 Subject: [PATCH 1399/1610] perf: tasks are now fully async --- lua/lazy/core/config.lua | 2 +- lua/lazy/manage/task/init.lua | 153 +++++++++++++++++++--------------- 2 files changed, 87 insertions(+), 68 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index b7f9c73..73e0970 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -105,7 +105,7 @@ M.defaults = { -- 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 = 20, -- how frequently should the ui process render events + 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. diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index df8e792..42268e8 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -4,7 +4,45 @@ local Process = require("lazy.manage.process") ---@field skip? fun(plugin:LazyPlugin, opts?:TaskOptions):any? ---@field run fun(task:LazyTask, opts:TaskOptions) ----@alias LazyTaskState fun():boolean? +---@alias LazyTaskState {task:LazyTask, thread:thread} + +local Scheduler = {} +---@type LazyTaskState[] +Scheduler._queue = {} +Scheduler._executor = assert(vim.loop.new_check()) +Scheduler._running = false + +function Scheduler.step() + Scheduler._running = true + local budget = 1 * 1e6 + local start = vim.loop.hrtime() + local count = #Scheduler._queue + local i = 0 + while #Scheduler._queue > 0 and vim.loop.hrtime() - start < budget do + ---@type LazyTaskState + local state = table.remove(Scheduler._queue, 1) + state.task:_step(state.thread) + if coroutine.status(state.thread) ~= "dead" then + table.insert(Scheduler._queue, state) + end + i = i + 1 + if i >= count then + break + end + end + Scheduler._running = false + if #Scheduler._queue == 0 then + return Scheduler._executor:stop() + end +end + +---@param state LazyTaskState +function Scheduler.add(state) + table.insert(Scheduler._queue, state) + if not Scheduler._executor:is_active() then + Scheduler._executor:start(vim.schedule_wrap(Scheduler.step)) + end +end ---@class LazyTask ---@field plugin LazyPlugin @@ -13,11 +51,11 @@ local Process = require("lazy.manage.process") ---@field status string ---@field error? string ---@field warn? string ----@field private _task fun(task:LazyTask) ----@field private _running LazyPluginState[] +---@field private _task fun(task:LazyTask, opts:TaskOptions) ---@field private _started? number ---@field private _ended? number ---@field private _opts TaskOptions +---@field private _threads thread[] local Task = {} ---@class TaskOptions: {[string]:any} @@ -32,18 +70,17 @@ function Task.new(plugin, name, task, opts) __index = Task, }) self._opts = opts or {} - self._running = {} + self._threads = {} self._task = task self._started = nil self.plugin = plugin self.name = name self.output = "" self.status = "" - plugin._.tasks = plugin._.tasks or {} ---@param other LazyTask plugin._.tasks = vim.tbl_filter(function(other) return other.name ~= name or other:is_running() - end, plugin._.tasks) + end, plugin._.tasks or {}) table.insert(plugin._.tasks, self) return self end @@ -52,27 +89,26 @@ function Task:has_started() return self._started ~= nil end +function Task:has_ended() + return self._ended ~= nil +end + function Task:is_done() - return self:has_started() and not self:is_running() + return self:has_started() and self:has_ended() end function Task:is_running() - return self:has_started() and self._ended == nil + return self:has_started() and not self:has_ended() end function Task:start() - if vim.in_fast_event() then - return vim.schedule(function() - self:start() - end) - end + assert(not self:has_started(), "task already started") + assert(not self:has_ended(), "task already done") + self._started = vim.uv.hrtime() - ---@type boolean, string|any - local ok, err = pcall(self._task, self, self._opts) - if not ok then - self.error = err or "failed" - end - self:_check() + self:async(function() + self._task(self, self._opts) + end) end ---@param msg string|string[] @@ -102,36 +138,33 @@ end ---@param fn async fun() function Task:async(fn) local co = coroutine.create(fn) - local check = vim.uv.new_check() - check:start(vim.schedule_wrap(function() - local status = coroutine.status(co) - if status == "dead" then - check:stop() - self:_check() - elseif status == "suspended" then - local ok, res = coroutine.resume(co) - if not ok then - error(res) - elseif res then - self.status = res - self.output = self.output .. "\n" .. res - vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) - end - end - end)) - - table.insert(self._running, function() - return check:is_active() - end) + table.insert(self._threads, co) + Scheduler.add({ task = self, thread = co }) end ----@private -function Task:_check() - for _, state in ipairs(self._running) do - if state() then +---@param co thread +function Task:_step(co) + local status = coroutine.status(co) + if status == "suspended" then + local ok, res = coroutine.resume(co) + if not ok then + self:notify_error(tostring(res)) + elseif res then + self:notify(tostring(res)) + end + end + for _, t in ipairs(self._threads) do + if coroutine.status(t) ~= "dead" then return end end + self:_done() +end + +---@private +function Task:_done() + assert(self:has_started(), "task not started") + assert(not self:has_ended(), "task already done") self._ended = vim.uv.hrtime() if self._opts.on_done then self._opts.on_done(self) @@ -147,29 +180,13 @@ function Task:time() if not self:has_started() then return 0 end - if not self:is_done() then + if not self:has_ended() then return (vim.uv.hrtime() - self._started) / 1e6 end return (self._ended - self._started) / 1e6 end ----@param fn fun() -function Task:schedule(fn) - local done = false - table.insert(self._running, function() - return not done - end) - vim.schedule(function() - ---@type boolean, string|any - local ok, err = pcall(fn) - if not ok then - self.error = err or "failed" - end - done = true - self:_check() - end) -end - +---@async ---@param cmd string ---@param opts? ProcessOpts function Task:spawn(cmd, opts) @@ -178,6 +195,7 @@ function Task:spawn(cmd, opts) local on_exit = opts.on_exit function opts.on_line(line) + self:notify(line) self.status = line if on_line then pcall(on_line, line) @@ -185,6 +203,7 @@ function Task:spawn(cmd, opts) vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) end + local running = true ---@param output string function opts.on_exit(ok, output) self.output = self.output .. output @@ -194,12 +213,12 @@ function Task:spawn(cmd, opts) if on_exit then pcall(on_exit, ok, output) end - self:_check() + running = false + end + Process.spawn(cmd, opts) + while running do + coroutine.yield() end - local proc = Process.spawn(cmd, opts) - table.insert(self._running, function() - return proc and not proc:is_closing() - end) end ---@param tasks (LazyTask?)[] From bbe136bda6b3afca84b686f77800e3cbe08f3cdb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 14:29:00 +0200 Subject: [PATCH 1400/1610] test: fix tests --- lua/lazy/manage/task/init.lua | 1 - tests/manage/runner_spec.lua | 3 ++- tests/manage/task_spec.lua | 43 ++++++++++++++++++----------------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 42268e8..9c2d179 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -195,7 +195,6 @@ function Task:spawn(cmd, opts) local on_exit = opts.on_exit function opts.on_line(line) - self:notify(line) self.status = line if on_line then pcall(on_line, line) diff --git a/tests/manage/runner_spec.lua b/tests/manage/runner_spec.lua index b3b606b..ba940e2 100644 --- a/tests/manage/runner_spec.lua +++ b/tests/manage/runner_spec.lua @@ -32,7 +32,8 @@ describe("runner", function() package.loaded["lazy.manage.task.test"]["async" .. i] = { ---@param task LazyTask run = function(task) - task:schedule(function() + task:async(function() + coroutine.yield() table.insert(runs, { plugin = task.plugin.name, task = task.name }) end) end, diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index bbb8704..546bc34 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -4,20 +4,18 @@ local Task = require("lazy.manage.task") describe("task", function() local plugin = { name = "test", _ = {} } - local done = false - ---@type string? - local error + ---@type {done?:boolean, error:string?} + local task_result = {} local opts = { + ---@param task LazyTask on_done = function(task) - done = true - error = task.error + task_result = { done = true, error = task.error } end, } before_each(function() - done = false - error = nil + task_result = {} end) it("simple function", function() @@ -25,9 +23,10 @@ describe("task", function() assert(not task:has_started()) assert(not task:is_running()) task:start() + task:wait() assert(not task:is_running()) assert(task:is_done()) - assert(done) + assert(task_result.done) end) it("detects errors", function() @@ -37,18 +36,19 @@ describe("task", function() assert(not task:has_started()) assert(not task:is_running()) task:start() + task:wait() assert(task:is_done()) assert(not task:is_running()) - assert(done) - assert(error) + assert(task_result.done) + assert(task_result.error) assert(task.error and task.error:find("test")) end) - it("schedule", function() - local running = false + it("async", function() + local running = true local task = Task.new(plugin, "test", function(task) - running = true - task:schedule(function() + task:async(function() + coroutine.yield() running = false end) end, opts) @@ -56,25 +56,26 @@ describe("task", function() assert(not task:has_started()) task:start() assert(running) - assert(#task._running == 1) assert(task:is_running()) assert(not task:is_done()) task:wait() + assert(not running) assert(task:is_done()) assert(not task:is_running()) - assert(done) + assert(task_result.done) assert(not task.error) end) it("spawn errors", function() - local task = Task.new(plugin, "test", function(task) + local task = Task.new(plugin, "spawn_errors", function(task) task:spawn("foobar") end, opts) assert(not task:is_running()) task:start() + task:wait() assert(not task:is_running()) - assert(done) - assert(task.error and task.error:find("Failed to spawn")) + assert(task_result.done) + assert(task.error and task.error:find("Failed to spawn"), task.output) end) it("spawn", function() @@ -89,7 +90,7 @@ describe("task", function() task:wait() assert(task:is_done()) assert.same(task.output, "foo\n") - assert(done) + assert(task_result.done) assert(not task.error) end) @@ -103,7 +104,7 @@ describe("task", function() assert(task:is_running()) task:wait() assert(task.output == "foo\nbar\n" or task.output == "bar\nfoo\n", task.output) - assert(done) + assert(task_result.done) assert(not task.error) end) end) From 9c1dd5a09065218a8aa67f251a2116cf74420b8c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 14:30:55 +0200 Subject: [PATCH 1401/1610] test: buse busted for running tasks --- .busted | 11 +++++++++++ .github/workflows/ci.yml | 2 +- tests/busted.lua | 28 ++++++++++++++++++++++++++++ tests/init.lua | 36 ------------------------------------ tests/run | 3 --- 5 files changed, 40 insertions(+), 40 deletions(-) create mode 100644 .busted create mode 100755 tests/busted.lua delete mode 100644 tests/init.lua delete mode 100755 tests/run diff --git a/.busted b/.busted new file mode 100644 index 0000000..98b3032 --- /dev/null +++ b/.busted @@ -0,0 +1,11 @@ +return { + _all = { + coverage = false, + }, + default = { + verbose = true, + }, + tests = { + verbose = true, + }, +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e7c3dd2..0d20294 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: run: | nvim --version [ ! -d tests ] && exit 0 - nvim --headless -u tests/init.lua -c "PlenaryBustedDirectory tests/ {minimal_init = 'tests/init.lua', sequential = true}" + nvim -l tests/busted.lua tests community: runs-on: ubuntu-latest steps: diff --git a/tests/busted.lua b/tests/busted.lua new file mode 100755 index 0000000..146ab96 --- /dev/null +++ b/tests/busted.lua @@ -0,0 +1,28 @@ +#!/usr/bin/env -S nvim -l + +-- set stdpaths to use .tests +local root = vim.fn.fnamemodify("./.tests", ":p") +for _, name in ipairs({ "config", "data", "state", "cache" }) do + vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name +end + +-- -- 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" +-- vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) +-- end +-- vim.opt.rtp:prepend(lazypath) +vim.opt.rtp:prepend(".") + +vim.o.loadplugins = true -- enable since nvim -l disables plugins + +-- Setup lazy.nvim +require("lazy").setup({ + "lunarmodules/busted", -- add busted +}) + +-- run busted +return pcall(require("busted.runner"), { + standalone = false, +}) or os.exit(1) diff --git a/tests/init.lua b/tests/init.lua deleted file mode 100644 index 7b243c5..0000000 --- a/tests/init.lua +++ /dev/null @@ -1,36 +0,0 @@ -local M = {} - -function M.root(root) - local f = debug.getinfo(1, "S").source:sub(2) - return vim.fn.fnamemodify(f, ":p:h:h") .. "/" .. (root or "") -end - ----@param plugin string -function M.load(plugin) - local name = plugin:match(".*/(.*)") - local package_root = M.root(".tests/site/pack/deps/start/") - if not vim.uv.fs_stat(package_root .. name) then - print("Installing " .. plugin) - vim.fn.mkdir(package_root, "p") - vim.fn.system({ - "git", - "clone", - "--depth=1", - "https://github.com/" .. plugin .. ".git", - package_root .. "/" .. name, - }) - end -end - -function M.setup() - vim.cmd([[set runtimepath=$VIMRUNTIME]]) - vim.opt.runtimepath:append(M.root()) - vim.opt.packpath = { M.root(".tests/site") } - M.load("nvim-lua/plenary.nvim") - vim.env.XDG_CONFIG_HOME = M.root(".tests/config") - vim.env.XDG_DATA_HOME = M.root(".tests/data") - vim.env.XDG_STATE_HOME = M.root(".tests/state") - vim.env.XDG_CACHE_HOME = M.root(".tests/cache") -end - -M.setup() diff --git a/tests/run b/tests/run deleted file mode 100755 index 412d7b5..0000000 --- a/tests/run +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -nvim --headless -u tests/init.lua -c "PlenaryBustedDirectory tests {minimal_init = 'tests//init.lua', sequential = true}" From 0eb46e781666d2a5b288b671813f65b00896fff9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 14:35:29 +0200 Subject: [PATCH 1402/1610] ci: use utfTerminal output for busted --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d20294..647365c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: run: | nvim --version [ ! -d tests ] && exit 0 - nvim -l tests/busted.lua tests + nvim -l tests/busted.lua tests -o utfTerminal community: runs-on: ubuntu-latest steps: From 768de1ebf6a1b45020438df018c1ba39669ca863 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 15:11:31 +0200 Subject: [PATCH 1403/1610] refactor: move scheduler to async --- lua/lazy/async.lua | 107 ++++++++++++++++++++++++++++++++++ lua/lazy/manage/task/init.lua | 84 +++++++------------------- 2 files changed, 129 insertions(+), 62 deletions(-) create mode 100644 lua/lazy/async.lua diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua new file mode 100644 index 0000000..a7bcfac --- /dev/null +++ b/lua/lazy/async.lua @@ -0,0 +1,107 @@ +---@class AsyncOpts +---@field on_done? fun() +---@field on_error? fun(err:string) +---@field on_yield? fun(res:any) + +local M = {} + +---@type Async[] +M._queue = {} +M._executor = assert(vim.loop.new_check()) +M._running = false + +---@class Async +---@field co thread +---@field opts AsyncOpts +local Async = {} + +---@param fn async fun() +---@param opts? AsyncOpts +---@return Async +function Async.new(fn, opts) + local self = setmetatable({}, { __index = Async }) + self.co = coroutine.create(fn) + self.opts = opts or {} + return self +end + +function Async:running() + return coroutine.status(self.co) ~= "dead" +end + +function Async:step() + local status = coroutine.status(self.co) + if status == "suspended" then + local ok, res = coroutine.resume(self.co) + if not ok then + if self.opts.on_error then + self.opts.on_error(tostring(res)) + end + elseif res then + if self.opts.on_yield then + self.opts.on_yield(res) + end + end + end + if self:running() then + return true + end + if self.opts.on_done then + self.opts.on_done() + end +end + +function M.step() + M._running = true + local budget = 1 * 1e6 + local start = vim.loop.hrtime() + local count = #M._queue + local i = 0 + while #M._queue > 0 and vim.loop.hrtime() - start < budget do + ---@type Async + local state = table.remove(M._queue, 1) + if state:step() then + table.insert(M._queue, state) + end + i = i + 1 + if i >= count then + break + end + end + M._running = false + if #M._queue == 0 then + return M._executor:stop() + end +end + +---@param async Async +function M.add(async) + table.insert(M._queue, async) + if not M._executor:is_active() then + M._executor:start(vim.schedule_wrap(M.step)) + end + return async +end + +---@param fn async fun() +---@param opts? AsyncOpts +function M.run(fn, opts) + return M.add(Async.new(fn, opts)) +end + +---@generic T: async fun() +---@param fn T +---@param opts? AsyncOpts +---@return T +function M.wrap(fn, opts) + return function(...) + local args = { ... } + ---@async + local wrapped = function() + return fn(unpack(args)) + end + return M.run(wrapped, opts) + end +end + +return M diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 9c2d179..5a9079d 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -1,3 +1,4 @@ +local Async = require("lazy.async") local Process = require("lazy.manage.process") ---@class LazyTaskDef @@ -6,44 +7,6 @@ local Process = require("lazy.manage.process") ---@alias LazyTaskState {task:LazyTask, thread:thread} -local Scheduler = {} ----@type LazyTaskState[] -Scheduler._queue = {} -Scheduler._executor = assert(vim.loop.new_check()) -Scheduler._running = false - -function Scheduler.step() - Scheduler._running = true - local budget = 1 * 1e6 - local start = vim.loop.hrtime() - local count = #Scheduler._queue - local i = 0 - while #Scheduler._queue > 0 and vim.loop.hrtime() - start < budget do - ---@type LazyTaskState - local state = table.remove(Scheduler._queue, 1) - state.task:_step(state.thread) - if coroutine.status(state.thread) ~= "dead" then - table.insert(Scheduler._queue, state) - end - i = i + 1 - if i >= count then - break - end - end - Scheduler._running = false - if #Scheduler._queue == 0 then - return Scheduler._executor:stop() - end -end - ----@param state LazyTaskState -function Scheduler.add(state) - table.insert(Scheduler._queue, state) - if not Scheduler._executor:is_active() then - Scheduler._executor:start(vim.schedule_wrap(Scheduler.step)) - end -end - ---@class LazyTask ---@field plugin LazyPlugin ---@field name string @@ -55,7 +18,7 @@ end ---@field private _started? number ---@field private _ended? number ---@field private _opts TaskOptions ----@field private _threads thread[] +---@field private _running Async[] local Task = {} ---@class TaskOptions: {[string]:any} @@ -70,7 +33,7 @@ function Task.new(plugin, name, task, opts) __index = Task, }) self._opts = opts or {} - self._threads = {} + self._running = {} self._task = task self._started = nil self.plugin = plugin @@ -137,34 +100,31 @@ end ---@param fn async fun() function Task:async(fn) - local co = coroutine.create(fn) - table.insert(self._threads, co) - Scheduler.add({ task = self, thread = co }) -end - ----@param co thread -function Task:_step(co) - local status = coroutine.status(co) - if status == "suspended" then - local ok, res = coroutine.resume(co) - if not ok then - self:notify_error(tostring(res)) - elseif res then - self:notify(tostring(res)) - end - end - for _, t in ipairs(self._threads) do - if coroutine.status(t) ~= "dead" then - return - end - end - self:_done() + local async = Async.run(fn, { + on_done = function() + self:_done() + end, + on_error = function(err) + self:notify_error(err) + end, + on_yield = function(res) + self:notify(res) + end, + }) + table.insert(self._running, async) end ---@private function Task:_done() assert(self:has_started(), "task not started") assert(not self:has_ended(), "task already done") + + for _, t in ipairs(self._running) do + if t:running() then + return + end + end + self._ended = vim.uv.hrtime() if self._opts.on_done then self._opts.on_done(self) From 765773a176dced0b9e95a0797af4c19f639d71af Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 17:06:56 +0200 Subject: [PATCH 1404/1610] refactor: use new async code for runner and simplify task class --- lua/lazy/manage/runner.lua | 208 +++++++++++++------------------- lua/lazy/manage/task/init.lua | 74 ++++-------- lua/lazy/manage/task/plugin.lua | 6 +- tests/manage/runner_spec.lua | 7 +- tests/manage/task_spec.lua | 43 +++---- 5 files changed, 133 insertions(+), 205 deletions(-) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 9b766df..31b194b 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -1,23 +1,24 @@ +local Async = require("lazy.async") local Config = require("lazy.core.config") local Task = require("lazy.manage.task") -local Util = require("lazy.util") ---@class RunnerOpts ---@field pipeline (string|{[1]:string, [string]:any})[] ---@field plugins? LazyPlugin[]|fun(plugin:LazyPlugin):any? ---@field concurrency? number ----@alias PipelineStep {task:string, opts?:TaskOptions} ----@alias LazyRunnerTask {co:thread, status: {task?:LazyTask, waiting?:boolean}, plugin: string} +---@class RunnerTask +---@field task? LazyTask +---@field step number + +---@alias PipelineStep {task:string, opts?:TaskOptions } ---@class Runner ---@field _plugins table<string,LazyPlugin> ----@field _running LazyRunnerTask[] ---@field _pipeline PipelineStep[] ----@field _sync PipelineStep[] ---@field _on_done fun()[] ----@field _syncing boolean ---@field _opts RunnerOpts +---@field _running? Async local Runner = {} ---@param opts RunnerOpts @@ -37,7 +38,6 @@ function Runner.new(opts) for _, plugin in ipairs(pp) do self._plugins[plugin.name] = plugin end - self._running = {} self._on_done = {} ---@param step string|(TaskOptions|{[1]:string}) @@ -45,10 +45,6 @@ function Runner.new(opts) return type(step) == "string" and { task = step } or { task = step[1], opts = step } end, self._opts.pipeline) - self._sync = vim.tbl_filter(function(step) - return step.task == "wait" - end, self._pipeline) - return self end @@ -56,139 +52,107 @@ function Runner:plugin(name) return Config.plugins[name] or self._plugins[name] end ----@param entry LazyRunnerTask -function Runner:_resume(entry) - if entry.status.task and not entry.status.task:is_done() then - return true - end - local ok, status = coroutine.resume(entry.co) - if not ok then - Util.error("Could not resume a task\n" .. status) - end - entry.status = ok and status - return entry.status ~= nil -end - -function Runner:resume(waiting) - if self._syncing then - return true - end - if waiting then - local sync = self._sync[1] - table.remove(self._sync, 1) - if sync then - self._syncing = true - vim.schedule(function() - if sync.opts and type(sync.opts.sync) == "function" then - sync.opts.sync(self) - end - for _, entry in ipairs(self._running) do - if entry.status then - if entry.status.waiting then - entry.status.waiting = false - local plugin = self:plugin(entry.plugin) - if plugin then - plugin._.working = true - end - end - end - end - self._syncing = false - end) - end - end - local running = 0 - for _, entry in ipairs(self._running) do - if entry.status then - if not entry.status.waiting and self:_resume(entry) then - running = running + 1 - if self._opts.concurrency and running >= self._opts.concurrency then - break - end - end - end - end - return self._syncing or running > 0 or (not waiting and self:resume(true)) -end - function Runner:start() - ---@type string[] - local names = vim.tbl_keys(self._plugins) - table.sort(names) - for _, name in pairs(names) do - local co = coroutine.create(self.run_pipeline) - local ok, err = coroutine.resume(co, self, name) - if ok then - table.insert(self._running, { co = co, status = {}, plugin = name }) - else - Util.error("Could not start tasks for " .. name .. "\n" .. err) - end - end - - local check = vim.uv.new_check() - check:start(function() - if self:resume() then - return - end - check:stop() - self._running = {} - for _, cb in ipairs(self._on_done) do - vim.schedule(cb) - end - self._on_done = {} - end) + ---@async + self._running = Async.run(function() + self:_start() + end, { + on_done = function() + for _, cb in ipairs(self._on_done) do + cb() + end + end, + }) end ---@async ----@param name string -function Runner:run_pipeline(name) - local plugin = self:plugin(name) - plugin._.working = true - coroutine.yield() - for _, step in ipairs(self._pipeline) do - if step.task == "wait" then - plugin._.working = false - coroutine.yield({ waiting = true }) - plugin._.working = true - else - plugin = self:plugin(name) - local task = self:queue(plugin, step.task, step.opts) - if task then - coroutine.yield({ task = task }) - assert(task:is_done()) - if task.error then +function Runner:_start() + ---@type string[] + local names = vim.tbl_keys(self._plugins) + table.sort(names) + + ---@type table<string,RunnerTask> + local state = {} + + local active = 1 + local waiting = 0 + ---@type number? + local wait_step = nil + + ---@param resume? boolean + local function continue(resume) + active = #names + waiting = 0 + wait_step = nil + for _, name in ipairs(names) do + state[name] = state[name] or { step = 0 } + local s = state[name] + local running = s.task and s.task:is_running() + local step = self._pipeline[s.step] + + if step and step.task == "wait" and not resume then + waiting = waiting + 1 + active = active - 1 + wait_step = s.step + elseif not running then + local plugin = self:plugin(name) + if s.task and s.task.error then + active = active - 1 + elseif s.step == #self._pipeline then + s.task = nil + active = active - 1 plugin._.working = false - return + elseif s.step < #self._pipeline then + s.step = s.step + 1 + step = self._pipeline[s.step] + if step.task == "wait" then + plugin._.working = false + else + s.task = self:queue(plugin, step) + plugin._.working = not not s.task + end end end end end - plugin._.working = false + + while active > 0 do + continue() + if active == 0 and waiting > 0 then + local sync = self._pipeline[wait_step] + if sync and sync.opts and type(sync.opts.sync) == "function" then + sync.opts.sync(self) + end + continue(true) + end + coroutine.yield() + end end ---@param plugin LazyPlugin ----@param task_name string ----@param opts? TaskOptions +---@param step PipelineStep ---@return LazyTask? -function Runner:queue(plugin, task_name, opts) - assert(self._running) - local def = vim.split(task_name, ".", { plain = true }) +function Runner:queue(plugin, step) + assert(self._running and self._running:running(), "Runner is not running") + local def = vim.split(step.task, ".", { plain = true }) ---@type LazyTaskDef local task_def = require("lazy.manage.task." .. def[1])[def[2]] - assert(task_def) - opts = opts or {} + assert(task_def, "Task not found: " .. step.task) + local opts = step.opts or {} if not (task_def.skip and task_def.skip(plugin, opts)) then - local task = Task.new(plugin, def[2], task_def.run, opts) - task:start() - return task + return Task.new(plugin, def[2], task_def.run, opts) end end +function Runner:is_running() + return self._running and self._running:running() +end + -- Execute the callback async when done. -- When no callback is specified, this will wait sync ---@param cb? fun() function Runner:wait(cb) - if #self._running == 0 then + if not self:is_running() then if cb then cb() end @@ -199,7 +163,7 @@ function Runner:wait(cb) table.insert(self._on_done, cb) else -- sync wait - while #self._running > 0 do + while self:is_running() do vim.wait(10) end end diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 5a9079d..98c7636 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -5,7 +5,7 @@ local Process = require("lazy.manage.process") ---@field skip? fun(plugin:LazyPlugin, opts?:TaskOptions):any? ---@field run fun(task:LazyTask, opts:TaskOptions) ----@alias LazyTaskState {task:LazyTask, thread:thread} +---@alias LazyTaskFn async fun(task:LazyTask, opts:TaskOptions) ---@class LazyTask ---@field plugin LazyPlugin @@ -14,11 +14,10 @@ local Process = require("lazy.manage.process") ---@field status string ---@field error? string ---@field warn? string ----@field private _task fun(task:LazyTask, opts:TaskOptions) ---@field private _started? number ---@field private _ended? number ---@field private _opts TaskOptions ----@field private _running Async[] +---@field private _running Async local Task = {} ---@class TaskOptions: {[string]:any} @@ -27,15 +26,10 @@ local Task = {} ---@param plugin LazyPlugin ---@param name string ---@param opts? TaskOptions ----@param task fun(task:LazyTask) +---@param task LazyTaskFn function Task.new(plugin, name, task, opts) - local self = setmetatable({}, { - __index = Task, - }) + local self = setmetatable({}, { __index = Task }) self._opts = opts or {} - self._running = {} - self._task = task - self._started = nil self.plugin = plugin self.name = name self.output = "" @@ -45,6 +39,7 @@ function Task.new(plugin, name, task, opts) return other.name ~= name or other:is_running() end, plugin._.tasks or {}) table.insert(plugin._.tasks, self) + self:_start(task) return self end @@ -56,22 +51,31 @@ function Task:has_ended() return self._ended ~= nil end -function Task:is_done() - return self:has_started() and self:has_ended() -end - function Task:is_running() - return self:has_started() and not self:has_ended() + return not self:has_ended() end -function Task:start() +---@private +---@param task LazyTaskFn +function Task:_start(task) assert(not self:has_started(), "task already started") assert(not self:has_ended(), "task already done") self._started = vim.uv.hrtime() - self:async(function() - self._task(self, self._opts) - end) + ---@async + self._running = Async.run(function() + task(self, self._opts) + end, { + on_done = function() + self:_done() + end, + on_error = function(err) + self:notify_error(err) + end, + on_yield = function(res) + self:notify(res) + end, + }) end ---@param msg string|string[] @@ -98,31 +102,13 @@ function Task:notify_warn(msg) self:notify(msg, vim.diagnostic.severity.WARN) end ----@param fn async fun() -function Task:async(fn) - local async = Async.run(fn, { - on_done = function() - self:_done() - end, - on_error = function(err) - self:notify_error(err) - end, - on_yield = function(res) - self:notify(res) - end, - }) - table.insert(self._running, async) -end - ---@private function Task:_done() assert(self:has_started(), "task not started") assert(not self:has_ended(), "task already done") - for _, t in ipairs(self._running) do - if t:running() then - return - end + if self._running and self._running:running() then + return end self._ended = vim.uv.hrtime() @@ -180,16 +166,6 @@ function Task:spawn(cmd, opts) end end ----@param tasks (LazyTask?)[] -function Task.all_done(tasks) - for _, task in ipairs(tasks) do - if task and not task:is_done() then - return false - end - end - return true -end - function Task:wait() while self:is_running() do vim.wait(10) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index cb426ec..ddf53a1 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -65,9 +65,7 @@ M.build = { ---@cast builders (string|fun(LazyPlugin))[] for _, build in ipairs(builders) do if type(build) == "function" then - self:async(function() - build(self.plugin) - end) + build(self.plugin) elseif build == "rockspec" then Rocks.build(self) elseif build:sub(1, 1) == ":" then @@ -78,7 +76,7 @@ M.build = { if not chunk or err then error(err) end - self:async(chunk) + chunk() else B.shell(self, build) end diff --git a/tests/manage/runner_spec.lua b/tests/manage/runner_spec.lua index ba940e2..2eb1ab1 100644 --- a/tests/manage/runner_spec.lua +++ b/tests/manage/runner_spec.lua @@ -30,12 +30,11 @@ describe("runner", function() end, } package.loaded["lazy.manage.task.test"]["async" .. i] = { + ---@async ---@param task LazyTask run = function(task) - task:async(function() - coroutine.yield() - table.insert(runs, { plugin = task.plugin.name, task = task.name }) - end) + coroutine.yield() + table.insert(runs, { plugin = task.plugin.name, task = task.name }) end, } end diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index 546bc34..11487c5 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -1,3 +1,4 @@ +---@module 'luassert' --# selene:allow(incorrect_standard_library_use) local Task = require("lazy.manage.task") @@ -20,12 +21,10 @@ describe("task", function() it("simple function", function() local task = Task.new(plugin, "test", function() end, opts) - assert(not task:has_started()) - assert(not task:is_running()) - task:start() + assert(task:has_started()) + assert(task:is_running()) task:wait() assert(not task:is_running()) - assert(task:is_done()) assert(task_result.done) end) @@ -33,11 +32,9 @@ describe("task", function() local task = Task.new(plugin, "test", function() error("test") end, opts) - assert(not task:has_started()) - assert(not task:is_running()) - task:start() + assert(task:has_started()) + assert(task:is_running()) task:wait() - assert(task:is_done()) assert(not task:is_running()) assert(task_result.done) assert(task_result.error) @@ -46,21 +43,17 @@ describe("task", function() it("async", function() local running = true - local task = Task.new(plugin, "test", function(task) - task:async(function() - coroutine.yield() - running = false - end) + ---@async + local task = Task.new(plugin, "test", function() + coroutine.yield() + running = false end, opts) - assert(not task:is_running()) - assert(not task:has_started()) - task:start() + assert(task:has_started()) + assert(task:is_running()) assert(running) assert(task:is_running()) - assert(not task:is_done()) task:wait() assert(not running) - assert(task:is_done()) assert(not task:is_running()) assert(task_result.done) assert(not task.error) @@ -70,8 +63,8 @@ describe("task", function() local task = Task.new(plugin, "spawn_errors", function(task) task:spawn("foobar") end, opts) - assert(not task:is_running()) - task:start() + assert(task:has_started()) + assert(task:is_running()) task:wait() assert(not task:is_running()) assert(task_result.done) @@ -82,13 +75,11 @@ describe("task", function() local task = Task.new(plugin, "test", function(task) task:spawn("echo", { args = { "foo" } }) end, opts) - assert(not task:is_running()) - assert(not task:has_started()) - task:start() + assert(task:has_started()) + assert(task:is_running()) assert(task:has_started()) assert(task:is_running()) task:wait() - assert(task:is_done()) assert.same(task.output, "foo\n") assert(task_result.done) assert(not task.error) @@ -99,8 +90,8 @@ describe("task", function() task:spawn("echo", { args = { "foo" } }) task:spawn("echo", { args = { "bar" } }) end, opts) - assert(not task:is_running()) - task:start() + assert(task:has_started()) + assert(task:is_running()) assert(task:is_running()) task:wait() assert(task.output == "foo\nbar\n" or task.output == "bar\nfoo\n", task.output) From 6c7ef7e27a797acd68f6bffcb90d58f03dd8431d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 18:31:31 +0200 Subject: [PATCH 1405/1610] refactor: logging --- lua/lazy/core/plugin.lua | 2 +- lua/lazy/manage/init.lua | 2 +- lua/lazy/manage/runner.lua | 2 +- lua/lazy/manage/task/git.lua | 27 +++++++---- lua/lazy/manage/task/init.lua | 82 ++++++++++++++++++++++----------- lua/lazy/manage/task/plugin.lua | 7 +-- lua/lazy/pkg/rockspec.lua | 6 +-- lua/lazy/view/colors.lua | 5 +- lua/lazy/view/render.lua | 68 +++++++++++++++------------ lua/lazy/view/sections.lua | 9 ++-- 10 files changed, 130 insertions(+), 80 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index a806b0a..a3cb497 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -403,7 +403,7 @@ end ---@param plugin LazyPlugin function M.has_errors(plugin) for _, task in ipairs(plugin._.tasks or {}) do - if task.error then + if task:has_errors() then return true end end diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 9737538..e0b2233 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -232,7 +232,7 @@ function M.clear(plugins) if plugin._.tasks then ---@param task LazyTask plugin._.tasks = vim.tbl_filter(function(task) - return task:is_running() or task.error + return task:is_running() or task:has_errors() end, plugin._.tasks) end end diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 31b194b..e517ddc 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -96,7 +96,7 @@ function Runner:_start() wait_step = s.step elseif not running then local plugin = self:plugin(name) - if s.task and s.task.error then + if s.task and s.task:has_errors() then active = active - 1 elseif s.step == #self._pipeline then s.task = nil diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 56d2b73..4bd7134 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -18,6 +18,7 @@ M.log = { local stat = vim.uv.fs_stat(plugin.dir .. "/.git") return not (stat and stat.type == "directory") end, + ---@async ---@param opts {args?: string[], updated?:boolean, check?:boolean} run = function(self, opts) local args = { @@ -68,6 +69,7 @@ M.clone = { skip = function(plugin) return plugin._.installed or plugin._.is_local end, + ---@async run = function(self) local args = { "clone", @@ -129,6 +131,7 @@ M.branch = { local branch = assert(Git.get_branch(plugin)) return Git.get_commit(plugin.dir, branch, true) end, + ---@async run = function(self) local args = { "remote", @@ -154,14 +157,17 @@ M.origin = { local origin = Git.get_origin(plugin.dir) return origin == plugin.url end, + ---@async ---@param opts {check?:boolean} run = function(self, opts) if opts.check then local origin = Git.get_origin(self.plugin.dir) - self.error = "Origin has changed:\n" - self.error = self.error .. " * old: " .. origin .. "\n" - self.error = self.error .. " * new: " .. self.plugin.url .. "\n" - self.error = self.error .. "Please run update to fix" + self:error({ + "Origin has changed:", + " * old: " .. origin, + " * new: " .. self.plugin.url, + "Please run update to fix", + }) return end require("lazy.manage.task.fs").clean.run(self, opts) @@ -173,6 +179,7 @@ M.status = { skip = function(plugin) return not plugin._.installed or plugin._.is_local end, + ---@async run = function(self) self:spawn("git", { args = { "ls-files", "-d", "-m" }, @@ -180,6 +187,7 @@ M.status = { on_exit = function(ok, output) if ok then local lines = vim.split(output, "\n") + ---@type string[] lines = vim.tbl_filter(function(line) -- Fix doc/tags being marked as modified if line:gsub("[\\/]", "/") == "doc/tags" then @@ -190,12 +198,13 @@ M.status = { return line ~= "" end, lines) if #lines > 0 then - self.error = "You have local changes in `" .. self.plugin.dir .. "`:\n" + local msg = { "You have local changes in `" .. self.plugin.dir .. "`:" } for _, line in ipairs(lines) do - self.error = self.error .. " * " .. line .. "\n" + msg[#msg + 1] = " * " .. line end - self.error = self.error .. "Please remove them to update.\n" - self.error = self.error .. "You can also press `x` to remove the plugin and then `I` to install it again." + msg[#msg + 1] = "Please remove them to update." + msg[#msg + 1] = "You can also press `x` to remove the plugin and then `I` to install it again." + self:error(msg) end end end, @@ -209,6 +218,7 @@ M.fetch = { return not plugin._.installed or plugin._.is_local end, + ---@async run = function(self) local args = { "fetch", @@ -236,6 +246,7 @@ M.checkout = { return not plugin._.installed or plugin._.is_local end, + ---@async ---@param opts {lockfile?:boolean} run = function(self, opts) local info = assert(Git.info(self.plugin.dir)) diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 98c7636..496dac9 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -3,21 +3,23 @@ local Process = require("lazy.manage.process") ---@class LazyTaskDef ---@field skip? fun(plugin:LazyPlugin, opts?:TaskOptions):any? ----@field run fun(task:LazyTask, opts:TaskOptions) +---@field run async fun(task:LazyTask, opts:TaskOptions) ---@alias LazyTaskFn async fun(task:LazyTask, opts:TaskOptions) +---@class LazyMsg +---@field msg string +---@field level? number + ---@class LazyTask ---@field plugin LazyPlugin ---@field name string ----@field output string ----@field status string ----@field error? string ----@field warn? string +---@field private _log LazyMsg[] ---@field private _started? number ---@field private _ended? number ---@field private _opts TaskOptions ---@field private _running Async +---@field private _level number local Task = {} ---@class TaskOptions: {[string]:any} @@ -30,10 +32,10 @@ local Task = {} function Task.new(plugin, name, task, opts) local self = setmetatable({}, { __index = Task }) self._opts = opts or {} + self._log = {} + self._level = vim.log.levels.TRACE self.plugin = plugin self.name = name - self.output = "" - self.status = "" ---@param other LazyTask plugin._.tasks = vim.tbl_filter(function(other) return other.name ~= name or other:is_running() @@ -43,6 +45,31 @@ function Task.new(plugin, name, task, opts) return self end +---@param level? number +---@return LazyMsg[] +function Task:get_log(level) + level = level or vim.log.levels.DEBUG + return vim.tbl_filter(function(msg) + return msg.level >= level + end, self._log) +end + +---@param level? number +function Task:output(level) + return table.concat( + ---@param m LazyMsg + vim.tbl_map(function(m) + return m.msg + end, self:get_log(level)), + "\n" + ) +end + +function Task:status() + local ret = self._log[#self._log] + return ret and ret.msg or "" +end + function Task:has_started() return self._started ~= nil end @@ -55,6 +82,14 @@ function Task:is_running() return not self:has_ended() end +function Task:has_errors() + return self._level >= vim.log.levels.ERROR +end + +function Task:has_warnings() + return self._level >= vim.log.levels.WARN +end + ---@private ---@param task LazyTaskFn function Task:_start(task) @@ -70,36 +105,33 @@ function Task:_start(task) self:_done() end, on_error = function(err) - self:notify_error(err) + self:error(err) end, on_yield = function(res) - self:notify(res) + self:log(res) end, }) end ---@param msg string|string[] ----@param severity? vim.diagnostic.Severity -function Task:notify(msg, severity) - local var = severity == vim.diagnostic.severity.ERROR and "error" - or severity == vim.diagnostic.severity.WARN and "warn" - or "output" +---@param level? number +function Task:log(msg, level) + level = level or vim.log.levels.DEBUG + self._level = math.max(self._level or 0, level or 0) msg = type(msg) == "table" and table.concat(msg, "\n") or msg ---@cast msg string - ---@diagnostic disable-next-line: no-unknown - self[var] = self[var] and (self[var] .. "\n" .. msg) or msg - self.status = msg + table.insert(self._log, { msg = msg, level = level }) vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) end ---@param msg string|string[] -function Task:notify_error(msg) - self:notify(msg, vim.diagnostic.severity.ERROR) +function Task:error(msg) + self:log(msg, vim.log.levels.ERROR) end ---@param msg string|string[] -function Task:notify_warn(msg) - self:notify(msg, vim.diagnostic.severity.WARN) +function Task:warn(msg) + self:log(msg, vim.log.levels.WARN) end ---@private @@ -141,20 +173,16 @@ function Task:spawn(cmd, opts) local on_exit = opts.on_exit function opts.on_line(line) - self.status = line + self:log(line, vim.log.levels.TRACE) if on_line then pcall(on_line, line) end - vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) end local running = true ---@param output string function opts.on_exit(ok, output) - self.output = self.output .. output - if not ok then - self.error = self.error and (self.error .. "\n" .. output) or output - end + self:log(output, ok and vim.log.levels.DEBUG or vim.log.levels.ERROR) if on_exit then pcall(on_exit, ok, output) end diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index ddf53a1..fd6c12b 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -1,4 +1,3 @@ -local Config = require("lazy.core.config") local Loader = require("lazy.core.loader") local Rocks = require("lazy.pkg.rockspec") local Util = require("lazy.util") @@ -21,9 +20,10 @@ local B = {} ---@param build string function B.cmd(task, build) local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) --[[@as vim.api.keyset.cmd]] - task.output = vim.api.nvim_cmd(cmd, { output = true }) + task:log(vim.api.nvim_cmd(cmd, { output = true })) end +---@async ---@param task LazyTask ---@param build string function B.shell(task, build) @@ -44,6 +44,7 @@ M.build = { end return not ((plugin._.dirty or plugin._.build) and (plugin.build or get_build_file(plugin))) end, + ---@async run = function(self) vim.cmd([[silent! runtime plugin/rplugin.vim]]) @@ -92,7 +93,7 @@ M.docs = { run = function(self) local docs = self.plugin.dir .. "/doc/" if Util.file_exists(docs) then - self.output = vim.api.nvim_cmd({ cmd = "helptags", args = { docs } }, { output = true }) + self:log(vim.api.nvim_cmd({ cmd = "helptags", args = { docs } }, { output = true })) end end, } diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 2eca5bd..04ff937 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -106,15 +106,15 @@ function M.build(task) if not M.check({ error = function(msg) - task:notify_error(msg:gsub("[{}]", "`")) + task:error(msg:gsub("[{}]", "`")) end, warn = function(msg) - task:notify_warn(msg) + task:warn(msg) end, ok = function(msg) end, }) then - task:notify_warn({ + task:log({ "", "This plugin requires `luarocks`. Try one of the following:", " - fix your `luarocks` installation", diff --git a/lua/lazy/view/colors.lua b/lua/lazy/view/colors.lua index e55c56b..c1dbe50 100644 --- a/lua/lazy/view/colors.lua +++ b/lua/lazy/view/colors.lua @@ -30,8 +30,9 @@ M.colors = { Button = "CursorLine", ButtonActive = "Visual", TaskOutput = "MsgArea", -- task output - TaskError = "ErrorMsg", -- task errors - TaskWarning = "WarningMsg", -- task errors + Error = "DiagnosticError", -- task errors + Warning = "DiagnosticWarn", -- task errors + Info = "DiagnosticInfo", -- task errors Dir = "@markup.link", -- directory Url = "@markup.link", -- url Bold = { bold = true }, diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index a2c33c1..00ebd8f 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -354,6 +354,31 @@ end ---@param plugin LazyPlugin function M:diagnostics(plugin) + local skip = false + for _, task in ipairs(plugin._.tasks or {}) do + if task:is_running() then + self:diagnostic({ + severity = vim.diagnostic.severity.WARN, + message = task.name .. (task:status() and (": " .. task:status()) or ""), + }) + skip = true + elseif task:has_errors() then + self:diagnostic({ + message = task.name .. " failed", + severity = vim.diagnostic.severity.ERROR, + }) + skip = true + elseif task:has_warnings() then + self:diagnostic({ + message = task.name .. " warning", + severity = vim.diagnostic.severity.WARN, + }) + skip = true + end + end + if skip then + return + end if plugin._.updated then if plugin._.updated.from == plugin._.updated.to then self:diagnostic({ @@ -383,24 +408,6 @@ function M:diagnostics(plugin) }) end end - for _, task in ipairs(plugin._.tasks or {}) do - if task:is_running() then - self:diagnostic({ - severity = vim.diagnostic.severity.WARN, - message = task.name .. (task.status == "" and "" or (": " .. task.status)), - }) - elseif task.error then - self:diagnostic({ - message = task.name .. " failed", - severity = vim.diagnostic.severity.ERROR, - }) - elseif task.warn then - self:diagnostic({ - message = task.name .. " warning", - severity = vim.diagnostic.severity.WARN, - }) - end - end end ---@param plugin LazyPlugin @@ -463,24 +470,27 @@ function M:tasks(plugin) self:append(" " .. math.floor((task:time()) * 100) / 100 .. "ms", "Bold") self:nl() end - if task.error then - self:markdown(task.error, "LazyTaskError", { indent = 6 }) - end - if task.warn then - self:markdown(task.warn, "LazyTaskWarning", { indent = 6 }) - end - if not task.error and not task.warn and task.name == "log" then + + if not task:has_warnings() and task.name == "log" then self:log(task) - end - if (self.view:is_selected(plugin) or (task.error or task.warn)) and task.output ~= task.error then - self:markdown(vim.trim(task.output), "LazyTaskOutput", { indent = 6 }) + else + local hls = { + [vim.log.levels.ERROR] = "LazyError", + [vim.log.levels.WARN] = "LazyWarning", + [vim.log.levels.INFO] = "LazyInfo", + } + for _, msg in ipairs(task:get_log()) do + if task:has_warnings() or self.view:is_selected(plugin) then + self:markdown(msg.msg, hls[msg.level] or "LazyTaskOutput", { indent = 6 }) + end + end end end end ---@param task LazyTask function M:log(task) - local log = vim.trim(task.output) + local log = vim.trim(task:output()) if log ~= "" then local lines = vim.split(log, "\n") for _, line in ipairs(lines) do diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index 5dfb57e..e2892a2 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -17,7 +17,7 @@ return { { filter = function(plugin) return has_task(plugin, function(task) - return task.error ~= nil + return task:has_errors() end) end, title = "Failed", @@ -39,8 +39,7 @@ return { if task.name ~= "log" then return end - local lines = vim.split(task.output, "\n") - for _, line in ipairs(lines) do + for _, line in ipairs(vim.split(task:output(), "\n")) do if line:find("^%w+ %S+!:") then return true end @@ -71,7 +70,7 @@ return { { filter = function(plugin) return has_task(plugin, function(task) - return task.name == "log" and vim.trim(task.output) ~= "" + return task.name == "log" and vim.trim(task:output()) ~= "" end) end, title = "Log", @@ -89,7 +88,7 @@ return { title = "Not Installed", }, { - filter = function (plugin) + filter = function(plugin) return plugin._.outdated end, title = "Outdated", From 206d2080189e44c536d107f15c2ba2dc6fc1b6ea Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 18:42:52 +0200 Subject: [PATCH 1406/1610] test: fix tests --- lua/lazy/manage/runner.lua | 15 ++++++++------- lua/lazy/manage/task/init.lua | 2 +- tests/manage/task_spec.lua | 14 +++++++------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index e517ddc..0b0e5c4 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -81,7 +81,7 @@ function Runner:_start() ---@param resume? boolean local function continue(resume) - active = #names + active = 0 waiting = 0 wait_step = nil for _, name in ipairs(names) do @@ -90,19 +90,18 @@ function Runner:_start() local running = s.task and s.task:is_running() local step = self._pipeline[s.step] - if step and step.task == "wait" and not resume then + if s.task and s.task:has_errors() then + local ignore = true + elseif step and step.task == "wait" and not resume then waiting = waiting + 1 - active = active - 1 wait_step = s.step elseif not running then local plugin = self:plugin(name) - if s.task and s.task:has_errors() then - active = active - 1 - elseif s.step == #self._pipeline then + if s.step == #self._pipeline then s.task = nil - active = active - 1 plugin._.working = false elseif s.step < #self._pipeline then + active = active + 1 s.step = s.step + 1 step = self._pipeline[s.step] if step.task == "wait" then @@ -112,6 +111,8 @@ function Runner:_start() plugin._.working = not not s.task end end + else + active = active + 1 end end end diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 496dac9..8c5f83f 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -182,7 +182,7 @@ function Task:spawn(cmd, opts) local running = true ---@param output string function opts.on_exit(ok, output) - self:log(output, ok and vim.log.levels.DEBUG or vim.log.levels.ERROR) + self:log(vim.trim(output), ok and vim.log.levels.DEBUG or vim.log.levels.ERROR) if on_exit then pcall(on_exit, ok, output) end diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index 11487c5..adb01e8 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -38,7 +38,7 @@ describe("task", function() assert(not task:is_running()) assert(task_result.done) assert(task_result.error) - assert(task.error and task.error:find("test")) + assert(task:has_errors() and task:output(vim.log.levels.ERROR):find("test")) end) it("async", function() @@ -56,7 +56,7 @@ describe("task", function() assert(not running) assert(not task:is_running()) assert(task_result.done) - assert(not task.error) + assert(not task:has_errors()) end) it("spawn errors", function() @@ -68,7 +68,7 @@ describe("task", function() task:wait() assert(not task:is_running()) assert(task_result.done) - assert(task.error and task.error:find("Failed to spawn"), task.output) + assert(task:has_errors() and task:output(vim.log.levels.ERROR):find("Failed to spawn"), task.output) end) it("spawn", function() @@ -80,9 +80,9 @@ describe("task", function() assert(task:has_started()) assert(task:is_running()) task:wait() - assert.same(task.output, "foo\n") + assert.same(task:output(), "foo") assert(task_result.done) - assert(not task.error) + assert(not task:has_errors()) end) it("spawn 2x", function() @@ -94,8 +94,8 @@ describe("task", function() assert(task:is_running()) assert(task:is_running()) task:wait() - assert(task.output == "foo\nbar\n" or task.output == "bar\nfoo\n", task.output) + assert(task:output() == "foo\nbar" or task:output() == "bar\nfoo", task:output()) assert(task_result.done) - assert(not task.error) + assert(not task:has_errors()) end) end) From 56075b57c421fc5e751c1da7a7f1bf18ec1499a7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 18:45:40 +0200 Subject: [PATCH 1407/1610] fix(runner): bring concurrency back --- lua/lazy/manage/runner.lua | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 0b0e5c4..eac6b3e 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -96,19 +96,21 @@ function Runner:_start() waiting = waiting + 1 wait_step = s.step elseif not running then - local plugin = self:plugin(name) - if s.step == #self._pipeline then - s.task = nil - plugin._.working = false - elseif s.step < #self._pipeline then - active = active + 1 - s.step = s.step + 1 - step = self._pipeline[s.step] - if step.task == "wait" then + if not self._opts.concurrency or active < self._opts.concurrency then + local plugin = self:plugin(name) + if s.step == #self._pipeline then + s.task = nil plugin._.working = false - else - s.task = self:queue(plugin, step) - plugin._.working = not not s.task + elseif s.step < #self._pipeline then + active = active + 1 + s.step = s.step + 1 + step = self._pipeline[s.step] + if step.task == "wait" then + plugin._.working = false + else + s.task = self:queue(plugin, step) + plugin._.working = not not s.task + end end end else From 20af3fcc4ef2fef0cb4021543c70410567fcf9aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 18:47:38 +0200 Subject: [PATCH 1408/1610] chore(main): release 11.4.2 (#1558) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 18 ++++++++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 8aab173..6d1ef85 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.4.1" + ".": "11.4.2" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 741e766..e54cefe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## [11.4.2](https://github.com/folke/lazy.nvim/compare/v11.4.1...v11.4.2) (2024-06-26) + + +### Bug Fixes + +* **config:** dont start checker/change_detection when running headless ([2aa8e06](https://github.com/folke/lazy.nvim/commit/2aa8e061f22579b0cabc74f05a90f7344d92195c)) +* **git:** fetch commit from origin or local to check if branch was changed. See [#1549](https://github.com/folke/lazy.nvim/issues/1549) ([28e435b](https://github.com/folke/lazy.nvim/commit/28e435b7f34eecd8b90bc87ac71c70b79fcb03b3)) +* **rocks:** build.type instead of build.build_type ([aa1c957](https://github.com/folke/lazy.nvim/commit/aa1c9572aa1916e582f9b9c3d43e272b4f23b326)) +* **rockspec:** dont lazy-load rock deps ([4733611](https://github.com/folke/lazy.nvim/commit/473361139cc05936cd5afb08ab68e5bee1ebb5b3)) +* **runner:** bring concurrency back ([56075b5](https://github.com/folke/lazy.nvim/commit/56075b57c421fc5e751c1da7a7f1bf18ec1499a7)) +* **ui:** don't show output when it's the same as error ([e79805d](https://github.com/folke/lazy.nvim/commit/e79805d706f815a62467260cb307844c368c3dba)) + + +### Performance Improvements + +* tasks are now fully async ([0614ca6](https://github.com/folke/lazy.nvim/commit/0614ca6ca629704cb1846c0d6f9a250b526900b9)) +* **util:** improve impl of throttle ([3695215](https://github.com/folke/lazy.nvim/commit/36952153ecb5b196c74e2d9a28eb0e01a9eb02fe)) + ## [11.4.1](https://github.com/folke/lazy.nvim/compare/v11.4.0...v11.4.1) (2024-06-25) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 73e0970..a6d3c3a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -197,7 +197,7 @@ M.defaults = { debug = false, } -M.version = "11.4.1" -- x-release-please-version +M.version = "11.4.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 804cae0a65ade8b1638eb1ccb537c2ff793459ce Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 19:38:45 +0200 Subject: [PATCH 1409/1610] refactor: hererocks check --- lua/lazy/core/plugin.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index a3cb497..84660e6 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -264,10 +264,8 @@ function M.update_rocks_state() end) for _, plugin in pairs(Config.plugins) do - if plugin.build == "rockspec" then + if plugin.build == "rockspec" or plugin.name == "hererocks" then plugin._.build = not installed[plugin.name] - elseif plugin.name == "hererocks" then - plugin._.build = not vim.uv.fs_stat(Config.options.rocks.root .. "/hererocks") end end end From 97f4df0824da13b2b0d065f0dc43c49862581a01 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 19:39:08 +0200 Subject: [PATCH 1410/1610] fix(runner): only use Config.plugins when updated. Fixes #1560 --- lua/lazy/manage/init.lua | 8 ++++++-- lua/lazy/manage/runner.lua | 9 ++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index e0b2233..9818764 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -85,9 +85,11 @@ function M.install(opts) "plugin.docs", { "wait", - sync = function() + ---@param runner Runner + sync = function(runner) require("lazy.pkg").update() Plugin.load() + runner:update() end, }, "plugin.build", @@ -114,9 +116,11 @@ function M.update(opts) "plugin.docs", { "wait", - sync = function() + ---@param runner Runner + sync = function(runner) require("lazy.pkg").update() Plugin.load() + runner:update() end, }, "plugin.build", diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index eac6b3e..8828412 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -49,7 +49,14 @@ function Runner.new(opts) end function Runner:plugin(name) - return Config.plugins[name] or self._plugins[name] + return self._plugins[name] +end + +--- Update plugins +function Runner:update() + for name in pairs(self._plugins) do + self._plugins[name] = Config.plugins[name] or self._plugins[name] + end end function Runner:start() From 66a4170f0e9ab238972f73a268582cf65026a017 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 19:58:45 +0200 Subject: [PATCH 1411/1610] fix(runner): properly do concurrency --- lua/lazy/manage/runner.lua | 58 +++++++++++++++++++++++------------- tests/manage/runner_spec.lua | 2 +- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 8828412..66d5f9c 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -91,37 +91,53 @@ function Runner:_start() active = 0 waiting = 0 wait_step = nil + local next = {} ---@type string[] + + -- check running tasks for _, name in ipairs(names) do state[name] = state[name] or { step = 0 } local s = state[name] - local running = s.task and s.task:is_running() + local is_running = s.task and s.task:is_running() local step = self._pipeline[s.step] + -- selene:allow(empty_if) if s.task and s.task:has_errors() then - local ignore = true + -- don't continue tasks if there are errors elseif step and step.task == "wait" and not resume then + -- waiting for sync waiting = waiting + 1 wait_step = s.step - elseif not running then - if not self._opts.concurrency or active < self._opts.concurrency then - local plugin = self:plugin(name) - if s.step == #self._pipeline then - s.task = nil - plugin._.working = false - elseif s.step < #self._pipeline then - active = active + 1 - s.step = s.step + 1 - step = self._pipeline[s.step] - if step.task == "wait" then - plugin._.working = false - else - s.task = self:queue(plugin, step) - plugin._.working = not not s.task - end - end - end - else + elseif is_running then + -- still running active = active + 1 + else + next[#next + 1] = name + end + end + + -- schedule next tasks + for _, name in ipairs(next) do + if self._opts.concurrency and active >= self._opts.concurrency then + break + end + local s = state[name] + local plugin = self:plugin(name) + if s.step == #self._pipeline then + -- done + s.task = nil + plugin._.working = false + elseif s.step < #self._pipeline then + -- next + s.step = s.step + 1 + local step = self._pipeline[s.step] + if step.task == "wait" then + plugin._.working = false + waiting = waiting + 1 + else + s.task = self:queue(plugin, step) + plugin._.working = not not s.task + active = active + 1 + end end end end diff --git a/tests/manage/runner_spec.lua b/tests/manage/runner_spec.lua index 2eb1ab1..925aaf1 100644 --- a/tests/manage/runner_spec.lua +++ b/tests/manage/runner_spec.lua @@ -64,7 +64,7 @@ describe("runner", function() local runner = Runner.new({ plugins = plugins, pipeline = { "test.test1", "test.skip", "test.test2" } }) runner:start() runner:wait() - assert.equal(4, #runs) + assert.equal(4, #runs, runs) end) it("handles opts", function() From 93b3a77286c4212850e21a6b3e31d328b5a86df4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 20:17:32 +0200 Subject: [PATCH 1412/1610] fix(runner): wait_step --- lua/lazy/manage/runner.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 66d5f9c..2d707c2 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -133,6 +133,7 @@ function Runner:_start() if step.task == "wait" then plugin._.working = false waiting = waiting + 1 + wait_step = s.step else s.task = self:queue(plugin, step) plugin._.working = not not s.task From a0a51c06c2fcddda925667142516c89777eb0c8e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 21:38:28 +0200 Subject: [PATCH 1413/1610] feat: added `opts.headless` to control ansi output when running headless --- lua/lazy/core/config.lua | 11 ++++++ lua/lazy/manage/process.lua | 6 +++ lua/lazy/manage/task/init.lua | 59 ++++++++++++++++++++++++++++- lua/lazy/terminal.lua | 71 +++++++++++++++++++++++++++++++++++ tests/busted.lua | 16 ++++---- 5 files changed, 153 insertions(+), 10 deletions(-) create mode 100644 lua/lazy/terminal.lua diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index a6d3c3a..89a89bd 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -130,6 +130,17 @@ M.defaults = { }, }, }, + -- 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 <d> can be one of: -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 5bb2716..7c568cb 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -48,6 +48,7 @@ local uv = vim.uv ---@field cwd? string ---@field on_line? fun(string) ---@field on_exit? fun(ok:boolean, output:string) +---@field on_data? fun(string) ---@field timeout? number ---@field env? table<string,string> @@ -145,6 +146,11 @@ function M.spawn(cmd, opts) assert(not err, err) if data then + if opts.on_data then + vim.schedule(function() + opts.on_data(data) + end) + end output = output .. data:gsub("\r\n", "\n") local lines = vim.split(vim.trim(output:gsub("\r$", "")):gsub("[^\n\r]+\r", ""), "\n") diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 8c5f83f..d561151 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -1,5 +1,9 @@ local Async = require("lazy.async") +local Config = require("lazy.core.config") local Process = require("lazy.manage.process") +local Terminal = require("lazy.terminal") + +local colors = Config.options.headless.colors ---@class LazyTaskDef ---@field skip? fun(plugin:LazyPlugin, opts?:TaskOptions):any? @@ -96,6 +100,10 @@ function Task:_start(task) assert(not self:has_started(), "task already started") assert(not self:has_ended(), "task already done") + if Config.headless() and Config.options.headless.task then + self:log("Running task " .. self.name, vim.log.levels.INFO) + end + self._started = vim.uv.hrtime() ---@async self._running = Async.run(function() @@ -122,6 +130,27 @@ function Task:log(msg, level) ---@cast msg string table.insert(self._log, { msg = msg, level = level }) vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) + if Config.headless() then + self:headless() + end +end + +function Task:headless() + if not Config.options.headless.log then + return + end + local msg = self._log[#self._log] + if not msg or msg.level == vim.log.levels.TRACE then + return + end + local map = { + [vim.log.levels.ERROR] = Terminal.red, + [vim.log.levels.WARN] = Terminal.yellow, + [vim.log.levels.INFO] = Terminal.blue, + } + local color = Config.options.headless.colors and map[msg.level] + io.write(Terminal.prefix(color and color(msg.msg) or msg.msg, self:prefix())) + io.write("\n") end ---@param msg string|string[] @@ -143,6 +172,10 @@ function Task:_done() return end + if Config.headless() and Config.options.headless.task then + local ms = math.floor(self:time() + 0.5) + self:log("Finished task " .. self.name .. " in " .. ms .. "ms", vim.log.levels.INFO) + end self._ended = vim.uv.hrtime() if self._opts.on_done then self._opts.on_done(self) @@ -172,8 +205,12 @@ function Task:spawn(cmd, opts) local on_line = opts.on_line local on_exit = opts.on_exit + local headless = Config.headless() and Config.options.headless.process + function opts.on_line(line) - self:log(line, vim.log.levels.TRACE) + if not headless then + return self:log(line, vim.log.levels.TRACE) + end if on_line then pcall(on_line, line) end @@ -182,18 +219,36 @@ function Task:spawn(cmd, opts) local running = true ---@param output string function opts.on_exit(ok, output) - self:log(vim.trim(output), ok and vim.log.levels.DEBUG or vim.log.levels.ERROR) + if not headless then + self:log(vim.trim(output), ok and vim.log.levels.DEBUG or vim.log.levels.ERROR) + end if on_exit then pcall(on_exit, ok, output) end running = false end + + if headless then + opts.on_data = function(data) + -- prefix with plugin name + local prefix = self:prefix() + io.write(Terminal.prefix(data, prefix)) + end + end Process.spawn(cmd, opts) while running do coroutine.yield() end end +function Task:prefix() + local plugin = "[" .. self.plugin.name .. "] " + local task = string.rep(" ", 20 - #(self.name .. self.plugin.name)) .. self.name + + return colors and Terminal.magenta(plugin) .. Terminal.cyan(task) .. Terminal.bright_black(" | ") + or plugin .. " " .. task .. " | " +end + function Task:wait() while self:is_running() do vim.wait(10) diff --git a/lua/lazy/terminal.lua b/lua/lazy/terminal.lua new file mode 100644 index 0000000..a1bcb84 --- /dev/null +++ b/lua/lazy/terminal.lua @@ -0,0 +1,71 @@ +---@class Ansi: table<string, fun(string):string> +local M = {} + +M.colors = { + reset = "\27[0m", + black = "\27[30m", + red = "\27[31m", + green = "\27[32m", + yellow = "\27[33m", + blue = "\27[34m", + magenta = "\27[35m", + cyan = "\27[36m", + white = "\27[37m", + bright_black = "\27[90m", + bright_red = "\27[91m", + bright_green = "\27[92m", + bright_yellow = "\27[93m", + bright_blue = "\27[94m", + bright_magenta = "\27[95m", + bright_cyan = "\27[96m", + bright_white = "\27[97m", +} + +function M.color(text, color) + return M.colors[color] .. text .. M.colors.reset +end + +-- stylua: ignore start +function M.black(text) return M.color(text, "black") end +function M.red(text) return M.color(text, "red") end +function M.green(text) return M.color(text, "green") end +function M.yellow(text) return M.color(text, "yellow") end +function M.blue(text) return M.color(text, "blue") end +function M.magenta(text) return M.color(text, "magenta") end +function M.cyan(text) return M.color(text, "cyan") end +function M.white(text) return M.color(text, "white") end +function M.bright_black(text) return M.color(text, "bright_black") end +function M.bright_red(text) return M.color(text, "bright_red") end +function M.bright_green(text) return M.color(text, "bright_green") end +function M.bright_yellow(text) return M.color(text, "bright_yellow") end +function M.bright_blue(text) return M.color(text, "bright_blue") end +function M.bright_magenta(text) return M.color(text, "bright_magenta") end +function M.bright_cyan(text) return M.color(text, "bright_cyan") end +function M.bright_white(text) return M.color(text, "bright_white") end +-- stylua: ignore end + +---@param data string +---@param prefix string +function M.prefix(data, prefix) + -- Normalize Windows-style newlines to simple newlines + data = data:gsub("\r\n", "\n") + + -- Handle prefix for the first line, if data starts immediately + data = prefix .. data + + -- Prefix new lines ensuring not to double prefix if a line starts with \r + data = data:gsub("(\n)([^\r])", "%1" .. prefix .. "%2") + + -- Handle carriage returns properly to avoid double prefixing + -- Replace any \r not followed by \n with \r, then add a prefix only if the following character isn't the start of our prefix + data = data:gsub("\r([^\n])", function(nextChar) + if nextChar:sub(1, #prefix) == prefix then + return "\r" .. nextChar + else + return "\r" .. prefix .. nextChar + end + end) + return data +end + +return M diff --git a/tests/busted.lua b/tests/busted.lua index 146ab96..8fd4f28 100755 --- a/tests/busted.lua +++ b/tests/busted.lua @@ -6,22 +6,22 @@ for _, name in ipairs({ "config", "data", "state", "cache" }) do vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name end --- -- 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" --- vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) --- end --- vim.opt.rtp:prepend(lazypath) vim.opt.rtp:prepend(".") vim.o.loadplugins = true -- enable since nvim -l disables plugins -- Setup lazy.nvim require("lazy").setup({ - "lunarmodules/busted", -- add busted + spec = { + "lunarmodules/busted", -- add busted + }, + rocks = { hererocks = true }, }) +local Config = require("lazy.core.config") +-- disable termnial output for the tests +Config.options.headless = {} + -- run busted return pcall(require("busted.runner"), { standalone = false, From 249902ab3194226efec0dbc3e000e758c43b4714 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 22:44:57 +0200 Subject: [PATCH 1414/1610] fix(ui): diagnostics without status --- lua/lazy/manage/task/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index d561151..6693adc 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -71,7 +71,8 @@ end function Task:status() local ret = self._log[#self._log] - return ret and ret.msg or "" + local msg = ret and vim.trim(ret.msg) or "" + return msg ~= "" and msg or nil end function Task:has_started() From 591ded8309e45806ae3fb58b7b68fe58785a3ada Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 26 Jun 2024 22:45:21 +0200 Subject: [PATCH 1415/1610] feat(ui): keep cursor position when rendering view --- lua/lazy/manage/runner.lua | 2 +- lua/lazy/view/init.lua | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 2d707c2..6a01609 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -136,7 +136,7 @@ function Runner:_start() wait_step = s.step else s.task = self:queue(plugin, step) - plugin._.working = not not s.task + plugin._.working = true active = active + 1 end end diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 5702531..c531927 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -146,7 +146,11 @@ end function M:update() if self.buf and vim.api.nvim_buf_is_valid(self.buf) then vim.bo[self.buf].modifiable = true + local view = vim.api.nvim_win_call(self.view.win, vim.fn.winsaveview) self.render:update() + vim.api.nvim_win_call(self.view.win, function() + vim.fn.winrestview(view) + end) vim.bo[self.buf].modifiable = false vim.cmd.redraw() end From 24a86d5ca4652a77f0f2c78dd7c693a3c369ab68 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 09:48:37 +0200 Subject: [PATCH 1416/1610] fix(pkg): only show pkg changed when effectively changing a pkg file. Fixes #1567 --- lua/lazy/core/config.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 89a89bd..d5c21b0 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -311,11 +311,10 @@ function M.setup(opts) vim.api.nvim_create_autocmd("BufWritePost", { pattern = { "lazy.lua", "pkg.json", "*.rockspec" }, callback = function() - require("lazy").pkg({ - plugins = { - require("lazy.core.plugin").find(vim.uv.cwd() .. "/lua/"), - }, - }) + local plugin = require("lazy.core.plugin").find(vim.uv.cwd() .. "/lua/") + if plugin then + require("lazy").pkg({ plugins = { plugin } }) + end end, }) end, From 6a423278a10ff7b1a76795275111d01632851c48 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 10:21:54 +0200 Subject: [PATCH 1417/1610] fix(meta): resolve deps from meta instead of fragments. Fixes #1566 --- lua/lazy/core/meta.lua | 5 +- tests/core/plugin_spec.lua | 99 ++++++++++++++++++++++++++++---------- 2 files changed, 77 insertions(+), 27 deletions(-) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 52b0549..6e781a0 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -198,7 +198,10 @@ function M:_rebuild(name) -- dependencies for _, dep in ipairs(fragment.deps or {}) do - table.insert(plugin.dependencies, self.fragments:get(dep).name) + local dep_meta = self.frag_to_meta[dep] + if dep_meta then + table.insert(plugin.dependencies, dep_meta.name) + end end end end diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 87cea77..d810339 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -8,20 +8,27 @@ local function inspect(obj) return vim.inspect(obj):gsub("%s+", " ") end ----@param plugins LazyPlugin[]|LazyPlugin +---@param plugin LazyPlugin +local function resolve(plugin) + local meta = getmetatable(plugin) + local ret = meta and type(meta.__index) == "table" and resolve(meta.__index) or {} + for k, v in pairs(plugin) do + ret[k] = v + end + return ret +end + +---@param plugins LazyPlugin[] local function clean(plugins) - local p = plugins - plugins = type(plugins) == "table" and plugins or { plugins } - for _, plugin in pairs(plugins) do - plugin._.fid = nil - plugin._.fpid = nil - plugin._.fdeps = nil + return vim.tbl_map(function(plugin) + plugin = resolve(plugin) + plugin[1] = nil plugin._.frags = nil if plugin._.dep == false then plugin._.dep = nil end - end - return p + return plugin + end, plugins) end describe("plugin spec url/name", function() @@ -168,14 +175,12 @@ describe("plugin spec opt", function() end assert.same({ bar = { - "foo/bar", _ = {}, dependencies = { "dep1", "dep2" }, name = "bar", url = "https://github.com/foo/bar.git", }, dep1 = { - "foo/dep1", _ = { dep = true, }, @@ -183,7 +188,6 @@ describe("plugin spec opt", function() url = "https://github.com/foo/dep1.git", }, dep2 = { - "foo/dep2", _ = { dep = true, }, @@ -198,13 +202,13 @@ describe("plugin spec opt", function() before_each(function() Handler.init() end) - it("handles dep names", function() - Config.options.defaults.lazy = false - local tests = { - { { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } }, "foo/dep1" }, - { "foo/dep1", { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } } }, - } - for _, test in ipairs(tests) do + Config.options.defaults.lazy = false + local tests = { + { { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } }, "foo/dep1" }, + { "foo/dep1", { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } } }, + } + for _, test in ipairs(tests) do + it("handles dep names " .. inspect(test), function() local spec = Plugin.Spec.new(vim.deepcopy(test)) assert(#spec.notifs == 0) Config.plugins = spec.plugins @@ -213,31 +217,74 @@ describe("plugin spec opt", function() for _, plugin in pairs(spec.plugins) do plugin.dir = nil end - assert.same(clean(spec.plugins), { + assert.same({ bar = { - "foo/bar", _ = {}, dependencies = { "dep1", "dep2" }, name = "bar", url = "https://github.com/foo/bar.git", }, dep1 = { - "foo/dep1", _ = {}, name = "dep1", url = "https://github.com/foo/dep1.git", }, dep2 = { - "foo/dep2", _ = { dep = true, }, name = "dep2", url = "https://github.com/foo/dep2.git", }, - }) - end - end) + }, clean(spec.plugins)) + end) + end + + Config.options.defaults.lazy = false + local tests = { + { + { "foo/baz", name = "bar" }, + { "foo/fee", dependencies = { "foo/baz" } }, + }, + { + { "foo/fee", dependencies = { "foo/baz" } }, + { "foo/baz", name = "bar" }, + }, + -- { + -- { "foo/baz", name = "bar" }, + -- { "foo/fee", dependencies = { "baz" } }, + -- }, + { + { "foo/baz", name = "bar" }, + { "foo/fee", dependencies = { "bar" } }, + }, + } + for _, test in ipairs(tests) do + it("handles dep names " .. inspect(test), function() + local spec = Plugin.Spec.new(vim.deepcopy(test)) + assert(#spec.notifs == 0) + Config.plugins = spec.plugins + Plugin.update_state() + spec = Plugin.Spec.new(test) + spec.meta:rebuild() + for _, plugin in pairs(spec.plugins) do + plugin.dir = nil + end + assert.same({ + bar = { + _ = {}, + name = "bar", + url = "https://github.com/foo/baz.git", + }, + fee = { + _ = {}, + name = "fee", + url = "https://github.com/foo/fee.git", + dependencies = { "bar" }, + }, + }, clean(spec.plugins)) + end) + end it("handles opt from dep", function() Config.options.defaults.lazy = false From 9c8e7a48406109458370f3b52f6f058943db40f4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 10:44:35 +0200 Subject: [PATCH 1418/1610] feat(health): show user's lazy.nvim version in checkhealth --- lua/lazy/health.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 86e805d..2e5781e 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -62,6 +62,7 @@ end function M.check() start("lazy.nvim") + info("{lazy.nvim} version `" .. Config.version .. "`") M.have("git") From 2e1167df4ab055e8327317ac38210b111cbaec83 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 11:30:29 +0200 Subject: [PATCH 1419/1610] feat: added localleader-i to inspect a plugin --- lua/lazy/core/config.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index d5c21b0..63c52c8 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -120,6 +120,16 @@ M.defaults = { 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"] = { function(plugin) require("lazy.util").float_term(nil, { From 53f314d9e6ef594677acdf5f038a4a042a7f3e38 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 11:31:20 +0200 Subject: [PATCH 1420/1610] feat(ui): show indication of plugins that need build. See #1563 --- lua/lazy/view/render.lua | 7 ++++++- lua/lazy/view/sections.lua | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 00ebd8f..6d0e758 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -379,7 +379,12 @@ function M:diagnostics(plugin) if skip then return end - if plugin._.updated then + if plugin._.build then + self:diagnostic({ + message = "needs build", + severity = vim.diagnostic.severity.WARN, + }) + elseif plugin._.updated then if plugin._.updated.from == plugin._.updated.to then self:diagnostic({ message = "already up to date", diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index e2892a2..c9fd9a7 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -33,6 +33,12 @@ return { end, title = "Working", }, + { + filter = function(plugin) + return plugin._.build + end, + title = "Build", + }, { filter = function(plugin) return has_task(plugin, function(task) From a0391c3e21e063df9dee70f17ae7891497cdcec9 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 11:32:00 +0200 Subject: [PATCH 1421/1610] fix(manage): dont skip install for plugins that need a build, but dont have an url (like local plugins). Fixes #1563 --- lua/lazy/manage/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 9818764..55c5076 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -95,7 +95,7 @@ function M.install(opts) "plugin.build", }, plugins = function(plugin) - return plugin.url and not (plugin._.installed and not plugin._.build) + return not (plugin._.installed and not plugin._.build) end, }, opts):wait(function() require("lazy.manage.lock").update() From e02c5b1b5787210dfbf89681d94e7861b30aa139 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 11:32:30 +0200 Subject: [PATCH 1422/1610] fix(runner): only check for errors when a task is no longer running --- lua/lazy/manage/runner.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 6a01609..74d6254 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -100,16 +100,16 @@ function Runner:_start() local is_running = s.task and s.task:is_running() local step = self._pipeline[s.step] + if is_running then + -- still running + active = active + 1 -- selene:allow(empty_if) - if s.task and s.task:has_errors() then + elseif s.task and s.task:has_errors() then -- don't continue tasks if there are errors elseif step and step.task == "wait" and not resume then -- waiting for sync waiting = waiting + 1 wait_step = s.step - elseif is_running then - -- still running - active = active + 1 else next[#next + 1] = name end From 82276321f5132c680a852bec0bb9b55694ab2a21 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 11:33:11 +0200 Subject: [PATCH 1423/1610] fix(rocks): if installing with luarocks (binaries) fails, then build from source. Fixes #1563 --- lua/lazy/manage/task/init.lua | 10 +++++++++- lua/lazy/pkg/rockspec.lua | 27 ++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 6693adc..8dbffc5 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -37,7 +37,7 @@ function Task.new(plugin, name, task, opts) local self = setmetatable({}, { __index = Task }) self._opts = opts or {} self._log = {} - self._level = vim.log.levels.TRACE + self:set_level() self.plugin = plugin self.name = name ---@param other LazyTask @@ -95,6 +95,11 @@ function Task:has_warnings() return self._level >= vim.log.levels.WARN end +---@param level? number +function Task:set_level(level) + self._level = level or vim.log.levels.TRACE +end + ---@private ---@param task LazyTaskFn function Task:_start(task) @@ -218,6 +223,7 @@ function Task:spawn(cmd, opts) end local running = true + local ret = true ---@param output string function opts.on_exit(ok, output) if not headless then @@ -226,6 +232,7 @@ function Task:spawn(cmd, opts) if on_exit then pcall(on_exit, ok, output) end + ret = ok running = false end @@ -240,6 +247,7 @@ function Task:spawn(cmd, opts) while running do coroutine.yield() end + return ret end function Task:prefix() diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 04ff937..2580afa 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -101,6 +101,7 @@ function M.check(opts) return ok end +---@async ---@param task LazyTask function M.build(task) if @@ -163,7 +164,7 @@ function M.build(task) ) local root = Config.options.rocks.root .. "/" .. task.plugin.name - task:spawn(luarocks, { + local ok = task:spawn(luarocks, { args = { "--tree", root, @@ -181,6 +182,30 @@ function M.build(task) cwd = task.plugin.dir, env = env, }) + + if ok then + return + end + + task:warn("Failed installing " .. rockspec.package .. " with `luarocks`.\nTrying to build from source.") + + -- install failed, so try building from source + task:set_level() -- reset level + task:spawn(luarocks, { + args = { + "--tree", + root, + "--dev", + "--lua-version", + "5.1", + "make", + "--force-fast", + "--deps-mode", + "one", + }, + cwd = task.plugin.dir, + env = env, + }) end ---@param rockspec RockSpec From c0fd59b020dc4efb91b226b0bbc4a22f28c12321 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 12:31:58 +0200 Subject: [PATCH 1424/1610] feat(health): show steps to get luarocks working. See #1570 --- lua/lazy/health.lua | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 2e5781e..60cb61e 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -145,11 +145,21 @@ function M.check() info("you have some plugins that require `luarocks`:\n" .. table.concat(lines, "\n")) end - require("lazy.pkg.rockspec").check({ + local ok = require("lazy.pkg.rockspec").check({ error = #need_luarocks > 0 and error or warn, warn = warn, ok = ok, }) + if not ok then + warn(table.concat({ + "Lazy won't be able to install plugins that require `luarocks`.", + "Here's what you can do:", + " - fix your `luarocks` installation", + Config.options.rocks.hererocks and " - disable *hererocks* with `opts.rocks.hererocks = false`" + or " - enable `hererocks` with `opts.rocks.hererocks = true`", + " - disable `luarocks` support completely with `opts.rocks.enabled = false`", + }, "\n")) + end else ok("luarocks disabled") end From e3e431480d6c9ab460cf08b1e35311c2ab2c05c4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 12:38:47 +0200 Subject: [PATCH 1425/1610] feat(ui): remap gx -> K. Fixes #1561 --- lua/lazy/view/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index c531927..26383da 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -86,6 +86,8 @@ function M.create() return ViewConfig.keys.abort end, { silent = true, buffer = self.buf, expr = true }) + vim.keymap.set("n", "gx", "K", { buffer = self.buf, remap = true }) + -- plugin details self:on_key(ViewConfig.keys.details, function() local plugin = self.render:get_plugin() From 79bcc02d17edf026065bc4313e13363f1717f2d4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 12:48:50 +0200 Subject: [PATCH 1426/1610] ci: make simple test script --- .github/workflows/ci.yml | 2 +- lua/lazy/view/text.lua | 4 +--- tests/run | 3 +++ 3 files changed, 5 insertions(+), 4 deletions(-) create mode 100755 tests/run diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 647365c..d1f514d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: run: | nvim --version [ ! -d tests ] && exit 0 - nvim -l tests/busted.lua tests -o utfTerminal + ./tests/run community: runs-on: ubuntu-latest steps: diff --git a/lua/lazy/view/text.lua b/lua/lazy/view/text.lua index 3e83d5a..6a664a3 100644 --- a/lua/lazy/view/text.lua +++ b/lua/lazy/view/text.lua @@ -11,9 +11,7 @@ local Util = require("lazy.util") local Text = {} function Text.new() - local self = setmetatable({}, { - __index = Text, - }) + local self = setmetatable({}, { __index = Text }) self._lines = {} return self diff --git a/tests/run b/tests/run new file mode 100755 index 0000000..7c8bb34 --- /dev/null +++ b/tests/run @@ -0,0 +1,3 @@ +#!/bin/sh + +nvim -l tests/busted.lua tests -o utfTerminal From 68cee30cdb1f7a29d10b44b00506aafa092b6cee Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 13:06:39 +0200 Subject: [PATCH 1427/1610] perf: prevent active waiting in coroutines. suspend/resume instead --- lua/lazy/async.lua | 28 +++++++++++++++++++++++++++- lua/lazy/manage/task/init.lua | 8 +++++--- lua/lazy/util.lua | 10 +++------- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index a7bcfac..1d348e9 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -9,10 +9,14 @@ local M = {} M._queue = {} M._executor = assert(vim.loop.new_check()) M._running = false +M.SLEEP = "sleep" +---@type Async +M.current = nil ---@class Async ---@field co thread ---@field opts AsyncOpts +---@field sleeping? boolean local Async = {} ---@param fn async fun() @@ -29,16 +33,38 @@ function Async:running() return coroutine.status(self.co) ~= "dead" end +function Async:sleep(ms) + self.sleeping = true + vim.defer_fn(function() + self.sleeping = false + end, ms) +end + +function Async:suspend() + self.sleeping = true +end + +function Async:resume() + self.sleeping = false +end + function Async:step() + if self.sleeping then + return true + end local status = coroutine.status(self.co) if status == "suspended" then + M.current = self local ok, res = coroutine.resume(self.co) + M.current = nil if not ok then if self.opts.on_error then self.opts.on_error(tostring(res)) end elseif res then - if self.opts.on_yield then + if res == M.SLEEP then + self.sleeping = true + elseif self.opts.on_yield then self.opts.on_yield(res) end end diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 8dbffc5..e651f63 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -222,6 +222,8 @@ function Task:spawn(cmd, opts) end end + self._running:suspend() + local running = true local ret = true ---@param output string @@ -234,6 +236,7 @@ function Task:spawn(cmd, opts) end ret = ok running = false + self._running:resume() end if headless then @@ -244,9 +247,8 @@ function Task:spawn(cmd, opts) end end Process.spawn(cmd, opts) - while running do - coroutine.yield() - end + coroutine.yield() + assert(not running, "process still running?") return ret end diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 09e4f54..4a3073e 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -232,13 +232,9 @@ end ---@async ---@param ms number function M.sleep(ms) - local continue = false - vim.defer_fn(function() - continue = true - end, ms) - while not continue do - coroutine.yield() - end + local async = require("lazy.async").current + assert(async, "Not in an async context") + async:sleep(ms) end function M._dump(value, result) From 37c7163f8d27243993ac07db8477e44cd5275027 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:34:05 +0200 Subject: [PATCH 1428/1610] chore(main): release 11.5.0 (#1565) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 31 +++++++++++++++++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 6d1ef85..1d395f3 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.4.2" + ".": "11.5.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index e54cefe..4c9fdb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # Changelog +## [11.5.0](https://github.com/folke/lazy.nvim/compare/v11.4.2...v11.5.0) (2024-06-27) + + +### Features + +* added `opts.headless` to control ansi output when running headless ([a0a51c0](https://github.com/folke/lazy.nvim/commit/a0a51c06c2fcddda925667142516c89777eb0c8e)) +* added localleader-i to inspect a plugin ([2e1167d](https://github.com/folke/lazy.nvim/commit/2e1167df4ab055e8327317ac38210b111cbaec83)) +* **health:** show steps to get luarocks working. See [#1570](https://github.com/folke/lazy.nvim/issues/1570) ([c0fd59b](https://github.com/folke/lazy.nvim/commit/c0fd59b020dc4efb91b226b0bbc4a22f28c12321)) +* **health:** show user's lazy.nvim version in checkhealth ([9c8e7a4](https://github.com/folke/lazy.nvim/commit/9c8e7a48406109458370f3b52f6f058943db40f4)) +* **ui:** keep cursor position when rendering view ([591ded8](https://github.com/folke/lazy.nvim/commit/591ded8309e45806ae3fb58b7b68fe58785a3ada)) +* **ui:** remap gx -> K. Fixes [#1561](https://github.com/folke/lazy.nvim/issues/1561) ([e3e4314](https://github.com/folke/lazy.nvim/commit/e3e431480d6c9ab460cf08b1e35311c2ab2c05c4)) +* **ui:** show indication of plugins that need build. See [#1563](https://github.com/folke/lazy.nvim/issues/1563) ([53f314d](https://github.com/folke/lazy.nvim/commit/53f314d9e6ef594677acdf5f038a4a042a7f3e38)) + + +### Bug Fixes + +* **manage:** dont skip install for plugins that need a build, but dont have an url (like local plugins). Fixes [#1563](https://github.com/folke/lazy.nvim/issues/1563) ([a0391c3](https://github.com/folke/lazy.nvim/commit/a0391c3e21e063df9dee70f17ae7891497cdcec9)) +* **meta:** resolve deps from meta instead of fragments. Fixes [#1566](https://github.com/folke/lazy.nvim/issues/1566) ([6a42327](https://github.com/folke/lazy.nvim/commit/6a423278a10ff7b1a76795275111d01632851c48)) +* **pkg:** only show pkg changed when effectively changing a pkg file. Fixes [#1567](https://github.com/folke/lazy.nvim/issues/1567) ([24a86d5](https://github.com/folke/lazy.nvim/commit/24a86d5ca4652a77f0f2c78dd7c693a3c369ab68)) +* **rocks:** if installing with luarocks (binaries) fails, then build from source. Fixes [#1563](https://github.com/folke/lazy.nvim/issues/1563) ([8227632](https://github.com/folke/lazy.nvim/commit/82276321f5132c680a852bec0bb9b55694ab2a21)) +* **runner:** only check for errors when a task is no longer running ([e02c5b1](https://github.com/folke/lazy.nvim/commit/e02c5b1b5787210dfbf89681d94e7861b30aa139)) +* **runner:** only use Config.plugins when updated. Fixes [#1560](https://github.com/folke/lazy.nvim/issues/1560) ([97f4df0](https://github.com/folke/lazy.nvim/commit/97f4df0824da13b2b0d065f0dc43c49862581a01)) +* **runner:** properly do concurrency ([66a4170](https://github.com/folke/lazy.nvim/commit/66a4170f0e9ab238972f73a268582cf65026a017)) +* **runner:** wait_step ([93b3a77](https://github.com/folke/lazy.nvim/commit/93b3a77286c4212850e21a6b3e31d328b5a86df4)) +* **ui:** diagnostics without status ([249902a](https://github.com/folke/lazy.nvim/commit/249902ab3194226efec0dbc3e000e758c43b4714)) + + +### Performance Improvements + +* prevent active waiting in coroutines. suspend/resume instead ([68cee30](https://github.com/folke/lazy.nvim/commit/68cee30cdb1f7a29d10b44b00506aafa092b6cee)) + ## [11.4.2](https://github.com/folke/lazy.nvim/compare/v11.4.1...v11.4.2) (2024-06-26) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 63c52c8..501f579 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -218,7 +218,7 @@ M.defaults = { debug = false, } -M.version = "11.4.2" -- x-release-please-version +M.version = "11.5.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 461552474c0646204399316228488edda63e9046 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 27 Jun 2024 14:43:35 +0200 Subject: [PATCH 1429/1610] refactor: cleanup --- lua/lazy/async.lua | 12 ++++++++---- lua/lazy/manage/task/init.lua | 22 +++++++--------------- lua/lazy/util.lua | 8 -------- tests/manage/task_spec.lua | 7 ------- 4 files changed, 15 insertions(+), 34 deletions(-) diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index 1d348e9..8a0a798 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -9,7 +9,6 @@ local M = {} M._queue = {} M._executor = assert(vim.loop.new_check()) M._running = false -M.SLEEP = "sleep" ---@type Async M.current = nil @@ -62,9 +61,7 @@ function Async:step() self.opts.on_error(tostring(res)) end elseif res then - if res == M.SLEEP then - self.sleeping = true - elseif self.opts.on_yield then + if self.opts.on_yield then self.opts.on_yield(res) end end @@ -130,4 +127,11 @@ function M.wrap(fn, opts) end end +---@async +---@param ms number +function M.sleep(ms) + assert(M.current, "Not in an async context") + M.current:sleep(ms) +end + return M diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index e651f63..a142cf4 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -75,16 +75,8 @@ function Task:status() return msg ~= "" and msg or nil end -function Task:has_started() - return self._started ~= nil -end - -function Task:has_ended() - return self._ended ~= nil -end - function Task:is_running() - return not self:has_ended() + return self._ended == nil end function Task:has_errors() @@ -103,8 +95,8 @@ end ---@private ---@param task LazyTaskFn function Task:_start(task) - assert(not self:has_started(), "task already started") - assert(not self:has_ended(), "task already done") + assert(not self._started, "task already started") + assert(not self._ended, "task already done") if Config.headless() and Config.options.headless.task then self:log("Running task " .. self.name, vim.log.levels.INFO) @@ -171,8 +163,8 @@ end ---@private function Task:_done() - assert(self:has_started(), "task not started") - assert(not self:has_ended(), "task already done") + assert(self._started, "task not started") + assert(not self._ended, "task already done") if self._running and self._running:running() then return @@ -194,10 +186,10 @@ function Task:_done() end function Task:time() - if not self:has_started() then + if not self._started then return 0 end - if not self:has_ended() then + if not self._ended then return (vim.uv.hrtime() - self._started) / 1e6 end return (self._ended - self._started) / 1e6 diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 4a3073e..1c3cee3 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -229,14 +229,6 @@ function M.markdown(msg, opts) ) end ----@async ----@param ms number -function M.sleep(ms) - local async = require("lazy.async").current - assert(async, "Not in an async context") - async:sleep(ms) -end - function M._dump(value, result) local t = type(value) if t == "number" or t == "boolean" then diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index adb01e8..7df638a 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -21,7 +21,6 @@ describe("task", function() it("simple function", function() local task = Task.new(plugin, "test", function() end, opts) - assert(task:has_started()) assert(task:is_running()) task:wait() assert(not task:is_running()) @@ -32,7 +31,6 @@ describe("task", function() local task = Task.new(plugin, "test", function() error("test") end, opts) - assert(task:has_started()) assert(task:is_running()) task:wait() assert(not task:is_running()) @@ -48,7 +46,6 @@ describe("task", function() coroutine.yield() running = false end, opts) - assert(task:has_started()) assert(task:is_running()) assert(running) assert(task:is_running()) @@ -63,7 +60,6 @@ describe("task", function() local task = Task.new(plugin, "spawn_errors", function(task) task:spawn("foobar") end, opts) - assert(task:has_started()) assert(task:is_running()) task:wait() assert(not task:is_running()) @@ -75,9 +71,7 @@ describe("task", function() local task = Task.new(plugin, "test", function(task) task:spawn("echo", { args = { "foo" } }) end, opts) - assert(task:has_started()) assert(task:is_running()) - assert(task:has_started()) assert(task:is_running()) task:wait() assert.same(task:output(), "foo") @@ -90,7 +84,6 @@ describe("task", function() task:spawn("echo", { args = { "foo" } }) task:spawn("echo", { args = { "bar" } }) end, opts) - assert(task:has_started()) assert(task:is_running()) assert(task:is_running()) task:wait() From 60fe75c88db22025989600bb53dba247654d9ed5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 28 Jun 2024 00:35:38 +0200 Subject: [PATCH 1430/1610] fix(task): run on_exit async. See #1569 --- lua/lazy/async.lua | 1 + lua/lazy/manage/process.lua | 16 +++++++++++++++- lua/lazy/manage/task/init.lua | 13 +++++++------ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index 8a0a798..9f39a5c 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -37,6 +37,7 @@ function Async:sleep(ms) vim.defer_fn(function() self.sleeping = false end, ms) + coroutine.yield() end function Async:suspend() diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 7c568cb..03becf2 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -197,7 +197,21 @@ function M.exec(cmd, opts) lines = _lines end, }) - vim.fn.jobwait({ job }) + + if job <= 0 then + error("Failed to start job: " .. vim.inspect(cmd)) + end + + local Async = require("lazy.async") + local async = Async.current + if async then + while vim.fn.jobwait({ job }, 0)[1] == -1 do + async:sleep(10) + end + else + vim.fn.jobwait({ job }) + end + return lines end diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index a142cf4..989f362 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -217,16 +217,13 @@ function Task:spawn(cmd, opts) self._running:suspend() local running = true - local ret = true + local ret = { ok = true, output = "" } ---@param output string function opts.on_exit(ok, output) if not headless then self:log(vim.trim(output), ok and vim.log.levels.DEBUG or vim.log.levels.ERROR) end - if on_exit then - pcall(on_exit, ok, output) - end - ret = ok + ret = { ok = ok, output = output } running = false self._running:resume() end @@ -241,7 +238,11 @@ function Task:spawn(cmd, opts) Process.spawn(cmd, opts) coroutine.yield() assert(not running, "process still running?") - return ret + if on_exit then + pcall(on_exit, ret.ok, ret.output) + end + coroutine.yield() + return ret.ok end function Task:prefix() From 4319846b8c8a05975c4139b0bc9f7e6e7a9e6e21 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 28 Jun 2024 16:07:49 +0200 Subject: [PATCH 1431/1610] fix(rocks): lua-5.1. Closes #1575 --- lua/lazy/pkg/rockspec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 2580afa..c89ab3c 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -90,7 +90,7 @@ function M.check(opts) ok = Health.have("luarocks", opts) ok = ( Health.have( - { "lua5.1", "lua" }, + { "lua5.1", "lua", "lua-5.1" }, vim.tbl_extend("force", opts, { version = "-v", version_pattern = "5.1", From a36ebd2a75145cd8a377b1847a7a1ccf31b2ab7a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 28 Jun 2024 16:08:26 +0200 Subject: [PATCH 1432/1610] refactor: async processes --- lua/lazy/async.lua | 150 +++++++++----- lua/lazy/manage/init.lua | 2 +- lua/lazy/manage/process.lua | 378 ++++++++++++++++++---------------- lua/lazy/manage/runner.lua | 22 +- lua/lazy/manage/task/init.lua | 111 ++++------ lua/lazy/util.lua | 12 +- lua/lazy/view/render.lua | 4 +- lua/lazy/view/sections.lua | 2 +- tests/manage/process_spec.lua | 20 ++ tests/manage/task_spec.lua | 28 +-- tests/run | 2 +- vim.toml | 42 +--- 12 files changed, 394 insertions(+), 379 deletions(-) create mode 100644 tests/manage/process_spec.lua diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index 9f39a5c..6ad2d6a 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -1,78 +1,122 @@ ----@class AsyncOpts ----@field on_done? fun() ----@field on_error? fun(err:string) ----@field on_yield? fun(res:any) - local M = {} ---@type Async[] M._queue = {} M._executor = assert(vim.loop.new_check()) M._running = false ----@type Async -M.current = nil + +---@type table<thread, Async> +M._threads = setmetatable({}, { __mode = "k" }) + +---@alias AsyncEvent "done" | "error" | "yield" | "ok" ---@class Async ----@field co thread ----@field opts AsyncOpts ----@field sleeping? boolean +---@field _co thread +---@field _fn fun() +---@field _suspended? boolean +---@field _on table<AsyncEvent, fun(res:any, async:Async)[]> local Async = {} ---@param fn async fun() ----@param opts? AsyncOpts ---@return Async -function Async.new(fn, opts) +function Async.new(fn) local self = setmetatable({}, { __index = Async }) - self.co = coroutine.create(fn) - self.opts = opts or {} + return self:init(fn) +end + +---@param fn async fun() +---@return Async +function Async:init(fn) + self._fn = fn + self._on = {} + self._co = coroutine.create(function() + local ok, err = pcall(self._fn) + if not ok then + self:_emit("error", err) + end + self:_emit("done") + end) + M._threads[self._co] = self + return M.add(self) +end + +function Async:restart() + assert(not self:running(), "Cannot restart a running async") + self:init(self._fn) +end + +---@param event AsyncEvent +---@param cb async fun(res:any, async:Async) +function Async:on(event, cb) + self._on[event] = self._on[event] or {} + table.insert(self._on[event], cb) return self end -function Async:running() - return coroutine.status(self.co) ~= "dead" +---@private +---@param event AsyncEvent +---@param res any +function Async:_emit(event, res) + for _, cb in ipairs(self._on[event] or {}) do + cb(res, self) + end end +function Async:running() + return coroutine.status(self._co) ~= "dead" +end + +---@async function Async:sleep(ms) - self.sleeping = true + self._suspended = true vim.defer_fn(function() - self.sleeping = false + self._suspended = false end, ms) coroutine.yield() end +---@async function Async:suspend() - self.sleeping = true + self._suspended = true + if coroutine.running() == self._co then + coroutine.yield() + end end function Async:resume() - self.sleeping = false + self._suspended = false +end + +function Async:wait() + local async = M.running() + if coroutine.running() == self._co then + error("Cannot wait on self") + end + + while self:running() do + if async then + coroutine.yield() + else + vim.wait(10) + end + end + return self end function Async:step() - if self.sleeping then + if self._suspended then return true end - local status = coroutine.status(self.co) + local status = coroutine.status(self._co) if status == "suspended" then - M.current = self - local ok, res = coroutine.resume(self.co) - M.current = nil + local ok, res = coroutine.resume(self._co) if not ok then - if self.opts.on_error then - self.opts.on_error(tostring(res)) - end + error(res) elseif res then - if self.opts.on_yield then - self.opts.on_yield(res) - end + self:_emit("yield", res) end end - if self:running() then - return true - end - if self.opts.on_done then - self.opts.on_done() - end + return self:running() end function M.step() @@ -107,32 +151,24 @@ function M.add(async) return async end ----@param fn async fun() ----@param opts? AsyncOpts -function M.run(fn, opts) - return M.add(Async.new(fn, opts)) -end - ----@generic T: async fun() ----@param fn T ----@param opts? AsyncOpts ----@return T -function M.wrap(fn, opts) - return function(...) - local args = { ... } - ---@async - local wrapped = function() - return fn(unpack(args)) - end - return M.run(wrapped, opts) +function M.running() + local co = coroutine.running() + if co then + local async = M._threads[co] + assert(async, "In coroutine without async context") + return async end end ---@async ---@param ms number function M.sleep(ms) - assert(M.current, "Not in an async context") - M.current:sleep(ms) + local async = M.running() + assert(async, "Not in an async context") + async:sleep(ms) end +M.Async = Async +M.new = Async.new + return M diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index 55c5076..ac9ba14 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -236,7 +236,7 @@ function M.clear(plugins) if plugin._.tasks then ---@param task LazyTask plugin._.tasks = vim.tbl_filter(function(task) - return task:is_running() or task:has_errors() + return task:running() or task:has_errors() end, plugin._.tasks) end end diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index 03becf2..f29d978 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -1,67 +1,133 @@ +local Async = require("lazy.async") local Config = require("lazy.core.config") -local M = {} - ----@type table<uv_process_t, true> -M.running = {} - -M.signals = { - "HUP", - "INT", - "QUIT", - "ILL", - "TRAP", - "ABRT", - "BUS", - "FPE", - "KILL", - "USR1", - "SEGV", - "USR2", - "PIPE", - "ALRM", - "TERM", - "CHLD", - "CONT", - "STOP", - "TSTP", - "TTIN", - "TTOU", - "URG", - "XCPU", - "XFSZ", - "VTALRM", - "PROF", - "WINCH", - "IO", - "PWR", - "EMT", - "SYS", - "INFO", -} - ---@diagnostic disable-next-line: no-unknown local uv = vim.uv ---@class ProcessOpts ---@field args string[] ---@field cwd? string ----@field on_line? fun(string) +---@field on_line? fun(line:string) ---@field on_exit? fun(ok:boolean, output:string) ----@field on_data? fun(string) +---@field on_data? fun(data:string, is_stderr?:boolean) ---@field timeout? number ---@field env? table<string,string> ----@param opts? ProcessOpts ----@param cmd string -function M.spawn(cmd, opts) - opts = opts or {} - opts.timeout = opts.timeout or (Config.options.git and Config.options.git.timeout * 1000) +local M = {} +---@type table<uv_process_t, LazyProcess> +M.running = setmetatable({}, { __mode = "k" }) + +---@class LazyProcess: Async +---@field handle? uv_process_t +---@field pid? number +---@field cmd string +---@field opts ProcessOpts +---@field timeout? uv_timer_t +---@field timedout? boolean +---@field data string +---@field check? uv_check_t +---@field code? number +---@field signal? number +local Process = setmetatable({}, { __index = Async.Async }) + +---@param cmd string|string[] +---@param opts? ProcessOpts +function Process.new(cmd, opts) + local self = setmetatable({}, { __index = Process }) + ---@async + Process.init(self, function() + self:_run() + end) + opts = opts or {} + opts.args = opts.args or {} + if type(cmd) == "table" then + self.cmd = table.remove(cmd, 1) + vim.list_extend(opts.args, cmd) + else + self.cmd = cmd + end + opts.timeout = opts.timeout or (Config.options.git and Config.options.git.timeout * 1000) + -- make sure the cwd is valid + if not opts.cwd and type(uv.cwd()) ~= "string" then + opts.cwd = uv.os_homedir() + end + opts.on_line = opts.on_line and vim.schedule_wrap(opts.on_line) or nil + opts.on_data = opts.on_data and vim.schedule_wrap(opts.on_data) or nil + self.data = "" + self.opts = opts + self.code = 1 + self.signal = 0 + return self +end + +---@async +function Process:_run() + self:guard() + local stdout = assert(uv.new_pipe()) + local stderr = assert(uv.new_pipe()) + self.handle = uv.spawn(self.cmd, { + stdio = { nil, stdout, stderr }, + args = self.opts.args, + cwd = self.opts.cwd, + env = self:env(), + }, function(code, signal) + self.code = code + self.signal = signal + if self.timeout then + self.timeout:stop() + end + self.handle:close() + stdout:close() + stderr:close() + self:resume() + end) + + if self.handle then + M.running[self.handle] = self + stdout:read_start(function(err, data) + self:on_data(err, data) + end) + stderr:read_start(function(err, data) + self:on_data(err, data, true) + end) + self:suspend() + while not (self.handle:is_closing() and stdout:is_closing() and stderr:is_closing()) do + coroutine.yield() + end + else + self.data = "Failed to spawn process " .. self.cmd .. " " .. vim.inspect(self.opts) + end + self:on_exit() +end + +function Process:on_exit() + self.data = self.data:gsub("[^\r\n]+\r", "") + if self.timedout then + self.data = self.data .. "\n" .. "Process was killed because it reached the timeout" + elseif self.signal ~= 0 then + self.data = self.data .. "\n" .. "Process was killed with SIG" .. M.signals[self.signal]:upper() + end + if self.opts.on_exit then + self.opts.on_exit(self.code == 0 and self.signal == 0, self.data) + end +end + +function Process:guard() + if self.opts.timeout then + self.timeout = assert(uv.new_timer()) + self.timeout:start(self.opts.timeout, 0, function() + self.timedout = true + self:kill() + end) + end +end + +function Process:env() ---@type table<string, string> local env = vim.tbl_extend("force", { GIT_SSH_COMMAND = "ssh -oBatchMode=yes", - }, uv.os_environ(), opts.env or {}) + }, uv.os_environ(), self.opts.env or {}) env.GIT_DIR = nil env.GIT_WORK_TREE = nil env.GIT_TERMINAL_PROMPT = "0" @@ -72,147 +138,105 @@ function M.spawn(cmd, opts) for k, v in pairs(env) do env_flat[#env_flat + 1] = k .. "=" .. v end - - local stdout = assert(uv.new_pipe()) - local stderr = assert(uv.new_pipe()) - - local output = "" - ---@type uv_process_t? - local handle = nil - - ---@type uv_timer_t - local timeout - local killed = false - if opts.timeout then - timeout = assert(uv.new_timer()) - timeout:start(opts.timeout, 0, function() - if M.kill(handle) then - killed = true - end - end) - end - - -- make sure the cwd is valid - if not opts.cwd and type(uv.cwd()) ~= "string" then - opts.cwd = uv.os_homedir() - end - - handle = uv.spawn(cmd, { - stdio = { nil, stdout, stderr }, - args = opts.args, - cwd = opts.cwd, - env = env_flat, - }, function(exit_code, signal) - ---@cast handle uv_process_t - M.running[handle] = nil - if timeout then - timeout:stop() - timeout:close() - end - handle:close() - stdout:close() - stderr:close() - local check = assert(uv.new_check()) - check:start(function() - if not stdout:is_closing() or not stderr:is_closing() then - return - end - check:stop() - if opts.on_exit then - output = output:gsub("[^\r\n]+\r", "") - if killed then - output = output .. "\n" .. "Process was killed because it reached the timeout" - elseif signal ~= 0 then - output = output .. "\n" .. "Process was killed with SIG" .. M.signals[signal] - end - - vim.schedule(function() - opts.on_exit(exit_code == 0 and signal == 0, output) - end) - end - end) - end) - - if not handle then - if opts.on_exit then - opts.on_exit(false, "Failed to spawn process " .. cmd .. " " .. vim.inspect(opts)) - end - return - end - M.running[handle] = true - - ---@param data? string - local function on_output(err, data) - assert(not err, err) - - if data then - if opts.on_data then - vim.schedule(function() - opts.on_data(data) - end) - end - output = output .. data:gsub("\r\n", "\n") - local lines = vim.split(vim.trim(output:gsub("\r$", "")):gsub("[^\n\r]+\r", ""), "\n") - - if opts.on_line then - vim.schedule(function() - opts.on_line(lines[#lines]) - end) - end - end - end - - uv.read_start(stdout, on_output) - uv.read_start(stderr, on_output) - - return handle + return env_flat end -function M.kill(handle) - if handle and not handle:is_closing() then - M.running[handle] = nil - uv.process_kill(handle, "sigint") - return true +---@param signals uv.aliases.signals|uv.aliases.signals[]|nil +function Process:kill(signals) + if not self.handle or self.handle:is_closing() then + return end + signals = signals or { "sigterm", "sigkill" } + signals = type(signals) == "table" and signals or { signals } + ---@cast signals uv.aliases.signals[] + local timer = assert(uv.new_timer()) + timer:start(0, 1000, function() + if self.handle and not self.handle:is_closing() and #signals > 0 then + self.handle:kill(table.remove(signals, 1)) + else + timer:stop() + end + end) +end + +---@param err? string +---@param data? string +---@param is_stderr? boolean +function Process:on_data(err, data, is_stderr) + assert(not err, err) + if not data then + return + end + + if self.opts.on_data then + self.opts.on_data(data, is_stderr) + end + self.data = self.data .. data:gsub("\r\n", "\n") + local lines = vim.split(vim.trim(self.data:gsub("\r$", "")):gsub("[^\n\r]+\r", ""), "\n") + + if self.opts.on_line then + self.opts.on_line(lines[#lines]) + end +end + +M.signals = { + "hup", + "int", + "quit", + "ill", + "trap", + "abrt", + "bus", + "fpe", + "kill", + "usr1", + "segv", + "usr2", + "pipe", + "alrm", + "term", + "chld", + "cont", + "stop", + "tstp", + "ttin", + "ttou", + "urg", + "xcpu", + "xfsz", + "vtalrm", + "prof", + "winch", + "io", + "pwr", + "emt", + "sys", + "info", +} + +---@param cmd string|string[] +---@param opts? ProcessOpts +function M.spawn(cmd, opts) + return Process.new(cmd, opts) end function M.abort() - for handle in pairs(M.running) do - M.kill(handle) + for _, proc in pairs(M.running) do + proc:kill() end end ----@param cmd string[] ----@param opts? {cwd:string, env:table} +---@async +---@param cmd string|string[] +---@param opts? ProcessOpts function M.exec(cmd, opts) opts = opts or {} - ---@type string[] - local lines - local job = vim.fn.jobstart(cmd, { - cwd = opts.cwd, - pty = false, - env = opts.env, - stdout_buffered = true, - on_stdout = function(_, _lines) - lines = _lines - end, - }) - - if job <= 0 then - error("Failed to start job: " .. vim.inspect(cmd)) + local proc = M.spawn(cmd, opts) + proc:wait() + if proc.code ~= 0 then + error("Process failed with code " .. proc.code) end - - local Async = require("lazy.async") - local async = Async.current - if async then - while vim.fn.jobwait({ job }, 0)[1] == -1 do - async:sleep(10) - end - else - vim.fn.jobwait({ job }) - end - - return lines + return vim.split(proc.data, "\n") end return M diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index 74d6254..c5f5c75 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -16,7 +16,6 @@ local Task = require("lazy.manage.task") ---@class Runner ---@field _plugins table<string,LazyPlugin> ---@field _pipeline PipelineStep[] ----@field _on_done fun()[] ---@field _opts RunnerOpts ---@field _running? Async local Runner = {} @@ -38,7 +37,6 @@ function Runner.new(opts) for _, plugin in ipairs(pp) do self._plugins[plugin.name] = plugin end - self._on_done = {} ---@param step string|(TaskOptions|{[1]:string}) self._pipeline = vim.tbl_map(function(step) @@ -61,15 +59,9 @@ end function Runner:start() ---@async - self._running = Async.run(function() + self._running = Async.new(function() self:_start() - end, { - on_done = function() - for _, cb in ipairs(self._on_done) do - cb() - end - end, - }) + end) end ---@async @@ -97,7 +89,7 @@ function Runner:_start() for _, name in ipairs(names) do state[name] = state[name] or { step = 0 } local s = state[name] - local is_running = s.task and s.task:is_running() + local is_running = s.task and s.task:running() local step = self._pipeline[s.step] if is_running then @@ -185,14 +177,10 @@ function Runner:wait(cb) end return self end - if cb then - table.insert(self._on_done, cb) + self._running:on("done", cb) else - -- sync wait - while self:is_running() do - vim.wait(10) - end + self._running:wait() end return self end diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 989f362..1470379 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -15,16 +15,15 @@ local colors = Config.options.headless.colors ---@field msg string ---@field level? number ----@class LazyTask +---@class LazyTask: Async ---@field plugin LazyPlugin ---@field name string ---@field private _log LazyMsg[] ----@field private _started? number +---@field private _started number ---@field private _ended? number ---@field private _opts TaskOptions ----@field private _running Async ---@field private _level number -local Task = {} +local Task = setmetatable({}, { __index = Async.Async }) ---@class TaskOptions: {[string]:any} ---@field on_done? fun(task:LazyTask) @@ -35,17 +34,21 @@ local Task = {} ---@param task LazyTaskFn function Task.new(plugin, name, task, opts) local self = setmetatable({}, { __index = Task }) + ---@async + Task.init(self, function() + self:_run(task) + end) + self:set_level() self._opts = opts or {} self._log = {} - self:set_level() self.plugin = plugin self.name = name + self._started = vim.uv.hrtime() ---@param other LazyTask plugin._.tasks = vim.tbl_filter(function(other) - return other.name ~= name or other:is_running() + return other.name ~= name or other:running() end, plugin._.tasks or {}) table.insert(plugin._.tasks, self) - self:_start(task) return self end @@ -75,10 +78,6 @@ function Task:status() return msg ~= "" and msg or nil end -function Task:is_running() - return self._ended == nil -end - function Task:has_errors() return self._level >= vim.log.levels.ERROR end @@ -92,31 +91,24 @@ function Task:set_level(level) self._level = level or vim.log.levels.TRACE end ----@private +---@async ---@param task LazyTaskFn -function Task:_start(task) - assert(not self._started, "task already started") - assert(not self._ended, "task already done") - +function Task:_run(task) if Config.headless() and Config.options.headless.task then self:log("Running task " .. self.name, vim.log.levels.INFO) end - self._started = vim.uv.hrtime() - ---@async - self._running = Async.run(function() - task(self, self._opts) - end, { - on_done = function() + self + :on("done", function() self:_done() - end, - on_error = function(err) + end) + :on("error", function(err) self:error(err) - end, - on_yield = function(res) - self:log(res) - end, - }) + end) + :on("yield", function(msg) + self:log(msg) + end) + task(self, self._opts) end ---@param msg string|string[] @@ -163,13 +155,6 @@ end ---@private function Task:_done() - assert(self._started, "task not started") - assert(not self._ended, "task already done") - - if self._running and self._running:running() then - return - end - if Config.headless() and Config.options.headless.task then local ms = math.floor(self:time() + 0.5) self:log("Finished task " .. self.name .. " in " .. ms .. "ms", vim.log.levels.INFO) @@ -186,13 +171,7 @@ function Task:_done() end function Task:time() - if not self._started then - return 0 - end - if not self._ended then - return (vim.uv.hrtime() - self._started) / 1e6 - end - return (self._ended - self._started) / 1e6 + return ((self._ended or vim.uv.hrtime()) - self._started) / 1e6 end ---@async @@ -201,7 +180,6 @@ end function Task:spawn(cmd, opts) opts = opts or {} local on_line = opts.on_line - local on_exit = opts.on_exit local headless = Config.headless() and Config.options.headless.process @@ -214,35 +192,28 @@ function Task:spawn(cmd, opts) end end - self._running:suspend() - - local running = true - local ret = { ok = true, output = "" } - ---@param output string - function opts.on_exit(ok, output) - if not headless then - self:log(vim.trim(output), ok and vim.log.levels.DEBUG or vim.log.levels.ERROR) - end - ret = { ok = ok, output = output } - running = false - self._running:resume() - end - if headless then opts.on_data = function(data) -- prefix with plugin name - local prefix = self:prefix() - io.write(Terminal.prefix(data, prefix)) + io.write(Terminal.prefix(data, self:prefix())) end end - Process.spawn(cmd, opts) - coroutine.yield() - assert(not running, "process still running?") - if on_exit then - pcall(on_exit, ret.ok, ret.output) + + local proc = Process.spawn(cmd, opts) + proc:wait() + + local ok = proc.code == 0 and proc.signal == 0 + if not headless then + local msg = vim.trim(proc.data) + if #msg > 0 then + self:log(vim.trim(proc.data), ok and vim.log.levels.DEBUG or vim.log.levels.ERROR) + end end - coroutine.yield() - return ret.ok + + if opts.on_exit then + pcall(opts.on_exit, ok, proc.data) + end + return ok end function Task:prefix() @@ -253,10 +224,4 @@ function Task:prefix() or plugin .. " " .. task .. " | " end -function Task:wait() - while self:is_running() do - vim.wait(10) - end -end - return Task diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 1c3cee3..9f1088d 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -76,6 +76,13 @@ function M.throttle(ms, fn) local timer = vim.uv.new_timer() local pending = false + ---@type Async + local async + + local function running() + return async and async:running() + end + return function() if timer:is_active() then pending = true @@ -85,7 +92,10 @@ function M.throttle(ms, fn) 0, ms, vim.schedule_wrap(function() - fn() + if running() then + return + end + async = require("lazy.async").new(fn) if pending then pending = false else diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 6d0e758..640e9b0 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -51,7 +51,7 @@ function M:update() if plugin._.tasks then for _, task in ipairs(plugin._.tasks) do self.progress.total = self.progress.total + 1 - if not task:is_running() then + if not task:running() then self.progress.done = self.progress.done + 1 end end @@ -356,7 +356,7 @@ end function M:diagnostics(plugin) local skip = false for _, task in ipairs(plugin._.tasks or {}) do - if task:is_running() then + if task:running() then self:diagnostic({ severity = vim.diagnostic.severity.WARN, message = task.name .. (task:status() and (": " .. task:status()) or ""), diff --git a/lua/lazy/view/sections.lua b/lua/lazy/view/sections.lua index c9fd9a7..c1681a8 100644 --- a/lua/lazy/view/sections.lua +++ b/lua/lazy/view/sections.lua @@ -28,7 +28,7 @@ return { return true end return has_task(plugin, function(task) - return task:is_running() + return task:running() end) end, title = "Working", diff --git a/tests/manage/process_spec.lua b/tests/manage/process_spec.lua new file mode 100644 index 0000000..0fbbe89 --- /dev/null +++ b/tests/manage/process_spec.lua @@ -0,0 +1,20 @@ +---@module 'luassert' +local Async = require("lazy.async") +local Process = require("lazy.manage.process") + +describe("process", function() + it("runs sync", function() + local lines = Process.exec({ "echo", "-n", "hello" }) + assert.are.same({ "hello" }, lines) + end) + + it("runs sync from async context", function() + local lines ---@type string[] + local async = Async.new(function() + lines = Process.exec({ "echo", "-n", "hello" }) + end) + async:wait() + + assert.are.same({ "hello" }, lines) + end) +end) diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index 7df638a..e161fa2 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -21,9 +21,9 @@ describe("task", function() it("simple function", function() local task = Task.new(plugin, "test", function() end, opts) - assert(task:is_running()) + assert(task:running()) task:wait() - assert(not task:is_running()) + assert(not task:running()) assert(task_result.done) end) @@ -31,9 +31,9 @@ describe("task", function() local task = Task.new(plugin, "test", function() error("test") end, opts) - assert(task:is_running()) + assert(task:running()) task:wait() - assert(not task:is_running()) + assert(not task:running()) assert(task_result.done) assert(task_result.error) assert(task:has_errors() and task:output(vim.log.levels.ERROR):find("test")) @@ -46,12 +46,12 @@ describe("task", function() coroutine.yield() running = false end, opts) - assert(task:is_running()) + assert(task:running()) assert(running) - assert(task:is_running()) + assert(task:running()) task:wait() assert(not running) - assert(not task:is_running()) + assert(not task:running()) assert(task_result.done) assert(not task:has_errors()) end) @@ -60,19 +60,19 @@ describe("task", function() local task = Task.new(plugin, "spawn_errors", function(task) task:spawn("foobar") end, opts) - assert(task:is_running()) + assert(task:running()) task:wait() - assert(not task:is_running()) + assert(not task:running()) assert(task_result.done) - assert(task:has_errors() and task:output(vim.log.levels.ERROR):find("Failed to spawn"), task.output) + assert(task:has_errors() and task:output(vim.log.levels.ERROR):find("Failed to spawn"), task:output()) end) it("spawn", function() local task = Task.new(plugin, "test", function(task) task:spawn("echo", { args = { "foo" } }) end, opts) - assert(task:is_running()) - assert(task:is_running()) + assert(task:running()) + assert(task:running()) task:wait() assert.same(task:output(), "foo") assert(task_result.done) @@ -84,8 +84,8 @@ describe("task", function() task:spawn("echo", { args = { "foo" } }) task:spawn("echo", { args = { "bar" } }) end, opts) - assert(task:is_running()) - assert(task:is_running()) + assert(task:running()) + assert(task:running()) task:wait() assert(task:output() == "foo\nbar" or task:output() == "bar\nfoo", task:output()) assert(task_result.done) diff --git a/tests/run b/tests/run index 7c8bb34..7872f5a 100755 --- a/tests/run +++ b/tests/run @@ -1,3 +1,3 @@ #!/bin/sh -nvim -l tests/busted.lua tests -o utfTerminal +nvim -l tests/busted.lua tests -o utfTerminal "$@" diff --git a/vim.toml b/vim.toml index 4206f6c..df7e67e 100644 --- a/vim.toml +++ b/vim.toml @@ -8,42 +8,14 @@ any = true [jit] any = true -[[describe.args]] -type = "string" -[[describe.args]] -type = "function" - -[[it.args]] -type = "string" -[[it.args]] -type = "function" - -[[before_each.args]] -type = "function" -[[after_each.args]] -type = "function" - -[assert.is_not] +[assert] any = true -[[assert.equals.args]] -type = "any" -[[assert.equals.args]] -type = "any" -[[assert.equals.args]] -type = "any" -required = false +[describe] +any = true -[[assert.same.args]] -type = "any" -[[assert.same.args]] -type = "any" +[it] +any = true -[[assert.truthy.args]] -type = "any" - -[[assert.spy.args]] -type = "any" - -[[assert.stub.args]] -type = "any" +[before_each.args] +any = true From ab46edbd47fa9f380db65dbf0a7c35d18d810b19 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 28 Jun 2024 17:44:21 +0200 Subject: [PATCH 1433/1610] perf: async render --- lua/lazy/manage/task/init.lua | 21 +++++++++++++++------ lua/lazy/util.lua | 34 +++++++++++----------------------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 1470379..2b21001 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -49,6 +49,7 @@ function Task.new(plugin, name, task, opts) return other.name ~= name or other:running() end, plugin._.tasks or {}) table.insert(plugin._.tasks, self) + self:render() return self end @@ -119,12 +120,18 @@ function Task:log(msg, level) msg = type(msg) == "table" and table.concat(msg, "\n") or msg ---@cast msg string table.insert(self._log, { msg = msg, level = level }) - vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) + self:render() if Config.headless() then self:headless() end end +function Task:render() + vim.schedule(function() + vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) + end) +end + function Task:headless() if not Config.options.headless.log then return @@ -163,11 +170,13 @@ function Task:_done() if self._opts.on_done then self._opts.on_done(self) end - vim.api.nvim_exec_autocmds("User", { pattern = "LazyRender", modeline = false }) - vim.api.nvim_exec_autocmds("User", { - pattern = "LazyPlugin" .. self.name:sub(1, 1):upper() .. self.name:sub(2), - data = { plugin = self.plugin.name }, - }) + vim.schedule(function() + self:render() + vim.api.nvim_exec_autocmds("User", { + pattern = "LazyPlugin" .. self.name:sub(1, 1):upper() .. self.name:sub(2), + data = { plugin = self.plugin.name }, + }) + end) end function Task:time() diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index 9f1088d..d1ae7fd 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -73,36 +73,24 @@ end ---@param fn F ---@return F function M.throttle(ms, fn) - local timer = vim.uv.new_timer() - local pending = false - ---@type Async local async - - local function running() - return async and async:running() - end + local pending = false return function() - if timer:is_active() then + if async and async:running() then pending = true return end - timer:start( - 0, - ms, - vim.schedule_wrap(function() - if running() then - return - end - async = require("lazy.async").new(fn) - if pending then - pending = false - else - timer:stop() - end - end) - ) + ---@async + async = require("lazy.async").new(function() + repeat + pending = false + fn() + async:sleep(ms) + + until not pending + end) end end From f85575ab23c81eb897fb2cb1240a0fa1cb41f7f4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 28 Jun 2024 17:44:43 +0200 Subject: [PATCH 1434/1610] perf: use timer instead of check for async executor --- lua/lazy/async.lua | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index 6ad2d6a..356f4b1 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -2,8 +2,10 @@ local M = {} ---@type Async[] M._queue = {} -M._executor = assert(vim.loop.new_check()) -M._running = false +M._executor = assert(vim.loop.new_timer()) + +M.TIMER = 10 +M.BUDGET = 100 ---@type table<thread, Async> M._threads = setmetatable({}, { __mode = "k" }) @@ -68,11 +70,10 @@ end ---@async function Async:sleep(ms) - self._suspended = true vim.defer_fn(function() - self._suspended = false + self:resume() end, ms) - coroutine.yield() + self:suspend() end ---@async @@ -120,12 +121,11 @@ function Async:step() end function M.step() - M._running = true - local budget = 1 * 1e6 - local start = vim.loop.hrtime() + local budget = M.BUDGET * 1e6 + local start = vim.uv.hrtime() local count = #M._queue local i = 0 - while #M._queue > 0 and vim.loop.hrtime() - start < budget do + while #M._queue > 0 and vim.uv.hrtime() - start < budget do ---@type Async local state = table.remove(M._queue, 1) if state:step() then @@ -136,7 +136,6 @@ function M.step() break end end - M._running = false if #M._queue == 0 then return M._executor:stop() end @@ -146,7 +145,7 @@ end function M.add(async) table.insert(M._queue, async) if not M._executor:is_active() then - M._executor:start(vim.schedule_wrap(M.step)) + M._executor:start(1, M.TIMER, vim.schedule_wrap(M.step)) end return async end From a617d9f47b05b80cce595cce0966b88332c75b49 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 17:47:04 +0200 Subject: [PATCH 1435/1610] chore(main): release 11.5.1 (#1573) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 14 ++++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 1d395f3..063a909 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.5.0" + ".": "11.5.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c9fdb0..b939887 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [11.5.1](https://github.com/folke/lazy.nvim/compare/v11.5.0...v11.5.1) (2024-06-28) + + +### Bug Fixes + +* **rocks:** lua-5.1. Closes [#1575](https://github.com/folke/lazy.nvim/issues/1575) ([4319846](https://github.com/folke/lazy.nvim/commit/4319846b8c8a05975c4139b0bc9f7e6e7a9e6e21)) +* **task:** run on_exit async. See [#1569](https://github.com/folke/lazy.nvim/issues/1569) ([60fe75c](https://github.com/folke/lazy.nvim/commit/60fe75c88db22025989600bb53dba247654d9ed5)) + + +### Performance Improvements + +* async render ([ab46edb](https://github.com/folke/lazy.nvim/commit/ab46edbd47fa9f380db65dbf0a7c35d18d810b19)) +* use timer instead of check for async executor ([f85575a](https://github.com/folke/lazy.nvim/commit/f85575ab23c81eb897fb2cb1240a0fa1cb41f7f4)) + ## [11.5.0](https://github.com/folke/lazy.nvim/compare/v11.4.2...v11.5.0) (2024-06-27) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 501f579..c087527 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -218,7 +218,7 @@ M.defaults = { debug = false, } -M.version = "11.5.0" -- x-release-please-version +M.version = "11.5.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 2a6a2dce1b14f35e7eb7cbe8f25202ed83cba697 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 28 Jun 2024 18:31:10 +0200 Subject: [PATCH 1436/1610] fix(git): tagrefs --- lua/lazy/manage/git.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 6b0ab58..a365824 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -184,7 +184,12 @@ function M.get_tag_refs(repo, tagref) tagref = tagref or "--tags" ---@type table<string,string> local tags = {} - local lines = Process.exec({ "git", "show-ref", "-d", tagref }, { cwd = repo }) + local ok, lines = pcall(function() + return Process.exec({ "git", "show-ref", "-d", tagref }, { cwd = repo }) + end) + if not ok then + return {} + end for _, line in ipairs(lines) do local ref, tag = line:match("^(%w+) refs/tags/([^%^]+)%^?{?}?$") if ref then From ec95702ae617308df35f35ad93c469c86d47346f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 18:33:22 +0200 Subject: [PATCH 1437/1610] chore(main): release 11.5.2 (#1577) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 063a909..d7f1664 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.5.1" + ".": "11.5.2" } diff --git a/CHANGELOG.md b/CHANGELOG.md index b939887..5d30b82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [11.5.2](https://github.com/folke/lazy.nvim/compare/v11.5.1...v11.5.2) (2024-06-28) + + +### Bug Fixes + +* **git:** tagrefs ([2a6a2dc](https://github.com/folke/lazy.nvim/commit/2a6a2dce1b14f35e7eb7cbe8f25202ed83cba697)) + ## [11.5.1](https://github.com/folke/lazy.nvim/compare/v11.5.0...v11.5.1) (2024-06-28) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c087527..2a66a57 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -218,7 +218,7 @@ M.defaults = { debug = false, } -M.version = "11.5.1" -- x-release-please-version +M.version = "11.5.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 9cf745939d792204a18d7ad10a54d22386ececf3 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 28 Jun 2024 20:17:34 +0200 Subject: [PATCH 1438/1610] feat(task): build procs can now yield a LazyMsg for more control --- lua/lazy/manage/task/init.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lua/lazy/manage/task/init.lua b/lua/lazy/manage/task/init.lua index 2b21001..277a592 100644 --- a/lua/lazy/manage/task/init.lua +++ b/lua/lazy/manage/task/init.lua @@ -112,9 +112,13 @@ function Task:_run(task) task(self, self._opts) end ----@param msg string|string[] +---@param msg string|string[]|LazyMsg ---@param level? number function Task:log(msg, level) + if type(msg) == "table" and msg.msg then + level = msg.level or level + msg = msg.msg + end level = level or vim.log.levels.DEBUG self._level = math.max(self._level or 0, level or 0) msg = type(msg) == "table" and table.concat(msg, "\n") or msg @@ -170,8 +174,8 @@ function Task:_done() if self._opts.on_done then self._opts.on_done(self) end + self:render() vim.schedule(function() - self:render() vim.api.nvim_exec_autocmds("User", { pattern = "LazyPlugin" .. self.name:sub(1, 1):upper() .. self.name:sub(2), data = { plugin = self.plugin.name }, From a1fffe18f9355030fbb483156c762f50f5e0db73 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 18:22:55 +0000 Subject: [PATCH 1439/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index e88747b..65fbe06 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1226,7 +1226,7 @@ BEST PRACTICES *lazy.nvim-🔥-developers-best-practices* 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(status_msg)` to show progress. + `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. @@ -1245,9 +1245,19 @@ The spec **build** property can be one of the following: - 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(status_msg)` 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. +`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. ============================================================================== From ba1a9c5392915c306cb12ed0b64b9b3e6372a1d5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 07:12:16 +0200 Subject: [PATCH 1440/1610] ci: bootstrap script --- bootstrap.lua | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 bootstrap.lua diff --git a/bootstrap.lua b/bootstrap.lua new file mode 100644 index 0000000..3b30f1f --- /dev/null +++ b/bootstrap.lua @@ -0,0 +1,48 @@ +-- Lay Bootstrapper +-- Usage: +-- ```lua +-- load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() +-- ``` +local M = {} + +function M.setup() + if vim.env.LAZY_STDPATH then + local root = vim.fn.fnamemodify(vim.env.LAZY_STDPATH, ":p") + for _, name in ipairs({ "config", "data", "state", "cache" }) do + vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name + end + end + + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" + if not (vim.uv or vim.loop).fs_stat(lazypath) then + vim.api.nvim_echo({ + { + "Cloning lazy.nvim\n\n", + "DiagnosticInfo", + }, + }, true, {}) + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local ok, out = + pcall(vim.fn.system, { "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if not ok or vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { + "Failed to clone lazy.nvim\n", + "ErrorMsg", + }, + { + vim.trim(out or ""), + "WarningMsg", + }, + { "\nPress any key to exit", "MoreMsg" }, + }, true, {}) + + vim.fn.getchar() + vim.cmd([[quit]]) + end + end + vim.opt.rtp:prepend(lazypath) +end +M.setup() + +return M From c93eb359a39bc924578a08ac6dacca4b82f97c97 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 07:15:22 +0200 Subject: [PATCH 1441/1610] ci: minit (minimal init) --- lua/lazy/minit.lua | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 lua/lazy/minit.lua diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua new file mode 100644 index 0000000..01ac238 --- /dev/null +++ b/lua/lazy/minit.lua @@ -0,0 +1,57 @@ +---@diagnostic disable: inject-field +---@class LazyMinit:LazyConfig +---@field stdpath? string + +local islist = vim.islist or vim.tbl_islist + +---@alias MinitSetup (fun(spec:LazySpec, opts: LazyMinit):LazyMinit?) | (fun(opts: LazyMinit):LazyMinit?) | (fun(spec:LazySpec, opts: LazyMinit):LazyMinit?) + +local M = {} + +---@param opts LazyMinit +---@return LazySpec[] +local function get_spec(opts) + local ret = opts.spec or {} + return ret and type(ret) == "table" and islist(ret) and ret or { ret } +end + +---@param defaults LazyMinit +---@param opts LazyMinit +function M.extend(defaults, opts) + local spec = {} + vim.list_extend(spec, get_spec(defaults)) + vim.list_extend(spec, get_spec(opts)) + return vim.tbl_deep_extend("force", defaults, opts, { spec = spec }) +end + +function M.setup(opts) + opts = M.extend({ spec = { { dir = vim.fn.expand(".") } } }, opts) + + -- set stdpaths to use .tests + local root = opts.stdpath or ".minit" + root = vim.fn.fnamemodify(root, ":p") + for _, name in ipairs({ "config", "data", "state", "cache" }) do + vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name + end + + vim.o.loadplugins = true + require("lazy").setup(opts) +end + +---@param opts LazyMinit +function M.busted(opts) + opts = M.extend({ spec = { "lunarmodules/busted" }, rocks = { hererocks = true } }, opts) + + M.setup(opts) + + local Config = require("lazy.core.config") + -- disable termnial output for the tests + Config.options.headless = {} + + -- run busted + return pcall(require("busted.runner"), { + standalone = false, + }) or os.exit(1) +end + +return M From cfdfb786b13ca0e37562a0f68b0930869c75af7f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 29 Jun 2024 07:17:01 +0200 Subject: [PATCH 1442/1610] chore(main): release 11.6.0 (#1579) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index d7f1664..888664e 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.5.2" + ".": "11.6.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d30b82..f310801 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [11.6.0](https://github.com/folke/lazy.nvim/compare/v11.5.2...v11.6.0) (2024-06-29) + + +### Features + +* **task:** build procs can now yield a LazyMsg for more control ([9cf7459](https://github.com/folke/lazy.nvim/commit/9cf745939d792204a18d7ad10a54d22386ececf3)) + ## [11.5.2](https://github.com/folke/lazy.nvim/compare/v11.5.1...v11.5.2) (2024-06-28) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 2a66a57..0ff2ca6 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -218,7 +218,7 @@ M.defaults = { debug = false, } -M.version = "11.5.2" -- x-release-please-version +M.version = "11.6.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From f47ab692f1bc84116d3c95808bba2e2b86fbd450 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 07:26:39 +0200 Subject: [PATCH 1443/1610] ci: allow to run busted script with nvim -u to inspect env --- lua/lazy/minit.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index 01ac238..52a0059 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -48,6 +48,9 @@ function M.busted(opts) -- 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 -- run busted return pcall(require("busted.runner"), { standalone = false, From b1821ca2fa193526246057f1659ee631be3912f7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 07:26:49 +0200 Subject: [PATCH 1444/1610] ci: tests using minit --- tests/busted.lua | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/tests/busted.lua b/tests/busted.lua index 8fd4f28..0bc764b 100755 --- a/tests/busted.lua +++ b/tests/busted.lua @@ -1,28 +1,9 @@ #!/usr/bin/env -S nvim -l --- set stdpaths to use .tests -local root = vim.fn.fnamemodify("./.tests", ":p") -for _, name in ipairs({ "config", "data", "state", "cache" }) do - vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name -end - vim.opt.rtp:prepend(".") -vim.o.loadplugins = true -- enable since nvim -l disables plugins - -- Setup lazy.nvim -require("lazy").setup({ - spec = { - "lunarmodules/busted", -- add busted - }, - rocks = { hererocks = true }, +require("lazy.minit").busted({ + spec = {}, + stdpath = ".tests", }) - -local Config = require("lazy.core.config") --- disable termnial output for the tests -Config.options.headless = {} - --- run busted -return pcall(require("busted.runner"), { - standalone = false, -}) or os.exit(1) From 0e106c085c7b7bb6553fcd770b7d059e69a62c90 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 07:46:41 +0200 Subject: [PATCH 1445/1610] ci(minit): added repro --- lua/lazy/minit.lua | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index 52a0059..d4e03d5 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -25,7 +25,9 @@ function M.extend(defaults, opts) end function M.setup(opts) - opts = M.extend({ spec = { { dir = vim.fn.expand(".") } } }, opts) + opts = M.extend({ + change_detection = { enabled = false }, + }, opts) -- set stdpaths to use .tests local root = opts.stdpath or ".minit" @@ -36,11 +38,45 @@ function M.setup(opts) vim.o.loadplugins = true require("lazy").setup(opts) + require("lazy").update():wait() + if vim.bo.filetype == "lazy" then + local errors = false + for _, plugin in pairs(require("lazy.core.config").spec.plugins) do + errors = errors or require("lazy.core.plugin").has_errors(plugin) + end + if not errors then + vim.cmd.close() + end + end +end + +function M.repro(opts) + opts = M.extend({ + spec = { + { + "folke/tokyonight.nvim", + priority = 1000, + lazy = false, + config = function() + require("tokyonight").setup({ style = "moon" }) + require("tokyonight").load() + end, + }, + }, + install = { colorscheme = { "tokyonight" } }, + }, opts) + M.setup(opts) end ---@param opts LazyMinit function M.busted(opts) - opts = M.extend({ spec = { "lunarmodules/busted" }, rocks = { hererocks = true } }, opts) + opts = M.extend({ + spec = { + "lunarmodules/busted", + { dir = vim.fn.fnamemodify(".", ":p") }, + }, + rocks = { hererocks = true }, + }, opts) M.setup(opts) From cdfea60506121d4704f37b8018fb24a135fb2f54 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 08:03:06 +0200 Subject: [PATCH 1446/1610] build(bootstrap): added support for custom lazypath --- bootstrap.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bootstrap.lua b/bootstrap.lua index 3b30f1f..e39db4d 100644 --- a/bootstrap.lua +++ b/bootstrap.lua @@ -13,8 +13,8 @@ function M.setup() end end - local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not (vim.uv or vim.loop).fs_stat(lazypath) then + 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 vim.api.nvim_echo({ { "Cloning lazy.nvim\n\n", From 307868826360bc1bda7502b002a4b6049d82ebaa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 08:03:37 +0200 Subject: [PATCH 1447/1610] ci(minit): LAZY_STDPATH --- lua/lazy/minit.lua | 21 +++++++++------------ tests/busted.lua | 2 ++ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index d4e03d5..01f89c0 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -1,22 +1,18 @@ ---@diagnostic disable: inject-field ----@class LazyMinit:LazyConfig ----@field stdpath? string local islist = vim.islist or vim.tbl_islist ----@alias MinitSetup (fun(spec:LazySpec, opts: LazyMinit):LazyMinit?) | (fun(opts: LazyMinit):LazyMinit?) | (fun(spec:LazySpec, opts: LazyMinit):LazyMinit?) - local M = {} ----@param opts LazyMinit +---@param opts LazyConfig ---@return LazySpec[] local function get_spec(opts) local ret = opts.spec or {} return ret and type(ret) == "table" and islist(ret) and ret or { ret } end ----@param defaults LazyMinit ----@param opts LazyMinit +---@param defaults LazyConfig +---@param opts LazyConfig function M.extend(defaults, opts) local spec = {} vim.list_extend(spec, get_spec(defaults)) @@ -30,10 +26,11 @@ function M.setup(opts) }, opts) -- set stdpaths to use .tests - local root = opts.stdpath or ".minit" - root = vim.fn.fnamemodify(root, ":p") - for _, name in ipairs({ "config", "data", "state", "cache" }) do - vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name + if vim.env.LAZY_STDPATH then + local root = vim.fn.fnamemodify(vim.env.LAZY_STDPATH, ":p") + for _, name in ipairs({ "config", "data", "state", "cache" }) do + vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name + end end vim.o.loadplugins = true @@ -68,7 +65,7 @@ function M.repro(opts) M.setup(opts) end ----@param opts LazyMinit +---@param opts LazyConfig function M.busted(opts) opts = M.extend({ spec = { diff --git a/tests/busted.lua b/tests/busted.lua index 0bc764b..7292d3e 100755 --- a/tests/busted.lua +++ b/tests/busted.lua @@ -1,5 +1,7 @@ #!/usr/bin/env -S nvim -l +vim.env.LAZY_STDPATH = ".tests" + vim.opt.rtp:prepend(".") -- Setup lazy.nvim From 88f4d13e5f489eb30959db03a94ebfa10a78b47f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 08:11:42 +0200 Subject: [PATCH 1448/1610] feat(minit): fallback to habamax when no colorscheme set --- lua/lazy/minit.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index 01f89c0..7da2b2a 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -35,6 +35,9 @@ function M.setup(opts) vim.o.loadplugins = true require("lazy").setup(opts) + if vim.g.colors_name == nil then + vim.cmd("colorscheme habamax") + end require("lazy").update():wait() if vim.bo.filetype == "lazy" then local errors = false From cece2a9b4a649ee5fa45fe83590a6dd11c5d4eb7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 29 Jun 2024 08:13:24 +0200 Subject: [PATCH 1449/1610] chore(main): release 11.7.0 (#1582) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 888664e..2f14177 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.6.0" + ".": "11.7.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index f310801..0fd257c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [11.7.0](https://github.com/folke/lazy.nvim/compare/v11.6.0...v11.7.0) (2024-06-29) + + +### Features + +* **minit:** fallback to habamax when no colorscheme set ([88f4d13](https://github.com/folke/lazy.nvim/commit/88f4d13e5f489eb30959db03a94ebfa10a78b47f)) + ## [11.6.0](https://github.com/folke/lazy.nvim/compare/v11.5.2...v11.6.0) (2024-06-29) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 0ff2ca6..4d6bca7 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -218,7 +218,7 @@ M.defaults = { debug = false, } -M.version = "11.6.0" -- x-release-please-version +M.version = "11.7.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 7af8a317e24e31f4ee276ecb6d1f5f44e5bd11e2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 29 Jun 2024 06:29:46 +0000 Subject: [PATCH 1450/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 85 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 65fbe06..eae1268 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -39,6 +39,7 @@ Table of Contents *lazy.nvim-table-of-contents* 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| ============================================================================== @@ -1260,6 +1261,90 @@ 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 +<https://olivinelabs.com/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* From 695a05872a5b44e366e5532eb2fe38a64fae8357 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 10:18:31 +0200 Subject: [PATCH 1451/1610] feat(plugin): allow loading specs without pkg --- lua/lazy/core/plugin.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 84660e6..f917b19 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -21,7 +21,7 @@ M.Spec = Spec M.LOCAL_SPEC = ".lazy.lua" ---@param spec? LazySpec ----@param opts? {optional?:boolean} +---@param opts? {optional?:boolean, pkg?:boolean} function Spec.new(spec, opts) local self = setmetatable({}, Spec) self.meta = Meta.new(self) @@ -30,7 +30,9 @@ function Spec.new(spec, opts) self.notifs = {} self.ignore_installed = {} self.optional = opts and opts.optional - self.meta:load_pkgs() + if not (opts and opts.pkg == false) then + self.meta:load_pkgs() + end if spec then self:parse(spec) end From 00c23e72a387614e4c2c8988181c8c07a2e81cf0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 29 Jun 2024 10:20:23 +0200 Subject: [PATCH 1452/1610] chore(main): release 11.8.0 (#1583) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 2f14177..28170d0 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.7.0" + ".": "11.8.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fd257c..17ff0cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [11.8.0](https://github.com/folke/lazy.nvim/compare/v11.7.0...v11.8.0) (2024-06-29) + + +### Features + +* **plugin:** allow loading specs without pkg ([695a058](https://github.com/folke/lazy.nvim/commit/695a05872a5b44e366e5532eb2fe38a64fae8357)) + ## [11.7.0](https://github.com/folke/lazy.nvim/compare/v11.6.0...v11.7.0) (2024-06-29) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4d6bca7..415a2b8 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -218,7 +218,7 @@ M.defaults = { debug = false, } -M.version = "11.7.0" -- x-release-please-version +M.version = "11.8.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 3513227a9a41c8e6366e1719f4cefbe891ca73d2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 10:36:35 +0200 Subject: [PATCH 1453/1610] fix(async): remove debug assert --- lua/lazy/async.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index 356f4b1..58145a6 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -153,9 +153,7 @@ end function M.running() local co = coroutine.running() if co then - local async = M._threads[co] - assert(async, "In coroutine without async context") - return async + return M._threads[co] end end From 8dd947fccddbf70893a1f0ae6522361cc1777609 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 29 Jun 2024 10:37:55 +0200 Subject: [PATCH 1454/1610] chore(main): release 11.8.1 (#1584) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 28170d0..01a094f 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.8.0" + ".": "11.8.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 17ff0cd..ec7ec51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [11.8.1](https://github.com/folke/lazy.nvim/compare/v11.8.0...v11.8.1) (2024-06-29) + + +### Bug Fixes + +* **async:** remove debug assert ([3513227](https://github.com/folke/lazy.nvim/commit/3513227a9a41c8e6366e1719f4cefbe891ca73d2)) + ## [11.8.0](https://github.com/folke/lazy.nvim/compare/v11.7.0...v11.8.0) (2024-06-29) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 415a2b8..f3ce188 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -218,7 +218,7 @@ M.defaults = { debug = false, } -M.version = "11.8.0" -- x-release-please-version +M.version = "11.8.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 9ab306169060eeab7ebca00653318683e72ab62d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 11:44:31 +0200 Subject: [PATCH 1455/1610] perf(rocks): `vim.fn.executable` is slow on WSL2, so only check for `luarocks` when needed. Closes #1585 --- lua/lazy/core/config.lua | 14 ++++++++++++-- lua/lazy/core/plugin.lua | 8 ++++---- lua/lazy/health.lua | 4 ++-- lua/lazy/pkg/rockspec.lua | 6 +++--- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f3ce188..cb360ec 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -49,8 +49,11 @@ M.defaults = { enabled = true, root = vim.fn.stdpath("data") .. "/lazy-rocks", server = "https://nvim-neorocks.github.io/rocks-binaries/", - -- use hererocks to install luarocks. - hererocks = vim.fn.executable("luarocks") == 0, + -- 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 = { ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects @@ -218,6 +221,13 @@ M.defaults = { debug = false, } +function M.hererocks() + if M.options.rocks.hererocks == nil then + M.options.rocks.hererocks = vim.fn.executable("luarocks") == 0 + end + return M.options.rocks.hererocks +end + M.version = "11.8.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f917b19..26b3f6e 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -336,16 +336,16 @@ function M.load() end -- add hererocks when enabled and needed - if Config.options.rocks.hererocks then - for _, plugin in pairs(Config.spec.plugins) do - if plugin.build == "rockspec" then + for _, plugin in pairs(Config.spec.plugins) do + if plugin.build == "rockspec" then + if Config.hererocks() then Config.spec.meta:add({ "luarocks/hererocks", build = "rockspec", lazy = true, }) - break end + break end end diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 60cb61e..b3bf6f2 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -125,7 +125,7 @@ function M.check() start("luarocks") if Config.options.rocks.enabled then - if Config.options.rocks.hererocks then + if Config.hererocks() then info("checking `hererocks` installation") else info("checking `luarocks` installation") @@ -155,7 +155,7 @@ function M.check() "Lazy won't be able to install plugins that require `luarocks`.", "Here's what you can do:", " - fix your `luarocks` installation", - Config.options.rocks.hererocks and " - disable *hererocks* with `opts.rocks.hererocks = false`" + Config.hererocks() and " - disable *hererocks* with `opts.rocks.hererocks = false`" or " - enable `hererocks` with `opts.rocks.hererocks = true`", " - disable `luarocks` support completely with `opts.rocks.enabled = false`", }, "\n")) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index c89ab3c..e1d2c6e 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -72,7 +72,7 @@ function M.check(opts) }, opts or {}) local ok = false - if Config.options.rocks.hererocks then + if Config.hererocks() then if M.hererocks.building() then ok = true else @@ -119,7 +119,7 @@ function M.build(task) "", "This plugin requires `luarocks`. Try one of the following:", " - fix your `luarocks` installation", - Config.options.rocks.hererocks and " - disable *hererocks* with `opts.rocks.hererocks = false`" + Config.hererocks() and " - disable *hererocks* with `opts.rocks.hererocks = false`" or " - enable `hererocks` with `opts.rocks.hererocks = true`", " - disable `luarocks` support completely with `opts.rocks.enabled = false`", }) @@ -132,7 +132,7 @@ function M.build(task) local env = {} local luarocks = "luarocks" - if Config.options.rocks.hererocks then + if Config.hererocks() then -- hererocks is still building, so skip for now -- a new build will happen in the next round if M.hererocks.building() then From 09f69bae4bb9661318599b3668e9fd19954cd7c7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 12:00:15 +0200 Subject: [PATCH 1456/1610] ci: dispatch docs gen from main --- .github/workflows/ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d1f514d..678322d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,6 +26,13 @@ jobs: nvim --version [ ! -d tests ] && exit 0 ./tests/run + docs: + runs-on: ubuntu-latest + needs: tests + steps: + - name: Generate Docs + shell: bash + run: gh workflow run "Deploy to Github Pages" --ref docs community: runs-on: ubuntu-latest steps: @@ -61,6 +68,7 @@ jobs: if: ${{ github.ref == 'refs/heads/main' }} needs: - tests + - docs runs-on: ubuntu-latest steps: - uses: googleapis/release-please-action@v4 From 07ccb49ace9ea4a5c1426ea0f620ad8fda28bf43 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 12:01:52 +0200 Subject: [PATCH 1457/1610] ci: set env for docs --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 678322d..cd2ff10 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,8 @@ jobs: docs: runs-on: ubuntu-latest needs: tests + env: + GH_TOKEN: ${{ github.token }} steps: - name: Generate Docs shell: bash From 440999fc5aa5073edd542a187c6cd65df2788a16 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 12:03:42 +0200 Subject: [PATCH 1458/1610] ci: fix --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cd2ff10..6b9c8e6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,13 +32,16 @@ jobs: env: GH_TOKEN: ${{ github.token }} steps: + - uses: actions/checkout@v4 + with: + ref: docs - name: Generate Docs shell: bash run: gh workflow run "Deploy to Github Pages" --ref docs community: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install Neovim shell: bash run: | From 332a7ff9b3d226529d8afda4e61979e8b410f350 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 12:06:54 +0200 Subject: [PATCH 1459/1610] ci: auto-commit-action v5 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6b9c8e6..029531d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,7 +62,7 @@ jobs: run: | nvim -l lua/lazy/build.lua - name: Push changes - uses: stefanzweifel/git-auto-commit-action@v4 + uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "chore(build): auto-generate rockspec mappings" commit_user_name: "github-actions[bot]" From a75d950b8f356733ad2d20c4bdb794179e6d4ff1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 13:52:50 +0200 Subject: [PATCH 1460/1610] fix(process): deal with process errors --- lua/lazy/manage/process.lua | 9 +++------ lua/lazy/util.lua | 13 +++++++++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index f29d978..c4a4baf 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -42,8 +42,8 @@ function Process.new(cmd, opts) opts = opts or {} opts.args = opts.args or {} if type(cmd) == "table" then - self.cmd = table.remove(cmd, 1) - vim.list_extend(opts.args, cmd) + self.cmd = cmd[1] + vim.list_extend(opts.args, vim.list_slice(cmd, 2)) else self.cmd = cmd end @@ -233,10 +233,7 @@ function M.exec(cmd, opts) opts = opts or {} local proc = M.spawn(cmd, opts) proc:wait() - if proc.code ~= 0 then - error("Process failed with code " .. proc.code) - end - return vim.split(proc.data, "\n") + return vim.split(proc.data, "\n"), proc.code end return M diff --git a/lua/lazy/util.lua b/lua/lazy/util.lua index d1ae7fd..fed140c 100644 --- a/lua/lazy/util.lua +++ b/lua/lazy/util.lua @@ -162,12 +162,21 @@ end ---@param opts? LazyCmdOptions|{filetype?:string} function M.float_cmd(cmd, opts) opts = opts or {} + local Process = require("lazy.manage.process") + local lines, code = Process.exec(cmd, { cwd = opts.cwd }) + if code ~= 0 then + M.error({ + "`" .. table.concat(cmd, " ") .. "`", + "", + "## Error", + table.concat(lines, "\n"), + }, { title = "Command Failed (" .. code .. ")" }) + return + end local float = M.float(opts) if opts.filetype then vim.bo[float.buf].filetype = opts.filetype end - local Process = require("lazy.manage.process") - local lines = Process.exec(cmd, { cwd = opts.cwd }) vim.api.nvim_buf_set_lines(float.buf, 0, -1, false, lines) vim.bo[float.buf].modifiable = false return float From 5d334b9f579aacd09603dd9e19b6730fbfcf4c72 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 13:58:13 +0200 Subject: [PATCH 1461/1610] fix(ui): save/restore view right before/after rendering --- lua/lazy/view/init.lua | 6 ------ lua/lazy/view/render.lua | 10 ++++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 26383da..b27a17e 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -147,13 +147,7 @@ end function M:update() if self.buf and vim.api.nvim_buf_is_valid(self.buf) then - vim.bo[self.buf].modifiable = true - local view = vim.api.nvim_win_call(self.view.win, vim.fn.winsaveview) self.render:update() - vim.api.nvim_win_call(self.view.win, function() - vim.fn.winrestview(view) - end) - vim.bo[self.buf].modifiable = false vim.cmd.redraw() end end diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 640e9b0..b7bd884 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -74,7 +74,17 @@ function M:update() end self:trim() + + vim.bo[self.view.buf].modifiable = true + local view = vim.api.nvim_win_call(self.view.win, vim.fn.winsaveview) + self:render(self.view.buf) + + vim.api.nvim_win_call(self.view.win, function() + vim.fn.winrestview(view) + end) + vim.bo[self.view.buf].modifiable = false + vim.diagnostic.set( Config.ns, self.view.buf, From 5bddef2415240b0fe620bb3dfec31a678bd670d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 29 Jun 2024 13:59:37 +0200 Subject: [PATCH 1462/1610] chore(main): release 11.8.2 (#1586) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 01a094f..a30099e 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.8.1" + ".": "11.8.2" } diff --git a/CHANGELOG.md b/CHANGELOG.md index ec7ec51..3fe0915 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [11.8.2](https://github.com/folke/lazy.nvim/compare/v11.8.1...v11.8.2) (2024-06-29) + + +### Bug Fixes + +* **process:** deal with process errors ([a75d950](https://github.com/folke/lazy.nvim/commit/a75d950b8f356733ad2d20c4bdb794179e6d4ff1)) +* **ui:** save/restore view right before/after rendering ([5d334b9](https://github.com/folke/lazy.nvim/commit/5d334b9f579aacd09603dd9e19b6730fbfcf4c72)) + + +### Performance Improvements + +* **rocks:** `vim.fn.executable` is slow on WSL2, so only check for `luarocks` when needed. Closes [#1585](https://github.com/folke/lazy.nvim/issues/1585) ([9ab3061](https://github.com/folke/lazy.nvim/commit/9ab306169060eeab7ebca00653318683e72ab62d)) + ## [11.8.1](https://github.com/folke/lazy.nvim/compare/v11.8.0...v11.8.1) (2024-06-29) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index cb360ec..4dc2419 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.8.1" -- x-release-please-version +M.version = "11.8.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 37729140751577e87318c137d90d0e6bb00ceff1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 14:12:57 +0200 Subject: [PATCH 1463/1610] fix(ui): when closing details, jump to plugin header. Closes #1338 --- lua/lazy/view/init.lua | 12 +++++++++++- lua/lazy/view/render.lua | 9 +++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index b27a17e..6ff3c81 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -96,7 +96,17 @@ function M.create() name = plugin.name, kind = plugin._.kind, } - self.state.plugin = not vim.deep_equal(self.state.plugin, selected) and selected or nil + + local open = not vim.deep_equal(self.state.plugin, selected) + + if not open then + local row = self.render:get_row(selected) + if row then + vim.api.nvim_win_set_cursor(self.view.win, { row, 8 }) + end + end + + self.state.plugin = open and selected or nil self:update() end end) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index b7bd884..c128147 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -122,6 +122,15 @@ function M:get_plugin(row) end end +---@param selected {name:string, kind?: LazyPluginKind} +function M:get_row(selected) + for _, loc in ipairs(self.locations) do + if loc.kind == selected.kind and loc.name == selected.name then + return loc.from + end + end +end + function M:title() self:nl() local modes = vim.tbl_filter(function(c) From 5e3c112cb32c9cb6e8622aab4446358e039def7c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 29 Jun 2024 14:22:53 +0200 Subject: [PATCH 1464/1610] feat(ui): use [[ & ]] to navigate between plugins. Fixes #1463 --- lua/lazy/view/config.lua | 2 ++ lua/lazy/view/init.lua | 22 ++++++++++++++++++++++ lua/lazy/view/render.lua | 10 +++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index e834573..d65f03c 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -34,6 +34,8 @@ M.keys = { profile_sort = "<C-s>", profile_filter = "<C-f>", abort = "<C-c>", + next = "]]", + prev = "[[", } ---@type table<string,LazyViewCommand> diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 6ff3c81..468ac8a 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -111,6 +111,28 @@ function M.create() end end) + self:on_key(ViewConfig.keys.next, function() + local cursor = vim.api.nvim_win_get_cursor(self.view.win) + for l = 1, #self.render.locations, 1 do + local loc = self.render.locations[l] + if loc.from > cursor[1] then + vim.api.nvim_win_set_cursor(self.view.win, { loc.from, 8 }) + return + end + end + end) + + self:on_key(ViewConfig.keys.prev, function() + local cursor = vim.api.nvim_win_get_cursor(self.view.win) + for l = #self.render.locations, 1, -1 do + local loc = self.render.locations[l] + if loc.from < cursor[1] then + vim.api.nvim_win_set_cursor(self.view.win, { loc.from, 8 }) + return + end + end + end) + 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 diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index c128147..e1eec6c 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -201,7 +201,15 @@ function M:help() :nl() self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl():nl() - self:append("Use "):append("<d>", "LazySpecial"):append(" on a commit or plugin to open the diff view"):nl() + self:append("Use "):append("<d>", "LazySpecial"):append(" on a commit or plugin to open the diff view"):nl():nl() + self + :append("Use ") + :append("<]]>", "LazySpecial") + :append(" and ") + :append("<[[>", "LazySpecial") + :append(" to navigate between plugins") + :nl() + :nl() self:nl() self:append("Keyboard Shortcuts", "LazyH2"):nl() From 0507e19289539396313503f6eb6b02bbe8a5e483 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 29 Jun 2024 17:01:41 +0200 Subject: [PATCH 1465/1610] chore(main): release 11.9.0 (#1587) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index a30099e..9918aa5 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.8.2" + ".": "11.9.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fe0915..d8fe701 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [11.9.0](https://github.com/folke/lazy.nvim/compare/v11.8.2...v11.9.0) (2024-06-29) + + +### Features + +* **ui:** use [[ & ]] to navigate between plugins. Fixes [#1463](https://github.com/folke/lazy.nvim/issues/1463) ([5e3c112](https://github.com/folke/lazy.nvim/commit/5e3c112cb32c9cb6e8622aab4446358e039def7c)) + + +### Bug Fixes + +* **ui:** when closing details, jump to plugin header. Closes [#1338](https://github.com/folke/lazy.nvim/issues/1338) ([3772914](https://github.com/folke/lazy.nvim/commit/37729140751577e87318c137d90d0e6bb00ceff1)) + ## [11.8.2](https://github.com/folke/lazy.nvim/compare/v11.8.1...v11.8.2) (2024-06-29) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4dc2419..9319999 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.8.2" -- x-release-please-version +M.version = "11.9.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From c7ed87f9ca03ea412134d6a6ea55b43232eb6b0c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 30 Jun 2024 08:48:03 +0200 Subject: [PATCH 1466/1610] perf: automatically suspend the scheduler when all threads are waiting (#1591) * perf: automatically suspend the scheduler when all threads are waiting * ci: fix ci * test: cleanup --- .github/workflows/ci.yml | 4 +- lua/lazy/async.lua | 85 ++++++++++++++++++++++------------- lua/lazy/manage/runner.lua | 39 +++++++++------- lua/lazy/manage/task/git.lua | 1 + tests/core/init_spec.lua | 1 - tests/core/plugin_spec.lua | 2 - tests/handlers/keys_spec.lua | 1 - tests/manage/process_spec.lua | 1 - tests/manage/task_spec.lua | 1 - 9 files changed, 81 insertions(+), 54 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 029531d..1a2ed40 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,7 @@ jobs: ./tests/run docs: runs-on: ubuntu-latest + if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} needs: tests env: GH_TOKEN: ${{ github.token }} @@ -40,6 +41,7 @@ jobs: run: gh workflow run "Deploy to Github Pages" --ref docs community: runs-on: ubuntu-latest + if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} steps: - uses: actions/checkout@v4 - name: Install Neovim @@ -70,7 +72,7 @@ jobs: commit_author: "github-actions[bot] <github-actions[bot]@users.noreply.github.com>" release: name: release - if: ${{ github.ref == 'refs/heads/main' }} + if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} needs: - tests - docs diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index 58145a6..7848b7d 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -1,11 +1,14 @@ +local Util = require("lazy.core.util") + local M = {} ---@type Async[] -M._queue = {} -M._executor = assert(vim.loop.new_timer()) +M._active = {} +---@type Async[] +M._suspended = {} +M._executor = assert(vim.loop.new_check()) -M.TIMER = 10 -M.BUDGET = 100 +M.BUDGET = 10 ---@type table<thread, Async> M._threads = setmetatable({}, { __mode = "k" }) @@ -42,11 +45,6 @@ function Async:init(fn) return M.add(self) end -function Async:restart() - assert(not self:running(), "Cannot restart a running async") - self:init(self._fn) -end - ---@param event AsyncEvent ---@param cb async fun(res:any, async:Async) function Async:on(event, cb) @@ -77,27 +75,41 @@ function Async:sleep(ms) end ---@async -function Async:suspend() +---@param yield? boolean +function Async:suspend(yield) self._suspended = true - if coroutine.running() == self._co then + if coroutine.running() == self._co and yield ~= false then coroutine.yield() end end function Async:resume() self._suspended = false + M._run() end -function Async:wait() +---@async +---@param yield? boolean +function Async:wake(yield) local async = M.running() + assert(async, "Not in an async context") + self:on("done", function() + async:resume() + end) + async:suspend(yield) +end + +---@async +function Async:wait() if coroutine.running() == self._co then error("Cannot wait on self") end - while self:running() do - if async then - coroutine.yield() - else + local async = M.running() + if async then + self:wake() + else + while self:running() do vim.wait(10) end end @@ -121,35 +133,44 @@ function Async:step() end function M.step() - local budget = M.BUDGET * 1e6 local start = vim.uv.hrtime() - local count = #M._queue - local i = 0 - while #M._queue > 0 and vim.uv.hrtime() - start < budget do - ---@type Async - local state = table.remove(M._queue, 1) - if state:step() then - table.insert(M._queue, state) - end - i = i + 1 - if i >= count then + for _ = 1, #M._active do + if vim.uv.hrtime() - start > M.BUDGET * 1e6 then break end + local state = table.remove(M._active, 1) + if state:step() then + if state._suspended then + table.insert(M._suspended, state) + else + table.insert(M._active, state) + end + end end - if #M._queue == 0 then + for _ = 1, #M._suspended do + local state = table.remove(M._suspended, 1) + table.insert(state._suspended and M._suspended or M._active, state) + end + + -- print("step", #M._active, #M._suspended) + if #M._active == 0 then return M._executor:stop() end end ---@param async Async function M.add(async) - table.insert(M._queue, async) - if not M._executor:is_active() then - M._executor:start(1, M.TIMER, vim.schedule_wrap(M.step)) - end + table.insert(M._active, async) + M._run() return async end +function M._run() + if not M._executor:is_active() then + M._executor:start(vim.schedule_wrap(M.step)) + end +end + function M.running() local co = coroutine.running() if co then diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index c5f5c75..d551ce5 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -78,6 +78,7 @@ function Runner:_start() ---@type number? local wait_step = nil + ---@async ---@param resume? boolean local function continue(resume) active = 0 @@ -114,22 +115,30 @@ function Runner:_start() end local s = state[name] local plugin = self:plugin(name) - if s.step == #self._pipeline then - -- done - s.task = nil - plugin._.working = false - elseif s.step < #self._pipeline then - -- next - s.step = s.step + 1 - local step = self._pipeline[s.step] - if step.task == "wait" then + while s.step <= #self._pipeline do + if s.step == #self._pipeline then + -- done + s.task = nil plugin._.working = false - waiting = waiting + 1 - wait_step = s.step - else - s.task = self:queue(plugin, step) - plugin._.working = true - active = active + 1 + break + elseif s.step < #self._pipeline then + -- next + s.step = s.step + 1 + local step = self._pipeline[s.step] + if step.task == "wait" then + plugin._.working = false + waiting = waiting + 1 + wait_step = s.step + break + else + s.task = self:queue(plugin, step) + plugin._.working = true + if s.task then + active = active + 1 + s.task:wake(false) + break + end + end end end end diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 4bd7134..774df16 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -21,6 +21,7 @@ M.log = { ---@async ---@param opts {args?: string[], updated?:boolean, check?:boolean} run = function(self, opts) + -- self:spawn({ "sleep", "5" }) local args = { "log", "--pretty=format:%h %s (%cr)", diff --git a/tests/core/init_spec.lua b/tests/core/init_spec.lua index 4970871..356f8e4 100644 --- a/tests/core/init_spec.lua +++ b/tests/core/init_spec.lua @@ -1,4 +1,3 @@ ----@module 'luassert' local Util = require("lazy.core.util") describe("init", function() diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index d810339..166dc2a 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -1,5 +1,3 @@ ----@module 'luassert' - local Config = require("lazy.core.config") local Handler = require("lazy.core.handler") local Plugin = require("lazy.core.plugin") diff --git a/tests/handlers/keys_spec.lua b/tests/handlers/keys_spec.lua index d6a9df4..6254db8 100644 --- a/tests/handlers/keys_spec.lua +++ b/tests/handlers/keys_spec.lua @@ -1,4 +1,3 @@ ----@module 'luassert' local Keys = require("lazy.core.handler.keys") describe("keys", function() diff --git a/tests/manage/process_spec.lua b/tests/manage/process_spec.lua index 0fbbe89..03b653e 100644 --- a/tests/manage/process_spec.lua +++ b/tests/manage/process_spec.lua @@ -1,4 +1,3 @@ ----@module 'luassert' local Async = require("lazy.async") local Process = require("lazy.manage.process") diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index e161fa2..fdd9c35 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -1,4 +1,3 @@ ----@module 'luassert' --# selene:allow(incorrect_standard_library_use) local Task = require("lazy.manage.task") From 2f4ac035bcc66292250de7134d73007b147f64e8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 30 Jun 2024 09:13:04 +0200 Subject: [PATCH 1467/1610] perf: suspend when tasks are active --- lua/lazy/async.lua | 19 ++++++++++++++++++- lua/lazy/manage/runner.lua | 4 +++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index 7848b7d..5cbdb1b 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -152,12 +152,29 @@ function M.step() table.insert(state._suspended and M._suspended or M._active, state) end - -- print("step", #M._active, #M._suspended) + -- M.debug() if #M._active == 0 then return M._executor:stop() end end +function M.debug() + local lines = { + "- active: " .. #M._active, + "- suspended: " .. #M._suspended, + } + for _, async in ipairs(M._active) do + local info = debug.getinfo(async._fn) + local file = vim.fn.fnamemodify(info.short_src:sub(1), ":~:.") + table.insert(lines, ("%s:%d"):format(file, info.linedefined)) + if #lines > 10 then + break + end + end + local msg = table.concat(lines, "\n") + M._notif = vim.notify(msg, nil, { replace = M._notif }) +end + ---@param async Async function M.add(async) table.insert(M._active, async) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index d551ce5..81dcde0 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -153,7 +153,9 @@ function Runner:_start() end continue(true) end - coroutine.yield() + if active > 0 then + self._running:suspend() + end end end From c882227f1fdc4580d14212df8f814a0772951e3d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 30 Jun 2024 12:47:41 +0200 Subject: [PATCH 1468/1610] chore(main): release 11.9.1 (#1592) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 9918aa5..67fa05d 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.9.0" + ".": "11.9.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index d8fe701..01bbc13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [11.9.1](https://github.com/folke/lazy.nvim/compare/v11.9.0...v11.9.1) (2024-06-30) + + +### Performance Improvements + +* automatically suspend the scheduler when all threads are waiting ([#1591](https://github.com/folke/lazy.nvim/issues/1591)) ([c7ed87f](https://github.com/folke/lazy.nvim/commit/c7ed87f9ca03ea412134d6a6ea55b43232eb6b0c)) +* suspend when tasks are active ([2f4ac03](https://github.com/folke/lazy.nvim/commit/2f4ac035bcc66292250de7134d73007b147f64e8)) + ## [11.9.0](https://github.com/folke/lazy.nvim/compare/v11.8.2...v11.9.0) (2024-06-29) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9319999..c51f680 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.9.0" -- x-release-please-version +M.version = "11.9.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 1fad61712bd3937dda925775a7736b8efbcbf1a7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 30 Jun 2024 13:35:11 +0200 Subject: [PATCH 1469/1610] fix(async): make asyncs abortable --- lua/lazy/async.lua | 21 +++++++++++++++++---- lua/lazy/core/util.lua | 4 ++++ lua/lazy/manage/process.lua | 2 +- lua/lazy/view/float.lua | 3 ++- lua/lazy/view/init.lua | 1 + tests/manage/runner_spec.lua | 3 ++- tests/manage/task_spec.lua | 3 ++- 7 files changed, 29 insertions(+), 8 deletions(-) diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index 5cbdb1b..7a865b3 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -79,7 +79,7 @@ end function Async:suspend(yield) self._suspended = true if coroutine.running() == self._co and yield ~= false then - coroutine.yield() + M.yield() end end @@ -132,12 +132,25 @@ function Async:step() return self:running() end +function M.abort() + for _, async in ipairs(M._active) do + coroutine.resume(async._co, "abort") + end +end + +function M.yield() + if coroutine.yield() == "abort" then + error("aborted", 2) + end +end + function M.step() local start = vim.uv.hrtime() for _ = 1, #M._active do - if vim.uv.hrtime() - start > M.BUDGET * 1e6 then + if Util.exiting() or vim.uv.hrtime() - start > M.BUDGET * 1e6 then break end + local state = table.remove(M._active, 1) if state:step() then if state._suspended then @@ -153,7 +166,7 @@ function M.step() end -- M.debug() - if #M._active == 0 then + if #M._active == 0 or Util.exiting() then return M._executor:stop() end end @@ -183,7 +196,7 @@ function M.add(async) end function M._run() - if not M._executor:is_active() then + if not Util.exiting() and not M._executor:is_active() then M._executor:start(vim.schedule_wrap(M.step)) end end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index f42cf6a..34ca1d6 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -29,6 +29,10 @@ function M.track(data, time) end end +function M.exiting() + return vim.v.exiting ~= vim.NIL +end + ---@generic T ---@param list T[] ---@param fn fun(v: T):boolean? diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index c4a4baf..0a67a14 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -93,7 +93,7 @@ function Process:_run() end) self:suspend() while not (self.handle:is_closing() and stdout:is_closing() and stderr:is_closing()) do - coroutine.yield() + Async.yield() end else self.data = "Failed to spawn process " .. self.cmd .. " " .. vim.inspect(self.opts) diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index d57b384..3a59069 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -252,7 +252,7 @@ end ---@param fn fun(self?) ---@param desc? string ---@param mode? string[] -function M:on_key(key, fn, desc,mode) +function M:on_key(key, fn, desc, mode) vim.keymap.set(mode or "n", key, function() fn(self) end, { @@ -295,6 +295,7 @@ function M:close(opts) vim.diagnostic.reset(Config.ns, buf) vim.api.nvim_buf_delete(buf, { force = true }) end + vim.cmd.redraw() end) end diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 468ac8a..313d3ad 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -83,6 +83,7 @@ function M.create() vim.keymap.set("n", ViewConfig.keys.abort, function() require("lazy.manage.process").abort() + require("lazy.async").abort() return ViewConfig.keys.abort end, { silent = true, buffer = self.buf, expr = true }) diff --git a/tests/manage/runner_spec.lua b/tests/manage/runner_spec.lua index 925aaf1..a2507c9 100644 --- a/tests/manage/runner_spec.lua +++ b/tests/manage/runner_spec.lua @@ -1,3 +1,4 @@ +local Async = require("lazy.async") local Runner = require("lazy.manage.runner") describe("runner", function() @@ -33,7 +34,7 @@ describe("runner", function() ---@async ---@param task LazyTask run = function(task) - coroutine.yield() + Async.yield() table.insert(runs, { plugin = task.plugin.name, task = task.name }) end, } diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index fdd9c35..f41eb80 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -1,4 +1,5 @@ --# selene:allow(incorrect_standard_library_use) +local Async = require("lazy.async") local Task = require("lazy.manage.task") describe("task", function() @@ -42,7 +43,7 @@ describe("task", function() local running = true ---@async local task = Task.new(plugin, "test", function() - coroutine.yield() + Async.yield() running = false end, opts) assert(task:running()) From a9d7ade203b3f3ee3058c082c62afdf8e4bcb416 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 1 Jul 2024 07:07:49 +0200 Subject: [PATCH 1470/1610] perf(plugin): minor optim to resolve imports a bit faster --- lua/lazy/core/plugin.lua | 5 ++++- lua/lazy/core/util.lua | 16 +++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 26b3f6e..f9bd04f 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -150,8 +150,11 @@ function Spec:import(spec) local modspecs = {} if type(import) == "string" then - Util.lsmod(import, function(modname) + Util.lsmod(import, function(modname, modpath) modspecs[#modspecs + 1] = modname + package.preload[modname] = function() + return loadfile(modpath)() + end end) table.sort(modspecs) else diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 34ca1d6..185527b 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -287,7 +287,7 @@ function M.find_root(modname) local ret = require("lazy.core.cache").find(modname, { rtp = true, paths = paths, - patterns = { "", ".lua" }, + patterns = { ".lua", "" }, })[1] if not ret and cached then @@ -295,25 +295,27 @@ function M.find_root(modname) ret = require("lazy.core.cache").find(modname, { rtp = false, paths = paths, - patterns = { "", ".lua" }, + patterns = { ".lua", "" }, })[1] end if ret then - local root = ret.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - return root + return ret.modpath:gsub("%.lua$", ""), ret.modpath end end ---@param modname string ---@param fn fun(modname:string, modpath:string) function M.lsmod(modname, fn) - local root = M.find_root(modname) + local root, match = M.find_root(modname) if not root then return end - if vim.uv.fs_stat(root .. ".lua") then - fn(modname, root .. ".lua") + if match:sub(-4) == ".lua" then + fn(modname, match) + if not vim.uv.fs_stat(root) then + return + end end M.ls(root, function(path, name, type) From d0921f5b9b3d2c5e09618da55a018228edcc4d16 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 2 Jul 2024 13:42:53 +0200 Subject: [PATCH 1471/1610] fix(health): check for errors when executing commands. Closes #1599 --- lua/lazy/health.lua | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index b3bf6f2..9e2a869 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -37,13 +37,17 @@ function M.have(cmd, opts) for _, c in ipairs(cmd) do if vim.fn.executable(c) == 1 then local version = vim.fn.system(c .. " " .. opts.version) or "" - version = vim.trim(vim.split(version, "\n")[1]) - 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)) + if vim.v.shell_error ~= 0 then + opts.error(("failed to get version of {%s}\n%s"):format(c, version)) else - found = ("{%s} `%s`"):format(c, version) - break + version = vim.trim(vim.split(version, "\n")[1]) + 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)) + else + found = ("{%s} `%s`"):format(c, version) + break + end end end end From 36c85945ee4ba7553132bfc07280817c8f578e18 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2024 08:20:37 +0000 Subject: [PATCH 1472/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index eae1268..ccf4829 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -157,7 +157,16 @@ STRUCTURED SETUP *lazy.nvim-🛠️-installation-structured-setup* 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" - vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + 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) @@ -196,7 +205,16 @@ SINGLE FILE SETUP *lazy.nvim-🛠️-installation-single-file-setup* 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" - vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + 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) From cea5920abb202753004440f94ec39bcf2927e02e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2024 12:11:21 +0200 Subject: [PATCH 1473/1610] chore(main): release 11.9.2 (#1595) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 67fa05d..cd35eb4 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.9.1" + ".": "11.9.2" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 01bbc13..84044cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [11.9.2](https://github.com/folke/lazy.nvim/compare/v11.9.1...v11.9.2) (2024-07-02) + + +### Bug Fixes + +* **async:** make asyncs abortable ([1fad617](https://github.com/folke/lazy.nvim/commit/1fad61712bd3937dda925775a7736b8efbcbf1a7)) +* **health:** check for errors when executing commands. Closes [#1599](https://github.com/folke/lazy.nvim/issues/1599) ([d0921f5](https://github.com/folke/lazy.nvim/commit/d0921f5b9b3d2c5e09618da55a018228edcc4d16)) + + +### Performance Improvements + +* **plugin:** minor optim to resolve imports a bit faster ([a9d7ade](https://github.com/folke/lazy.nvim/commit/a9d7ade203b3f3ee3058c082c62afdf8e4bcb416)) + ## [11.9.1](https://github.com/folke/lazy.nvim/compare/v11.9.0...v11.9.1) (2024-06-30) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c51f680..b7f5c14 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.9.1" -- x-release-please-version +M.version = "11.9.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 0f2786bcc91347188627534471ee75c3f6f16b2d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 4 Jul 2024 15:17:02 +0200 Subject: [PATCH 1474/1610] feat(profiling): merge VeryLazy stats and show startuptime in profile view --- lua/lazy/core/handler/event.lua | 8 ++++++-- lua/lazy/core/util.lua | 2 ++ lua/lazy/stats.lua | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/handler/event.lua b/lua/lazy/core/handler/event.lua index aff4572..a34e0c5 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -75,7 +75,9 @@ function M:_add(event) end -- HACK: work-around for https://github.com/neovim/neovim/issues/25526 done = true - Util.track({ [self.type] = event.id }) + if event.id ~= "VeryLazy" then + Util.track({ [self.type] = event.id }) + end local state = M.get_state(ev.event, ev.buf, ev.data) @@ -86,7 +88,9 @@ function M:_add(event) for _, s in ipairs(state) do M.trigger(s) end - Util.track() + if event.id ~= "VeryLazy" then + Util.track() + end end, }) end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 185527b..6d7c3b8 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -171,7 +171,9 @@ function M.very_lazy() return end vim.g.did_very_lazy = true + M.track({ event = "VeryLazy" }) vim.api.nvim_exec_autocmds("User", { pattern = "VeryLazy", modeline = false }) + M.track() end) end diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index 36865db..015a2be 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -21,6 +21,7 @@ M.C = nil function M.on_ui_enter() M._stats.startuptime = M.track("UIEnter") + require("lazy.core.util").track({ start = "startuptime" }, M._stats.startuptime * 1e6) vim.api.nvim_exec_autocmds("User", { pattern = "LazyVimStarted", modeline = false }) end From 6fdd904ee45b66d933c5d2f72bcec337e13744f8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 4 Jul 2024 15:19:41 +0200 Subject: [PATCH 1475/1610] fix(config): determine headless only during startup. Fixes #1608 --- lua/lazy/core/config.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index b7f5c14..f77a29d 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -253,8 +253,9 @@ M.mapleader = nil ---@type string M.maplocalleader = nil +local headless = #vim.api.nvim_list_uis() == 0 function M.headless() - return #vim.api.nvim_list_uis() == 0 + return headless end ---@param opts? LazyConfig From 923e1aa7a49d945afa4c03da4f8ff052cd6d14a6 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 4 Jul 2024 16:16:39 +0200 Subject: [PATCH 1476/1610] fix(plugin): local spec name --- lua/lazy/core/plugin.lua | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index f9bd04f..d121fdf 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -275,15 +275,6 @@ function M.update_rocks_state() end end ----@param path string -function M.local_spec(path) - local file = vim.secure.read(path) - if file then - return loadstring(file)() - end - return {} -end - ---@return LazySpecImport? function M.find_local_spec() if not Config.options.local_spec then @@ -298,7 +289,7 @@ function M.find_local_spec() import = function() local data = vim.secure.read(file) if data then - return loadstring(data)() + return loadstring(data, M.LOCAL_SPEC)() end return {} end, From a17ad27435eb710e5e942b60a717d2a6af98c38e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 4 Jul 2024 17:53:45 +0200 Subject: [PATCH 1477/1610] build: better minit --- bootstrap.lua | 19 ++++------ lua/lazy/minit.lua | 65 +++++++++++++++++++++++++++------ tests/{busted.lua => minit.lua} | 7 ++-- tests/run | 2 +- 4 files changed, 67 insertions(+), 26 deletions(-) rename tests/{busted.lua => minit.lua} (59%) diff --git a/bootstrap.lua b/bootstrap.lua index e39db4d..dfafd59 100644 --- a/bootstrap.lua +++ b/bootstrap.lua @@ -13,6 +13,10 @@ function M.setup() end end + if vim.env.LAZY_PATH and not vim.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 vim.api.nvim_echo({ @@ -26,19 +30,12 @@ function M.setup() pcall(vim.fn.system, { "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) if not ok or vim.v.shell_error ~= 0 then vim.api.nvim_echo({ - { - "Failed to clone lazy.nvim\n", - "ErrorMsg", - }, - { - vim.trim(out or ""), - "WarningMsg", - }, - { "\nPress any key to exit", "MoreMsg" }, + { "Failed to clone lazy.nvim\n", "ErrorMsg" }, + { vim.trim(out or ""), "WarningMsg" }, + { "\nPress any key to exit...", "MoreMsg" }, }, true, {}) - vim.fn.getchar() - vim.cmd([[quit]]) + os.exit(1) end end vim.opt.rtp:prepend(lazypath) diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index 7da2b2a..3874a18 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -20,11 +20,27 @@ function M.extend(defaults, opts) return vim.tbl_deep_extend("force", defaults, opts, { spec = spec }) end +---@param opts LazyConfig function M.setup(opts) opts = M.extend({ change_detection = { enabled = false }, }, opts) + local args = {} + local is_busted = false + for _, a in ipairs(_G.arg) do + if a == "--busted" then + is_busted = true + else + table.insert(args, a) + end + end + _G.arg = args + + if is_busted then + opts = M.busted.setup(opts) + end + -- set stdpaths to use .tests if vim.env.LAZY_STDPATH then local root = vim.fn.fnamemodify(vim.env.LAZY_STDPATH, ":p") @@ -48,6 +64,10 @@ function M.setup(opts) vim.cmd.close() end end + + if is_busted then + M.busted.run() + end end function M.repro(opts) @@ -68,18 +88,9 @@ function M.repro(opts) M.setup(opts) end ----@param opts LazyConfig -function M.busted(opts) - opts = M.extend({ - spec = { - "lunarmodules/busted", - { dir = vim.fn.fnamemodify(".", ":p") }, - }, - rocks = { hererocks = true }, - }, opts) - - M.setup(opts) +M.busted = {} +function M.busted.run() local Config = require("lazy.core.config") -- disable termnial output for the tests Config.options.headless = {} @@ -93,4 +104,36 @@ function M.busted(opts) }) or os.exit(1) end +---@param opts LazyConfig +function M.busted.setup(opts) + local args = table.concat(_G.arg, " ") + local json = args:find("--output[ =]json") + + return M.extend({ + spec = { + "lunarmodules/busted", + { dir = vim.uv.cwd() }, + }, + headless = { + process = not json, + log = not json, + task = not json, + }, + rocks = { hererocks = true }, + }, opts) +end + +---@param opts LazyConfig +function M.busted.init(opts) + opts = M.busted.setup(opts) + M.setup(opts) + M.busted.run() +end + +setmetatable(M.busted, { + __call = function(_, opts) + M.busted.init(opts) + end, +}) + return M diff --git a/tests/busted.lua b/tests/minit.lua similarity index 59% rename from tests/busted.lua rename to tests/minit.lua index 7292d3e..e62be39 100755 --- a/tests/busted.lua +++ b/tests/minit.lua @@ -5,7 +5,8 @@ vim.env.LAZY_STDPATH = ".tests" vim.opt.rtp:prepend(".") -- Setup lazy.nvim -require("lazy.minit").busted({ - spec = {}, - stdpath = ".tests", +require("lazy.minit").setup({ + spec = { + { dir = vim.uv.cwd() }, + }, }) diff --git a/tests/run b/tests/run index 7872f5a..f1399de 100755 --- a/tests/run +++ b/tests/run @@ -1,3 +1,3 @@ #!/bin/sh -nvim -l tests/busted.lua tests -o utfTerminal "$@" +nvim -l tests/minit.lua --busted tests -o utfTerminal "$@" From 1225f1dc60342d82b9de031406c66516c3dfc564 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 4 Jul 2024 18:00:59 +0200 Subject: [PATCH 1478/1610] ci: dont enable local specs for minit --- lua/lazy/minit.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index 3874a18..838ac36 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -23,6 +23,7 @@ end ---@param opts LazyConfig function M.setup(opts) opts = M.extend({ + local_spec = false, change_detection = { enabled = false }, }, opts) From 851b12034d1eb77acda84537805740923af3fab4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 4 Jul 2024 18:05:36 +0200 Subject: [PATCH 1479/1610] ci: use main for bootstrap --- bootstrap.lua | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/bootstrap.lua b/bootstrap.lua index dfafd59..16d9f1d 100644 --- a/bootstrap.lua +++ b/bootstrap.lua @@ -26,8 +26,13 @@ function M.setup() }, }, true, {}) local lazyrepo = "https://github.com/folke/lazy.nvim.git" - local ok, out = - pcall(vim.fn.system, { "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + local ok, out = pcall(vim.fn.system, { + "git", + "clone", + "--filter=blob:none", + lazyrepo, + lazypath, + }) if not ok or vim.v.shell_error ~= 0 then vim.api.nvim_echo({ { "Failed to clone lazy.nvim\n", "ErrorMsg" }, From 407e65c7924989c1efed6bbc89e6287e2d140f02 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 21:01:57 +0200 Subject: [PATCH 1480/1610] chore(main): release 11.10.0 (#1609) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index cd35eb4..d58642f 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.9.2" + ".": "11.10.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 84044cd..a6ad34e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [11.10.0](https://github.com/folke/lazy.nvim/compare/v11.9.2...v11.10.0) (2024-07-04) + + +### Features + +* **profiling:** merge VeryLazy stats and show startuptime in profile view ([0f2786b](https://github.com/folke/lazy.nvim/commit/0f2786bcc91347188627534471ee75c3f6f16b2d)) + + +### Bug Fixes + +* **config:** determine headless only during startup. Fixes [#1608](https://github.com/folke/lazy.nvim/issues/1608) ([6fdd904](https://github.com/folke/lazy.nvim/commit/6fdd904ee45b66d933c5d2f72bcec337e13744f8)) +* **plugin:** local spec name ([923e1aa](https://github.com/folke/lazy.nvim/commit/923e1aa7a49d945afa4c03da4f8ff052cd6d14a6)) + ## [11.9.2](https://github.com/folke/lazy.nvim/compare/v11.9.1...v11.9.2) (2024-07-02) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f77a29d..28e942c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.9.2" -- x-release-please-version +M.version = "11.10.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From baac5517770abd6eee63d11cf4791ef5bf5702e8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 5 Jul 2024 09:01:01 +0200 Subject: [PATCH 1481/1610] fix(lockfile): keep cond=false and enabed=false in lockfile. Fixes #1535. Fixes #1606 --- lua/lazy/manage/lock.lua | 55 ++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/lua/lazy/manage/lock.lua b/lua/lazy/manage/lock.lua index c7ceb4e..a1b4c74 100644 --- a/lua/lazy/manage/lock.lua +++ b/lua/lazy/manage/lock.lua @@ -3,43 +3,43 @@ local Git = require("lazy.manage.git") local M = {} ----@type table<string, {commit:string, branch:string}> +---@alias LazyLockfile table<string, {commit:string, branch:string}> +---@type LazyLockfile M.lock = {} M._loaded = false function M.update() + M.load() vim.fn.mkdir(vim.fn.fnamemodify(Config.options.lockfile, ":p:h"), "p") local f = assert(io.open(Config.options.lockfile, "wb")) f:write("{\n") - M.lock = {} - ---@param plugin LazyPlugin - local plugins = vim.tbl_filter(function(plugin) - return not plugin._.is_local and plugin._.installed - end, Config.plugins) + -- keep disabled and cond plugins + for name in pairs(M.lock) do + if not (Config.spec.disabled[name] or Config.spec.ignore_installed[name]) then + M.lock[name] = nil + end + end + + for _, plugin in pairs(Config.plugins) do + if not plugin._.is_local and plugin._.installed then + local info = assert(Git.info(plugin.dir)) + M.lock[plugin.name] = { + branch = info.branch or assert(Git.get_branch(plugin)), + commit = assert(info.commit, "commit is nil"), + } + end + end - ---@param plugin LazyPlugin ---@type string[] - local names = vim.tbl_map(function(plugin) - return plugin.name - end, plugins) + local names = vim.tbl_keys(M.lock) table.sort(names) for n, name in ipairs(names) do - local plugin = Config.plugins[name] - if not plugin._.is_local and plugin._.installed then - local info = assert(Git.info(plugin.dir)) - if not info.branch then - info.branch = assert(Git.get_branch(plugin)) - end - info.commit = info.commit - -- f:write(([[ [%q] = { branch = %q, commit = %q },]]):format(name, info.branch, info.commit) .. "\n") - f:write(([[ %q: { "branch": %q, "commit": %q }]]):format(name, info.branch, info.commit)) - if n ~= #names then - f:write(",\n") - end - ---@diagnostic disable-next-line: assign-type-mismatch - M.lock[plugin.name] = info + local info = M.lock[name] + f:write(([[ %q: { "branch": %q, "commit": %q }]]):format(name, info.branch, info.commit)) + if n ~= #names then + f:write(",\n") end end f:write("\n}") @@ -47,6 +47,9 @@ function M.update() end function M.load() + if M._loaded then + return + end M.lock = {} M._loaded = true local f = io.open(Config.options.lockfile, "r") @@ -64,9 +67,7 @@ end ---@param plugin LazyPlugin ---@return {commit:string, branch:string} function M.get(plugin) - if not M._loaded then - M.load() - end + M.load() return M.lock[plugin.name] end From a1d23e80badccc407d6b289d1c366ff2888812b6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 07:31:34 +0000 Subject: [PATCH 1482/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index ccf4829..73bd0ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -291,23 +291,25 @@ SPEC LOADING *lazy.nvim-🔌-plugin-spec-spec-loading* SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup* - --------------------------------------------------------------------------------------------------- + -------------------------------------------------------------------------------------------------- Property Type Description - ---------- ----------------------------- ---------------------------------------------------------- - init fun(LazyPlugin) init functions are always executed during startup + ---------- ----------------------------- --------------------------------------------------------- + init fun(LazyPlugin) init functions are always executed during. 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 specs), - fun(LazyPlugin, opts:table) 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() + 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. See - also opts. To use the default implementation without opts - set config to true. + 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. @@ -316,7 +318,12 @@ SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup* 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* @@ -1241,6 +1248,8 @@ BEST PRACTICES *lazy.nvim-🔥-developers-best-practices* >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`. From 53661bb38c2b9b9eab84355b549c07b94f334d01 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 5 Jul 2024 16:00:54 +0200 Subject: [PATCH 1483/1610] ci: update --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + .github/dependabot.yml | 9 +-- .github/workflows/ci.yml | 99 +++------------------------ .github/workflows/community.yml | 30 ++++++++ .github/workflows/docs.yml | 20 ++++++ .github/workflows/labeler.yml | 8 +++ .github/workflows/pr.yml | 18 +++++ .github/workflows/stale.yml | 10 +++ .gitignore | 13 ++-- tests/run => scripts/test | 2 +- 10 files changed, 105 insertions(+), 105 deletions(-) create mode 100644 .github/workflows/community.yml create mode 100644 .github/workflows/docs.yml create mode 100644 .github/workflows/labeler.yml create mode 100644 .github/workflows/pr.yml create mode 100644 .github/workflows/stale.yml rename tests/run => scripts/test (78%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 4a77601..7f1e1ed 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -75,6 +75,7 @@ body: -- install plugins local plugins = { "folke/tokyonight.nvim", + -- add any other plugins here } require("lazy").setup(plugins, { diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0d08e26..5ace460 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,11 +1,6 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - version: 2 updates: - - package-ecosystem: "github-actions" # See documentation for possible values - directory: "/" # Location of package manifests + - package-ecosystem: "github-actions" + directory: "/" schedule: interval: "weekly" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1a2ed40..b88337a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,96 +1,15 @@ name: CI + on: push: + branches: [main, master] pull_request: jobs: - tests: - strategy: - matrix: - # os: [ubuntu-latest, windows-latest] - os: [ubuntu-latest] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v4 - - name: Install Neovim - shell: bash - run: | - mkdir -p /tmp/nvim - wget -q https://github.com/neovim/neovim/releases/download/nightly/nvim.appimage -O /tmp/nvim/nvim.appimage - cd /tmp/nvim - chmod a+x ./nvim.appimage - ./nvim.appimage --appimage-extract - echo "/tmp/nvim/squashfs-root/usr/bin/" >> $GITHUB_PATH - - name: Run Tests - run: | - nvim --version - [ ! -d tests ] && exit 0 - ./tests/run - docs: - runs-on: ubuntu-latest - if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} - needs: tests - env: - GH_TOKEN: ${{ github.token }} - steps: - - uses: actions/checkout@v4 - with: - ref: docs - - name: Generate Docs - shell: bash - run: gh workflow run "Deploy to Github Pages" --ref docs - community: - runs-on: ubuntu-latest - if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} - steps: - - uses: actions/checkout@v4 - - name: Install Neovim - shell: bash - run: | - mkdir -p /tmp/nvim - wget -q https://github.com/neovim/neovim/releases/download/nightly/nvim.appimage -O /tmp/nvim/nvim.appimage - cd /tmp/nvim - chmod a+x ./nvim.appimage - ./nvim.appimage --appimage-extract - echo "/tmp/nvim/squashfs-root/usr/bin/" >> $GITHUB_PATH - - name: Rockspec Build - id: rockspec-build - uses: actions/cache@v4 - with: - path: build - key: rockspec-build - - name: Generate Rockspec - if: steps.rockspec-build.cache-hit != 'true' - run: | - nvim -l lua/lazy/build.lua - - name: Push changes - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: "chore(build): auto-generate rockspec mappings" - commit_user_name: "github-actions[bot]" - commit_user_email: "github-actions[bot]@users.noreply.github.com" - commit_author: "github-actions[bot] <github-actions[bot]@users.noreply.github.com>" - release: - name: release - if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} - needs: - - tests - - docs - runs-on: ubuntu-latest - steps: - - uses: googleapis/release-please-action@v4 - id: release - with: - config-file: .github/release-please-config.json - manifest-file: .github/.release-please-manifest.json - - uses: actions/checkout@v4 - - name: tag stable versions - if: ${{ steps.release.outputs.release_created }} - run: | - git config user.name github-actions[bot] - git config user.email github-actions[bot]@users.noreply.github.com - git remote add gh-token "https://${{ secrets.GITHUB_TOKEN }}@github.com/google-github-actions/release-please-action.git" - git tag -d stable || true - git push origin :stable || true - git tag -a stable -m "Last Stable Release" - git push origin stable + ci: + uses: folke/github/.github/workflows/ci.yml@main + secrets: inherit + with: + plugin: lazy.nvim + repo: folke/lazy.nvim + tests: true diff --git a/.github/workflows/community.yml b/.github/workflows/community.yml new file mode 100644 index 0000000..85d3248 --- /dev/null +++ b/.github/workflows/community.yml @@ -0,0 +1,30 @@ +name: Community +on: + push: + branches: + - main + +jobs: + community: + runs-on: ubuntu-latest + if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} + steps: + - uses: actions/checkout@v4 + - uses: folke/github/neovim@main + - name: Rockspec Build + id: rockspec-build + uses: actions/cache@v4 + with: + path: build + key: rockspec-build + - name: Generate Rockspec + if: steps.rockspec-build.cache-hit != 'true' + run: | + nvim -l lua/lazy/build.lua + - name: Push changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "chore(build): auto-generate rockspec mappings" + commit_user_name: "github-actions[bot]" + commit_user_email: "github-actions[bot]@users.noreply.github.com" + commit_author: "github-actions[bot] <github-actions[bot]@users.noreply.github.com>" diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..ee5e7c9 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,20 @@ +name: Docs +on: + push: + branches: + - main + +jobs: + docs: + runs-on: ubuntu-latest + if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} + needs: tests + env: + GH_TOKEN: ${{ github.token }} + steps: + - uses: actions/checkout@v4 + with: + ref: docs + - name: Generate Docs + shell: bash + run: gh workflow run "Deploy to Github Pages" --ref docs diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 0000000..0908727 --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,8 @@ +name: "PR Labeler" +on: + - pull_request_target + +jobs: + labeler: + uses: folke/github/.github/workflows/labeler.yml@main + secrets: inherit diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000..6d9df36 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,18 @@ +name: PR Title + +on: + pull_request_target: + types: + - opened + - edited + - synchronize + - reopened + - ready_for_review + +permissions: + pull-requests: read + +jobs: + pr-title: + uses: folke/github/.github/workflows/pr.yml@main + secrets: inherit diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..a0c704b --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,10 @@ +name: Stale Issues & PRs + +on: + schedule: + - cron: "30 1 * * *" + +jobs: + ci: + uses: folke/github/.github/workflows/stale.yml@main + secrets: inherit diff --git a/.gitignore b/.gitignore index 7217496..2b0bb7a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,8 @@ -tt.* -.tests -doc/tags -debug -.repro -foo.* *.log -data +.repro +.tests build +debug +doc/tags +foo.* +tt.* diff --git a/tests/run b/scripts/test similarity index 78% rename from tests/run rename to scripts/test index f1399de..4baf621 100755 --- a/tests/run +++ b/scripts/test @@ -1,3 +1,3 @@ -#!/bin/sh +#!/bin/env bash nvim -l tests/minit.lua --busted tests -o utfTerminal "$@" From 6186b3de3e1be15f3dc95fcf7c5ec121b69cbc52 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 5 Jul 2024 16:03:08 +0200 Subject: [PATCH 1484/1610] ci: add generated files to .styluaignore --- .styluaignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .styluaignore diff --git a/.styluaignore b/.styluaignore new file mode 100644 index 0000000..0ad920d --- /dev/null +++ b/.styluaignore @@ -0,0 +1 @@ +lua/lazy/community/_generated.lua From 61c7156b57191b8c90fb168dc22506b9482d52be Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:04:23 +0000 Subject: [PATCH 1485/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73bd0ae..89fb0a4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 05 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From d0c00e697a8202dae764d2cc5d9392cf50639515 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 5 Jul 2024 16:04:28 +0200 Subject: [PATCH 1486/1610] ci: remove tests dep --- .github/workflows/docs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index ee5e7c9..4b0363f 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -8,7 +8,6 @@ jobs: docs: runs-on: ubuntu-latest if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} - needs: tests env: GH_TOKEN: ${{ github.token }} steps: From 40e08f2b8a7ce27f20c339767ecdfa78e5250cc4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:05:18 +0000 Subject: [PATCH 1487/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 89fb0a4..73bd0ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 05 +*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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From 6ca23c15f64e88e3ba26be9795343c4c7f2ee851 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 16:13:11 +0200 Subject: [PATCH 1488/1610] chore(main): release 11.10.1 (#1612) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index d58642f..e6cb8da 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.10.0" + ".": "11.10.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index a6ad34e..97a2b89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [11.10.1](https://github.com/folke/lazy.nvim/compare/v11.10.0...v11.10.1) (2024-07-05) + + +### Bug Fixes + +* **lockfile:** keep cond=false and enabed=false in lockfile. Fixes [#1535](https://github.com/folke/lazy.nvim/issues/1535). Fixes [#1606](https://github.com/folke/lazy.nvim/issues/1606) ([baac551](https://github.com/folke/lazy.nvim/commit/baac5517770abd6eee63d11cf4791ef5bf5702e8)) + ## [11.10.0](https://github.com/folke/lazy.nvim/compare/v11.9.2...v11.10.0) (2024-07-04) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 28e942c..3bcb5ae 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.10.0" -- x-release-please-version +M.version = "11.10.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 11e802dbaa5d33a3c49cae73708aa160c3601b6e Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:13:53 +0000 Subject: [PATCH 1489/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73bd0ae..89fb0a4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 05 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From 894cd193e9ffc05dcb75ff0093c1b72880d5d9c1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:13:57 +0000 Subject: [PATCH 1490/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 89fb0a4..73bd0ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 05 +*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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From 538f060e42d60dedf058d478cc410c6b193bf188 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 5 Jul 2024 19:02:48 +0200 Subject: [PATCH 1491/1610] ci: update --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/ISSUE_TEMPLATE/config.yml | 5 +++++ .github/PULL_REQUEST_TEMPLATE.md | 12 ++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 7f1e1ed..4a77601 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -75,7 +75,6 @@ body: -- install plugins local plugins = { "folke/tokyonight.nvim", - -- add any other plugins here } require("lazy").setup(plugins, { diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..d6851ed --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Ask a question or start a discussion + url: https://github.com/folke/lazy.nvim/discussions + about: Use Github discussions instead diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..c064b8c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,12 @@ +## What is this PR for? + +<!-- Describe the big picture of your changes to communicate to the maintainers + why we should accept this pull request. --> + +## Does this PR fix an existing issue? + +<!-- + If this PR fixes any issues, please link to the issue here. + - Fixes #<issue_number> +--> + From 94b6b6703129bb659220720515655d2eaf36cbc3 Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Fri, 5 Jul 2024 17:03:29 +0000 Subject: [PATCH 1492/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73bd0ae..89fb0a4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 05 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From d901d2166fef0304e360316e7a04316f11ab62d0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 17:03:38 +0000 Subject: [PATCH 1493/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 89fb0a4..73bd0ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 05 +*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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From c3a9cec06b62c7fbd896644c13840f18fcc79e67 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 6 Jul 2024 11:45:24 +0200 Subject: [PATCH 1494/1610] ci: update --- .github/workflows/update.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/workflows/update.yml diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml new file mode 100644 index 0000000..2177a50 --- /dev/null +++ b/.github/workflows/update.yml @@ -0,0 +1,12 @@ +name: Update Repo + +on: + workflow_dispatch: + schedule: + # Run every hour + - cron: "0 * * * *" + +jobs: + ci: + uses: folke/github/.github/workflows/update.yml@main + secrets: inherit From e3154ff0b7055f1bcded818d52cb518cac899ee8 Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Sat, 6 Jul 2024 09:48:26 +0000 Subject: [PATCH 1495/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73bd0ae..cb18dda 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From c060de160a3cebb658969852d843915bc73a11ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 15:00:16 +0200 Subject: [PATCH 1496/1610] chore(update): update repository (#1616) Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action Co-authored-by: folke <292349+folke@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index d6851ed..8dba2f4 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - - name: Ask a question or start a discussion + - name: Ask a question url: https://github.com/folke/lazy.nvim/discussions about: Use Github discussions instead From 16ccd54360651ad2b27ee0117365f7a33577ea3c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 13:01:02 +0000 Subject: [PATCH 1497/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index cb18dda..73bd0ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 06 +*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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From 49a35d3c8c7f9cfe6eede9d351953c8ef17fcd35 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 18:05:10 +0200 Subject: [PATCH 1498/1610] chore(update): update repository (#1618) Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action Co-authored-by: folke <292349+folke@users.noreply.github.com> --- .github/PULL_REQUEST_TEMPLATE.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c064b8c..3f7c92e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,12 +1,16 @@ -## What is this PR for? +## Description <!-- Describe the big picture of your changes to communicate to the maintainers why we should accept this pull request. --> -## Does this PR fix an existing issue? +## Related Issue(s) <!-- If this PR fixes any issues, please link to the issue here. - Fixes #<issue_number> --> +## Screenshots + +<!-- Add screenshots of the changes if applicable. --> + From 1e7745a4a078b7e58ae673ca5a374e4439f443d1 Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Sat, 6 Jul 2024 16:05:47 +0000 Subject: [PATCH 1499/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73bd0ae..cb18dda 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From 0ff7e83c17c6eef181116954761ee8ed84db88a7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 16:05:52 +0000 Subject: [PATCH 1500/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index cb18dda..73bd0ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 06 +*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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From e6035dc59bcd71c395b1a39f15e418acc94e789a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 6 Jul 2024 23:18:28 +0200 Subject: [PATCH 1501/1610] ci: update --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b88337a..60f92cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,4 +12,3 @@ jobs: with: plugin: lazy.nvim repo: folke/lazy.nvim - tests: true From 23ea80b6a3230070989a730f6ba921a75d7d7057 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 6 Jul 2024 23:19:48 +0200 Subject: [PATCH 1502/1610] ci: update --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2b0bb7a..61ab828 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ build debug doc/tags foo.* +node_modules tt.* From 55b46b3993df75b015b8e294a8e5a244e8df415b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 6 Jul 2024 23:45:30 +0200 Subject: [PATCH 1503/1610] ci: update --- .gitignore | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 61ab828..771c835 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ *.log -.repro -.tests -build -debug -doc/tags +/.repro +/.tests +/build +/debug +/doc/tags foo.* node_modules tt.* From 933f0b596c7372daf534373ae9a11e98744b8636 Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Sat, 6 Jul 2024 21:46:26 +0000 Subject: [PATCH 1504/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73bd0ae..cb18dda 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 06 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From 81d2bfffdc8c84a40d25cae7fd4800178c19a138 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 7 Jul 2024 08:42:19 +0200 Subject: [PATCH 1505/1610] fix(git): only check for new commits for local plugins. Closes #1512 --- lua/lazy/manage/git.lua | 8 ++++++++ lua/lazy/manage/task/git.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index a365824..201e4e7 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -148,6 +148,14 @@ function M.get_target(plugin) 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) } +end + function M.ref(repo, ...) local ref = table.concat({ ... }, "/") diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 774df16..8e0ef48 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -36,7 +36,7 @@ M.log = { table.insert(args, self.plugin._.updated.from .. ".." .. (self.plugin._.updated.to or "HEAD")) elseif opts.check then local info = assert(Git.info(self.plugin.dir)) - local 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 for k, v in pairs(target) do error(k .. " '" .. v .. "' not found") From 23aeb224edf9c8da9e5613af0218f5a5380283d4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Jul 2024 06:43:02 +0000 Subject: [PATCH 1506/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index cb18dda..73bd0ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 06 +*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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From 89b264ac1d3c9752b22d4e61d16dc408a75d2a16 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Jul 2024 08:44:37 +0200 Subject: [PATCH 1507/1610] chore(main): release 11.10.2 (#1621) :robot: I have created a release *beep* *boop* --- ## [11.10.2](https://github.com/folke/lazy.nvim/compare/v11.10.1...v11.10.2) (2024-07-07) ### Bug Fixes * **git:** only check for new commits for local plugins. Closes [#1512](https://github.com/folke/lazy.nvim/issues/1512) ([81d2bff](https://github.com/folke/lazy.nvim/commit/81d2bfffdc8c84a40d25cae7fd4800178c19a138)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index e6cb8da..9441643 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.10.1" + ".": "11.10.2" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 97a2b89..b265fe9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [11.10.2](https://github.com/folke/lazy.nvim/compare/v11.10.1...v11.10.2) (2024-07-07) + + +### Bug Fixes + +* **git:** only check for new commits for local plugins. Closes [#1512](https://github.com/folke/lazy.nvim/issues/1512) ([81d2bff](https://github.com/folke/lazy.nvim/commit/81d2bfffdc8c84a40d25cae7fd4800178c19a138)) + ## [11.10.1](https://github.com/folke/lazy.nvim/compare/v11.10.0...v11.10.1) (2024-07-05) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 3bcb5ae..f1eff9c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.10.1" -- x-release-please-version +M.version = "11.10.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 083f3dfb5e5ef7e53fccd0d7d71c32aae7d93a16 Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Sun, 7 Jul 2024 06:45:23 +0000 Subject: [PATCH 1508/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73bd0ae..b3fad77 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 07 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From 25026d23822bf95b1f7a1ad2a8541a190c8f7b30 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Jul 2024 06:45:25 +0000 Subject: [PATCH 1509/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b3fad77..73bd0ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 07 +*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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From c771cf4928d1a1428ac7461658ab2916ed48adf5 Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Sun, 7 Jul 2024 06:46:59 +0000 Subject: [PATCH 1510/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73bd0ae..b3fad77 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 07 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From 72c0dc9462ab3bf1a68198afabc1eb4e2940d299 Mon Sep 17 00:00:00 2001 From: Andre Toerien <andre.toerien8@gmail.com> Date: Sun, 7 Jul 2024 17:13:49 +0200 Subject: [PATCH 1511/1610] fix(git): local plugin fixes (#1624) ## Description As I described in https://github.com/folke/lazy.nvim/pull/1512#issuecomment-2212474372, this makes it so that local plugins will only show as needing updates if the local branch is behind the upstream branch. This is done by checking the output of the `git log` command, and only setting `plugin._.updates` if the output is not empty. This seems to solve my issue where local plugins with unpushed changes always show as needing updates, but if there's a easier/better way of doing it then please feel free to edit/close this. Or if you don't agree that the current behaviour is a bug, then that's also fine - it's not a big deal and I can easily just ignore the "updates available" notice. I also came across a minor issue where the plugin diff view (press `d`) compares the wrong commits for local plugins, because [lua/lazy/view/init.lua](https://github.com/folke/lazy.nvim/blob/c771cf4928d1a1428ac7461658ab2916ed48adf5/lua/lazy/view/init.lua#L268) always uses `get_target`. I fixed this by moving `get_local_target` into `get_target` - I think this is simpler and more straightforward than the alternative of adding a ternary everywhere `get_target` is called. This second bugfix is a very small change, so I've just included it here, but I'm happy to make a second PR if you'd like. ## Related Issue(s) Related PR: #1512 --- lua/lazy/manage/checker.lua | 4 +++- lua/lazy/manage/git.lua | 15 ++++++--------- lua/lazy/manage/task/git.lua | 30 +++++++++++++++++++++--------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 8e03d9e..6efc5a7 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -35,7 +35,9 @@ end function M.fast_check(opts) opts = opts or {} for _, plugin in pairs(Config.plugins) do - if not plugin.pin and not plugin.dev and plugin._.installed then + -- don't check local plugins here, since we mark them as needing updates + -- 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 local info = Git.info(plugin.dir) local ok, target = pcall(Git.get_target, plugin) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 201e4e7..ef68cc7 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -116,6 +116,12 @@ end ---@param plugin LazyPlugin ---@return GitInfo? 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)) if plugin.commit then @@ -144,15 +150,6 @@ function M.get_target(plugin) } 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) } end diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 8e0ef48..9425fec 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -32,11 +32,13 @@ M.log = { "--no-show-signature", } + local info, target + if opts.updated then table.insert(args, self.plugin._.updated.from .. ".." .. (self.plugin._.updated.to or "HEAD")) elseif opts.check then - local info = assert(Git.info(self.plugin.dir)) - local target = assert(self.plugin._.is_local and Git.get_local_target(self.plugin) or Git.get_target(self.plugin)) + info = assert(Git.info(self.plugin.dir)) + target = assert(Git.get_target(self.plugin)) if not target.commit then for k, v in pairs(target) do error(k .. " '" .. v .. "' not found") @@ -44,15 +46,17 @@ M.log = { error("no target commit found") end assert(target.commit, self.plugin.name .. " " .. target.branch) - if Git.eq(info, target) then - if Config.options.checker.check_pinned then - local last_commit = Git.get_commit(self.plugin.dir, target.branch, true) - if not Git.eq(info, { commit = last_commit }) then - self.plugin._.outdated = true + if not self.plugin._.is_local then + if Git.eq(info, target) then + if Config.options.checker.check_pinned then + local last_commit = Git.get_commit(self.plugin.dir, target.branch, true) + if not Git.eq(info, { commit = last_commit }) then + self.plugin._.outdated = true + end end + else + self.plugin._.updates = { from = info, to = target } end - else - self.plugin._.updates = { from = info, to = target } end table.insert(args, info.commit .. ".." .. target.commit) else @@ -63,6 +67,14 @@ M.log = { args = args, 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, } From 93c9a3f872153247cef14f095d2d037b7c93704f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Jul 2024 15:14:44 +0000 Subject: [PATCH 1512/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b3fad77..73bd0ae 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 07 +*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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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. 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From 436d09af7d3d9e1ff39dc2cf51be800a7ab45be9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Jul 2024 15:15:37 +0000 Subject: [PATCH 1513/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73bd0ae..c2c9695 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -294,9 +294,9 @@ SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup* -------------------------------------------------------------------------------------------------- Property Type Description ---------- ----------------------------- --------------------------------------------------------- - init fun(LazyPlugin) init functions are always executed during. Mostly useful - for setting vim.g.* configuration used by Vim plugins - startup + 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 From a6daaf68a2805ac9180b835f09de5ca5d5cf8993 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Jul 2024 21:25:12 +0200 Subject: [PATCH 1514/1610] chore(main): release 11.10.3 (#1625) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 9441643..5d18bbe 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.10.2" + ".": "11.10.3" } diff --git a/CHANGELOG.md b/CHANGELOG.md index b265fe9..b09ee5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f1eff9c..083db1c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.10.2" -- x-release-please-version +M.version = "11.10.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 44cd12fa2709a4de644b1d7c2773d5c59df07a66 Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Sun, 7 Jul 2024 19:26:10 +0000 Subject: [PATCH 1515/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c2c9695..b3fad77 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 07 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From 2dfccd7b948beb26d8bcff7f9113a3a5c85cbc4a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 8 Jul 2024 07:28:02 +0200 Subject: [PATCH 1516/1610] fix(ui): don't treat suspended as headless. Closes #1626 --- lua/lazy/core/config.lua | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 083db1c..233b1fc 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -253,9 +253,10 @@ M.mapleader = nil ---@type string M.maplocalleader = nil -local headless = #vim.api.nvim_list_uis() == 0 +M.suspended = false + function M.headless() - return headless + return not M.suspended and #vim.api.nvim_list_uis() == 0 end ---@param opts? LazyConfig @@ -338,6 +339,12 @@ function M.setup(opts) end end, }) + + vim.api.nvim_create_autocmd({ "VimSuspend", "VimResume" }, { + callback = function(ev) + M.suspended = ev.event == "VimSuspend" + end, + }) end, }) end From 0002bfbd9ffba015f65955027799adba2634d220 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 05:28:57 +0000 Subject: [PATCH 1517/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index b3fad77..c2c9695 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 07 +*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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From f0324defdd43be8aa14aaf3a794ff3d5581f36ba Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 8 Jul 2024 07:45:43 +0200 Subject: [PATCH 1518/1610] fix(rocks): try building anyway even when prerequisits have not been met. (will likely fail) --- lua/lazy/manage/task/fs.lua | 11 +++++-- lua/lazy/pkg/rockspec.lua | 57 +++++++++++++++++++++---------------- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/lua/lazy/manage/task/fs.lua b/lua/lazy/manage/task/fs.lua index 3401c29..41a18a8 100644 --- a/lua/lazy/manage/task/fs.lua +++ b/lua/lazy/manage/task/fs.lua @@ -21,16 +21,23 @@ M.clean = { skip = function(plugin) return plugin._.is_local end, - run = function(self) + ---@param opts? {rocks_only?:boolean} + run = function(self, opts) + opts = opts or {} local dir = self.plugin.dir:gsub("/+$", "") 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 if vim.uv.fs_stat(rock_root) then rm(rock_root) end + if opts.rocks_only then + return + end + + rm(dir) + self.plugin._.installed = false end, } diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index e1d2c6e..19d580d 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -78,25 +78,23 @@ function M.check(opts) else ok = Health.have(M.python, opts) ok = Health.have(M.hererocks.bin("luarocks")) and ok - ok = Health.have( + Health.have( M.hererocks.bin("lua"), vim.tbl_extend("force", opts, { version = "-v", version_pattern = "5.1", }) - ) and ok + ) end else ok = Health.have("luarocks", opts) - ok = ( - Health.have( - { "lua5.1", "lua", "lua-5.1" }, - vim.tbl_extend("force", opts, { - version = "-v", - version_pattern = "5.1", - }) - ) - ) and ok + Health.have( + { "lua5.1", "lua", "lua-5.1" }, + vim.tbl_extend("force", opts, { + version = "-v", + version_pattern = "5.1", + }) + ) end return ok end @@ -104,17 +102,17 @@ end ---@async ---@param task LazyTask function M.build(task) - if - not M.check({ - error = function(msg) - task:error(msg:gsub("[{}]", "`")) - end, - warn = function(msg) - task:warn(msg) - end, - ok = function(msg) end, - }) - then + M.check({ + error = function(msg) + task:error(msg:gsub("[{}]", "`")) + end, + warn = function(msg) + task:warn(msg) + end, + ok = function(msg) end, + }) + + if task:has_warnings() then task:log({ "", "This plugin requires `luarocks`. Try one of the following:", @@ -123,7 +121,11 @@ function M.build(task) or " - enable `hererocks` with `opts.rocks.hererocks = true`", " - disable `luarocks` support completely with `opts.rocks.enabled = false`", }) - return + task:warn("\nWill try building anyway, but will likely fail...") + + task:warn("\n" .. string.rep("-", 80) .. "\n") + + task:set_level(vim.log.levels.WARN) end if task.plugin.name == "hererocks" then @@ -187,11 +189,13 @@ function M.build(task) return end - task:warn("Failed installing " .. rockspec.package .. " with `luarocks`.\nTrying to build from source.") + task:warn("Failed installing " .. rockspec.package .. " with `luarocks`.") + task:warn("\n" .. string.rep("-", 80) .. "\n") + task:warn("Trying to build from source.") -- install failed, so try building from source task:set_level() -- reset level - task:spawn(luarocks, { + ok = task:spawn(luarocks, { args = { "--tree", root, @@ -206,6 +210,9 @@ function M.build(task) cwd = task.plugin.dir, env = env, }) + if not ok then + require("lazy.manage.task.fs").clean.run(task, { rocks_only = true }) + end end ---@param rockspec RockSpec From a4c473cc2d30717a211f1bef4f99b0b6f9914efa Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Mon, 8 Jul 2024 05:46:33 +0000 Subject: [PATCH 1519/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c2c9695..476bdf7 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 08 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From f918318d21956b0874a65ab35ce3d94d9057aabf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 07:52:50 +0200 Subject: [PATCH 1520/1610] chore(main): release 11.10.4 (#1628) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 5d18bbe..a2f63d1 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.10.3" + ".": "11.10.4" } diff --git a/CHANGELOG.md b/CHANGELOG.md index b09ee5d..3ed551f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 233b1fc..c50b9c5 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.10.3" -- x-release-please-version +M.version = "11.10.4" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 1870238cf9c579c5d7eb8ea8b296f10b81978d34 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 05:53:40 +0000 Subject: [PATCH 1521/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 476bdf7..c2c9695 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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From fadebdc76b71a1d3658a88a025c6c8fb4749e0f8 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 9 Jul 2024 15:02:18 +0200 Subject: [PATCH 1522/1610] fix(minit): add tests to package.path when running busted (helpers.lua etc) --- lua/lazy/minit.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index 838ac36..6300730 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -99,6 +99,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, From 159036c5762a97246689299e61311fc88523a8fa Mon Sep 17 00:00:00 2001 From: folke <folke@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:03:11 +0000 Subject: [PATCH 1523/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 ++------------------------------------------- 1 file changed, 46 insertions(+), 1352 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c2c9695..f2ef56a 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,130 +1,61 @@ -*lazy.nvim.txt* A modern plugin manager for Neovim +*lazy.nvim.txt* For Neovim Last change: 2024 July 09 ============================================================================== Table of Contents *lazy.nvim-table-of-contents* -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?* + - Features |lazy.nvim-features| + - Requirements |lazy.nvim-requirements| + - Getting Started |lazy.nvim-getting-started| +1. Links |lazy.nvim-links| +Install +· +Configure +· +Docs + + + + + + + + + + + + + + -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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies - and configuration using one of: - - **Lazy**: `lazy.lua` file - - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> - - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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-🚀-getting-started-✨-features* +FEATURES *lazy.nvim-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 <https://devhints.io/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 <https://devhints.io/semver> support +- Statusline component to see the number of pending updates +- Automatically lazy-loads colorschemes -⚡️ REQUIREMENTS *lazy.nvim-🚀-getting-started-⚡️-requirements* +REQUIREMENTS *lazy.nvim-requirements* - Neovim >= **0.8.0** (needs to be built with **LuaJIT**) - Git >= **2.19.0** (for partial clones support) @@ -133,1251 +64,14 @@ Table of Contents *lazy.nvim-table-of-contents* You can remove `rockspec` from `opts.pkg.sources` to disable this feature. -============================================================================== -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 </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 </usage/structuring> - - -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 }, - }) -< +GETTING STARTED *lazy.nvim-getting-started* +Check the documentation website <https://lazy.folke.io/> for more information. ============================================================================== -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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { - { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, - }, - config = function() - require("neo-tree").setup() - end, - } -< - - -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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> -- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) - -You can enable/disable package sources with `config.pkg.sources` -</configuration>. 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 -<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, - }, - pkg = { - enabled = true, - 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. - sources = { - "lazy", - "rockspec", - "packspec", - }, - }, - rocks = { - root = vim.fn.stdpath("data") .. "/lazy-rocks", - server = "https://nvim-neorocks.github.io/rocks-binaries/", - }, - dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects - 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 = "", - 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 = 20, -- 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. - - ["<localleader>l"] = { - function(plugin) - require("lazy.util").float_term({ "lazygit", "log" }, { - cwd = plugin.dir, - }) - end, - desc = "Open lazygit log", - }, - - ["<localleader>t"] = { - function(plugin) - require("lazy.util").float_term(nil, { - cwd = plugin.dir, - }) - end, - desc = "Open terminal in plugin dir", - }, - }, - }, - diff = { - -- diff command <d> can be one of: - -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, - -- so you can have a different command for diff <d> - -- * 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 dont 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 - ----------------------- ----------------------- ----------------------- - 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 - - LazyH1 IncSearch home button - - LazyH2 Bold titles - - 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 - - LazyTaskError ErrorMsg task errors - - LazyTaskOutput MsgArea task output - - LazyUrl @markup.link url - - LazyValue @string value of a property - ----------------------------------------------------------------------- - -============================================================================== -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 `<CR>` on a plugin to show its details. Most properties can be -hovered with `<K>` 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<string, number> - 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 -<https://github.com/lewis6991/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 -<https://github.com/LazyVim/LazyVim> and more specifically: - -- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 -<https://olivinelabs.com/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. 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 <https://github.com/kdheepak/panvimdoc> From 2cb8af1eb14184442d718d6418e26ccd5adf535c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 9 Jul 2024 17:25:39 +0200 Subject: [PATCH 1524/1610] ci: skip docs on main --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) 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 From d1de92dffab5a862332fdd1892889d362369c12f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:26:28 +0000 Subject: [PATCH 1525/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1398 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1352 insertions(+), 46 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index f2ef56a..c2c9695 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -1,61 +1,130 @@ -*lazy.nvim.txt* For Neovim Last change: 2024 July 09 +*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 <https://lazy.folke.io>. 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 <https://lazy.folke.io/packages> can now specify their dependencies + and configuration using one of: + - **Lazy**: `lazy.lua` file + - **Rockspec**: luarocks <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> + - **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> 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 <https://github.com/nvim-neorg/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 <https://devhints.io/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 <https://devhints.io/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,1251 @@ 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 </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 </usage/structuring> + + +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 <https://lazy.folke.io/> 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", "<cmd>TSJToggle<cr>", 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 = { "<C-a>", { "<C-x>", 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 = { + { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, + }, + config = function() + require("neo-tree").setup() + end, + } +< + + +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 <https://semver.org/> 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 <https://luarocks.org/> `*-scm-1.rockspec` file <https://github.com/luarocks/luarocks/wiki/Rockspec-format> +- **Packspec**: `pkg.json` (experimental, since the format <https://github.com/neovim/packspec/issues/41> is not quite there yet) + +You can enable/disable package sources with `config.pkg.sources` +</configuration>. 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 +<https://github.com/nvim-lua/nvim-package-specification/issues/41> 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, + }, + pkg = { + enabled = true, + 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. + sources = { + "lazy", + "rockspec", + "packspec", + }, + }, + rocks = { + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://nvim-neorocks.github.io/rocks-binaries/", + }, + dev = { + ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + 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 = "", + 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 = 20, -- 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. + + ["<localleader>l"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["<localleader>t"] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + diff = { + -- diff command <d> can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, + -- so you can have a different command for diff <d> + -- * 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 dont 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 + ----------------------- ----------------------- ----------------------- + 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 + + LazyH1 IncSearch home button + + LazyH2 Bold titles + + 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 + + LazyTaskError ErrorMsg task errors + + LazyTaskOutput MsgArea task output + + LazyUrl @markup.link url + + LazyValue @string value of a property + ----------------------------------------------------------------------- + +============================================================================== +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 `<CR>` on a plugin to show its details. Most properties can be +hovered with `<K>` 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<string, number> + 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 +<https://github.com/lewis6991/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 +<https://github.com/LazyVim/LazyVim> and more specifically: + +- lazyvim.plugins <https://github.com/LazyVim/LazyVim/tree/main/lua/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 </packages> 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 </packages> 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 +<https://olivinelabs.com/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 <https://github.com/kdheepak/panvimdoc> From 54b003c650f07b771e61566f7be2629beb2b781f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 11 Jul 2024 22:03:53 +0200 Subject: [PATCH 1526/1610] fix(util): strip `-lua` in normname --- lua/lazy/core/util.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 6d7c3b8..bdd42dd 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 From 17473db1d79ea30e06126834be7fd95ca511557b Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 11 Jul 2024 22:04:06 +0200 Subject: [PATCH 1527/1610] feat: add plugin name to handlers.managed --- lua/lazy/core/handler/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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<string,table<string,string>> ----@field managed table<string,string> +---@field managed table<string,string> 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 From 1d451b4c2ce957da05e2123ce1a001804fc7ea96 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 11 Jul 2024 22:32:11 +0200 Subject: [PATCH 1528/1610] ci: use mini.test instead of busted --- lua/lazy/minit.lua | 62 +++++++++++++++++++++++++++++++++++++++++++++- scripts/test | 2 +- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index 6300730..bfe63c4 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -29,9 +29,12 @@ function M.setup(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 +43,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 +54,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 +72,8 @@ function M.setup(opts) if is_busted then M.busted.run() + elseif is_minitest then + M.minitest.run() end end @@ -89,6 +95,60 @@ 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, + }, + } + Assert.__index = Assert + -- assert = require("luassert") + assert = setmetatable({}, Assert) + require("mini.test").run() +end + +---@param opts LazyConfig +function M.minitest.setup(opts) + return M.extend({ + spec = { + { + "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() diff --git a/scripts/test b/scripts/test index 4baf621..2ed43b9 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 tests -o utfTerminal "$@" From 070418dca1417e7df5c803d7366fd0c7b3e9c612 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 09:25:55 +0200 Subject: [PATCH 1529/1610] chore(main): release 11.11.0 (#1634) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index a2f63d1..c71760f 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.10.4" + ".": "11.11.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ed551f..b2051d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [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/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index c50b9c5..ff178c1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.10.4" -- x-release-please-version +M.version = "11.11.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 54f70c757cdfc5da4740f2c22e057f3518872ef5 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 13 Jul 2024 09:44:59 +0200 Subject: [PATCH 1530/1610] ci: add luassert to minitest for now --- .github/ISSUE_TEMPLATE/bug_report.yml | 35 ++++++++------------------- lua/lazy/minit.lua | 15 +++++++++++- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 4a77601..9f95860 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? @@ -57,32 +60,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 validations: required: false diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index bfe63c4..0b8f3ca 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -25,6 +25,9 @@ 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 = {} @@ -121,10 +124,19 @@ function M.minitest.run() 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 = require("luassert") assert = setmetatable({}, Assert) + assert = require("luassert") require("mini.test").run() end @@ -132,6 +144,7 @@ end function M.minitest.setup(opts) return M.extend({ spec = { + "lunarmodules/luassert", { "echasnovski/mini.test", opts = { From 7ed9f7173cdec71a057053d7e6efc20c2c230b95 Mon Sep 17 00:00:00 2001 From: Ethan Wu <ethanwu10@gmail.com> Date: Sat, 13 Jul 2024 03:51:44 -0400 Subject: [PATCH 1531/1610] fix(lockfile): ensure newline at EOF for lockfile (#1639) ## Description The lockfile currently does not end with a newline at EOF. Text files should [end with a newline](https://unix.stackexchange.com/a/18789). This also lets you manually edit the lockfile in vim without 'fixeol' creating a spurious change for the added newline. This change however will create a change in users' lockfiles adding a newline upon updating, but since the lockfile would be changing anyways to update lazy.nvim itself, this is likely acceptable. ## Related Issue(s) *none* ## Screenshots *N/A* --- lua/lazy/manage/lock.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 58c6bc4ab298dc0d808d325754585f918a031919 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 10:07:17 +0200 Subject: [PATCH 1532/1610] chore(update): update repository (#1638) Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action Co-authored-by: folke <292349+folke@users.noreply.github.com> --- scripts/test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/test b/scripts/test index 2ed43b9..ffbb540 100755 --- a/scripts/test +++ b/scripts/test @@ -1,3 +1,3 @@ #!/bin/env bash -nvim -l tests/minit.lua --minitest tests -o utfTerminal "$@" +nvim -l tests/minit.lua --minitest From 788feaf10efd5c8a849f7a0daef31ac0af1157bd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 16:16:17 +0200 Subject: [PATCH 1533/1610] chore(update): update repository (#1644) Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action Co-authored-by: folke <292349+folke@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 9f95860..8468e01 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -68,6 +68,6 @@ body: -- add any other plugins here }, }) - render: Lua + render: lua validations: required: false From 93499c5deb37641c6cf71528a93f101d186b409f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 13 Jul 2024 18:07:56 +0200 Subject: [PATCH 1534/1610] fix(config): check for lib64. Fixes #1343 --- .editorconfig | 12 ++++++++++++ lua/lazy/core/config.lua | 5 ++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a9452c7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +charset = utf-8 diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index ff178c1..ee3e38b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -284,6 +284,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 +294,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 From 6e66f8e6550dd22467c11284e638dfccb5d514e4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 19:29:13 +0200 Subject: [PATCH 1535/1610] chore(update): update repository (#1648) Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action Co-authored-by: folke <292349+folke@users.noreply.github.com> --- .editorconfig | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.editorconfig b/.editorconfig index a9452c7..18616d3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,9 +1,5 @@ -# EditorConfig is awesome: https://EditorConfig.org - -# top-most EditorConfig file root = true -# Unix-style newlines with a newline ending every file [*] end_of_line = lf insert_final_newline = true From b02c9eae6a250f98908c146d1dc1a891f5019f0a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 22:50:19 +0200 Subject: [PATCH 1536/1610] chore(main): release 11.11.1 (#1643) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index c71760f..4d14617 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.11.0" + ".": "11.11.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index b2051d3..39481ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index ee3e38b..1206305 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -228,7 +228,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.11.0" -- x-release-please-version +M.version = "11.11.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 315191aa9e1b0ce5a023c01f959059411405b7c9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:19:51 +0200 Subject: [PATCH 1537/1610] chore(update): update repository (#1651) Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action Co-authored-by: folke <292349+folke@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 8468e01..5c225eb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -17,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 From 9d445ebbd89401544a538c6af080e4d2785abb49 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 17:09:32 +0200 Subject: [PATCH 1538/1610] chore(update): update repository (#1653) Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action Co-authored-by: folke <292349+folke@users.noreply.github.com> --- .editorconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 18616d3..8b176d5 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,7 +1,6 @@ root = true [*] -end_of_line = lf insert_final_newline = true indent_style = space indent_size = 2 From d731a6b005fd239e85e555bd57362382f6c1e461 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 16 Jul 2024 16:50:31 +0200 Subject: [PATCH 1539/1610] feat(git): added git network throttle to limit network related git ops per interval. Closes #1635 --- lua/lazy/core/config.lua | 7 +++++++ lua/lazy/manage/task/git.lua | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1206305..3ec89c6 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -34,6 +34,13 @@ 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 + }, }, pkg = { enabled = true, diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 9425fec..bd7ee38 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -1,8 +1,45 @@ +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 + ---@type table<string, LazyTaskDef> local M = {} @@ -84,6 +121,7 @@ M.clone = { end, ---@async run = function(self) + throttle.wait() local args = { "clone", self.plugin.url, @@ -233,6 +271,7 @@ M.fetch = { ---@async run = function(self) + throttle.wait() local args = { "fetch", "--recurse-submodules", @@ -262,6 +301,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)) From 5473e3d77c13e40fc4758fa977a1f2c14d0b4ceb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 17 Jul 2024 12:54:53 +0200 Subject: [PATCH 1540/1610] chore(main): release 11.12.0 (#1655) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 4d14617..fc1c305 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.11.1" + ".": "11.12.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 39481ef..0ad1e73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 3ec89c6..facd1f8 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -235,7 +235,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.11.1" -- x-release-please-version +M.version = "11.12.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 6ca90a21202808796418e46d3cebfbb5a44e54a2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 18 Jul 2024 00:40:41 +0200 Subject: [PATCH 1541/1610] feat(ui): added mapping descriptions --- lua/lazy/view/float.lua | 2 +- lua/lazy/view/init.lua | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) 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<string, fun(str:string)> ---@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() From 8f6225751138329da339eb6554d40158768d23ff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 10:47:30 +0200 Subject: [PATCH 1542/1610] chore(main): release 11.13.0 (#1660) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index fc1c305..fa12dc5 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.12.0" + ".": "11.13.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ad1e73..44bd690 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index facd1f8..b75b51c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -235,7 +235,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.12.0" -- x-release-please-version +M.version = "11.13.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 124b864233367cc0665bfcd9872b1c974bfb225b Mon Sep 17 00:00:00 2001 From: Gert Burger <GertBurger@users.noreply.github.com> Date: Thu, 18 Jul 2024 14:57:12 +0100 Subject: [PATCH 1543/1610] docs(commands): fix command ordering for sync (#1661) ## Description After a discussion on Slack we noticed that the description of the sync command is a bit vague. Some people, including myself, assumed `clean`/`install`/`update` referred to build steps being performed per plugin. Another person mentioned they thought it referred to the Lazy commands, which does make more sense. They also noticed that the order of the commands do not match the source code. So this PR corrects the order, assuming it was meant to be ordered, and mentions that those are commands for clarity. --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c2c9695..1694d24 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -988,8 +988,8 @@ function: lockfile or to a given commit under the cursor - :Lazy sync [plugins] require("lazy").sync(opts?) Run install, clean and - update + :Lazy sync [plugins] require("lazy").sync(opts?) Run clean, install, and + update commands :Lazy update [plugins] require("lazy").update(opts?) Update plugins. This will also update the From c92c6b5fd2b3a13c8999ab8379e43a79c9406e59 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 13:57:58 +0000 Subject: [PATCH 1544/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 1694d24..c2c9695 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -988,8 +988,8 @@ function: lockfile or to a given commit under the cursor - :Lazy sync [plugins] require("lazy").sync(opts?) Run clean, install, and - update commands + :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 From 5bdb12a038e5a72cc793f38893f1a9c9fb741759 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 19 Jul 2024 08:57:35 +0200 Subject: [PATCH 1545/1610] fix(build): only load the plugin before build for `:` build commands --- lua/lazy/manage/task/plugin.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index fd6c12b..bd565f8 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` From 9a374a0fb4d3ac42dac4a129d4bead7252473c77 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 11:50:14 +0200 Subject: [PATCH 1546/1610] chore(main): release 11.13.1 (#1664) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index fa12dc5..4639dfb 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.13.0" + ".": "11.13.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 44bd690..1757c13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index b75b51c..1753933 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -235,7 +235,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.13.0" -- x-release-please-version +M.version = "11.13.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 18d1c1b47e175cd58dc12bf4792ef4e9a50505fa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 21 Jul 2024 12:41:54 +0200 Subject: [PATCH 1547/1610] fix(loader): add auto loaded module to package.loaded early to prevent require loops --- lua/lazy/core/loader.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c5cdca2..ac53690 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -552,15 +552,16 @@ function M.loader(modname) end if ret then - M.auto_load(modname, ret.modpath) local mod = package.loaded[modname] - if type(mod) == "table" then - return function() - return mod - end + if type(mod) ~= "table" then + mod = loadfile(ret.modpath, nil, nil, ret.stat)() end + package.loaded[modname] = mod + M.auto_load(modname, ret.modpath) -- selene: allow(incorrect_standard_library_use) - return loadfile(ret.modpath, nil, nil, ret.stat) + return function() + return mod + end end end From 8bef0742a2f6f587c8dba73e99e7fb2c05b3764a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 21 Jul 2024 15:53:27 +0200 Subject: [PATCH 1548/1610] chore(main): release 11.13.2 (#1668) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 4639dfb..a52e23c 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.13.1" + ".": "11.13.2" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 1757c13..8094a59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1753933..0029a30 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -235,7 +235,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.13.1" -- x-release-please-version +M.version = "11.13.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From a692bf86883457f45fe3f773bfc8bc4d9e4b070c Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 21 Jul 2024 17:32:12 +0200 Subject: [PATCH 1549/1610] revert: fix(loader): add auto loaded module to package.loaded early to prevent require loops This reverts commit 18d1c1b47e175cd58dc12bf4792ef4e9a50505fa. --- lua/lazy/core/loader.lua | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index ac53690..c5cdca2 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -552,16 +552,15 @@ function M.loader(modname) end if ret then - local mod = package.loaded[modname] - if type(mod) ~= "table" then - mod = loadfile(ret.modpath, nil, nil, ret.stat)() - end - package.loaded[modname] = mod M.auto_load(modname, ret.modpath) - -- selene: allow(incorrect_standard_library_use) - return function() - return mod + local mod = package.loaded[modname] + if type(mod) == "table" then + return function() + return mod + end end + -- selene: allow(incorrect_standard_library_use) + return loadfile(ret.modpath, nil, nil, ret.stat) end end From a09c876f6ef642c8feaea45932df73b058d9a083 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 21 Jul 2024 17:34:22 +0200 Subject: [PATCH 1550/1610] chore(main): release 11.13.3 (#1669) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index a52e23c..34e9ae3 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.13.2" + ".": "11.13.3" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 8094a59..9f4735d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 0029a30..ab07479 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -235,7 +235,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.13.2" -- x-release-please-version +M.version = "11.13.3" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 34b0126e5b3966f1dbe148d6f8450213115e76b2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 22 Jul 2024 09:43:09 +0200 Subject: [PATCH 1551/1610] fix(loader): add plugins whose rtp got loaded early to start plugins --- lua/lazy/core/loader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c5cdca2..323b57b 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 From 12f2c74244cc768d97c83972aa63722389b5d96d Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 22 Jul 2024 09:45:01 +0200 Subject: [PATCH 1552/1610] fix(loader): explicitely set package.loaded.modname to nil to prevent recursive loading errors --- lua/lazy/core/loader.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index 323b57b..cfcc136 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -552,6 +552,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 From 16a5c46aa3d05d37eb9c49f57ab058033b0870a6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 09:47:04 +0200 Subject: [PATCH 1553/1610] chore(main): release 11.13.4 (#1670) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 34e9ae3..8c425b8 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.13.3" + ".": "11.13.4" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f4735d..21299f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index ab07479..041778d 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -235,7 +235,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.13.3" -- x-release-please-version +M.version = "11.13.4" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From cc028e77eba9592818ca237b2079a51cf87b6af2 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 22 Jul 2024 14:24:40 +0200 Subject: [PATCH 1554/1610] ci: update --- .github/workflows/stale.yml | 3 ++- .github/workflows/update.yml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) 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 From 7d29719ade6f5a269e3b7d08b246641b5b079aaa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 22 Jul 2024 14:38:00 +0200 Subject: [PATCH 1555/1610] fix(health): dont use vim.fn.system to get cmd versions --- lua/lazy/health.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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)) From 839f9e78e78dc935b1188fb16583365991739c51 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 14:41:58 +0200 Subject: [PATCH 1556/1610] chore(main): release 11.13.5 (#1672) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 8c425b8..73b8cd1 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.13.4" + ".": "11.13.5" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 21299f1..ed2bf2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 041778d..e02ed0b 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -235,7 +235,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.13.4" -- x-release-please-version +M.version = "11.13.5" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From d5686efbd00942b3e38de7c08b8df69d961b02f0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 23 Jul 2024 13:31:20 +0200 Subject: [PATCH 1557/1610] feat: added `opts.git.cooldown` to allow updating plugins on slow connections. Fixes #1656 --- lua/lazy/core/config.lua | 4 ++++ lua/lazy/manage/task/git.lua | 16 +++++++++++++++- lua/lazy/types.lua | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index e02ed0b..f5633b1 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -41,6 +41,10 @@ M.defaults = { 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, diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index bd7ee38..c54c809 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -40,6 +40,15 @@ function throttle.wait() 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> local M = {} @@ -266,7 +275,7 @@ 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 @@ -287,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, } diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 0a10467..5921169 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -20,6 +20,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 From c02268ac6e6aab92249d020d75efc588bd9d24fa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 23 Jul 2024 17:24:33 +0200 Subject: [PATCH 1558/1610] feat(plugin): improve error handling and show better error message --- lua/lazy/core/plugin.lua | 41 ++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index d121fdf..1aef7c7 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,18 +190,17 @@ 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) From b4a5a1209e4c64fa67aedf721a383541a64056d1 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 24 Jul 2024 07:23:36 +0200 Subject: [PATCH 1559/1610] fix(plugin): make .lazy.lua work again --- lua/lazy/core/plugin.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 1aef7c7..97347a7 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -167,7 +167,7 @@ function Spec:import(spec) return a.modname < b.modname end) else - modspecs = { modname = import_name, load = spec.import } + modspecs = { { modname = import_name, load = spec.import } } end for _, modspec in ipairs(modspecs) do @@ -203,7 +203,7 @@ function Spec:import(spec) 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 From 4496b4cad69a862199bb3ad452d3c4988bb925a1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 07:38:49 +0200 Subject: [PATCH 1560/1610] chore(main): release 11.14.0 (#1673) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 73b8cd1..ec03d72 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.13.5" + ".": "11.14.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index ed2bf2c..a67aea8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f5633b1..1a8dba7 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -239,7 +239,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.13.5" -- x-release-please-version +M.version = "11.14.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 7108809ab18dc1b1e6f402b29e2e1d35a5d311d5 Mon Sep 17 00:00:00 2001 From: Alexander Grebennik <slbug@users.noreply.github.com> Date: Thu, 25 Jul 2024 12:53:01 +0200 Subject: [PATCH 1561/1610] fix(plugins): "Vim:E150: Not a directory" on plugin update (#1679) ## Description On plugins update it fails with following error for any plugin. ``` ~/.local/share/nvim/lazy/lazy.nvim/manage/task/plugin.lua:95: Vim:E150: Not a directory: ~/.local/share/nvim/lazy/gitsigns.nvim/doc/ ``` --- lua/lazy/manage/task/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index bd565f8..69a93a5 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -90,7 +90,7 @@ M.docs = { return 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 From 077102c5bfc578693f12377846d427f49bc50076 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 13:38:23 +0200 Subject: [PATCH 1562/1610] chore(main): release 11.14.1 (#1680) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index ec03d72..fe56f44 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.14.0" + ".": "11.14.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index a67aea8..83a3375 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 1a8dba7..06719b9 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -239,7 +239,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.14.0" -- x-release-please-version +M.version = "11.14.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 014a72b7a87ccf56670412edb87a431b196e5864 Mon Sep 17 00:00:00 2001 From: Christoph Zirkelbach <31811+tigion@users.noreply.github.com> Date: Sat, 31 Aug 2024 08:57:58 +0200 Subject: [PATCH 1563/1610] docs: update dev.path description (#1711) ## Description In the issue (#1707) I was confused by the description of `dev.path`. I thought functions must also return the general directory for local plugins, but it must be the plugin directory. ## Related Issue(s) #1707 --- lua/lazy/core/config.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 06719b9..16cc012 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -67,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"} From 80da254e645f579c28394ee0f08f75a9c9481744 Mon Sep 17 00:00:00 2001 From: Roger Kim <roger.kim486@gmail.com> Date: Sat, 31 Aug 2024 02:58:43 -0400 Subject: [PATCH 1564/1610] fix(rocks): add lib64 plugin directory to package.cpath (#1717) ## Description `package.cpath` is missing the `lib64` directory for plugins that have luarocks dependencies. ## Context I found this issue when I was working on my new Neovim plugin on my Fedora 39 machine. I added the `luasockets` dependency to rockspec file in my plugin like so: ``` rockspec_format = "3.0" package = "typeracer.nvim" version = "scm-1" source = { url = "git+https://github.com/carbon-steel/typeracer.nvim", } dependencies = { "luasocket", } test_dependencies = { "nlua", } build = { type = "builtin", copy_directories = {}, } ``` I found that the dynamic libraries from the `luasockets` dependency were installed like so: `/home/username/.local/share/nvim/lazy-rocks/typeracer.nvim/lib64/lua/5.1/socket/core.so`. However, the only entry related to my plugin `typeracer.nvim` was: `/home/glyph/.local/share/nvim/lazy-rocks/typeracer.nvim/lib/lua/5.1/?.so`. The issue is that we only have the plugin's `lib` directory in `package.cpath` and not `lib64`. I looked through `lazy.nvim`'s code and I think adding the `lib64` directory should fix the issue. I don't know if we also want to worry about `lib32` as well, but so far, this change works for me. --- lua/lazy/core/loader.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index cfcc136..c6a7271 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -493,8 +493,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) From 591ef40f2da3a26fbcc0466988cd6fe45ca68cae Mon Sep 17 00:00:00 2001 From: Marc Jakobi <mrcjkb89@outlook.com> Date: Sat, 31 Aug 2024 13:59:45 +0700 Subject: [PATCH 1565/1610] fix(luarocks): try to install from root manifest (#1687) ## Description When passing the `--dev` flag to `luarocks`, it will prioritise `dev` versions when resolving dependencies (treating `dev` or `scm` as greater than a SemVer version) if the rockspec doesn't specify an upper version constraint (which is often the case). Dev packages are often unstable and may cause more problems, especially for Windows users (an example I've seen is git for windows trying and failing to checkout submodules). For now , a good compromise between too many retries and not retrying at all could be to try `luarocks install` from the root manifest first, but to keep the `--dev` flag in `luarocks make`. If that still causes problems, it might be better to fall back to `luarocks make` without `--dev` first, and then to try `luarocks ---dev make` as a last resort. In rocks.nvim, we only fall back to adding the `--dev` flag if the install error message contains the string `"No results matching query were found"`; assuming that stable non-dev packages shouldn't depend on dev packages. --- lua/lazy/pkg/rockspec.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index 19d580d..d7ecfdb 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 From 48b52b5cfcf8f88ed0aff8fde573a5cc20b1306d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 31 Aug 2024 07:03:18 +0000 Subject: [PATCH 1566/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 1496 +++++++++++++++++++++++++++-- 1 file changed, 1418 insertions(+), 78 deletions(-) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 87b46dd..b91e678 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -10,27 +10,39 @@ return }, { name = "adopure.nvim", url = "Willem-J-an/adopure.nvim", - version = "1.1.0-1" + version = "1.1.2-1" }, { name = "aerial.nvim", url = "stevearc/aerial.nvim", - version = "1.7.0-1" + version = "2.2.0-1" }, { name = "ai.nvim", url = "S1M0N38/ai.nvim", version = "0.1.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 = "banana.nvim", + url = "CWood-sdf/banana.nvim", + version = "0.1.0-1" }, { name = "better-escape.nvim", url = "max397574/better-escape.nvim", - version = "1.0.0-1" + version = "2.3.2-1" }, { name = "bufferline.nvim", url = "akinsho/bufferline.nvim", - version = "4.6.1-1" + version = "4.7.0-1" + }, { + name = "care.nvim", + url = "max397574/care.nvim", + version = "0.1.0-1" }, { name = "ccc.nvim", url = "uga-rosa/ccc.nvim", @@ -39,6 +51,10 @@ return 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", @@ -70,11 +86,11 @@ return }, { name = "commons.nvim", url = "linrongbin16/commons.nvim", - version = "18.0.0-1" + version = "19.0.0-1" }, { name = "conform.nvim", url = "stevearc/conform.nvim", - version = "6.0.0-1" + version = "8.0.0-1" }, { name = "cybu.nvim", url = "ghillb/cybu.nvim", @@ -91,6 +107,10 @@ return name = "decipher.nvim", url = "MisanthropicBit/decipher.nvim", version = "1.0.1-1" + }, { + name = "delog.nvim", + url = "ej-shafran/delog.nvim", + version = "0.0.2-1" }, { name = "detour.nvim", url = "carbon-steel/detour.nvim", @@ -114,7 +134,7 @@ return }, { name = "dropbar.nvim", url = "Bekaboo/dropbar.nvim", - version = "8.4.0-1" + version = "8.6.1-1" }, { name = "duck.nvim", url = "tamton-aquib/duck.nvim", @@ -126,15 +146,19 @@ 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.7.0-1" }, { name = "elixir-tools.nvim", url = "elixir-tools/elixir-tools.nvim", - version = "0.14.3-1" + version = "0.16.0-1" }, { name = "feline.nvim", url = "freddiehaddad/feline.nvim", - version = "1.6.2-1" + version = "1.6.3-1" }, { name = "fidget.nvim", url = "j-hui/fidget.nvim", @@ -142,7 +166,7 @@ return }, { 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 +174,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 +190,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", @@ -182,7 +210,11 @@ 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 = "3.3.1-1" }, { name = "github-nvim-theme", url = "projekt0n/github-nvim-theme", @@ -191,10 +223,6 @@ return name = "gitlinker.nvim", url = "linrongbin16/gitlinker.nvim", version = "4.13.1-1" - }, { - name = "gitsigns.nvim", - url = "lewis6991/gitsigns.nvim", - version = "scm-1" }, { name = "glow.nvim", url = "ellisonleao/glow.nvim", @@ -202,7 +230,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 +243,10 @@ return name = "gruvbox.nvim", url = "ellisonleao/gruvbox.nvim", version = "2.0.0-1" + }, { + name = "hardhat.nvim", + url = "TheSnakeWitcher/hardhat.nvim", + version = "0.1.0-1" }, { name = "haskell-snippets.nvim", url = "mrcjkb/haskell-snippets.nvim", @@ -222,7 +254,7 @@ return }, { name = "haskell-tools.nvim", url = "mrcjkb/haskell-tools.nvim", - version = "3.1.10-1" + version = "4.0.1-1" }, { name = "headlines.nvim", url = "lukas-reineke/headlines.nvim", @@ -231,6 +263,14 @@ return name = "heirline.nvim", url = "rebelot/heirline.nvim", version = "1.0.6-1" + }, { + name = "helpview.nvim", + url = "OXY2DEV/helpview.nvim", + version = "1.1.0-1" + }, { + name = "hibiscus.nvim", + url = "udayvir-singh/hibiscus.nvim", + version = "1.7-1" }, { name = "hlchunk.nvim", url = "shellRaining/hlchunk.nvim", @@ -238,7 +278,11 @@ return }, { name = "hotpot.nvim", url = "rktjmp/hotpot.nvim", - version = "0.12.1-1" + version = "0.14.3-1" + }, { + name = "hurl.nvim", + url = "jellydn/hurl.nvim", + version = "1.7.0-1" }, { name = "hydra.nvim", url = "nvimtools/hydra.nvim", @@ -254,7 +298,7 @@ return }, { name = "indent-blankline.nvim", url = "lukas-reineke/indent-blankline.nvim", - version = "3.6.3-1" + version = "3.7.2-1" }, { name = "kai.nvim", url = "Kamilcuk/kai.nvim", @@ -262,7 +306,15 @@ return }, { name = "lazy.nvim", url = "folke/lazy.nvim", - version = "11.2.1-1" + version = "11.14.1-1" + }, { + name = "lazydev.nvim", + url = "folke/lazydev.nvim", + version = "1.8.0-1" + }, { + name = "lean.nvim", + url = "Julian/lean.nvim", + version = "1.0.0-1" }, { name = "leetcode.nvim", url = "kawre/leetcode.nvim", @@ -275,6 +327,10 @@ return name = "live-command.nvim", url = "smjonas/live-command.nvim", version = "1.2.1-1" + }, { + name = "logger.nvim", + url = "jnpngshiii/logger.nvim", + version = "0.4.6-1" }, { name = "logging.nvim", url = "NTBBloodbath/logging.nvim", @@ -283,10 +339,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", @@ -310,23 +370,39 @@ return }, { name = "luarocks-build-treesitter-parser", url = "nvim-neorocks/luarocks-build-treesitter-parser", - version = "4.1.0-1" + version = "5.0.2-1" + }, { + name = "luarocks-build-treesitter-parser-cpp", + url = "nvim-neorocks/luarocks-build-treesitter-parser-cpp", + version = "2.0.4-1" }, { name = "mapx.nvim", url = "b0o/mapx.nvim", version = "0.2.1-1" + }, { + name = "markdown.nvim", + url = "MeanderingProgrammer/render-markdown.nvim", + version = "5.0.1-1" + }, { + name = "markview.nvim", + url = "OXY2DEV/markview.nvim", + version = "22.0.1-1" }, { name = "mason-lspconfig.nvim", url = "williamboman/mason-lspconfig.nvim", - version = "1.29.0-1" + version = "1.30.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 = "mindmap.nvim", + url = "jnpngshiii/mindmap.nvim", + version = "0.7.1-1" }, { name = "mini.nvim", url = "echasnovski/mini.nvim", @@ -334,7 +410,7 @@ return }, { 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 +418,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", @@ -358,7 +434,7 @@ return }, { name = "neoconf.nvim", url = "folke/neoconf.nvim", - version = "1.2.2-1" + version = "1.3.2-1" }, { name = "neodev.nvim", url = "folke/neodev.nvim", @@ -366,7 +442,7 @@ return }, { name = "neogen", url = "danymat/neogen", - version = "2.17.1-1" + version = "2.19.4-1" }, { name = "neogit", url = "NeogitOrg/neogit", @@ -374,11 +450,27 @@ return }, { name = "neorg", url = "nvim-neorg/neorg", - version = "8.7.1-1" + version = "9.1.1-1" + }, { + name = "neorg-conceal-wrap", + url = "benlubas/neorg-conceal-wrap", + version = "1.0.0-1" + }, { + name = "neorg-interim-ls", + url = "benlubas/neorg-interim-ls", + version = "1.2.0-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 +478,43 @@ return }, { name = "neotest", url = "nvim-neotest/neotest", - version = "5.3.3-1" + version = "5.4.1-1" + }, { + name = "neotest-busted", + url = "MisanthropicBit/neotest-busted", + version = "0.1.0-1" + }, { + name = "neotest-golang", + url = "fredrikaverpil/neotest-golang", + version = "1.0.0-1" }, { name = "neotest-haskell", url = "mrcjkb/neotest-haskell", - version = "2.0.0-1" + version = "2.1.0-1" + }, { + name = "neotest-java", + url = "rcasia/neotest-java", + version = "0.14.1-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 = "1.16.0-1" }, { name = "noice.nvim", url = "folke/noice.nvim", - version = "4.3.0-1" + version = "4.5.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 +523,10 @@ return name = "nui.nvim", url = "MunifTanjim/nui.nvim", version = "0.3.0-1" + }, { + name = "nvim-bqf", + url = "kevinhwang91/nvim-bqf", + version = "1.1.1-1" }, { name = "nvim-client", url = "neovim/lua-client", @@ -423,10 +535,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", @@ -442,7 +550,7 @@ 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", @@ -486,7 +594,7 @@ return }, { name = "nvim-nio", url = "nvim-neotest/nvim-nio", - version = "1.9.4-1" + version = "1.10.0-1" }, { name = "nvim-notify", url = "rcarriga/nvim-notify", @@ -502,15 +610,19 @@ return }, { name = "nvim-possession", url = "gennaro-tedesco/nvim-possession", - version = "0.0.13-1" + version = "0.0.14-1" }, { name = "nvim-scrollview", url = "dstein64/nvim-scrollview", - version = "5.1.0-1" + version = "5.2.1-1" }, { name = "nvim-smuggler", url = "Klafyvel/nvim-smuggler", - version = "main-1" + version = "0.3.0-1" + }, { + name = "nvim-snippets", + url = "garymjr/nvim-snippets", + version = "1.0.0-1" }, { name = "nvim-snippy", url = "dcampos/nvim-snippy", @@ -522,7 +634,7 @@ return }, { 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 +647,22 @@ 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.0.3-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.12.1-1" }, { name = "onedarkpro.nvim", url = "olimorris/onedarkpro.nvim", - version = "0.8.0-1" + version = "1.0.0-1" }, { name = "onenord.nvim", url = "rmehri01/onenord.nvim", @@ -554,7 +670,7 @@ return }, { name = "otter.nvim", url = "jmbuhr/otter.nvim", - version = "1.15.1-1" + version = "2.5.0-1" }, { name = "overseer.nvim", url = "stevearc/overseer.nvim", @@ -574,7 +690,7 @@ return }, { name = "papis.nvim", url = "jghauser/papis.nvim", - version = "0.5.1-1" + version = "0.6.1-1" }, { name = "paq-nvim", url = "savq/paq-nvim", @@ -582,11 +698,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 = "1.1.0-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 +715,66 @@ return name = "pretty-fold.nvim", url = "anuvyklack/pretty-fold.nvim", version = "3.0-1" + }, { + name = "quarry.nvim", + url = "rudionrails/quarry.nvim", + version = "2.3.0-1" + }, { + name = "quicker.nvim", + url = "stevearc/quicker.nvim", + version = "1.1.1-1" }, { name = "rainbow-delimiters.nvim", url = "HiPhish/rainbow-delimiters.nvim", - version = "0.4.0-1" + version = "0.6.1-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 = "6.3.0-1" }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", - version = "2.0.1-1" + version = "3.2.1-1" }, { name = "rocks-config.nvim", url = "nvim-neorocks/rocks-config.nvim", - version = "2.1.0-1" + version = "2.2.0-1" }, { name = "rocks-dev.nvim", url = "nvim-neorocks/rocks-dev.nvim", - version = "1.2.3-1" + version = "1.5.0-1" }, { name = "rocks-git.nvim", url = "nvim-neorocks/rocks-git.nvim", - version = "1.5.1-1" + version = "2.0.1-1" + }, { + name = "rocks-lazy.nvim", + url = "nvim-neorocks/rocks-lazy.nvim", + version = "1.0.1-1" + }, { + name = "rocks-treesitter.nvim", + url = "nvim-neorocks/rocks-treesitter.nvim", + version = "1.1.1-1" }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.32.0-1" + version = "2.38.2-1" }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", - version = "1.0.0-1" + version = "1.2.0-1" }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "4.25.1-1" + version = "5.2.2-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -638,7 +782,7 @@ return }, { name = "screenkey.nvim", url = "NStefan002/screenkey.nvim", - version = "2.1.0-1" + version = "2.2.1-1" }, { name = "scrollbar.nvim", url = "Xuyuanp/scrollbar.nvim", @@ -646,7 +790,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.5.0-1" }, { name = "sg.nvim", url = "sourcegraph/sg.nvim", @@ -654,7 +802,7 @@ return }, { name = "smart-splits.nvim", url = "mrjones2014/smart-splits.nvim", - version = "1.5.0-1" + version = "1.6.0-1" }, { name = "squirrel.nvim", url = "xiaoshihou514/squirrel.nvim", @@ -671,14 +819,22 @@ 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" + }, { + name = "tangerine.nvim", + url = "udayvir-singh/tangerine.nvim", + version = "2.9-1" }, { name = "telescope-zf-native.nvim", url = "natecraddock/telescope-zf-native.nvim", @@ -690,35 +846,1215 @@ return }, { name = "todo-comments.nvim", url = "folke/todo-comments.nvim", - version = "1.2.0-1" + version = "1.3.0-1" }, { name = "toggleterm.nvim", url = "akinsho/toggleterm.nvim", - version = "2.11.0-1" + version = "2.12.0-1" }, { name = "tokyonight.nvim", url = "folke/tokyonight.nvim", - version = "3.0.1-1" + version = "4.8.0-1" + }, { + name = "tree-sitter-ada", + url = "briot/tree-sitter-ada", + version = "0.0.2-1" + }, { + name = "tree-sitter-agda", + url = "tree-sitter/tree-sitter-agda", + version = "0.0.2-1" + }, { + name = "tree-sitter-angular", + url = "dlvandenberg/tree-sitter-angular", + version = "0.0.3-1" + }, { + name = "tree-sitter-apex", + url = "aheber/tree-sitter-sfapex", + version = "0.0.3-1" + }, { + name = "tree-sitter-arduino", + url = "tree-sitter-grammars/tree-sitter-arduino", + version = "0.0.2-1" + }, { + name = "tree-sitter-asm", + url = "RubixDev/tree-sitter-asm", + version = "0.0.3-1" + }, { + name = "tree-sitter-astro", + url = "virchau13/tree-sitter-astro", + version = "0.0.2-1" + }, { + name = "tree-sitter-authzed", + url = "mleonidas/tree-sitter-authzed", + version = "0.0.2-1" + }, { + name = "tree-sitter-awk", + url = "Beaglefoot/tree-sitter-awk", + version = "0.0.2-1" + }, { + name = "tree-sitter-bash", + url = "tree-sitter/tree-sitter-bash", + version = "0.0.2-1" + }, { + name = "tree-sitter-bass", + url = "vito/tree-sitter-bass", + version = "0.0.2-1" + }, { + name = "tree-sitter-beancount", + url = "polarmutex/tree-sitter-beancount", + version = "0.0.3-1" + }, { + name = "tree-sitter-bibtex", + url = "latex-lsp/tree-sitter-bibtex", + version = "0.0.2-1" + }, { + name = "tree-sitter-bicep", + url = "tree-sitter-grammars/tree-sitter-bicep", + version = "0.0.2-1" + }, { + name = "tree-sitter-bitbake", + url = "tree-sitter-grammars/tree-sitter-bitbake", + version = "0.0.2-1" + }, { + name = "tree-sitter-blueprint", + url = "https://gitlab.com/gabmus/tree-sitter-blueprint/-/archive/60ba73739c6083c693d86a1a7cf039c07eb4ed59.zip", + version = "0.0.2-1" + }, { + name = "tree-sitter-bp", + url = "ambroisie/tree-sitter-bp", + version = "0.0.2-1" + }, { + name = "tree-sitter-c", + url = "tree-sitter/tree-sitter-c", + version = "0.0.3-1" + }, { + name = "tree-sitter-c_sharp", + url = "tree-sitter/tree-sitter-c-sharp", + version = "0.0.2-1" + }, { + name = "tree-sitter-cairo", + url = "tree-sitter-grammars/tree-sitter-cairo", + version = "0.0.2-1" + }, { + name = "tree-sitter-capnp", + url = "tree-sitter-grammars/tree-sitter-capnp", + version = "0.0.2-1" + }, { + name = "tree-sitter-chatito", + url = "tree-sitter-grammars/tree-sitter-chatito", + version = "0.0.2-1" + }, { + name = "tree-sitter-clojure", + url = "sogaiu/tree-sitter-clojure", + version = "0.0.2-1" + }, { + name = "tree-sitter-cmake", + url = "uyha/tree-sitter-cmake", + version = "0.0.2-1" + }, { + name = "tree-sitter-comment", + url = "stsewd/tree-sitter-comment", + version = "0.0.3-1" + }, { + name = "tree-sitter-commonlisp", + url = "tree-sitter-grammars/tree-sitter-commonlisp", + version = "0.0.2-1" + }, { + name = "tree-sitter-cooklang", + url = "addcninblue/tree-sitter-cooklang", + version = "0.0.2-1" + }, { + name = "tree-sitter-corn", + url = "jakestanger/tree-sitter-corn", + version = "0.0.2-1" + }, { + name = "tree-sitter-cpon", + url = "tree-sitter-grammars/tree-sitter-cpon", + version = "0.0.2-1" + }, { + name = "tree-sitter-cpp", + url = "tree-sitter/tree-sitter-cpp", + version = "0.0.3-1" + }, { + name = "tree-sitter-css", + url = "tree-sitter/tree-sitter-css", + version = "0.0.3-1" + }, { + name = "tree-sitter-csv", + url = "tree-sitter-grammars/tree-sitter-csv", + version = "0.0.2-1" + }, { + name = "tree-sitter-cuda", + url = "tree-sitter-grammars/tree-sitter-cuda", + version = "0.0.3-1" + }, { + name = "tree-sitter-cue", + url = "eonpatapon/tree-sitter-cue", + version = "0.0.2-1" + }, { + name = "tree-sitter-d", + url = "gdamore/tree-sitter-d", + version = "0.0.3-1" + }, { + name = "tree-sitter-dart", + url = "UserNobody14/tree-sitter-dart", + version = "0.0.3-1" + }, { + name = "tree-sitter-devicetree", + url = "joelspadin/tree-sitter-devicetree", + version = "0.0.3-1" + }, { + name = "tree-sitter-dhall", + url = "jbellerb/tree-sitter-dhall", + version = "0.0.2-1" + }, { + name = "tree-sitter-diff", + url = "the-mikedavis/tree-sitter-diff", + version = "0.0.2-1" + }, { + name = "tree-sitter-disassembly", + url = "ColinKennedy/tree-sitter-disassembly", + version = "0.0.2-1" + }, { + name = "tree-sitter-djot", + url = "treeman/tree-sitter-djot", + version = "0.0.2-1" + }, { + name = "tree-sitter-dockerfile", + url = "camdencheek/tree-sitter-dockerfile", + version = "0.0.2-1" + }, { + name = "tree-sitter-dot", + url = "rydesun/tree-sitter-dot", + version = "0.0.2-1" + }, { + name = "tree-sitter-doxygen", + url = "tree-sitter-grammars/tree-sitter-doxygen", + version = "0.0.2-1" + }, { + name = "tree-sitter-dtd", + url = "tree-sitter-grammars/tree-sitter-xml", + version = "0.0.2-1" + }, { + name = "tree-sitter-earthfile", + url = "glehmann/tree-sitter-earthfile", + version = "0.0.2-1" + }, { + name = "tree-sitter-ebnf", + url = "RubixDev/ebnf", + version = "0.0.2-1" + }, { + name = "tree-sitter-ecma", + url = "nvim-neorocks/luarocks-stub", + version = "0.0.2-1" + }, { + name = "tree-sitter-editorconfig", + url = "ValdezFOmar/tree-sitter-editorconfig", + version = "0.0.4-1" + }, { + name = "tree-sitter-eds", + url = "uyha/tree-sitter-eds", + version = "0.0.2-1" + }, { + name = "tree-sitter-eex", + url = "connorlay/tree-sitter-eex", + version = "0.0.2-1" + }, { + name = "tree-sitter-elixir", + url = "elixir-lang/tree-sitter-elixir", + version = "0.0.2-1" + }, { + name = "tree-sitter-elm", + url = "elm-tooling/tree-sitter-elm", + version = "0.0.2-1" + }, { + name = "tree-sitter-elsa", + url = "glapa-grossklag/tree-sitter-elsa", + version = "0.0.2-1" + }, { + name = "tree-sitter-elvish", + url = "elves/tree-sitter-elvish", + version = "0.0.2-1" + }, { + name = "tree-sitter-embedded_template", + url = "tree-sitter/tree-sitter-embedded-template", + version = "0.0.3-1" + }, { + name = "tree-sitter-erlang", + url = "WhatsApp/tree-sitter-erlang", + version = "0.0.3-1" + }, { + name = "tree-sitter-facility", + url = "FacilityApi/tree-sitter-facility", + version = "0.0.2-1" + }, { + name = "tree-sitter-faust", + url = "khiner/tree-sitter-faust", + version = "0.0.2-1" + }, { + name = "tree-sitter-fennel", + url = "alexmozaidze/tree-sitter-fennel", + version = "0.0.2-1" + }, { + name = "tree-sitter-fidl", + url = "google/tree-sitter-fidl", + version = "0.0.2-1" + }, { + name = "tree-sitter-firrtl", + url = "tree-sitter-grammars/tree-sitter-firrtl", + version = "0.0.2-1" + }, { + name = "tree-sitter-fish", + url = "ram02z/tree-sitter-fish", + version = "0.0.2-1" + }, { + name = "tree-sitter-foam", + url = "FoamScience/tree-sitter-foam", + version = "0.0.2-1" + }, { + name = "tree-sitter-forth", + url = "AlexanderBrevig/tree-sitter-forth", + version = "0.0.2-1" + }, { + name = "tree-sitter-fortran", + url = "stadelmanma/tree-sitter-fortran", + version = "0.0.4-1" + }, { + name = "tree-sitter-fsh", + url = "mgramigna/tree-sitter-fsh", + version = "0.0.2-1" + }, { + name = "tree-sitter-func", + url = "tree-sitter-grammars/tree-sitter-func", + version = "0.0.2-1" + }, { + name = "tree-sitter-fusion", + url = "https://gitlab.com/jirgn/tree-sitter-fusion/-/archive/19db2f47ba4c3a0f6238d4ae0e2abfca16e61dd6.zip", + version = "0.0.2-1" + }, { + name = "tree-sitter-gdscript", + url = "PrestonKnopp/tree-sitter-gdscript", + version = "0.0.2-1" + }, { + name = "tree-sitter-gdshader", + url = "GodOfAvacyn/tree-sitter-gdshader", + version = "0.0.2-1" + }, { + name = "tree-sitter-git_config", + url = "the-mikedavis/tree-sitter-git-config", + version = "0.0.2-1" + }, { + name = "tree-sitter-git_rebase", + url = "the-mikedavis/tree-sitter-git-rebase", + version = "0.0.3-1" + }, { + name = "tree-sitter-gitattributes", + url = "tree-sitter-grammars/tree-sitter-gitattributes", + version = "0.0.2-1" + }, { + name = "tree-sitter-gitcommit", + url = "gbprod/tree-sitter-gitcommit", + version = "0.0.2-1" + }, { + name = "tree-sitter-gitignore", + url = "shunsambongi/tree-sitter-gitignore", + version = "0.0.2-1" + }, { + name = "tree-sitter-gleam", + url = "gleam-lang/tree-sitter-gleam", + version = "0.0.3-1" + }, { + name = "tree-sitter-glimmer", + url = "alexlafroscia/tree-sitter-glimmer", + version = "0.0.3-1" + }, { + name = "tree-sitter-glsl", + url = "tree-sitter-grammars/tree-sitter-glsl", + version = "0.0.3-1" + }, { + name = "tree-sitter-gn", + url = "tree-sitter-grammars/tree-sitter-gn", + version = "0.0.2-1" + }, { + name = "tree-sitter-gnuplot", + url = "dpezto/tree-sitter-gnuplot", + version = "0.0.2-1" + }, { + name = "tree-sitter-go", + url = "tree-sitter/tree-sitter-go", + version = "0.0.3-1" + }, { + name = "tree-sitter-goctl", + url = "chaozwn/tree-sitter-goctl", + version = "0.0.3-1" + }, { + name = "tree-sitter-godot_resource", + url = "PrestonKnopp/tree-sitter-godot-resource", + version = "0.0.2-1" + }, { + name = "tree-sitter-gomod", + url = "camdencheek/tree-sitter-go-mod", + version = "0.0.3-1" + }, { + name = "tree-sitter-gosum", + url = "tree-sitter-grammars/tree-sitter-go-sum", + version = "0.0.2-1" + }, { + name = "tree-sitter-gotmpl", + url = "ngalaiko/tree-sitter-go-template", + version = "0.0.3-1" + }, { + name = "tree-sitter-gowork", + url = "omertuc/tree-sitter-go-work", + version = "0.0.2-1" + }, { + name = "tree-sitter-gpg", + url = "tree-sitter-grammars/tree-sitter-gpg-config", + version = "0.0.2-1" + }, { + name = "tree-sitter-graphql", + url = "bkegley/tree-sitter-graphql", + version = "0.0.2-1" + }, { + name = "tree-sitter-groovy", + url = "murtaza64/tree-sitter-groovy", + version = "0.0.3-1" + }, { + name = "tree-sitter-gstlaunch", + url = "tree-sitter-grammars/tree-sitter-gstlaunch", + version = "0.0.2-1" + }, { + name = "tree-sitter-hack", + url = "slackhq/tree-sitter-hack", + version = "0.0.2-1" + }, { + name = "tree-sitter-hare", + url = "tree-sitter-grammars/tree-sitter-hare", + version = "0.0.2-1" + }, { + name = "tree-sitter-haskell", + url = "tree-sitter/tree-sitter-haskell", + version = "0.0.2-1" + }, { + name = "tree-sitter-haskell_persistent", + url = "MercuryTechnologies/tree-sitter-haskell-persistent", + version = "0.0.2-1" + }, { + name = "tree-sitter-hcl", + url = "tree-sitter-grammars/tree-sitter-hcl", + version = "0.0.2-1" + }, { + name = "tree-sitter-heex", + url = "connorlay/tree-sitter-heex", + version = "0.0.3-1" + }, { + name = "tree-sitter-helm", + url = "ngalaiko/tree-sitter-go-template", + version = "0.0.3-1" + }, { + name = "tree-sitter-hjson", + url = "winston0410/tree-sitter-hjson", + version = "0.0.2-1" + }, { + name = "tree-sitter-hlsl", + url = "tree-sitter-grammars/tree-sitter-hlsl", + version = "0.0.3-1" + }, { + name = "tree-sitter-hlsplaylist", + url = "Freed-Wu/tree-sitter-hlsplaylist", + version = "0.0.3-1" + }, { + name = "tree-sitter-hocon", + url = "antosha417/tree-sitter-hocon", + version = "0.0.2-1" + }, { + name = "tree-sitter-hoon", + url = "urbit-pilled/tree-sitter-hoon", + version = "0.0.2-1" + }, { + name = "tree-sitter-html", + url = "tree-sitter/tree-sitter-html", + version = "0.0.3-1" + }, { + name = "tree-sitter-html_tags", + url = "nvim-neorocks/luarocks-stub", + version = "0.0.2-1" + }, { + name = "tree-sitter-htmldjango", + url = "interdependence/tree-sitter-htmldjango", + version = "0.0.2-1" + }, { + name = "tree-sitter-http", + url = "rest-nvim/tree-sitter-http", + version = "0.0.3-1" + }, { + name = "tree-sitter-hurl", + url = "pfeiferj/tree-sitter-hurl", + version = "0.0.3-1" + }, { + name = "tree-sitter-hyprlang", + url = "tree-sitter-grammars/tree-sitter-hyprlang", + version = "0.0.2-1" + }, { + name = "tree-sitter-idl", + url = "cathaysia/tree-sitter-idl", + version = "0.0.3-1" + }, { + name = "tree-sitter-ini", + url = "justinmk/tree-sitter-ini", + version = "0.0.3-1" + }, { + name = "tree-sitter-inko", + url = "inko-lang/tree-sitter-inko", + version = "0.0.2-1" + }, { + name = "tree-sitter-ispc", + url = "tree-sitter-grammars/tree-sitter-ispc", + version = "0.0.2-1" + }, { + name = "tree-sitter-janet_simple", + url = "sogaiu/tree-sitter-janet-simple", + version = "0.0.3-1" + }, { + name = "tree-sitter-java", + url = "tree-sitter/tree-sitter-java", + version = "0.0.3-1" + }, { + name = "tree-sitter-javascript", + url = "tree-sitter/tree-sitter-javascript", + version = "0.0.3-1" + }, { + name = "tree-sitter-jq", + url = "flurie/tree-sitter-jq", + version = "0.0.2-1" + }, { + name = "tree-sitter-jsdoc", + url = "tree-sitter/tree-sitter-jsdoc", + version = "0.0.2-1" + }, { + name = "tree-sitter-json", + url = "tree-sitter/tree-sitter-json", + version = "0.0.3-1" + }, { + name = "tree-sitter-json5", + url = "Joakker/tree-sitter-json5", + version = "0.0.2-1" + }, { + name = "tree-sitter-jsonc", + url = "https://gitlab.com/WhyNotHugo/tree-sitter-jsonc/-/archive/02b01653c8a1c198ae7287d566efa86a135b30d5.zip", + version = "0.0.2-1" + }, { + name = "tree-sitter-jsonnet", + url = "sourcegraph/tree-sitter-jsonnet", + version = "0.0.4-1" + }, { + name = "tree-sitter-jsx", + url = "nvim-neorocks/luarocks-stub", + version = "0.0.2-1" + }, { + name = "tree-sitter-julia", + url = "tree-sitter/tree-sitter-julia", + version = "0.0.3-1" + }, { + name = "tree-sitter-just", + url = "IndianBoy42/tree-sitter-just", + version = "0.0.3-1" + }, { + name = "tree-sitter-kconfig", + url = "tree-sitter-grammars/tree-sitter-kconfig", + version = "0.0.2-1" + }, { + name = "tree-sitter-kdl", + url = "tree-sitter-grammars/tree-sitter-kdl", + version = "0.0.2-1" + }, { + name = "tree-sitter-kotlin", + url = "fwcd/tree-sitter-kotlin", + version = "0.0.4-1" + }, { + name = "tree-sitter-koto", + url = "koto-lang/tree-sitter-koto", + version = "0.0.2-1" + }, { + name = "tree-sitter-kusto", + url = "Willem-J-an/tree-sitter-kusto", + version = "0.0.2-1" + }, { + name = "tree-sitter-lalrpop", + url = "traxys/tree-sitter-lalrpop", + version = "0.0.2-1" + }, { + name = "tree-sitter-latex", + url = "latex-lsp/tree-sitter-latex", + version = "0.0.3-1" + }, { + name = "tree-sitter-ledger", + url = "cbarrete/tree-sitter-ledger", + version = "0.0.2-1" + }, { + name = "tree-sitter-leo", + url = "r001/tree-sitter-leo", + version = "0.0.4-1" + }, { + name = "tree-sitter-linkerscript", + url = "tree-sitter-grammars/tree-sitter-linkerscript", + version = "0.0.2-1" + }, { + name = "tree-sitter-liquid", + url = "hankthetank27/tree-sitter-liquid", + version = "0.0.5-1" + }, { + name = "tree-sitter-liquidsoap", + url = "savonet/tree-sitter-liquidsoap", + version = "0.0.2-1" + }, { + name = "tree-sitter-llvm", + url = "benwilliamgraham/tree-sitter-llvm", + version = "0.0.2-1" + }, { + name = "tree-sitter-lua", + url = "tree-sitter-grammars/tree-sitter-lua", + version = "0.0.2-1" + }, { + name = "tree-sitter-luadoc", + url = "tree-sitter-grammars/tree-sitter-luadoc", + version = "0.0.2-1" + }, { + name = "tree-sitter-luap", + url = "tree-sitter-grammars/tree-sitter-luap", + version = "0.0.2-1" + }, { + name = "tree-sitter-luau", + url = "tree-sitter-grammars/tree-sitter-luau", + version = "0.0.2-1" + }, { + name = "tree-sitter-m68k", + url = "grahambates/tree-sitter-m68k", + version = "0.0.3-1" + }, { + name = "tree-sitter-make", + url = "alemuller/tree-sitter-make", + version = "0.0.2-1" + }, { + name = "tree-sitter-markdown", + url = "tree-sitter-grammars/tree-sitter-markdown", + version = "0.0.2-1" + }, { + name = "tree-sitter-markdown_inline", + url = "tree-sitter-grammars/tree-sitter-markdown", + version = "0.0.2-1" + }, { + name = "tree-sitter-matlab", + url = "acristoffers/tree-sitter-matlab", + version = "0.0.4-1" + }, { + name = "tree-sitter-menhir", + url = "Kerl13/tree-sitter-menhir", + version = "0.0.2-1" + }, { + name = "tree-sitter-mermaid", + url = "monaqa/tree-sitter-mermaid", + version = "0.0.2-1" + }, { + name = "tree-sitter-meson", + url = "tree-sitter-grammars/tree-sitter-meson", + version = "0.0.2-1" + }, { + name = "tree-sitter-mlir", + url = "artagnon/tree-sitter-mlir", + version = "0.0.3-1" + }, { + name = "tree-sitter-muttrc", + url = "neomutt/tree-sitter-muttrc", + version = "0.0.3-1" + }, { + name = "tree-sitter-nasm", + url = "naclsn/tree-sitter-nasm", + version = "0.0.2-1" + }, { + name = "tree-sitter-nginx", + url = "opa-oz/tree-sitter-nginx", + version = "0.0.2-1" + }, { + name = "tree-sitter-nickel", + url = "nickel-lang/tree-sitter-nickel", + version = "0.0.4-1" + }, { + name = "tree-sitter-nim", + url = "alaviss/tree-sitter-nim", + version = "0.0.2-1" + }, { + name = "tree-sitter-nim_format_string", + url = "aMOPel/tree-sitter-nim-format-string", + version = "0.0.2-1" + }, { + name = "tree-sitter-ninja", + url = "alemuller/tree-sitter-ninja", + version = "0.0.2-1" + }, { + name = "tree-sitter-nix", + url = "cstrahan/tree-sitter-nix", + version = "0.0.5-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", - version = "0.2.4-1" + version = "0.2.5-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.2-1" + }, { + name = "tree-sitter-objc", + url = "tree-sitter-grammars/tree-sitter-objc", + version = "0.0.2-1" + }, { + name = "tree-sitter-objdump", + url = "ColinKennedy/tree-sitter-objdump", + version = "0.0.2-1" + }, { + name = "tree-sitter-ocaml", + url = "tree-sitter/tree-sitter-ocaml", + version = "0.0.2-1" + }, { + name = "tree-sitter-ocaml_interface", + url = "tree-sitter/tree-sitter-ocaml", + version = "0.0.2-1" + }, { + name = "tree-sitter-ocamllex", + url = "atom-ocaml/tree-sitter-ocamllex", + version = "0.0.2-1" + }, { + name = "tree-sitter-odin", + url = "tree-sitter-grammars/tree-sitter-odin", + version = "0.0.2-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.3-1" + }, { + name = "tree-sitter-passwd", + url = "ath3/tree-sitter-passwd", + version = "0.0.2-1" + }, { + name = "tree-sitter-pem", + url = "tree-sitter-grammars/tree-sitter-pem", + version = "0.0.2-1" + }, { + name = "tree-sitter-perl", + url = "tree-sitter-perl/tree-sitter-perl", + version = "0.0.4-1" + }, { + name = "tree-sitter-php", + url = "tree-sitter/tree-sitter-php", + version = "0.0.4-1" + }, { + name = "tree-sitter-php_only", + url = "tree-sitter/tree-sitter-php", + version = "0.0.4-1" + }, { + name = "tree-sitter-phpdoc", + url = "claytonrcarter/tree-sitter-phpdoc", + version = "0.0.2-1" + }, { + name = "tree-sitter-pioasm", + url = "leo60228/tree-sitter-pioasm", + version = "0.0.2-1" + }, { + name = "tree-sitter-po", + url = "tree-sitter-grammars/tree-sitter-po", + version = "0.0.2-1" + }, { + name = "tree-sitter-pod", + url = "tree-sitter-perl/tree-sitter-pod", + version = "0.0.3-1" + }, { + name = "tree-sitter-poe_filter", + url = "tree-sitter-grammars/tree-sitter-poe-filter", + version = "0.0.2-1" + }, { + name = "tree-sitter-pony", + url = "tree-sitter-grammars/tree-sitter-pony", + version = "0.0.2-1" + }, { + name = "tree-sitter-powershell", + url = "airbus-cert/tree-sitter-powershell", + version = "0.0.3-1" + }, { + name = "tree-sitter-printf", + url = "tree-sitter-grammars/tree-sitter-printf", + version = "0.0.2-1" + }, { + name = "tree-sitter-prisma", + url = "victorhqc/tree-sitter-prisma", + version = "0.0.2-1" + }, { + name = "tree-sitter-problog", + url = "foxyseta/tree-sitter-prolog", + version = "0.0.3-1" + }, { + name = "tree-sitter-prolog", + url = "foxyseta/tree-sitter-prolog", + version = "0.0.3-1" + }, { + name = "tree-sitter-promql", + url = "MichaHoffmann/tree-sitter-promql", + version = "0.0.2-1" + }, { + name = "tree-sitter-properties", + url = "tree-sitter-grammars/tree-sitter-properties", + version = "0.0.2-1" + }, { + name = "tree-sitter-proto", + url = "treywood/tree-sitter-proto", + version = "0.0.2-1" + }, { + name = "tree-sitter-prql", + url = "PRQL/tree-sitter-prql", + version = "0.0.2-1" + }, { + name = "tree-sitter-psv", + url = "tree-sitter-grammars/tree-sitter-csv", + version = "0.0.2-1" + }, { + name = "tree-sitter-pug", + url = "zealot128/tree-sitter-pug", + version = "0.0.2-1" + }, { + name = "tree-sitter-puppet", + url = "tree-sitter-grammars/tree-sitter-puppet", + version = "0.0.2-1" + }, { + name = "tree-sitter-purescript", + url = "postsolar/tree-sitter-purescript", + version = "0.0.2-1" + }, { + name = "tree-sitter-pymanifest", + url = "tree-sitter-grammars/tree-sitter-pymanifest", + version = "0.0.2-1" + }, { + name = "tree-sitter-python", + url = "tree-sitter/tree-sitter-python", + version = "0.0.3-1" + }, { + name = "tree-sitter-ql", + url = "tree-sitter/tree-sitter-ql", + version = "0.0.2-1" + }, { + name = "tree-sitter-qmldir", + url = "tree-sitter-grammars/tree-sitter-qmldir", + version = "0.0.2-1" + }, { + name = "tree-sitter-qmljs", + url = "yuja/tree-sitter-qmljs", + version = "0.0.3-1" + }, { + name = "tree-sitter-query", + url = "tree-sitter-grammars/tree-sitter-query", + version = "0.0.2-1" + }, { + name = "tree-sitter-r", + url = "r-lib/tree-sitter-r", + version = "0.0.2-1" + }, { + name = "tree-sitter-racket", + url = "6cdh/tree-sitter-racket", + version = "0.0.2-1" + }, { + name = "tree-sitter-ralph", + url = "alephium/tree-sitter-ralph", + version = "0.0.2-1" + }, { + name = "tree-sitter-rasi", + url = "Fymyte/tree-sitter-rasi", + version = "0.0.2-1" + }, { + name = "tree-sitter-rbs", + url = "joker1007/tree-sitter-rbs", + version = "0.0.2-1" + }, { + name = "tree-sitter-re2c", + url = "tree-sitter-grammars/tree-sitter-re2c", + version = "0.0.2-1" + }, { + name = "tree-sitter-readline", + url = "tree-sitter-grammars/tree-sitter-readline", + version = "0.0.2-1" + }, { + name = "tree-sitter-regex", + url = "tree-sitter/tree-sitter-regex", + version = "0.0.2-1" + }, { + name = "tree-sitter-rego", + url = "FallenAngel97/tree-sitter-rego", + version = "0.0.2-1" + }, { + name = "tree-sitter-requirements", + url = "tree-sitter-grammars/tree-sitter-requirements", + version = "0.0.2-1" + }, { + name = "tree-sitter-rescript", + url = "rescript-lang/tree-sitter-rescript", + version = "0.0.3-1" + }, { + name = "tree-sitter-rnoweb", + url = "bamonroe/tree-sitter-rnoweb", + version = "0.0.2-1" + }, { + name = "tree-sitter-robot", + url = "Hubro/tree-sitter-robot", + version = "0.0.2-1" + }, { + name = "tree-sitter-robots", + url = "opa-oz/tree-sitter-robots-txt", + version = "0.0.2-1" + }, { + name = "tree-sitter-roc", + url = "faldor20/tree-sitter-roc", + version = "0.0.3-1" + }, { + name = "tree-sitter-ron", + url = "tree-sitter-grammars/tree-sitter-ron", + version = "0.0.2-1" + }, { + name = "tree-sitter-rst", + url = "stsewd/tree-sitter-rst", + version = "0.0.2-1" + }, { + name = "tree-sitter-ruby", + url = "tree-sitter/tree-sitter-ruby", + version = "0.0.3-1" + }, { + name = "tree-sitter-rust", + url = "tree-sitter/tree-sitter-rust", + version = "0.0.3-1" + }, { + name = "tree-sitter-scala", + url = "tree-sitter/tree-sitter-scala", + version = "0.0.3-1" + }, { + name = "tree-sitter-scfg", + url = "rockorager/tree-sitter-scfg", + version = "0.0.2-1" + }, { + name = "tree-sitter-scheme", + url = "6cdh/tree-sitter-scheme", + version = "0.0.2-1" + }, { + name = "tree-sitter-scss", + url = "serenadeai/tree-sitter-scss", + version = "0.0.2-1" + }, { + name = "tree-sitter-sflog", + url = "aheber/tree-sitter-sfapex", + version = "0.0.3-1" + }, { + name = "tree-sitter-slang", + url = "tree-sitter-grammars/tree-sitter-slang", + version = "0.0.3-1" + }, { + name = "tree-sitter-slint", + url = "slint-ui/tree-sitter-slint", + version = "0.0.3-1" + }, { + name = "tree-sitter-smali", + url = "tree-sitter-grammars/tree-sitter-smali", + version = "0.0.2-1" + }, { + name = "tree-sitter-smithy", + url = "indoorvivants/tree-sitter-smithy", + version = "0.0.2-1" + }, { + name = "tree-sitter-snakemake", + url = "osthomas/tree-sitter-snakemake", + version = "0.0.3-1" + }, { + name = "tree-sitter-solidity", + url = "JoranHonig/tree-sitter-solidity", + version = "0.0.2-1" + }, { + name = "tree-sitter-soql", + url = "aheber/tree-sitter-sfapex", + version = "0.0.3-1" + }, { + name = "tree-sitter-sosl", + url = "aheber/tree-sitter-sfapex", + version = "0.0.3-1" + }, { + name = "tree-sitter-sourcepawn", + url = "nilshelmig/tree-sitter-sourcepawn", + version = "0.0.3-1" + }, { + name = "tree-sitter-sparql", + url = "GordianDziwis/tree-sitter-sparql", + version = "0.0.2-1" + }, { + name = "tree-sitter-sql", + url = "derekstride/tree-sitter-sql", + version = "0.0.3-1" + }, { + name = "tree-sitter-squirrel", + url = "tree-sitter-grammars/tree-sitter-squirrel", + version = "0.0.2-1" + }, { + name = "tree-sitter-ssh_config", + url = "tree-sitter-grammars/tree-sitter-ssh-config", + version = "0.0.2-1" + }, { + name = "tree-sitter-starlark", + url = "tree-sitter-grammars/tree-sitter-starlark", + version = "0.0.2-1" + }, { + name = "tree-sitter-strace", + url = "sigmaSd/tree-sitter-strace", + version = "0.0.2-1" + }, { + name = "tree-sitter-styled", + url = "mskelton/tree-sitter-styled", + version = "0.0.3-1" + }, { + name = "tree-sitter-supercollider", + url = "madskjeldgaard/tree-sitter-supercollider", + version = "0.0.2-1" + }, { + name = "tree-sitter-surface", + url = "connorlay/tree-sitter-surface", + version = "0.0.2-1" + }, { + name = "tree-sitter-svelte", + url = "tree-sitter-grammars/tree-sitter-svelte", + version = "0.0.3-1" + }, { + name = "tree-sitter-swift", + url = "alex-pinkus/tree-sitter-swift", + version = "0.0.3-1" + }, { + name = "tree-sitter-sxhkdrc", + url = "RaafatTurki/tree-sitter-sxhkdrc", + version = "0.0.2-1" + }, { + name = "tree-sitter-systemtap", + url = "ok-ryoko/tree-sitter-systemtap", + version = "0.0.3-1" + }, { + name = "tree-sitter-systemverilog", + url = "zhangwwpeng/tree-sitter-systemverilog", + version = "0.0.3-1" + }, { + name = "tree-sitter-t32", + url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/6182836f4128725f1e74ce986840d7317021a015.zip", + version = "0.0.2-1" + }, { + name = "tree-sitter-tablegen", + url = "tree-sitter-grammars/tree-sitter-tablegen", + version = "0.0.2-1" + }, { + name = "tree-sitter-tact", + url = "tact-lang/tree-sitter-tact", + version = "0.0.3-1" + }, { + name = "tree-sitter-tcl", + url = "tree-sitter-grammars/tree-sitter-tcl", + version = "0.0.2-1" + }, { + name = "tree-sitter-teal", + url = "euclidianAce/tree-sitter-teal", + version = "0.0.2-1" + }, { + name = "tree-sitter-templ", + url = "vrischmann/tree-sitter-templ", + version = "0.0.3-1" + }, { + name = "tree-sitter-terraform", + url = "MichaHoffmann/tree-sitter-hcl", + version = "0.0.2-1" + }, { + name = "tree-sitter-textproto", + url = "PorterAtGoogle/tree-sitter-textproto", + version = "0.0.2-1" + }, { + name = "tree-sitter-thrift", + url = "tree-sitter-grammars/tree-sitter-thrift", + version = "0.0.2-1" + }, { + name = "tree-sitter-tiger", + url = "ambroisie/tree-sitter-tiger", + version = "0.0.2-1" + }, { + name = "tree-sitter-tlaplus", + url = "tlaplus-community/tree-sitter-tlaplus", + version = "0.0.2-1" + }, { + name = "tree-sitter-tmux", + url = "Freed-Wu/tree-sitter-tmux", + version = "0.0.3-1" + }, { + name = "tree-sitter-todotxt", + url = "arnarg/tree-sitter-todotxt", + version = "0.0.2-1" + }, { + name = "tree-sitter-toml", + url = "tree-sitter-grammars/tree-sitter-toml", + version = "0.0.2-1" + }, { + name = "tree-sitter-tsv", + url = "tree-sitter-grammars/tree-sitter-csv", + version = "0.0.2-1" + }, { + name = "tree-sitter-tsx", + url = "tree-sitter/tree-sitter-typescript", + version = "0.0.3-1" + }, { + name = "tree-sitter-turtle", + url = "GordianDziwis/tree-sitter-turtle", + version = "0.0.2-1" + }, { + name = "tree-sitter-twig", + url = "gbprod/tree-sitter-twig", + version = "0.0.2-1" + }, { + name = "tree-sitter-typescript", + url = "tree-sitter/tree-sitter-typescript", + version = "0.0.3-1" + }, { + name = "tree-sitter-typespec", + url = "happenslol/tree-sitter-typespec", + version = "0.0.3-1" + }, { + name = "tree-sitter-typoscript", + url = "Teddytrombone/tree-sitter-typoscript", + version = "0.0.2-1" + }, { + name = "tree-sitter-typst", + url = "uben0/tree-sitter-typst", + version = "0.0.3-1" + }, { + name = "tree-sitter-udev", + url = "tree-sitter-grammars/tree-sitter-udev", + version = "0.0.2-1" + }, { + name = "tree-sitter-ungrammar", + url = "tree-sitter-grammars/tree-sitter-ungrammar", + version = "0.0.2-1" + }, { + name = "tree-sitter-unison", + url = "kylegoetz/tree-sitter-unison", + version = "0.0.2-1" + }, { + name = "tree-sitter-usd", + url = "ColinKennedy/tree-sitter-usd", + version = "0.0.2-1" + }, { + name = "tree-sitter-uxntal", + url = "tree-sitter-grammars/tree-sitter-uxntal", + version = "0.0.2-1" + }, { + name = "tree-sitter-v", + url = "vlang/v-analyzer", + version = "0.0.3-1" + }, { + name = "tree-sitter-vala", + url = "vala-lang/tree-sitter-vala", + version = "0.0.2-1" + }, { + name = "tree-sitter-vento", + url = "ventojs/tree-sitter-vento", + version = "0.0.2-1" + }, { + name = "tree-sitter-verilog", + url = "tree-sitter/tree-sitter-verilog", + version = "0.0.2-1" + }, { + name = "tree-sitter-vhdl", + url = "jpt13653903/tree-sitter-vhdl", + version = "0.0.2-1" + }, { + name = "tree-sitter-vhs", + url = "charmbracelet/tree-sitter-vhs", + version = "0.0.3-1" + }, { + name = "tree-sitter-vim", + url = "tree-sitter-grammars/tree-sitter-vim", + version = "0.0.3-1" + }, { + name = "tree-sitter-vimdoc", + url = "neovim/tree-sitter-vimdoc", + version = "0.0.2-1" + }, { + name = "tree-sitter-vrl", + url = "belltoy/tree-sitter-vrl", + version = "0.0.2-1" + }, { + name = "tree-sitter-vue", + url = "tree-sitter-grammars/tree-sitter-vue", + version = "0.0.2-1" + }, { + name = "tree-sitter-wgsl", + url = "szebniok/tree-sitter-wgsl", + version = "0.0.2-1" + }, { + name = "tree-sitter-wgsl_bevy", + url = "tree-sitter-grammars/tree-sitter-wgsl-bevy", + version = "0.0.2-1" + }, { + name = "tree-sitter-wing", + url = "winglang/tree-sitter-wing", + version = "0.0.2-1" + }, { + name = "tree-sitter-wit", + url = "liamwh/tree-sitter-wit", + version = "0.0.3-1" + }, { + name = "tree-sitter-xcompose", + url = "tree-sitter-grammars/tree-sitter-xcompose", + version = "0.0.2-1" + }, { + name = "tree-sitter-xml", + url = "tree-sitter-grammars/tree-sitter-xml", + version = "0.0.2-1" + }, { + name = "tree-sitter-yaml", + url = "tree-sitter-grammars/tree-sitter-yaml", + version = "0.0.2-1" + }, { + name = "tree-sitter-yang", + url = "Hubro/tree-sitter-yang", + version = "0.0.2-1" + }, { + name = "tree-sitter-yuck", + url = "tree-sitter-grammars/tree-sitter-yuck", + version = "0.0.2-1" + }, { + name = "tree-sitter-zathurarc", + url = "Freed-Wu/tree-sitter-zathurarc", + version = "0.0.3-1" + }, { + name = "tree-sitter-zig", + url = "tree-sitter-grammars/tree-sitter-zig", + version = "0.0.3-1" }, { name = "trouble.nvim", url = "folke/trouble.nvim", - version = "3.4.3-1" + version = "3.6.0-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.4.1-1" }, { name = "twilight.nvim", url = "folke/twilight.nvim", @@ -730,15 +2066,19 @@ return }, { name = "vgit.nvim", url = "tanvirtin/vgit.nvim", - version = "0.2.2-1" + version = "0.2.3-1" }, { name = "which-key.nvim", url = "folke/which-key.nvim", - version = "2.1.0-1" + version = "3.13.2-1" }, { name = "windline.nvim", url = "windwp/windline.nvim", version = "1.1.0-1" + }, { + name = "wrapping-paper.nvim", + url = "benlubas/wrapping-paper.nvim", + version = "1.0.0-1" }, { name = "yanky.nvim", url = "gbprod/yanky.nvim", @@ -746,11 +2086,11 @@ return }, { name = "yazi.nvim", url = "mikavilpas/yazi.nvim", - version = "master-1" + version = "6.0.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", From aca30f63619a7492ecdea8833a065cf83c80f764 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 16 Sep 2024 10:13:11 +0200 Subject: [PATCH 1567/1610] fix(bootstrap): single forward slash. Fixes #1747 --- bootstrap.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bootstrap.lua b/bootstrap.lua index 16d9f1d..88c1a44 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"))() @@ -7,7 +7,7 @@ local M = {} function M.setup() 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 From 460e1cd8f24e364d54543a4b0e83f6f4ec1f65fb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 08:17:41 +0000 Subject: [PATCH 1568/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 710 ++++++++++++++++-------------- 1 file changed, 375 insertions(+), 335 deletions(-) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index b91e678..6b1d4fb 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -14,11 +14,11 @@ return }, { name = "aerial.nvim", url = "stevearc/aerial.nvim", - version = "2.2.0-1" + version = "2.3.0-1" }, { name = "ai.nvim", url = "S1M0N38/ai.nvim", - version = "0.1.0-1" + version = "1.2.0-1" }, { name = "astral.nvim", url = "rootiest/astral.nvim", @@ -31,6 +31,14 @@ return name = "banana.nvim", url = "CWood-sdf/banana.nvim", version = "0.1.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", @@ -90,11 +98,15 @@ return }, { name = "conform.nvim", url = "stevearc/conform.nvim", - version = "8.0.0-1" + version = "8.1.0-1" }, { name = "cybu.nvim", url = "ghillb/cybu.nvim", version = "1.0-1" + }, { + name = "dante.nvim", + url = "S1M0N38/dante.nvim", + version = "1.0.1-1" }, { name = "daylight.nvim", url = "NTBBloodbath/daylight.nvim", @@ -106,7 +118,7 @@ return }, { name = "decipher.nvim", url = "MisanthropicBit/decipher.nvim", - version = "1.0.1-1" + version = "1.0.2-1" }, { name = "delog.nvim", url = "ej-shafran/delog.nvim", @@ -214,7 +226,7 @@ return }, { name = "git.nvim", url = "Kibadda/git.nvim", - version = "3.3.1-1" + version = "3.3.2-1" }, { name = "github-nvim-theme", url = "projekt0n/github-nvim-theme", @@ -223,6 +235,10 @@ return name = "gitlinker.nvim", url = "linrongbin16/gitlinker.nvim", version = "4.13.1-1" + }, { + name = "gitsigns.nvim", + url = "lewis6991/gitsigns.nvim", + version = "0.9.0-1" }, { name = "glow.nvim", url = "ellisonleao/glow.nvim", @@ -258,7 +274,7 @@ return }, { name = "headlines.nvim", url = "lukas-reineke/headlines.nvim", - version = "4.0.1-1" + version = "4.0.2-1" }, { name = "heirline.nvim", url = "rebelot/heirline.nvim", @@ -278,11 +294,11 @@ return }, { name = "hotpot.nvim", url = "rktjmp/hotpot.nvim", - version = "0.14.3-1" + version = "0.14.5-1" }, { name = "hurl.nvim", url = "jellydn/hurl.nvim", - version = "1.7.0-1" + version = "1.7.1-1" }, { name = "hydra.nvim", url = "nvimtools/hydra.nvim", @@ -303,6 +319,10 @@ return 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 = "lazy.nvim", url = "folke/lazy.nvim", @@ -326,11 +346,7 @@ return }, { name = "live-command.nvim", url = "smjonas/live-command.nvim", - version = "1.2.1-1" - }, { - name = "logger.nvim", - url = "jnpngshiii/logger.nvim", - version = "0.4.6-1" + version = "2.0.0-1" }, { name = "logging.nvim", url = "NTBBloodbath/logging.nvim", @@ -386,11 +402,11 @@ return }, { name = "markview.nvim", url = "OXY2DEV/markview.nvim", - version = "22.0.1-1" + version = "23.1.0-1" }, { name = "mason-lspconfig.nvim", url = "williamboman/mason-lspconfig.nvim", - version = "1.30.0-1" + version = "1.31.0-1" }, { name = "mason-nvim-dap.nvim", url = "jay-babu/mason-nvim-dap.nvim", @@ -399,10 +415,6 @@ return name = "mason.nvim", url = "williamboman/mason.nvim", version = "1.10.0-1" - }, { - name = "mindmap.nvim", - url = "jnpngshiii/mindmap.nvim", - version = "0.7.1-1" }, { name = "mini.nvim", url = "echasnovski/mini.nvim", @@ -454,11 +466,11 @@ return }, { name = "neorg-conceal-wrap", url = "benlubas/neorg-conceal-wrap", - version = "1.0.0-1" + version = "1.0.1-1" }, { name = "neorg-interim-ls", url = "benlubas/neorg-interim-ls", - version = "1.2.0-1" + version = "1.2.1-1" }, { name = "neorg-se", url = "benlubas/neorg-se", @@ -482,11 +494,11 @@ return }, { name = "neotest-busted", url = "MisanthropicBit/neotest-busted", - version = "0.1.0-1" + version = "0.2.0-1" }, { name = "neotest-golang", url = "fredrikaverpil/neotest-golang", - version = "1.0.0-1" + version = "1.1.1-1" }, { name = "neotest-haskell", url = "mrcjkb/neotest-haskell", @@ -494,7 +506,7 @@ return }, { name = "neotest-java", url = "rcasia/neotest-java", - version = "0.14.1-1" + version = "0.15.6-1" }, { name = "netman.nvim", url = "miversen33/netman.nvim", @@ -506,7 +518,7 @@ return }, { name = "no-neck-pain.nvim", url = "shortcuts/no-neck-pain.nvim", - version = "1.16.0-1" + version = "2.0.1-1" }, { name = "noice.nvim", url = "folke/noice.nvim", @@ -586,7 +598,7 @@ return }, { name = "nvim-lspconfig", url = "neovim/nvim-lspconfig", - version = "0.1.8-1" + version = "1.0.0-1" }, { name = "nvim-metals", url = "scalameta/nvim-metals", @@ -618,7 +630,7 @@ return }, { name = "nvim-smuggler", url = "Klafyvel/nvim-smuggler", - version = "0.3.0-1" + version = "0.4.2-1" }, { name = "nvim-snippets", url = "garymjr/nvim-snippets", @@ -658,7 +670,7 @@ return }, { name = "oil.nvim", url = "stevearc/oil.nvim", - version = "2.12.1-1" + version = "2.12.2-1" }, { name = "onedarkpro.nvim", url = "olimorris/onedarkpro.nvim", @@ -690,7 +702,7 @@ return }, { name = "papis.nvim", url = "jghauser/papis.nvim", - version = "0.6.1-1" + version = "0.7.0-1" }, { name = "paq-nvim", url = "savq/paq-nvim", @@ -702,7 +714,7 @@ return }, { name = "persisted.nvim", url = "olimorris/persisted.nvim", - version = "1.1.0-1" + version = "2.0.0-1" }, { name = "persistence.nvim", url = "folke/persistence.nvim", @@ -715,6 +727,10 @@ 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", @@ -738,23 +754,23 @@ return }, { name = "render-markdown.nvim", url = "MeanderingProgrammer/render-markdown.nvim", - version = "6.3.0-1" + version = "7.0.0-1" }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", - version = "3.2.1-1" + version = "3.7.0-1" }, { name = "rocks-config.nvim", url = "nvim-neorocks/rocks-config.nvim", - version = "2.2.0-1" + version = "2.3.1-1" }, { name = "rocks-dev.nvim", url = "nvim-neorocks/rocks-dev.nvim", - version = "1.5.0-1" + version = "1.7.0-1" }, { name = "rocks-git.nvim", url = "nvim-neorocks/rocks-git.nvim", - version = "2.0.1-1" + version = "2.2.0-1" }, { name = "rocks-lazy.nvim", url = "nvim-neorocks/rocks-lazy.nvim", @@ -762,19 +778,23 @@ return }, { name = "rocks-treesitter.nvim", url = "nvim-neorocks/rocks-treesitter.nvim", - version = "1.1.1-1" + version = "1.1.2-1" }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.38.2-1" + version = "2.40.0-1" }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", version = "1.2.0-1" + }, { + name = "runt.nvim", + url = "Julian/runt.nvim", + version = "2024.9.2-1" }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "5.2.2-1" + version = "5.4.2-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -794,7 +814,7 @@ return }, { name = "sf.nvim", url = "xixiaofinland/sf.nvim", - version = "1.5.0-1" + version = "1.6.0-1" }, { name = "sg.nvim", url = "sourcegraph/sg.nvim", @@ -807,6 +827,10 @@ return 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", @@ -858,647 +882,663 @@ return }, { name = "tree-sitter-ada", url = "briot/tree-sitter-ada", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-agda", url = "tree-sitter/tree-sitter-agda", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-angular", url = "dlvandenberg/tree-sitter-angular", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-apex", url = "aheber/tree-sitter-sfapex", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-arduino", url = "tree-sitter-grammars/tree-sitter-arduino", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-asm", url = "RubixDev/tree-sitter-asm", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-astro", url = "virchau13/tree-sitter-astro", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-authzed", url = "mleonidas/tree-sitter-authzed", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-awk", url = "Beaglefoot/tree-sitter-awk", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-bash", url = "tree-sitter/tree-sitter-bash", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-bass", url = "vito/tree-sitter-bass", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-beancount", url = "polarmutex/tree-sitter-beancount", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-bibtex", url = "latex-lsp/tree-sitter-bibtex", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-bicep", url = "tree-sitter-grammars/tree-sitter-bicep", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-bitbake", url = "tree-sitter-grammars/tree-sitter-bitbake", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-blueprint", url = "https://gitlab.com/gabmus/tree-sitter-blueprint/-/archive/60ba73739c6083c693d86a1a7cf039c07eb4ed59.zip", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-bp", url = "ambroisie/tree-sitter-bp", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-c", url = "tree-sitter/tree-sitter-c", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-c_sharp", url = "tree-sitter/tree-sitter-c-sharp", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-cairo", url = "tree-sitter-grammars/tree-sitter-cairo", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-capnp", url = "tree-sitter-grammars/tree-sitter-capnp", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-chatito", url = "tree-sitter-grammars/tree-sitter-chatito", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-clojure", url = "sogaiu/tree-sitter-clojure", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-cmake", url = "uyha/tree-sitter-cmake", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-comment", url = "stsewd/tree-sitter-comment", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-commonlisp", url = "tree-sitter-grammars/tree-sitter-commonlisp", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-cooklang", url = "addcninblue/tree-sitter-cooklang", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-corn", url = "jakestanger/tree-sitter-corn", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-cpon", url = "tree-sitter-grammars/tree-sitter-cpon", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-cpp", url = "tree-sitter/tree-sitter-cpp", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-css", url = "tree-sitter/tree-sitter-css", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-csv", url = "tree-sitter-grammars/tree-sitter-csv", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-cuda", url = "tree-sitter-grammars/tree-sitter-cuda", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-cue", url = "eonpatapon/tree-sitter-cue", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-d", url = "gdamore/tree-sitter-d", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-dart", url = "UserNobody14/tree-sitter-dart", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-devicetree", url = "joelspadin/tree-sitter-devicetree", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-dhall", url = "jbellerb/tree-sitter-dhall", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-diff", url = "the-mikedavis/tree-sitter-diff", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-disassembly", url = "ColinKennedy/tree-sitter-disassembly", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-djot", url = "treeman/tree-sitter-djot", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-dockerfile", url = "camdencheek/tree-sitter-dockerfile", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-dot", url = "rydesun/tree-sitter-dot", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-doxygen", url = "tree-sitter-grammars/tree-sitter-doxygen", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-dtd", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-earthfile", url = "glehmann/tree-sitter-earthfile", - version = "0.0.2-1" + version = "0.0.12-1" }, { name = "tree-sitter-ebnf", url = "RubixDev/ebnf", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-ecma", url = "nvim-neorocks/luarocks-stub", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-editorconfig", url = "ValdezFOmar/tree-sitter-editorconfig", - version = "0.0.4-1" + version = "0.0.10-1" }, { name = "tree-sitter-eds", url = "uyha/tree-sitter-eds", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-eex", url = "connorlay/tree-sitter-eex", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-elixir", url = "elixir-lang/tree-sitter-elixir", - version = "0.0.2-1" + version = "0.0.11-1" }, { name = "tree-sitter-elm", url = "elm-tooling/tree-sitter-elm", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-elsa", url = "glapa-grossklag/tree-sitter-elsa", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-elvish", url = "elves/tree-sitter-elvish", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-embedded_template", url = "tree-sitter/tree-sitter-embedded-template", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-erlang", url = "WhatsApp/tree-sitter-erlang", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-facility", url = "FacilityApi/tree-sitter-facility", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-faust", url = "khiner/tree-sitter-faust", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-fennel", url = "alexmozaidze/tree-sitter-fennel", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-fidl", url = "google/tree-sitter-fidl", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-firrtl", url = "tree-sitter-grammars/tree-sitter-firrtl", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-fish", url = "ram02z/tree-sitter-fish", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-foam", url = "FoamScience/tree-sitter-foam", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-forth", url = "AlexanderBrevig/tree-sitter-forth", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-fortran", url = "stadelmanma/tree-sitter-fortran", - version = "0.0.4-1" + version = "0.0.10-1" }, { name = "tree-sitter-fsh", url = "mgramigna/tree-sitter-fsh", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-func", url = "tree-sitter-grammars/tree-sitter-func", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-fusion", url = "https://gitlab.com/jirgn/tree-sitter-fusion/-/archive/19db2f47ba4c3a0f6238d4ae0e2abfca16e61dd6.zip", - version = "0.0.2-1" + version = "0.0.10-1" + }, { + name = "tree-sitter-gap", + url = "gap-system/tree-sitter-gap", + version = "0.0.10-1" + }, { + name = "tree-sitter-gaptst", + url = "gap-system/tree-sitter-gaptst", + version = "0.0.10-1" }, { name = "tree-sitter-gdscript", url = "PrestonKnopp/tree-sitter-gdscript", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-gdshader", url = "GodOfAvacyn/tree-sitter-gdshader", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-git_config", url = "the-mikedavis/tree-sitter-git-config", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-git_rebase", url = "the-mikedavis/tree-sitter-git-rebase", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-gitattributes", url = "tree-sitter-grammars/tree-sitter-gitattributes", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-gitcommit", url = "gbprod/tree-sitter-gitcommit", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-gitignore", url = "shunsambongi/tree-sitter-gitignore", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-gleam", url = "gleam-lang/tree-sitter-gleam", - version = "0.0.3-1" + version = "0.0.11-1" }, { name = "tree-sitter-glimmer", - url = "alexlafroscia/tree-sitter-glimmer", - version = "0.0.3-1" + url = "ember-tooling/tree-sitter-glimmer", + version = "0.0.10-1" + }, { + name = "tree-sitter-glimmer_javascript", + url = "NullVoxPopuli/tree-sitter-glimmer-javascript", + version = "0.0.10-1" + }, { + name = "tree-sitter-glimmer_typescript", + url = "NullVoxPopuli/tree-sitter-glimmer-typescript", + version = "0.0.10-1" }, { name = "tree-sitter-glsl", url = "tree-sitter-grammars/tree-sitter-glsl", - version = "0.0.3-1" + version = "0.0.11-1" }, { name = "tree-sitter-gn", url = "tree-sitter-grammars/tree-sitter-gn", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-gnuplot", url = "dpezto/tree-sitter-gnuplot", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-go", url = "tree-sitter/tree-sitter-go", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-goctl", url = "chaozwn/tree-sitter-goctl", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-godot_resource", url = "PrestonKnopp/tree-sitter-godot-resource", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-gomod", url = "camdencheek/tree-sitter-go-mod", - version = "0.0.3-1" + version = "0.0.11-1" }, { name = "tree-sitter-gosum", url = "tree-sitter-grammars/tree-sitter-go-sum", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-gotmpl", url = "ngalaiko/tree-sitter-go-template", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-gowork", url = "omertuc/tree-sitter-go-work", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-gpg", url = "tree-sitter-grammars/tree-sitter-gpg-config", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-graphql", url = "bkegley/tree-sitter-graphql", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-groovy", url = "murtaza64/tree-sitter-groovy", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-gstlaunch", url = "tree-sitter-grammars/tree-sitter-gstlaunch", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-hack", url = "slackhq/tree-sitter-hack", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-hare", url = "tree-sitter-grammars/tree-sitter-hare", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-haskell", url = "tree-sitter/tree-sitter-haskell", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-haskell_persistent", url = "MercuryTechnologies/tree-sitter-haskell-persistent", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-hcl", url = "tree-sitter-grammars/tree-sitter-hcl", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-heex", url = "connorlay/tree-sitter-heex", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-helm", url = "ngalaiko/tree-sitter-go-template", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-hjson", url = "winston0410/tree-sitter-hjson", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-hlsl", url = "tree-sitter-grammars/tree-sitter-hlsl", - version = "0.0.3-1" + version = "0.0.11-1" }, { name = "tree-sitter-hlsplaylist", url = "Freed-Wu/tree-sitter-hlsplaylist", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-hocon", url = "antosha417/tree-sitter-hocon", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-hoon", url = "urbit-pilled/tree-sitter-hoon", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-html", url = "tree-sitter/tree-sitter-html", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-html_tags", url = "nvim-neorocks/luarocks-stub", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-htmldjango", url = "interdependence/tree-sitter-htmldjango", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-http", url = "rest-nvim/tree-sitter-http", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-hurl", url = "pfeiferj/tree-sitter-hurl", - version = "0.0.3-1" + version = "0.0.11-1" }, { name = "tree-sitter-hyprlang", url = "tree-sitter-grammars/tree-sitter-hyprlang", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-idl", url = "cathaysia/tree-sitter-idl", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-ini", url = "justinmk/tree-sitter-ini", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-inko", url = "inko-lang/tree-sitter-inko", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-ispc", url = "tree-sitter-grammars/tree-sitter-ispc", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-janet_simple", url = "sogaiu/tree-sitter-janet-simple", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-java", url = "tree-sitter/tree-sitter-java", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-javascript", url = "tree-sitter/tree-sitter-javascript", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-jq", url = "flurie/tree-sitter-jq", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-jsdoc", url = "tree-sitter/tree-sitter-jsdoc", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-json", url = "tree-sitter/tree-sitter-json", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-json5", url = "Joakker/tree-sitter-json5", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-jsonc", url = "https://gitlab.com/WhyNotHugo/tree-sitter-jsonc/-/archive/02b01653c8a1c198ae7287d566efa86a135b30d5.zip", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-jsonnet", url = "sourcegraph/tree-sitter-jsonnet", - version = "0.0.4-1" + version = "0.0.10-1" }, { name = "tree-sitter-jsx", url = "nvim-neorocks/luarocks-stub", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-julia", url = "tree-sitter/tree-sitter-julia", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-just", url = "IndianBoy42/tree-sitter-just", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-kconfig", url = "tree-sitter-grammars/tree-sitter-kconfig", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-kdl", url = "tree-sitter-grammars/tree-sitter-kdl", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-kotlin", url = "fwcd/tree-sitter-kotlin", - version = "0.0.4-1" + version = "0.0.10-1" }, { name = "tree-sitter-koto", url = "koto-lang/tree-sitter-koto", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-kusto", url = "Willem-J-an/tree-sitter-kusto", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-lalrpop", url = "traxys/tree-sitter-lalrpop", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-latex", url = "latex-lsp/tree-sitter-latex", - version = "0.0.3-1" + version = "0.0.11-1" }, { name = "tree-sitter-ledger", url = "cbarrete/tree-sitter-ledger", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-leo", url = "r001/tree-sitter-leo", - version = "0.0.4-1" + version = "0.0.10-1" }, { name = "tree-sitter-linkerscript", url = "tree-sitter-grammars/tree-sitter-linkerscript", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-liquid", url = "hankthetank27/tree-sitter-liquid", - version = "0.0.5-1" + version = "0.0.10-1" }, { name = "tree-sitter-liquidsoap", url = "savonet/tree-sitter-liquidsoap", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-llvm", url = "benwilliamgraham/tree-sitter-llvm", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-lua", url = "tree-sitter-grammars/tree-sitter-lua", - version = "0.0.2-1" + version = "0.0.11-1" }, { name = "tree-sitter-luadoc", url = "tree-sitter-grammars/tree-sitter-luadoc", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-luap", url = "tree-sitter-grammars/tree-sitter-luap", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-luau", url = "tree-sitter-grammars/tree-sitter-luau", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-m68k", url = "grahambates/tree-sitter-m68k", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-make", url = "alemuller/tree-sitter-make", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-markdown", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.2-1" + version = "0.0.13-1" }, { name = "tree-sitter-markdown_inline", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.2-1" + version = "0.0.13-1" }, { name = "tree-sitter-matlab", url = "acristoffers/tree-sitter-matlab", - version = "0.0.4-1" + version = "0.0.10-1" }, { name = "tree-sitter-menhir", url = "Kerl13/tree-sitter-menhir", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-mermaid", url = "monaqa/tree-sitter-mermaid", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-meson", url = "tree-sitter-grammars/tree-sitter-meson", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-mlir", url = "artagnon/tree-sitter-mlir", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-muttrc", url = "neomutt/tree-sitter-muttrc", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-nasm", url = "naclsn/tree-sitter-nasm", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-nginx", url = "opa-oz/tree-sitter-nginx", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-nickel", url = "nickel-lang/tree-sitter-nickel", - version = "0.0.4-1" + version = "0.0.10-1" }, { name = "tree-sitter-nim", url = "alaviss/tree-sitter-nim", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-nim_format_string", url = "aMOPel/tree-sitter-nim-format-string", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-ninja", url = "alemuller/tree-sitter-ninja", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-nix", url = "cstrahan/tree-sitter-nix", - version = "0.0.5-1" + version = "0.0.10-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", - version = "0.2.5-1" + version = "0.2.6-1" }, { name = "tree-sitter-norg-meta", url = "nvim-neorg/tree-sitter-norg-meta", @@ -1506,31 +1546,31 @@ return }, { name = "tree-sitter-nqc", url = "tree-sitter-grammars/tree-sitter-nqc", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-objc", url = "tree-sitter-grammars/tree-sitter-objc", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-objdump", url = "ColinKennedy/tree-sitter-objdump", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-ocaml", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-ocaml_interface", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-ocamllex", url = "atom-ocaml/tree-sitter-ocamllex", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-odin", url = "tree-sitter-grammars/tree-sitter-odin", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-org", url = "milisims/tree-sitter-org", @@ -1542,507 +1582,507 @@ return }, { name = "tree-sitter-pascal", url = "Isopod/tree-sitter-pascal", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-passwd", url = "ath3/tree-sitter-passwd", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-pem", url = "tree-sitter-grammars/tree-sitter-pem", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-perl", url = "tree-sitter-perl/tree-sitter-perl", - version = "0.0.4-1" + version = "0.0.12-1" }, { name = "tree-sitter-php", url = "tree-sitter/tree-sitter-php", - version = "0.0.4-1" + version = "0.0.10-1" }, { name = "tree-sitter-php_only", url = "tree-sitter/tree-sitter-php", - version = "0.0.4-1" + version = "0.0.10-1" }, { name = "tree-sitter-phpdoc", url = "claytonrcarter/tree-sitter-phpdoc", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-pioasm", url = "leo60228/tree-sitter-pioasm", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-po", url = "tree-sitter-grammars/tree-sitter-po", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-pod", url = "tree-sitter-perl/tree-sitter-pod", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-poe_filter", url = "tree-sitter-grammars/tree-sitter-poe-filter", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-pony", url = "tree-sitter-grammars/tree-sitter-pony", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-powershell", url = "airbus-cert/tree-sitter-powershell", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-printf", url = "tree-sitter-grammars/tree-sitter-printf", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-prisma", url = "victorhqc/tree-sitter-prisma", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-problog", url = "foxyseta/tree-sitter-prolog", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-prolog", url = "foxyseta/tree-sitter-prolog", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-promql", url = "MichaHoffmann/tree-sitter-promql", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-properties", url = "tree-sitter-grammars/tree-sitter-properties", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-proto", url = "treywood/tree-sitter-proto", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-prql", url = "PRQL/tree-sitter-prql", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-psv", url = "tree-sitter-grammars/tree-sitter-csv", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-pug", url = "zealot128/tree-sitter-pug", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-puppet", url = "tree-sitter-grammars/tree-sitter-puppet", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-purescript", url = "postsolar/tree-sitter-purescript", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-pymanifest", url = "tree-sitter-grammars/tree-sitter-pymanifest", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-python", url = "tree-sitter/tree-sitter-python", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-ql", url = "tree-sitter/tree-sitter-ql", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-qmldir", url = "tree-sitter-grammars/tree-sitter-qmldir", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-qmljs", url = "yuja/tree-sitter-qmljs", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-query", url = "tree-sitter-grammars/tree-sitter-query", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-r", url = "r-lib/tree-sitter-r", - version = "0.0.2-1" + version = "0.0.11-1" }, { name = "tree-sitter-racket", url = "6cdh/tree-sitter-racket", - version = "0.0.2-1" + version = "0.0.12-1" }, { name = "tree-sitter-ralph", url = "alephium/tree-sitter-ralph", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-rasi", url = "Fymyte/tree-sitter-rasi", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-rbs", url = "joker1007/tree-sitter-rbs", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-re2c", url = "tree-sitter-grammars/tree-sitter-re2c", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-readline", url = "tree-sitter-grammars/tree-sitter-readline", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-regex", url = "tree-sitter/tree-sitter-regex", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-rego", url = "FallenAngel97/tree-sitter-rego", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-requirements", url = "tree-sitter-grammars/tree-sitter-requirements", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-rescript", url = "rescript-lang/tree-sitter-rescript", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-rnoweb", url = "bamonroe/tree-sitter-rnoweb", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-robot", url = "Hubro/tree-sitter-robot", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-robots", url = "opa-oz/tree-sitter-robots-txt", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-roc", url = "faldor20/tree-sitter-roc", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-ron", url = "tree-sitter-grammars/tree-sitter-ron", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-rst", url = "stsewd/tree-sitter-rst", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-ruby", url = "tree-sitter/tree-sitter-ruby", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-rust", url = "tree-sitter/tree-sitter-rust", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-scala", url = "tree-sitter/tree-sitter-scala", - version = "0.0.3-1" + version = "0.0.13-1" }, { name = "tree-sitter-scfg", url = "rockorager/tree-sitter-scfg", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-scheme", url = "6cdh/tree-sitter-scheme", - version = "0.0.2-1" + version = "0.0.12-1" }, { name = "tree-sitter-scss", url = "serenadeai/tree-sitter-scss", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-sflog", url = "aheber/tree-sitter-sfapex", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-slang", url = "tree-sitter-grammars/tree-sitter-slang", - version = "0.0.3-1" + version = "0.0.11-1" }, { name = "tree-sitter-slint", url = "slint-ui/tree-sitter-slint", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-smali", url = "tree-sitter-grammars/tree-sitter-smali", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-smithy", url = "indoorvivants/tree-sitter-smithy", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-snakemake", url = "osthomas/tree-sitter-snakemake", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-solidity", url = "JoranHonig/tree-sitter-solidity", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-soql", url = "aheber/tree-sitter-sfapex", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-sosl", url = "aheber/tree-sitter-sfapex", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-sourcepawn", url = "nilshelmig/tree-sitter-sourcepawn", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-sparql", url = "GordianDziwis/tree-sitter-sparql", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-sql", url = "derekstride/tree-sitter-sql", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-squirrel", url = "tree-sitter-grammars/tree-sitter-squirrel", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-ssh_config", url = "tree-sitter-grammars/tree-sitter-ssh-config", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-starlark", url = "tree-sitter-grammars/tree-sitter-starlark", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-strace", url = "sigmaSd/tree-sitter-strace", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-styled", url = "mskelton/tree-sitter-styled", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-supercollider", url = "madskjeldgaard/tree-sitter-supercollider", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-surface", url = "connorlay/tree-sitter-surface", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-svelte", url = "tree-sitter-grammars/tree-sitter-svelte", - version = "0.0.3-1" + version = "0.0.12-1" }, { name = "tree-sitter-swift", url = "alex-pinkus/tree-sitter-swift", - version = "0.0.3-1" + version = "0.0.11-1" }, { name = "tree-sitter-sxhkdrc", url = "RaafatTurki/tree-sitter-sxhkdrc", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-systemtap", url = "ok-ryoko/tree-sitter-systemtap", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-systemverilog", url = "zhangwwpeng/tree-sitter-systemverilog", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-t32", url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/6182836f4128725f1e74ce986840d7317021a015.zip", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-tablegen", url = "tree-sitter-grammars/tree-sitter-tablegen", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-tact", url = "tact-lang/tree-sitter-tact", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-tcl", url = "tree-sitter-grammars/tree-sitter-tcl", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-teal", url = "euclidianAce/tree-sitter-teal", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-templ", url = "vrischmann/tree-sitter-templ", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-terraform", url = "MichaHoffmann/tree-sitter-hcl", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-textproto", url = "PorterAtGoogle/tree-sitter-textproto", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-thrift", url = "tree-sitter-grammars/tree-sitter-thrift", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-tiger", url = "ambroisie/tree-sitter-tiger", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-tlaplus", url = "tlaplus-community/tree-sitter-tlaplus", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-tmux", url = "Freed-Wu/tree-sitter-tmux", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-todotxt", url = "arnarg/tree-sitter-todotxt", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-toml", url = "tree-sitter-grammars/tree-sitter-toml", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-tsv", url = "tree-sitter-grammars/tree-sitter-csv", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-tsx", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-turtle", url = "GordianDziwis/tree-sitter-turtle", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-twig", url = "gbprod/tree-sitter-twig", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-typescript", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-typespec", url = "happenslol/tree-sitter-typespec", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-typoscript", url = "Teddytrombone/tree-sitter-typoscript", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-typst", url = "uben0/tree-sitter-typst", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-udev", url = "tree-sitter-grammars/tree-sitter-udev", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-ungrammar", url = "tree-sitter-grammars/tree-sitter-ungrammar", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-unison", url = "kylegoetz/tree-sitter-unison", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-usd", url = "ColinKennedy/tree-sitter-usd", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-uxntal", url = "tree-sitter-grammars/tree-sitter-uxntal", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-v", url = "vlang/v-analyzer", - version = "0.0.3-1" + version = "0.0.11-1" }, { name = "tree-sitter-vala", url = "vala-lang/tree-sitter-vala", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-vento", url = "ventojs/tree-sitter-vento", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-verilog", url = "tree-sitter/tree-sitter-verilog", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-vhdl", url = "jpt13653903/tree-sitter-vhdl", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-vhs", url = "charmbracelet/tree-sitter-vhs", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-vim", url = "tree-sitter-grammars/tree-sitter-vim", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-vimdoc", url = "neovim/tree-sitter-vimdoc", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-vrl", url = "belltoy/tree-sitter-vrl", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-vue", url = "tree-sitter-grammars/tree-sitter-vue", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-wgsl", url = "szebniok/tree-sitter-wgsl", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-wgsl_bevy", url = "tree-sitter-grammars/tree-sitter-wgsl-bevy", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-wing", url = "winglang/tree-sitter-wing", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-wit", url = "liamwh/tree-sitter-wit", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-xcompose", url = "tree-sitter-grammars/tree-sitter-xcompose", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-xml", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-yaml", url = "tree-sitter-grammars/tree-sitter-yaml", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-yang", url = "Hubro/tree-sitter-yang", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-yuck", url = "tree-sitter-grammars/tree-sitter-yuck", - version = "0.0.2-1" + version = "0.0.10-1" }, { name = "tree-sitter-zathurarc", url = "Freed-Wu/tree-sitter-zathurarc", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "tree-sitter-zig", url = "tree-sitter-grammars/tree-sitter-zig", - version = "0.0.3-1" + version = "0.0.10-1" }, { name = "trouble.nvim", url = "folke/trouble.nvim", @@ -2086,7 +2126,7 @@ return }, { name = "yazi.nvim", url = "mikavilpas/yazi.nvim", - version = "6.0.4-1" + version = "6.1.0-1" }, { name = "zen-mode.nvim", url = "folke/zen-mode.nvim", From e9fd76e239cc18da289f9a3f80f35fa16b003175 Mon Sep 17 00:00:00 2001 From: Luna Saphie Mittelbach <lunarlambda@gmail.com> Date: Wed, 2 Oct 2024 09:52:51 +0200 Subject: [PATCH 1569/1610] fix(completion): check if command string is a prefix of Lazy (#1760) Problem: Command completion doesn't work if the command name isn't written in full Solution: Use vim.startswith to check if the command is a prefix of 'Lazy' Fixes #1758 --- lua/lazy/view/commands.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 1159bdccd8910a0fd0914b24d6c3d186689023d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 07:54:44 +0000 Subject: [PATCH 1570/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 676 +++++++++++++++--------------- 1 file changed, 346 insertions(+), 330 deletions(-) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 6b1d4fb..558ff33 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -18,7 +18,7 @@ return }, { name = "ai.nvim", url = "S1M0N38/ai.nvim", - version = "1.2.0-1" + version = "1.3.0-1" }, { name = "astral.nvim", url = "rootiest/astral.nvim", @@ -106,7 +106,7 @@ return }, { name = "dante.nvim", url = "S1M0N38/dante.nvim", - version = "1.0.1-1" + version = "1.2.0-1" }, { name = "daylight.nvim", url = "NTBBloodbath/daylight.nvim", @@ -138,11 +138,11 @@ return }, { name = "donut.nvim", url = "NStefan002/donut.nvim", - version = "2.1.0-1" + version = "2.2.1-1" }, { name = "dressing.nvim", url = "stevearc/dressing.nvim", - version = "2.2.2-1" + version = "3.0.0-1" }, { name = "dropbar.nvim", url = "Bekaboo/dropbar.nvim", @@ -167,6 +167,10 @@ return name = "elixir-tools.nvim", url = "elixir-tools/elixir-tools.nvim", version = "0.16.0-1" + }, { + name = "feed.nvim", + url = "noearc/feed.nvim", + version = "main-1" }, { name = "feline.nvim", url = "freddiehaddad/feline.nvim", @@ -226,7 +230,7 @@ return }, { name = "git.nvim", url = "Kibadda/git.nvim", - version = "3.3.2-1" + version = "4.1.0-1" }, { name = "github-nvim-theme", url = "projekt0n/github-nvim-theme", @@ -234,7 +238,7 @@ return }, { name = "gitlinker.nvim", url = "linrongbin16/gitlinker.nvim", - version = "4.13.1-1" + version = "4.13.2-1" }, { name = "gitsigns.nvim", url = "lewis6991/gitsigns.nvim", @@ -270,7 +274,7 @@ return }, { name = "haskell-tools.nvim", url = "mrcjkb/haskell-tools.nvim", - version = "4.0.1-1" + version = "4.1.0-1" }, { name = "headlines.nvim", url = "lukas-reineke/headlines.nvim", @@ -294,7 +298,7 @@ return }, { name = "hotpot.nvim", url = "rktjmp/hotpot.nvim", - version = "0.14.5-1" + version = "0.14.7-1" }, { name = "hurl.nvim", url = "jellydn/hurl.nvim", @@ -334,7 +338,7 @@ return }, { name = "lean.nvim", url = "Julian/lean.nvim", - version = "1.0.0-1" + version = "2024.9.2-1" }, { name = "leetcode.nvim", url = "kawre/leetcode.nvim", @@ -346,7 +350,7 @@ return }, { name = "live-command.nvim", url = "smjonas/live-command.nvim", - version = "2.0.0-1" + version = "2.2.0-1" }, { name = "logging.nvim", url = "NTBBloodbath/logging.nvim", @@ -446,7 +450,7 @@ return }, { name = "neoconf.nvim", url = "folke/neoconf.nvim", - version = "1.3.2-1" + version = "1.3.3-1" }, { name = "neodev.nvim", url = "folke/neodev.nvim", @@ -490,7 +494,7 @@ return }, { name = "neotest", url = "nvim-neotest/neotest", - version = "5.4.1-1" + version = "5.6.0-1" }, { name = "neotest-busted", url = "MisanthropicBit/neotest-busted", @@ -498,7 +502,7 @@ return }, { name = "neotest-golang", url = "fredrikaverpil/neotest-golang", - version = "1.1.1-1" + version = "1.2.0-1" }, { name = "neotest-haskell", url = "mrcjkb/neotest-haskell", @@ -506,7 +510,7 @@ return }, { name = "neotest-java", url = "rcasia/neotest-java", - version = "0.15.6-1" + version = "0.16.0-1" }, { name = "netman.nvim", url = "miversen33/netman.nvim", @@ -518,11 +522,11 @@ return }, { name = "no-neck-pain.nvim", url = "shortcuts/no-neck-pain.nvim", - version = "2.0.1-1" + version = "2.0.5-1" }, { name = "noice.nvim", url = "folke/noice.nvim", - version = "4.5.0-1" + version = "4.5.1-1" }, { name = "npackages.nvim", url = "diegofigs/npackages.nvim", @@ -535,6 +539,10 @@ return name = "nui.nvim", url = "MunifTanjim/nui.nvim", version = "0.3.0-1" + }, { + name = "nvim-a2-pack", + url = "dfgordon/nvim-a2-pack", + version = "0.0.2-1" }, { name = "nvim-bqf", url = "kevinhwang91/nvim-bqf", @@ -610,7 +618,7 @@ return }, { name = "nvim-notify", url = "rcarriga/nvim-notify", - version = "3.13.5-1" + version = "3.14.0-1" }, { name = "nvim-parinfer", url = "gpanders/nvim-parinfer", @@ -626,7 +634,7 @@ return }, { name = "nvim-scrollview", url = "dstein64/nvim-scrollview", - version = "5.2.1-1" + version = "5.2.2-1" }, { name = "nvim-smuggler", url = "Klafyvel/nvim-smuggler", @@ -734,7 +742,7 @@ return }, { name = "quarry.nvim", url = "rudionrails/quarry.nvim", - version = "2.3.0-1" + version = "3.0.1-1" }, { name = "quicker.nvim", url = "stevearc/quicker.nvim", @@ -742,7 +750,7 @@ return }, { name = "rainbow-delimiters.nvim", url = "HiPhish/rainbow-delimiters.nvim", - version = "0.6.1-1" + version = "0.6.2-1" }, { name = "remember.nvim", url = "vladdoster/remember.nvim", @@ -754,15 +762,19 @@ return }, { name = "render-markdown.nvim", url = "MeanderingProgrammer/render-markdown.nvim", - version = "7.0.0-1" + version = "7.2.0-1" }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", - version = "3.7.0-1" + version = "3.8.2-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.3.1-1" + version = "3.0.0-1" }, { name = "rocks-dev.nvim", url = "nvim-neorocks/rocks-dev.nvim", @@ -770,19 +782,19 @@ return }, { name = "rocks-git.nvim", url = "nvim-neorocks/rocks-git.nvim", - version = "2.2.0-1" + version = "2.3.1-1" }, { name = "rocks-lazy.nvim", url = "nvim-neorocks/rocks-lazy.nvim", - version = "1.0.1-1" + version = "1.1.0-1" }, { name = "rocks-treesitter.nvim", url = "nvim-neorocks/rocks-treesitter.nvim", - version = "1.1.2-1" + version = "1.1.3-1" }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.40.0-1" + version = "2.40.2-1" }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", @@ -790,11 +802,11 @@ return }, { name = "runt.nvim", url = "Julian/runt.nvim", - version = "2024.9.2-1" + version = "2024.10.1-1" }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "5.4.2-1" + version = "5.11.0-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -814,7 +826,7 @@ return }, { name = "sf.nvim", url = "xixiaofinland/sf.nvim", - version = "1.6.0-1" + version = "1.7.0-1" }, { name = "sg.nvim", url = "sourcegraph/sg.nvim", @@ -870,7 +882,7 @@ return }, { name = "todo-comments.nvim", url = "folke/todo-comments.nvim", - version = "1.3.0-1" + version = "1.4.0-1" }, { name = "toggleterm.nvim", url = "akinsho/toggleterm.nvim", @@ -882,659 +894,663 @@ return }, { name = "tree-sitter-ada", url = "briot/tree-sitter-ada", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-agda", url = "tree-sitter/tree-sitter-agda", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-angular", url = "dlvandenberg/tree-sitter-angular", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-apex", url = "aheber/tree-sitter-sfapex", - version = "0.0.10-1" + version = "0.0.26-1" }, { name = "tree-sitter-arduino", url = "tree-sitter-grammars/tree-sitter-arduino", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-asm", url = "RubixDev/tree-sitter-asm", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-astro", url = "virchau13/tree-sitter-astro", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-authzed", url = "mleonidas/tree-sitter-authzed", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-awk", url = "Beaglefoot/tree-sitter-awk", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-bash", url = "tree-sitter/tree-sitter-bash", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-bass", url = "vito/tree-sitter-bass", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-beancount", url = "polarmutex/tree-sitter-beancount", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-bibtex", url = "latex-lsp/tree-sitter-bibtex", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-bicep", url = "tree-sitter-grammars/tree-sitter-bicep", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-bitbake", url = "tree-sitter-grammars/tree-sitter-bitbake", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-blueprint", url = "https://gitlab.com/gabmus/tree-sitter-blueprint/-/archive/60ba73739c6083c693d86a1a7cf039c07eb4ed59.zip", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-bp", url = "ambroisie/tree-sitter-bp", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-c", url = "tree-sitter/tree-sitter-c", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-c_sharp", url = "tree-sitter/tree-sitter-c-sharp", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-cairo", url = "tree-sitter-grammars/tree-sitter-cairo", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-capnp", url = "tree-sitter-grammars/tree-sitter-capnp", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-chatito", url = "tree-sitter-grammars/tree-sitter-chatito", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-clojure", url = "sogaiu/tree-sitter-clojure", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-cmake", url = "uyha/tree-sitter-cmake", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-comment", url = "stsewd/tree-sitter-comment", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-commonlisp", url = "tree-sitter-grammars/tree-sitter-commonlisp", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-cooklang", url = "addcninblue/tree-sitter-cooklang", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-corn", url = "jakestanger/tree-sitter-corn", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-cpon", url = "tree-sitter-grammars/tree-sitter-cpon", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-cpp", url = "tree-sitter/tree-sitter-cpp", - version = "0.0.10-1" + version = "0.0.26-1" }, { name = "tree-sitter-css", url = "tree-sitter/tree-sitter-css", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-csv", url = "tree-sitter-grammars/tree-sitter-csv", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-cuda", url = "tree-sitter-grammars/tree-sitter-cuda", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-cue", url = "eonpatapon/tree-sitter-cue", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-d", url = "gdamore/tree-sitter-d", - version = "0.0.10-1" + version = "0.0.28-1" }, { name = "tree-sitter-dart", url = "UserNobody14/tree-sitter-dart", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-devicetree", url = "joelspadin/tree-sitter-devicetree", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-dhall", url = "jbellerb/tree-sitter-dhall", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-diff", url = "the-mikedavis/tree-sitter-diff", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-disassembly", url = "ColinKennedy/tree-sitter-disassembly", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-djot", url = "treeman/tree-sitter-djot", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-dockerfile", url = "camdencheek/tree-sitter-dockerfile", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-dot", url = "rydesun/tree-sitter-dot", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-doxygen", url = "tree-sitter-grammars/tree-sitter-doxygen", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-dtd", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-earthfile", url = "glehmann/tree-sitter-earthfile", - version = "0.0.12-1" + version = "0.0.26-1" }, { name = "tree-sitter-ebnf", url = "RubixDev/ebnf", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-ecma", url = "nvim-neorocks/luarocks-stub", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-editorconfig", url = "ValdezFOmar/tree-sitter-editorconfig", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-eds", url = "uyha/tree-sitter-eds", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-eex", url = "connorlay/tree-sitter-eex", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-elixir", url = "elixir-lang/tree-sitter-elixir", - version = "0.0.11-1" + version = "0.0.26-1" }, { name = "tree-sitter-elm", url = "elm-tooling/tree-sitter-elm", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-elsa", url = "glapa-grossklag/tree-sitter-elsa", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-elvish", url = "elves/tree-sitter-elvish", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-embedded_template", url = "tree-sitter/tree-sitter-embedded-template", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-erlang", url = "WhatsApp/tree-sitter-erlang", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-facility", url = "FacilityApi/tree-sitter-facility", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-faust", url = "khiner/tree-sitter-faust", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-fennel", url = "alexmozaidze/tree-sitter-fennel", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-fidl", url = "google/tree-sitter-fidl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-firrtl", url = "tree-sitter-grammars/tree-sitter-firrtl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-fish", url = "ram02z/tree-sitter-fish", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-foam", url = "FoamScience/tree-sitter-foam", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-forth", url = "AlexanderBrevig/tree-sitter-forth", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-fortran", url = "stadelmanma/tree-sitter-fortran", - version = "0.0.10-1" + version = "0.0.27-1" }, { name = "tree-sitter-fsh", url = "mgramigna/tree-sitter-fsh", - version = "0.0.10-1" + version = "0.0.24-1" + }, { + name = "tree-sitter-fsharp", + url = "ionide/tree-sitter-fsharp", + version = "0.0.2-1" }, { name = "tree-sitter-func", url = "tree-sitter-grammars/tree-sitter-func", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-fusion", url = "https://gitlab.com/jirgn/tree-sitter-fusion/-/archive/19db2f47ba4c3a0f6238d4ae0e2abfca16e61dd6.zip", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gap", url = "gap-system/tree-sitter-gap", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gaptst", url = "gap-system/tree-sitter-gaptst", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gdscript", url = "PrestonKnopp/tree-sitter-gdscript", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gdshader", url = "GodOfAvacyn/tree-sitter-gdshader", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-git_config", url = "the-mikedavis/tree-sitter-git-config", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-git_rebase", url = "the-mikedavis/tree-sitter-git-rebase", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gitattributes", url = "tree-sitter-grammars/tree-sitter-gitattributes", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gitcommit", url = "gbprod/tree-sitter-gitcommit", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gitignore", url = "shunsambongi/tree-sitter-gitignore", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gleam", url = "gleam-lang/tree-sitter-gleam", - version = "0.0.11-1" + version = "0.0.26-1" }, { name = "tree-sitter-glimmer", url = "ember-tooling/tree-sitter-glimmer", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-glimmer_javascript", url = "NullVoxPopuli/tree-sitter-glimmer-javascript", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-glimmer_typescript", url = "NullVoxPopuli/tree-sitter-glimmer-typescript", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-glsl", url = "tree-sitter-grammars/tree-sitter-glsl", - version = "0.0.11-1" + version = "0.0.25-1" }, { name = "tree-sitter-gn", url = "tree-sitter-grammars/tree-sitter-gn", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gnuplot", url = "dpezto/tree-sitter-gnuplot", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-go", url = "tree-sitter/tree-sitter-go", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-goctl", url = "chaozwn/tree-sitter-goctl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-godot_resource", url = "PrestonKnopp/tree-sitter-godot-resource", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gomod", url = "camdencheek/tree-sitter-go-mod", - version = "0.0.11-1" + version = "0.0.25-1" }, { name = "tree-sitter-gosum", url = "tree-sitter-grammars/tree-sitter-go-sum", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gotmpl", url = "ngalaiko/tree-sitter-go-template", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gowork", url = "omertuc/tree-sitter-go-work", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gpg", url = "tree-sitter-grammars/tree-sitter-gpg-config", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-graphql", url = "bkegley/tree-sitter-graphql", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-groovy", url = "murtaza64/tree-sitter-groovy", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-gstlaunch", url = "tree-sitter-grammars/tree-sitter-gstlaunch", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-hack", url = "slackhq/tree-sitter-hack", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-hare", url = "tree-sitter-grammars/tree-sitter-hare", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-haskell", url = "tree-sitter/tree-sitter-haskell", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-haskell_persistent", url = "MercuryTechnologies/tree-sitter-haskell-persistent", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-hcl", url = "tree-sitter-grammars/tree-sitter-hcl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-heex", url = "connorlay/tree-sitter-heex", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-helm", url = "ngalaiko/tree-sitter-go-template", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-hjson", url = "winston0410/tree-sitter-hjson", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-hlsl", url = "tree-sitter-grammars/tree-sitter-hlsl", - version = "0.0.11-1" + version = "0.0.25-1" }, { name = "tree-sitter-hlsplaylist", url = "Freed-Wu/tree-sitter-hlsplaylist", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-hocon", url = "antosha417/tree-sitter-hocon", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-hoon", url = "urbit-pilled/tree-sitter-hoon", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-html", url = "tree-sitter/tree-sitter-html", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-html_tags", url = "nvim-neorocks/luarocks-stub", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-htmldjango", url = "interdependence/tree-sitter-htmldjango", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-http", url = "rest-nvim/tree-sitter-http", - version = "0.0.10-1" + version = "0.0.26-1" }, { name = "tree-sitter-hurl", url = "pfeiferj/tree-sitter-hurl", - version = "0.0.11-1" + version = "0.0.25-1" }, { name = "tree-sitter-hyprlang", url = "tree-sitter-grammars/tree-sitter-hyprlang", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-idl", url = "cathaysia/tree-sitter-idl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-ini", url = "justinmk/tree-sitter-ini", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-inko", url = "inko-lang/tree-sitter-inko", - version = "0.0.10-1" + version = "0.0.26-1" }, { name = "tree-sitter-ispc", url = "tree-sitter-grammars/tree-sitter-ispc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-janet_simple", url = "sogaiu/tree-sitter-janet-simple", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-java", url = "tree-sitter/tree-sitter-java", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-javascript", url = "tree-sitter/tree-sitter-javascript", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-jq", url = "flurie/tree-sitter-jq", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-jsdoc", url = "tree-sitter/tree-sitter-jsdoc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-json", url = "tree-sitter/tree-sitter-json", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-json5", url = "Joakker/tree-sitter-json5", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-jsonc", url = "https://gitlab.com/WhyNotHugo/tree-sitter-jsonc/-/archive/02b01653c8a1c198ae7287d566efa86a135b30d5.zip", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-jsonnet", url = "sourcegraph/tree-sitter-jsonnet", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-jsx", url = "nvim-neorocks/luarocks-stub", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-julia", url = "tree-sitter/tree-sitter-julia", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-just", url = "IndianBoy42/tree-sitter-just", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-kconfig", url = "tree-sitter-grammars/tree-sitter-kconfig", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-kdl", url = "tree-sitter-grammars/tree-sitter-kdl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-kotlin", url = "fwcd/tree-sitter-kotlin", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-koto", url = "koto-lang/tree-sitter-koto", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-kusto", url = "Willem-J-an/tree-sitter-kusto", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-lalrpop", url = "traxys/tree-sitter-lalrpop", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-latex", url = "latex-lsp/tree-sitter-latex", - version = "0.0.11-1" + version = "0.0.25-1" }, { name = "tree-sitter-ledger", url = "cbarrete/tree-sitter-ledger", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-leo", url = "r001/tree-sitter-leo", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-linkerscript", url = "tree-sitter-grammars/tree-sitter-linkerscript", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-liquid", url = "hankthetank27/tree-sitter-liquid", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-liquidsoap", url = "savonet/tree-sitter-liquidsoap", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-llvm", url = "benwilliamgraham/tree-sitter-llvm", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-lua", url = "tree-sitter-grammars/tree-sitter-lua", - version = "0.0.11-1" + version = "0.0.25-1" }, { name = "tree-sitter-luadoc", url = "tree-sitter-grammars/tree-sitter-luadoc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-luap", url = "tree-sitter-grammars/tree-sitter-luap", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-luau", url = "tree-sitter-grammars/tree-sitter-luau", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-m68k", url = "grahambates/tree-sitter-m68k", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-make", url = "alemuller/tree-sitter-make", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-markdown", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.13-1" + version = "0.0.28-1" }, { name = "tree-sitter-markdown_inline", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.13-1" + version = "0.0.28-1" }, { name = "tree-sitter-matlab", url = "acristoffers/tree-sitter-matlab", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-menhir", url = "Kerl13/tree-sitter-menhir", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-mermaid", url = "monaqa/tree-sitter-mermaid", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-meson", url = "tree-sitter-grammars/tree-sitter-meson", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-mlir", url = "artagnon/tree-sitter-mlir", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-muttrc", url = "neomutt/tree-sitter-muttrc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-nasm", url = "naclsn/tree-sitter-nasm", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-nginx", url = "opa-oz/tree-sitter-nginx", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-nickel", url = "nickel-lang/tree-sitter-nickel", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-nim", url = "alaviss/tree-sitter-nim", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-nim_format_string", url = "aMOPel/tree-sitter-nim-format-string", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-ninja", url = "alemuller/tree-sitter-ninja", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-nix", url = "cstrahan/tree-sitter-nix", - version = "0.0.10-1" + version = "0.0.29-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", @@ -1546,31 +1562,31 @@ return }, { name = "tree-sitter-nqc", url = "tree-sitter-grammars/tree-sitter-nqc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-objc", url = "tree-sitter-grammars/tree-sitter-objc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-objdump", url = "ColinKennedy/tree-sitter-objdump", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-ocaml", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.10-1" + version = "0.0.27-1" }, { name = "tree-sitter-ocaml_interface", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.10-1" + version = "0.0.27-1" }, { name = "tree-sitter-ocamllex", url = "atom-ocaml/tree-sitter-ocamllex", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-odin", url = "tree-sitter-grammars/tree-sitter-odin", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-org", url = "milisims/tree-sitter-org", @@ -1582,507 +1598,507 @@ return }, { name = "tree-sitter-pascal", url = "Isopod/tree-sitter-pascal", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-passwd", url = "ath3/tree-sitter-passwd", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-pem", url = "tree-sitter-grammars/tree-sitter-pem", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-perl", url = "tree-sitter-perl/tree-sitter-perl", - version = "0.0.12-1" + version = "0.0.28-1" }, { name = "tree-sitter-php", url = "tree-sitter/tree-sitter-php", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-php_only", url = "tree-sitter/tree-sitter-php", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-phpdoc", url = "claytonrcarter/tree-sitter-phpdoc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-pioasm", url = "leo60228/tree-sitter-pioasm", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-po", url = "tree-sitter-grammars/tree-sitter-po", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-pod", url = "tree-sitter-perl/tree-sitter-pod", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-poe_filter", url = "tree-sitter-grammars/tree-sitter-poe-filter", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-pony", url = "tree-sitter-grammars/tree-sitter-pony", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-powershell", url = "airbus-cert/tree-sitter-powershell", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-printf", url = "tree-sitter-grammars/tree-sitter-printf", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-prisma", url = "victorhqc/tree-sitter-prisma", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-problog", url = "foxyseta/tree-sitter-prolog", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-prolog", url = "foxyseta/tree-sitter-prolog", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-promql", url = "MichaHoffmann/tree-sitter-promql", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-properties", url = "tree-sitter-grammars/tree-sitter-properties", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-proto", url = "treywood/tree-sitter-proto", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-prql", url = "PRQL/tree-sitter-prql", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-psv", url = "tree-sitter-grammars/tree-sitter-csv", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-pug", url = "zealot128/tree-sitter-pug", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-puppet", url = "tree-sitter-grammars/tree-sitter-puppet", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-purescript", url = "postsolar/tree-sitter-purescript", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-pymanifest", url = "tree-sitter-grammars/tree-sitter-pymanifest", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-python", url = "tree-sitter/tree-sitter-python", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-ql", url = "tree-sitter/tree-sitter-ql", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-qmldir", url = "tree-sitter-grammars/tree-sitter-qmldir", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-qmljs", url = "yuja/tree-sitter-qmljs", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-query", url = "tree-sitter-grammars/tree-sitter-query", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-r", url = "r-lib/tree-sitter-r", - version = "0.0.11-1" + version = "0.0.26-1" }, { name = "tree-sitter-racket", url = "6cdh/tree-sitter-racket", - version = "0.0.12-1" + version = "0.0.26-1" }, { name = "tree-sitter-ralph", url = "alephium/tree-sitter-ralph", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-rasi", url = "Fymyte/tree-sitter-rasi", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-rbs", url = "joker1007/tree-sitter-rbs", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-re2c", url = "tree-sitter-grammars/tree-sitter-re2c", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-readline", url = "tree-sitter-grammars/tree-sitter-readline", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-regex", url = "tree-sitter/tree-sitter-regex", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-rego", url = "FallenAngel97/tree-sitter-rego", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-requirements", url = "tree-sitter-grammars/tree-sitter-requirements", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-rescript", url = "rescript-lang/tree-sitter-rescript", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-rnoweb", url = "bamonroe/tree-sitter-rnoweb", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-robot", url = "Hubro/tree-sitter-robot", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-robots", url = "opa-oz/tree-sitter-robots-txt", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-roc", url = "faldor20/tree-sitter-roc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-ron", url = "tree-sitter-grammars/tree-sitter-ron", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-rst", url = "stsewd/tree-sitter-rst", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-ruby", url = "tree-sitter/tree-sitter-ruby", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-rust", url = "tree-sitter/tree-sitter-rust", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-scala", url = "tree-sitter/tree-sitter-scala", - version = "0.0.13-1" + version = "0.0.27-1" }, { name = "tree-sitter-scfg", url = "rockorager/tree-sitter-scfg", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-scheme", url = "6cdh/tree-sitter-scheme", - version = "0.0.12-1" + version = "0.0.26-1" }, { name = "tree-sitter-scss", url = "serenadeai/tree-sitter-scss", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-sflog", url = "aheber/tree-sitter-sfapex", - version = "0.0.10-1" + version = "0.0.26-1" }, { name = "tree-sitter-slang", url = "tree-sitter-grammars/tree-sitter-slang", - version = "0.0.11-1" + version = "0.0.25-1" }, { name = "tree-sitter-slint", url = "slint-ui/tree-sitter-slint", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-smali", url = "tree-sitter-grammars/tree-sitter-smali", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-smithy", url = "indoorvivants/tree-sitter-smithy", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-snakemake", url = "osthomas/tree-sitter-snakemake", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-solidity", url = "JoranHonig/tree-sitter-solidity", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-soql", url = "aheber/tree-sitter-sfapex", - version = "0.0.10-1" + version = "0.0.26-1" }, { name = "tree-sitter-sosl", url = "aheber/tree-sitter-sfapex", - version = "0.0.10-1" + version = "0.0.26-1" }, { name = "tree-sitter-sourcepawn", url = "nilshelmig/tree-sitter-sourcepawn", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-sparql", url = "GordianDziwis/tree-sitter-sparql", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-sql", url = "derekstride/tree-sitter-sql", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-squirrel", url = "tree-sitter-grammars/tree-sitter-squirrel", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-ssh_config", url = "tree-sitter-grammars/tree-sitter-ssh-config", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-starlark", url = "tree-sitter-grammars/tree-sitter-starlark", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-strace", url = "sigmaSd/tree-sitter-strace", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-styled", url = "mskelton/tree-sitter-styled", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-supercollider", url = "madskjeldgaard/tree-sitter-supercollider", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-surface", url = "connorlay/tree-sitter-surface", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-svelte", url = "tree-sitter-grammars/tree-sitter-svelte", - version = "0.0.12-1" + version = "0.0.26-1" }, { name = "tree-sitter-swift", url = "alex-pinkus/tree-sitter-swift", - version = "0.0.11-1" + version = "0.0.26-1" }, { name = "tree-sitter-sxhkdrc", url = "RaafatTurki/tree-sitter-sxhkdrc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-systemtap", url = "ok-ryoko/tree-sitter-systemtap", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-systemverilog", url = "zhangwwpeng/tree-sitter-systemverilog", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-t32", url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/6182836f4128725f1e74ce986840d7317021a015.zip", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-tablegen", url = "tree-sitter-grammars/tree-sitter-tablegen", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-tact", url = "tact-lang/tree-sitter-tact", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "tree-sitter-tcl", url = "tree-sitter-grammars/tree-sitter-tcl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-teal", url = "euclidianAce/tree-sitter-teal", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-templ", url = "vrischmann/tree-sitter-templ", - version = "0.0.10-1" + version = "0.0.26-1" }, { name = "tree-sitter-terraform", url = "MichaHoffmann/tree-sitter-hcl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-textproto", url = "PorterAtGoogle/tree-sitter-textproto", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-thrift", url = "tree-sitter-grammars/tree-sitter-thrift", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-tiger", url = "ambroisie/tree-sitter-tiger", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-tlaplus", url = "tlaplus-community/tree-sitter-tlaplus", - version = "0.0.10-1" + version = "0.0.26-1" }, { name = "tree-sitter-tmux", url = "Freed-Wu/tree-sitter-tmux", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-todotxt", url = "arnarg/tree-sitter-todotxt", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-toml", url = "tree-sitter-grammars/tree-sitter-toml", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-tsv", url = "tree-sitter-grammars/tree-sitter-csv", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-tsx", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-turtle", url = "GordianDziwis/tree-sitter-turtle", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-twig", url = "gbprod/tree-sitter-twig", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-typescript", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-typespec", url = "happenslol/tree-sitter-typespec", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-typoscript", url = "Teddytrombone/tree-sitter-typoscript", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-typst", url = "uben0/tree-sitter-typst", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-udev", url = "tree-sitter-grammars/tree-sitter-udev", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-ungrammar", url = "tree-sitter-grammars/tree-sitter-ungrammar", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-unison", url = "kylegoetz/tree-sitter-unison", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-usd", url = "ColinKennedy/tree-sitter-usd", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-uxntal", url = "tree-sitter-grammars/tree-sitter-uxntal", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-v", url = "vlang/v-analyzer", - version = "0.0.11-1" + version = "0.0.27-1" }, { name = "tree-sitter-vala", url = "vala-lang/tree-sitter-vala", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-vento", url = "ventojs/tree-sitter-vento", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-verilog", url = "tree-sitter/tree-sitter-verilog", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-vhdl", url = "jpt13653903/tree-sitter-vhdl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-vhs", url = "charmbracelet/tree-sitter-vhs", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-vim", url = "tree-sitter-grammars/tree-sitter-vim", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-vimdoc", url = "neovim/tree-sitter-vimdoc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-vrl", url = "belltoy/tree-sitter-vrl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-vue", url = "tree-sitter-grammars/tree-sitter-vue", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-wgsl", url = "szebniok/tree-sitter-wgsl", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-wgsl_bevy", url = "tree-sitter-grammars/tree-sitter-wgsl-bevy", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-wing", url = "winglang/tree-sitter-wing", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-wit", url = "liamwh/tree-sitter-wit", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-xcompose", url = "tree-sitter-grammars/tree-sitter-xcompose", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-xml", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-yaml", url = "tree-sitter-grammars/tree-sitter-yaml", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-yang", url = "Hubro/tree-sitter-yang", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-yuck", url = "tree-sitter-grammars/tree-sitter-yuck", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-zathurarc", url = "Freed-Wu/tree-sitter-zathurarc", - version = "0.0.10-1" + version = "0.0.24-1" }, { name = "tree-sitter-zig", url = "tree-sitter-grammars/tree-sitter-zig", - version = "0.0.10-1" + version = "0.0.25-1" }, { name = "trouble.nvim", url = "folke/trouble.nvim", @@ -2110,7 +2126,7 @@ return }, { name = "which-key.nvim", url = "folke/which-key.nvim", - version = "3.13.2-1" + version = "3.13.3-1" }, { name = "windline.nvim", url = "windwp/windline.nvim", @@ -2126,7 +2142,7 @@ return }, { name = "yazi.nvim", url = "mikavilpas/yazi.nvim", - version = "6.1.0-1" + version = "6.3.0-1" }, { name = "zen-mode.nvim", url = "folke/zen-mode.nvim", From 40dab7450e6da28364539664d9f51be596b4686b Mon Sep 17 00:00:00 2001 From: Lorenzo Zabot <lorenzozabot@gmail.com> Date: Tue, 22 Oct 2024 12:43:33 +0200 Subject: [PATCH 1571/1610] style(typos): correct a few typos (#1776) ## Description <!-- Describe the big picture of your changes to communicate to the maintainers why we should accept this pull request. --> This PR just fixes a few typos :) `dont => don't` ## Related Issue(s) <!-- If this PR fixes any issues, please link to the issue here. - Fixes #<issue_number> --> ## Screenshots <!-- Add screenshots of the changes if applicable. --> --- lua/lazy/core/config.lua | 2 +- lua/lazy/manage/task/git.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 16cc012..5bb1d91 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -218,7 +218,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 diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index c54c809..ef848f9 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -335,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 = { From cf8ecc2c5e4332760431a33534240b0cbc6680ab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:47:57 +0000 Subject: [PATCH 1572/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 700 ++++++++++++++++-------------- 1 file changed, 374 insertions(+), 326 deletions(-) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 558ff33..c105756 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -14,7 +14,7 @@ return }, { name = "aerial.nvim", url = "stevearc/aerial.nvim", - version = "2.3.0-1" + version = "2.3.1-1" }, { name = "ai.nvim", url = "S1M0N38/ai.nvim", @@ -115,6 +115,10 @@ return name = "deadcolumn.nvim", url = "Bekaboo/deadcolumn.nvim", version = "1.0.0-1" + }, { + name = "decasify.nvim", + url = "alerque/decasify", + version = "0.7.3-1" }, { name = "decipher.nvim", url = "MisanthropicBit/decipher.nvim", @@ -139,6 +143,10 @@ return name = "donut.nvim", url = "NStefan002/donut.nvim", version = "2.2.1-1" + }, { + name = "doris.nvim", + url = "jackokring/doris.nvim", + version = "0.0.0-1" }, { name = "dressing.nvim", url = "stevearc/dressing.nvim", @@ -166,11 +174,11 @@ return }, { name = "elixir-tools.nvim", url = "elixir-tools/elixir-tools.nvim", - version = "0.16.0-1" + version = "0.16.1-1" }, { name = "feed.nvim", - url = "noearc/feed.nvim", - version = "main-1" + url = "neo451/feed.nvim", + version = "1.5.1-1" }, { name = "feline.nvim", url = "freddiehaddad/feline.nvim", @@ -230,7 +238,7 @@ return }, { name = "git.nvim", url = "Kibadda/git.nvim", - version = "4.1.0-1" + version = "5.0.1-1" }, { name = "github-nvim-theme", url = "projekt0n/github-nvim-theme", @@ -263,6 +271,10 @@ return name = "gruvbox.nvim", url = "ellisonleao/gruvbox.nvim", version = "2.0.0-1" + }, { + name = "guard.nvim", + url = "nvimdev/guard.nvim", + version = "1.0.1-1" }, { name = "hardhat.nvim", url = "TheSnakeWitcher/hardhat.nvim", @@ -274,7 +286,7 @@ return }, { name = "haskell-tools.nvim", url = "mrcjkb/haskell-tools.nvim", - version = "4.1.0-1" + version = "4.3.1-1" }, { name = "headlines.nvim", url = "lukas-reineke/headlines.nvim", @@ -318,7 +330,7 @@ return }, { name = "indent-blankline.nvim", url = "lukas-reineke/indent-blankline.nvim", - version = "3.7.2-1" + version = "3.8.2-1" }, { name = "kai.nvim", url = "Kamilcuk/kai.nvim", @@ -327,6 +339,10 @@ return 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", @@ -395,6 +411,10 @@ return name = "luarocks-build-treesitter-parser-cpp", url = "nvim-neorocks/luarocks-build-treesitter-parser-cpp", version = "2.0.4-1" + }, { + name = "magazine.nvim", + url = "iguanacucumber/magazine.nvim", + version = "0.1-1" }, { name = "mapx.nvim", url = "b0o/mapx.nvim", @@ -406,7 +426,7 @@ return }, { name = "markview.nvim", url = "OXY2DEV/markview.nvim", - version = "23.1.0-1" + version = "24.0.0-1" }, { name = "mason-lspconfig.nvim", url = "williamboman/mason-lspconfig.nvim", @@ -494,15 +514,15 @@ return }, { name = "neotest", url = "nvim-neotest/neotest", - version = "5.6.0-1" + version = "5.6.1-1" }, { name = "neotest-busted", url = "MisanthropicBit/neotest-busted", - version = "0.2.0-1" + version = "0.2.1-1" }, { name = "neotest-golang", url = "fredrikaverpil/neotest-golang", - version = "1.2.0-1" + version = "1.3.0-1" }, { name = "neotest-haskell", url = "mrcjkb/neotest-haskell", @@ -510,7 +530,7 @@ return }, { name = "neotest-java", url = "rcasia/neotest-java", - version = "0.16.0-1" + version = "0.17.4-1" }, { name = "netman.nvim", url = "miversen33/netman.nvim", @@ -522,11 +542,11 @@ return }, { name = "no-neck-pain.nvim", url = "shortcuts/no-neck-pain.nvim", - version = "2.0.5-1" + version = "2.0.6-1" }, { name = "noice.nvim", url = "folke/noice.nvim", - version = "4.5.1-1" + version = "4.5.2-1" }, { name = "npackages.nvim", url = "diegofigs/npackages.nvim", @@ -542,7 +562,7 @@ return }, { name = "nvim-a2-pack", url = "dfgordon/nvim-a2-pack", - version = "0.0.2-1" + version = "0.2.0-1" }, { name = "nvim-bqf", url = "kevinhwang91/nvim-bqf", @@ -634,7 +654,7 @@ return }, { name = "nvim-scrollview", url = "dstein64/nvim-scrollview", - version = "5.2.2-1" + version = "6.0.0-1" }, { name = "nvim-smuggler", url = "Klafyvel/nvim-smuggler", @@ -682,7 +702,7 @@ return }, { name = "onedarkpro.nvim", url = "olimorris/onedarkpro.nvim", - version = "1.0.0-1" + version = "2.0.0-1" }, { name = "onenord.nvim", url = "rmehri01/onenord.nvim", @@ -722,7 +742,7 @@ return }, { name = "persisted.nvim", url = "olimorris/persisted.nvim", - version = "2.0.0-1" + version = "2.0.1-1" }, { name = "persistence.nvim", url = "folke/persistence.nvim", @@ -762,11 +782,11 @@ return }, { name = "render-markdown.nvim", url = "MeanderingProgrammer/render-markdown.nvim", - version = "7.2.0-1" + version = "7.4.0-1" }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", - version = "3.8.2-1" + version = "3.8.3-1" }, { name = "rime.nvim", url = "Freed-Wu/rime.nvim", @@ -782,11 +802,11 @@ return }, { name = "rocks-git.nvim", url = "nvim-neorocks/rocks-git.nvim", - version = "2.3.1-1" + version = "2.4.2-1" }, { name = "rocks-lazy.nvim", url = "nvim-neorocks/rocks-lazy.nvim", - version = "1.1.0-1" + version = "1.1.1-1" }, { name = "rocks-treesitter.nvim", url = "nvim-neorocks/rocks-treesitter.nvim", @@ -794,7 +814,7 @@ return }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.40.2-1" + version = "2.40.5-1" }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", @@ -806,7 +826,7 @@ return }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "5.11.0-1" + version = "5.13.0-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -826,7 +846,7 @@ return }, { name = "sf.nvim", url = "xixiaofinland/sf.nvim", - version = "1.7.0-1" + version = "1.8.0-1" }, { name = "sg.nvim", url = "sourcegraph/sg.nvim", @@ -835,6 +855,10 @@ return name = "smart-splits.nvim", url = "mrjones2014/smart-splits.nvim", version = "1.6.0-1" + }, { + name = "sos.nvim", + url = "tmillr/sos.nvim", + version = "1.0.0-1" }, { name = "squirrel.nvim", url = "xiaoshihou514/squirrel.nvim", @@ -894,663 +918,667 @@ return }, { name = "tree-sitter-ada", url = "briot/tree-sitter-ada", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-agda", url = "tree-sitter/tree-sitter-agda", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-angular", url = "dlvandenberg/tree-sitter-angular", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-apex", url = "aheber/tree-sitter-sfapex", - version = "0.0.26-1" + version = "0.0.36-1" }, { name = "tree-sitter-arduino", url = "tree-sitter-grammars/tree-sitter-arduino", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-asm", url = "RubixDev/tree-sitter-asm", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-astro", url = "virchau13/tree-sitter-astro", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-authzed", url = "mleonidas/tree-sitter-authzed", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-awk", url = "Beaglefoot/tree-sitter-awk", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-bash", url = "tree-sitter/tree-sitter-bash", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-bass", url = "vito/tree-sitter-bass", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-beancount", url = "polarmutex/tree-sitter-beancount", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-bibtex", url = "latex-lsp/tree-sitter-bibtex", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-bicep", url = "tree-sitter-grammars/tree-sitter-bicep", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-bitbake", url = "tree-sitter-grammars/tree-sitter-bitbake", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-blueprint", url = "https://gitlab.com/gabmus/tree-sitter-blueprint/-/archive/60ba73739c6083c693d86a1a7cf039c07eb4ed59.zip", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-bp", url = "ambroisie/tree-sitter-bp", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-c", url = "tree-sitter/tree-sitter-c", - version = "0.0.25-1" + version = "0.0.32-1" }, { name = "tree-sitter-c_sharp", url = "tree-sitter/tree-sitter-c-sharp", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-cairo", url = "tree-sitter-grammars/tree-sitter-cairo", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-capnp", url = "tree-sitter-grammars/tree-sitter-capnp", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-chatito", url = "tree-sitter-grammars/tree-sitter-chatito", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-clojure", url = "sogaiu/tree-sitter-clojure", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-cmake", url = "uyha/tree-sitter-cmake", - version = "0.0.24-1" + version = "0.0.31-1" }, { name = "tree-sitter-comment", url = "stsewd/tree-sitter-comment", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-commonlisp", url = "tree-sitter-grammars/tree-sitter-commonlisp", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-cooklang", url = "addcninblue/tree-sitter-cooklang", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-corn", url = "jakestanger/tree-sitter-corn", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-cpon", url = "tree-sitter-grammars/tree-sitter-cpon", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-cpp", url = "tree-sitter/tree-sitter-cpp", - version = "0.0.26-1" + version = "0.0.32-1" }, { name = "tree-sitter-css", url = "tree-sitter/tree-sitter-css", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-csv", url = "tree-sitter-grammars/tree-sitter-csv", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-cuda", url = "tree-sitter-grammars/tree-sitter-cuda", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-cue", url = "eonpatapon/tree-sitter-cue", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-d", url = "gdamore/tree-sitter-d", - version = "0.0.28-1" + version = "0.0.33-1" }, { name = "tree-sitter-dart", url = "UserNobody14/tree-sitter-dart", - version = "0.0.24-1" + version = "0.0.32-1" }, { name = "tree-sitter-devicetree", url = "joelspadin/tree-sitter-devicetree", - version = "0.0.25-1" + version = "0.0.31-1" }, { name = "tree-sitter-dhall", url = "jbellerb/tree-sitter-dhall", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-diff", url = "the-mikedavis/tree-sitter-diff", - version = "0.0.24-1" + version = "0.0.31-1" }, { name = "tree-sitter-disassembly", url = "ColinKennedy/tree-sitter-disassembly", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-djot", url = "treeman/tree-sitter-djot", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-dockerfile", url = "camdencheek/tree-sitter-dockerfile", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-dot", url = "rydesun/tree-sitter-dot", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-doxygen", url = "tree-sitter-grammars/tree-sitter-doxygen", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-dtd", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-earthfile", url = "glehmann/tree-sitter-earthfile", - version = "0.0.26-1" + version = "0.0.31-1" }, { name = "tree-sitter-ebnf", url = "RubixDev/ebnf", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-ecma", url = "nvim-neorocks/luarocks-stub", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-editorconfig", url = "ValdezFOmar/tree-sitter-editorconfig", - version = "0.0.25-1" + version = "0.0.34-1" }, { name = "tree-sitter-eds", url = "uyha/tree-sitter-eds", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-eex", url = "connorlay/tree-sitter-eex", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-elixir", url = "elixir-lang/tree-sitter-elixir", - version = "0.0.26-1" + version = "0.0.33-1" }, { name = "tree-sitter-elm", url = "elm-tooling/tree-sitter-elm", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-elsa", url = "glapa-grossklag/tree-sitter-elsa", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-elvish", url = "elves/tree-sitter-elvish", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-embedded_template", url = "tree-sitter/tree-sitter-embedded-template", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-erlang", url = "WhatsApp/tree-sitter-erlang", - version = "0.0.24-1" + version = "0.0.31-1" }, { name = "tree-sitter-facility", url = "FacilityApi/tree-sitter-facility", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-faust", url = "khiner/tree-sitter-faust", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-fennel", url = "alexmozaidze/tree-sitter-fennel", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-fidl", url = "google/tree-sitter-fidl", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-firrtl", url = "tree-sitter-grammars/tree-sitter-firrtl", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-fish", url = "ram02z/tree-sitter-fish", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-foam", url = "FoamScience/tree-sitter-foam", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-forth", url = "AlexanderBrevig/tree-sitter-forth", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-fortran", url = "stadelmanma/tree-sitter-fortran", - version = "0.0.27-1" + version = "0.0.32-1" }, { name = "tree-sitter-fsh", url = "mgramigna/tree-sitter-fsh", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-fsharp", url = "ionide/tree-sitter-fsharp", - version = "0.0.2-1" + version = "0.0.9-1" }, { name = "tree-sitter-func", url = "tree-sitter-grammars/tree-sitter-func", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-fusion", url = "https://gitlab.com/jirgn/tree-sitter-fusion/-/archive/19db2f47ba4c3a0f6238d4ae0e2abfca16e61dd6.zip", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gap", url = "gap-system/tree-sitter-gap", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gaptst", url = "gap-system/tree-sitter-gaptst", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gdscript", url = "PrestonKnopp/tree-sitter-gdscript", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gdshader", url = "GodOfAvacyn/tree-sitter-gdshader", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-git_config", url = "the-mikedavis/tree-sitter-git-config", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-git_rebase", url = "the-mikedavis/tree-sitter-git-rebase", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gitattributes", url = "tree-sitter-grammars/tree-sitter-gitattributes", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gitcommit", url = "gbprod/tree-sitter-gitcommit", - version = "0.0.24-1" + version = "0.0.32-1" }, { name = "tree-sitter-gitignore", url = "shunsambongi/tree-sitter-gitignore", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gleam", url = "gleam-lang/tree-sitter-gleam", - version = "0.0.26-1" + version = "0.0.31-1" }, { name = "tree-sitter-glimmer", url = "ember-tooling/tree-sitter-glimmer", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-glimmer_javascript", url = "NullVoxPopuli/tree-sitter-glimmer-javascript", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-glimmer_typescript", url = "NullVoxPopuli/tree-sitter-glimmer-typescript", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-glsl", url = "tree-sitter-grammars/tree-sitter-glsl", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-gn", url = "tree-sitter-grammars/tree-sitter-gn", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gnuplot", url = "dpezto/tree-sitter-gnuplot", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-go", url = "tree-sitter/tree-sitter-go", - version = "0.0.25-1" + version = "0.0.31-1" }, { name = "tree-sitter-goctl", url = "chaozwn/tree-sitter-goctl", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-godot_resource", url = "PrestonKnopp/tree-sitter-godot-resource", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gomod", url = "camdencheek/tree-sitter-go-mod", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-gosum", url = "tree-sitter-grammars/tree-sitter-go-sum", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gotmpl", url = "ngalaiko/tree-sitter-go-template", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-gowork", url = "omertuc/tree-sitter-go-work", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gpg", url = "tree-sitter-grammars/tree-sitter-gpg-config", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-graphql", url = "bkegley/tree-sitter-graphql", - version = "0.0.24-1" + version = "0.0.29-1" + }, { + name = "tree-sitter-gren", + url = "MaeBrooks/tree-sitter-gren", + version = "0.0.2-1" }, { name = "tree-sitter-groovy", url = "murtaza64/tree-sitter-groovy", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-gstlaunch", url = "tree-sitter-grammars/tree-sitter-gstlaunch", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-hack", url = "slackhq/tree-sitter-hack", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-hare", url = "tree-sitter-grammars/tree-sitter-hare", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-haskell", url = "tree-sitter/tree-sitter-haskell", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-haskell_persistent", url = "MercuryTechnologies/tree-sitter-haskell-persistent", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-hcl", url = "tree-sitter-grammars/tree-sitter-hcl", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-heex", url = "connorlay/tree-sitter-heex", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-helm", url = "ngalaiko/tree-sitter-go-template", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-hjson", url = "winston0410/tree-sitter-hjson", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-hlsl", url = "tree-sitter-grammars/tree-sitter-hlsl", - version = "0.0.25-1" + version = "0.0.31-1" }, { name = "tree-sitter-hlsplaylist", url = "Freed-Wu/tree-sitter-hlsplaylist", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-hocon", url = "antosha417/tree-sitter-hocon", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-hoon", url = "urbit-pilled/tree-sitter-hoon", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-html", url = "tree-sitter/tree-sitter-html", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-html_tags", url = "nvim-neorocks/luarocks-stub", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-htmldjango", url = "interdependence/tree-sitter-htmldjango", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-http", url = "rest-nvim/tree-sitter-http", - version = "0.0.26-1" + version = "0.0.31-1" }, { name = "tree-sitter-hurl", url = "pfeiferj/tree-sitter-hurl", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-hyprlang", url = "tree-sitter-grammars/tree-sitter-hyprlang", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-idl", url = "cathaysia/tree-sitter-idl", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-ini", url = "justinmk/tree-sitter-ini", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-inko", url = "inko-lang/tree-sitter-inko", - version = "0.0.26-1" + version = "0.0.31-1" }, { name = "tree-sitter-ispc", url = "tree-sitter-grammars/tree-sitter-ispc", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-janet_simple", url = "sogaiu/tree-sitter-janet-simple", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-java", url = "tree-sitter/tree-sitter-java", - version = "0.0.24-1" + version = "0.0.32-1" }, { name = "tree-sitter-javascript", url = "tree-sitter/tree-sitter-javascript", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-jq", url = "flurie/tree-sitter-jq", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-jsdoc", url = "tree-sitter/tree-sitter-jsdoc", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-json", url = "tree-sitter/tree-sitter-json", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-json5", url = "Joakker/tree-sitter-json5", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-jsonc", url = "https://gitlab.com/WhyNotHugo/tree-sitter-jsonc/-/archive/02b01653c8a1c198ae7287d566efa86a135b30d5.zip", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-jsonnet", url = "sourcegraph/tree-sitter-jsonnet", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-jsx", url = "nvim-neorocks/luarocks-stub", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-julia", url = "tree-sitter/tree-sitter-julia", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-just", url = "IndianBoy42/tree-sitter-just", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-kconfig", url = "tree-sitter-grammars/tree-sitter-kconfig", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-kdl", url = "tree-sitter-grammars/tree-sitter-kdl", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-kotlin", url = "fwcd/tree-sitter-kotlin", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-koto", url = "koto-lang/tree-sitter-koto", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-kusto", url = "Willem-J-an/tree-sitter-kusto", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-lalrpop", url = "traxys/tree-sitter-lalrpop", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-latex", url = "latex-lsp/tree-sitter-latex", - version = "0.0.25-1" + version = "0.0.32-1" }, { name = "tree-sitter-ledger", url = "cbarrete/tree-sitter-ledger", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-leo", url = "r001/tree-sitter-leo", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-linkerscript", url = "tree-sitter-grammars/tree-sitter-linkerscript", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-liquid", url = "hankthetank27/tree-sitter-liquid", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-liquidsoap", url = "savonet/tree-sitter-liquidsoap", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-llvm", url = "benwilliamgraham/tree-sitter-llvm", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-lua", url = "tree-sitter-grammars/tree-sitter-lua", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-luadoc", url = "tree-sitter-grammars/tree-sitter-luadoc", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-luap", url = "tree-sitter-grammars/tree-sitter-luap", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-luau", url = "tree-sitter-grammars/tree-sitter-luau", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-m68k", url = "grahambates/tree-sitter-m68k", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-make", url = "alemuller/tree-sitter-make", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-markdown", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.28-1" + version = "0.0.34-1" }, { name = "tree-sitter-markdown_inline", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.28-1" + version = "0.0.34-1" }, { name = "tree-sitter-matlab", url = "acristoffers/tree-sitter-matlab", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-menhir", url = "Kerl13/tree-sitter-menhir", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-mermaid", url = "monaqa/tree-sitter-mermaid", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-meson", url = "tree-sitter-grammars/tree-sitter-meson", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-mlir", url = "artagnon/tree-sitter-mlir", - version = "0.0.24-1" + version = "0.0.34-1" }, { name = "tree-sitter-muttrc", url = "neomutt/tree-sitter-muttrc", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-nasm", url = "naclsn/tree-sitter-nasm", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-nginx", url = "opa-oz/tree-sitter-nginx", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-nickel", url = "nickel-lang/tree-sitter-nickel", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-nim", url = "alaviss/tree-sitter-nim", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-nim_format_string", url = "aMOPel/tree-sitter-nim-format-string", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-ninja", url = "alemuller/tree-sitter-ninja", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-nix", url = "cstrahan/tree-sitter-nix", - version = "0.0.29-1" + version = "0.0.42-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", @@ -1562,31 +1590,31 @@ return }, { name = "tree-sitter-nqc", url = "tree-sitter-grammars/tree-sitter-nqc", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-objc", url = "tree-sitter-grammars/tree-sitter-objc", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-objdump", url = "ColinKennedy/tree-sitter-objdump", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-ocaml", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.27-1" + version = "0.0.32-1" }, { name = "tree-sitter-ocaml_interface", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.27-1" + version = "0.0.33-1" }, { name = "tree-sitter-ocamllex", url = "atom-ocaml/tree-sitter-ocamllex", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-odin", url = "tree-sitter-grammars/tree-sitter-odin", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-org", url = "milisims/tree-sitter-org", @@ -1598,507 +1626,527 @@ return }, { name = "tree-sitter-pascal", url = "Isopod/tree-sitter-pascal", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-passwd", url = "ath3/tree-sitter-passwd", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-pem", url = "tree-sitter-grammars/tree-sitter-pem", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-perl", url = "tree-sitter-perl/tree-sitter-perl", - version = "0.0.28-1" + version = "0.0.35-1" }, { name = "tree-sitter-php", url = "tree-sitter/tree-sitter-php", - version = "0.0.24-1" + version = "0.0.33-1" }, { name = "tree-sitter-php_only", url = "tree-sitter/tree-sitter-php", - version = "0.0.24-1" + version = "0.0.33-1" }, { name = "tree-sitter-phpdoc", url = "claytonrcarter/tree-sitter-phpdoc", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-pioasm", url = "leo60228/tree-sitter-pioasm", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-po", url = "tree-sitter-grammars/tree-sitter-po", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-pod", url = "tree-sitter-perl/tree-sitter-pod", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-poe_filter", url = "tree-sitter-grammars/tree-sitter-poe-filter", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-pony", url = "tree-sitter-grammars/tree-sitter-pony", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-powershell", url = "airbus-cert/tree-sitter-powershell", - version = "0.0.25-1" + version = "0.0.30-1" }, { name = "tree-sitter-printf", url = "tree-sitter-grammars/tree-sitter-printf", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-prisma", url = "victorhqc/tree-sitter-prisma", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-problog", url = "foxyseta/tree-sitter-prolog", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-prolog", url = "foxyseta/tree-sitter-prolog", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-promql", url = "MichaHoffmann/tree-sitter-promql", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-properties", url = "tree-sitter-grammars/tree-sitter-properties", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-proto", url = "treywood/tree-sitter-proto", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-prql", url = "PRQL/tree-sitter-prql", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-psv", url = "tree-sitter-grammars/tree-sitter-csv", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-pug", url = "zealot128/tree-sitter-pug", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-puppet", url = "tree-sitter-grammars/tree-sitter-puppet", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-purescript", url = "postsolar/tree-sitter-purescript", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-pymanifest", url = "tree-sitter-grammars/tree-sitter-pymanifest", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-python", url = "tree-sitter/tree-sitter-python", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-ql", url = "tree-sitter/tree-sitter-ql", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-qmldir", url = "tree-sitter-grammars/tree-sitter-qmldir", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-qmljs", url = "yuja/tree-sitter-qmljs", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-query", url = "tree-sitter-grammars/tree-sitter-query", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-r", url = "r-lib/tree-sitter-r", - version = "0.0.26-1" + version = "0.0.31-1" }, { name = "tree-sitter-racket", url = "6cdh/tree-sitter-racket", - version = "0.0.26-1" + version = "0.0.31-1" }, { name = "tree-sitter-ralph", url = "alephium/tree-sitter-ralph", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-rasi", url = "Fymyte/tree-sitter-rasi", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-rbs", url = "joker1007/tree-sitter-rbs", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-re2c", url = "tree-sitter-grammars/tree-sitter-re2c", - version = "0.0.25-1" + version = "0.0.31-1" }, { name = "tree-sitter-readline", url = "tree-sitter-grammars/tree-sitter-readline", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-regex", url = "tree-sitter/tree-sitter-regex", - version = "0.0.24-1" + version = "0.0.32-1" }, { name = "tree-sitter-rego", url = "FallenAngel97/tree-sitter-rego", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-requirements", url = "tree-sitter-grammars/tree-sitter-requirements", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-rescript", url = "rescript-lang/tree-sitter-rescript", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-rnoweb", url = "bamonroe/tree-sitter-rnoweb", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-robot", url = "Hubro/tree-sitter-robot", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-robots", url = "opa-oz/tree-sitter-robots-txt", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-roc", url = "faldor20/tree-sitter-roc", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-ron", url = "tree-sitter-grammars/tree-sitter-ron", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-rst", url = "stsewd/tree-sitter-rst", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-ruby", url = "tree-sitter/tree-sitter-ruby", - version = "0.0.24-1" + version = "0.0.31-1" }, { name = "tree-sitter-rust", url = "tree-sitter/tree-sitter-rust", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-scala", url = "tree-sitter/tree-sitter-scala", - version = "0.0.27-1" + version = "0.0.36-1" }, { name = "tree-sitter-scfg", url = "rockorager/tree-sitter-scfg", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-scheme", url = "6cdh/tree-sitter-scheme", - version = "0.0.26-1" + version = "0.0.31-1" }, { name = "tree-sitter-scss", url = "serenadeai/tree-sitter-scss", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-sflog", url = "aheber/tree-sitter-sfapex", - version = "0.0.26-1" + version = "0.0.34-1" }, { name = "tree-sitter-slang", url = "tree-sitter-grammars/tree-sitter-slang", - version = "0.0.25-1" + version = "0.0.32-1" }, { name = "tree-sitter-slint", url = "slint-ui/tree-sitter-slint", - version = "0.0.24-1" + version = "0.0.31-1" }, { name = "tree-sitter-smali", url = "tree-sitter-grammars/tree-sitter-smali", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-smithy", url = "indoorvivants/tree-sitter-smithy", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-snakemake", url = "osthomas/tree-sitter-snakemake", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-solidity", url = "JoranHonig/tree-sitter-solidity", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-soql", url = "aheber/tree-sitter-sfapex", - version = "0.0.26-1" + version = "0.0.35-1" }, { name = "tree-sitter-sosl", url = "aheber/tree-sitter-sfapex", - version = "0.0.26-1" + version = "0.0.34-1" }, { name = "tree-sitter-sourcepawn", url = "nilshelmig/tree-sitter-sourcepawn", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-sparql", url = "GordianDziwis/tree-sitter-sparql", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-sql", url = "derekstride/tree-sitter-sql", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-squirrel", url = "tree-sitter-grammars/tree-sitter-squirrel", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-ssh_config", url = "tree-sitter-grammars/tree-sitter-ssh-config", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-starlark", url = "tree-sitter-grammars/tree-sitter-starlark", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-strace", url = "sigmaSd/tree-sitter-strace", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-styled", url = "mskelton/tree-sitter-styled", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-supercollider", url = "madskjeldgaard/tree-sitter-supercollider", - version = "0.0.25-1" + version = "0.0.30-1" + }, { + name = "tree-sitter-superhtml", + url = "kristoff-it/superhtml", + version = "0.0.6-1" }, { name = "tree-sitter-surface", url = "connorlay/tree-sitter-surface", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-svelte", url = "tree-sitter-grammars/tree-sitter-svelte", - version = "0.0.26-1" + version = "0.0.32-1" }, { name = "tree-sitter-swift", url = "alex-pinkus/tree-sitter-swift", - version = "0.0.26-1" + version = "0.0.35-1" }, { name = "tree-sitter-sxhkdrc", url = "RaafatTurki/tree-sitter-sxhkdrc", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-systemtap", url = "ok-ryoko/tree-sitter-systemtap", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-systemverilog", url = "zhangwwpeng/tree-sitter-systemverilog", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-t32", - url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/6182836f4128725f1e74ce986840d7317021a015.zip", - version = "0.0.24-1" + url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/0f6a5b1e031c97ebf58d3c76eadb2c6bf1e4f780.zip", + version = "0.0.30-1" }, { name = "tree-sitter-tablegen", url = "tree-sitter-grammars/tree-sitter-tablegen", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-tact", url = "tact-lang/tree-sitter-tact", - version = "0.0.25-1" + version = "0.0.33-1" }, { name = "tree-sitter-tcl", url = "tree-sitter-grammars/tree-sitter-tcl", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-teal", url = "euclidianAce/tree-sitter-teal", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-templ", url = "vrischmann/tree-sitter-templ", - version = "0.0.26-1" + version = "0.0.33-1" }, { name = "tree-sitter-terraform", url = "MichaHoffmann/tree-sitter-hcl", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-textproto", url = "PorterAtGoogle/tree-sitter-textproto", - version = "0.0.24-1" + version = "0.0.31-1" }, { name = "tree-sitter-thrift", url = "tree-sitter-grammars/tree-sitter-thrift", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-tiger", url = "ambroisie/tree-sitter-tiger", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-tlaplus", url = "tlaplus-community/tree-sitter-tlaplus", - version = "0.0.26-1" + version = "0.0.34-1" }, { name = "tree-sitter-tmux", url = "Freed-Wu/tree-sitter-tmux", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-todotxt", url = "arnarg/tree-sitter-todotxt", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-toml", url = "tree-sitter-grammars/tree-sitter-toml", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-tsv", url = "tree-sitter-grammars/tree-sitter-csv", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-tsx", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-turtle", url = "GordianDziwis/tree-sitter-turtle", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-twig", url = "gbprod/tree-sitter-twig", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-typescript", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-typespec", url = "happenslol/tree-sitter-typespec", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-typoscript", url = "Teddytrombone/tree-sitter-typoscript", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-typst", url = "uben0/tree-sitter-typst", - version = "0.0.24-1" + version = "0.0.31-1" }, { name = "tree-sitter-udev", url = "tree-sitter-grammars/tree-sitter-udev", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-ungrammar", url = "tree-sitter-grammars/tree-sitter-ungrammar", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-unison", url = "kylegoetz/tree-sitter-unison", - version = "0.0.24-1" + version = "0.0.31-1" }, { name = "tree-sitter-usd", url = "ColinKennedy/tree-sitter-usd", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-uxntal", url = "tree-sitter-grammars/tree-sitter-uxntal", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-v", url = "vlang/v-analyzer", - version = "0.0.27-1" + version = "0.0.34-1" }, { name = "tree-sitter-vala", url = "vala-lang/tree-sitter-vala", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-vento", url = "ventojs/tree-sitter-vento", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-verilog", - url = "tree-sitter/tree-sitter-verilog", - version = "0.0.24-1" + url = "gmlarumbe/tree-sitter-systemverilog", + version = "0.0.33-1" }, { name = "tree-sitter-vhdl", url = "jpt13653903/tree-sitter-vhdl", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-vhs", url = "charmbracelet/tree-sitter-vhs", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-vim", url = "tree-sitter-grammars/tree-sitter-vim", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-vimdoc", url = "neovim/tree-sitter-vimdoc", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-vrl", url = "belltoy/tree-sitter-vrl", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-vue", url = "tree-sitter-grammars/tree-sitter-vue", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-wgsl", url = "szebniok/tree-sitter-wgsl", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-wgsl_bevy", url = "tree-sitter-grammars/tree-sitter-wgsl-bevy", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-wing", url = "winglang/tree-sitter-wing", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-wit", url = "liamwh/tree-sitter-wit", - version = "0.0.24-1" + version = "0.0.30-1" }, { name = "tree-sitter-xcompose", url = "tree-sitter-grammars/tree-sitter-xcompose", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-xml", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.24-1" + version = "0.0.30-1" + }, { + name = "tree-sitter-xresources", + url = "ValdezFOmar/tree-sitter-xresources", + version = "0.0.3-1" }, { name = "tree-sitter-yaml", url = "tree-sitter-grammars/tree-sitter-yaml", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-yang", url = "Hubro/tree-sitter-yang", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-yuck", url = "tree-sitter-grammars/tree-sitter-yuck", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-zathurarc", url = "Freed-Wu/tree-sitter-zathurarc", - version = "0.0.24-1" + version = "0.0.29-1" }, { name = "tree-sitter-zig", url = "tree-sitter-grammars/tree-sitter-zig", - version = "0.0.25-1" + version = "0.0.30-1" + }, { + name = "tree-sitter-ziggy", + url = "kristoff-it/ziggy", + version = "0.0.6-1" + }, { + name = "tree-sitter-ziggy_schema", + url = "kristoff-it/ziggy", + version = "0.0.6-1" + }, { + name = "treedoc.nvim", + url = "neo451/treedoc.nvim", + version = "1.0.0-1" }, { name = "trouble.nvim", url = "folke/trouble.nvim", @@ -2142,7 +2190,7 @@ return }, { name = "yazi.nvim", url = "mikavilpas/yazi.nvim", - version = "6.3.0-1" + version = "6.4.3-1" }, { name = "zen-mode.nvim", url = "folke/zen-mode.nvim", From 408449a59adb8c2a31c32fff606676b32ce4552a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Mon, 4 Nov 2024 11:46:48 +0100 Subject: [PATCH 1573/1610] fix(rockspec): allow binary lua files. Fixes #1800 --- lua/lazy/pkg/rockspec.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index d7ecfdb..e8ece1b 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -224,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 From b1134ab82ee4279e31f7ddf7e34b2a99eb9b7bc9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 10:49:21 +0000 Subject: [PATCH 1574/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 176 ++++++++++++++++++------------ 1 file changed, 108 insertions(+), 68 deletions(-) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index c105756..908d5d7 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -27,6 +27,10 @@ return name = "auto-hlsearch.nvim", url = "asiryk/auto-hlsearch.nvim", version = "1.1.0-1" + }, { + name = "autosave.nvim", + url = "brianhuster/autosave.nvim", + version = "0.1.1-1" }, { name = "banana.nvim", url = "CWood-sdf/banana.nvim", @@ -42,11 +46,11 @@ return }, { name = "better-escape.nvim", url = "max397574/better-escape.nvim", - version = "2.3.2-1" + version = "2.3.3-1" }, { name = "bufferline.nvim", url = "akinsho/bufferline.nvim", - version = "4.7.0-1" + version = "4.8.0-1" }, { name = "care.nvim", url = "max397574/care.nvim", @@ -79,6 +83,10 @@ return name = "colortils.nvim", url = "nvim-colortils/colortils.nvim", version = "1.1.0-1" + }, { + name = "command.nvim", + url = "cultab/command.nvim", + version = "0.1.1-1" }, { name = "commander.nvim", url = "FeiyouG/commander.nvim", @@ -114,11 +122,11 @@ 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.7.3-1" + version = "0.8.0-1" }, { name = "decipher.nvim", url = "MisanthropicBit/decipher.nvim", @@ -154,7 +162,7 @@ return }, { name = "dropbar.nvim", url = "Bekaboo/dropbar.nvim", - version = "8.6.1-1" + version = "9.0.0-1" }, { name = "duck.nvim", url = "tamton-aquib/duck.nvim", @@ -178,7 +186,7 @@ return }, { name = "feed.nvim", url = "neo451/feed.nvim", - version = "1.5.1-1" + version = "1.6.3-1" }, { name = "feline.nvim", url = "freddiehaddad/feline.nvim", @@ -238,7 +246,7 @@ return }, { name = "git.nvim", url = "Kibadda/git.nvim", - version = "5.0.1-1" + version = "5.1.0-1" }, { name = "github-nvim-theme", url = "projekt0n/github-nvim-theme", @@ -274,7 +282,7 @@ return }, { name = "guard.nvim", url = "nvimdev/guard.nvim", - version = "1.0.1-1" + version = "1.0.3-1" }, { name = "hardhat.nvim", url = "TheSnakeWitcher/hardhat.nvim", @@ -314,7 +322,7 @@ return }, { name = "hurl.nvim", url = "jellydn/hurl.nvim", - version = "1.7.1-1" + version = "1.8.0-1" }, { name = "hydra.nvim", url = "nvimtools/hydra.nvim", @@ -330,7 +338,7 @@ return }, { name = "indent-blankline.nvim", url = "lukas-reineke/indent-blankline.nvim", - version = "3.8.2-1" + version = "3.8.3-1" }, { name = "kai.nvim", url = "Kamilcuk/kai.nvim", @@ -354,7 +362,7 @@ return }, { name = "lean.nvim", url = "Julian/lean.nvim", - version = "2024.9.2-1" + version = "2024.10.1-1" }, { name = "leetcode.nvim", url = "kawre/leetcode.nvim", @@ -367,6 +375,10 @@ return name = "live-command.nvim", url = "smjonas/live-command.nvim", version = "2.2.0-1" + }, { + name = "live-preview.nvim", + url = "brianhuster/live-preview.nvim", + version = "0.8.1-1" }, { name = "logging.nvim", url = "NTBBloodbath/logging.nvim", @@ -411,10 +423,18 @@ return 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.1-1" + }, { + name = "mag-nvim-lua", + url = "iguanacucumber/mag-nvim-lua", + version = "0.1-1" }, { name = "magazine.nvim", url = "iguanacucumber/magazine.nvim", - version = "0.1-1" + version = "0.2.1-1" }, { name = "mapx.nvim", url = "b0o/mapx.nvim", @@ -522,7 +542,7 @@ return }, { name = "neotest-golang", url = "fredrikaverpil/neotest-golang", - version = "1.3.0-1" + version = "1.5.0-1" }, { name = "neotest-haskell", url = "mrcjkb/neotest-haskell", @@ -530,7 +550,11 @@ return }, { name = "neotest-java", url = "rcasia/neotest-java", - version = "0.17.4-1" + version = "0.17.5-1" + }, { + name = "neotest-zig", + url = "lawrence-laz/neotest-zig", + version = "1.3.0-1" }, { name = "netman.nvim", url = "miversen33/netman.nvim", @@ -546,7 +570,7 @@ return }, { name = "noice.nvim", url = "folke/noice.nvim", - version = "4.5.2-1" + version = "4.6.0-1" }, { name = "npackages.nvim", url = "diegofigs/npackages.nvim", @@ -563,6 +587,10 @@ return name = "nvim-a2-pack", url = "dfgordon/nvim-a2-pack", version = "0.2.0-1" + }, { + name = "nvim-best-practices-plugin-template", + url = "ColinKennedy/nvim-best-practices-plugin-template", + version = "1.3.1-1" }, { name = "nvim-bqf", url = "kevinhwang91/nvim-bqf", @@ -650,7 +678,7 @@ return }, { name = "nvim-possession", url = "gennaro-tedesco/nvim-possession", - version = "0.0.14-1" + version = "0.0.15-1" }, { name = "nvim-scrollview", url = "dstein64/nvim-scrollview", @@ -702,7 +730,7 @@ return }, { name = "onedarkpro.nvim", url = "olimorris/onedarkpro.nvim", - version = "2.0.0-1" + version = "2.0.1-1" }, { name = "onenord.nvim", url = "rmehri01/onenord.nvim", @@ -762,7 +790,7 @@ return }, { name = "quarry.nvim", url = "rudionrails/quarry.nvim", - version = "3.0.1-1" + version = "4.0.0-1" }, { name = "quicker.nvim", url = "stevearc/quicker.nvim", @@ -770,7 +798,7 @@ return }, { name = "rainbow-delimiters.nvim", url = "HiPhish/rainbow-delimiters.nvim", - version = "0.6.2-1" + version = "0.7.0-1" }, { name = "remember.nvim", url = "vladdoster/remember.nvim", @@ -802,7 +830,7 @@ return }, { name = "rocks-git.nvim", url = "nvim-neorocks/rocks-git.nvim", - version = "2.4.2-1" + version = "2.5.1-1" }, { name = "rocks-lazy.nvim", url = "nvim-neorocks/rocks-lazy.nvim", @@ -814,7 +842,7 @@ return }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.40.5-1" + version = "2.41.1-1" }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", @@ -822,11 +850,11 @@ return }, { name = "runt.nvim", url = "Julian/runt.nvim", - version = "2024.10.1-1" + version = "2024.10.2-1" }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "5.13.0-1" + version = "5.13.1-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -855,6 +883,10 @@ return name = "smart-splits.nvim", url = "mrjones2014/smart-splits.nvim", version = "1.6.0-1" + }, { + name = "snippets.nvim", + url = "Kibadda/snippets.nvim", + version = "1.0.0-1" }, { name = "sos.nvim", url = "tmillr/sos.nvim", @@ -914,7 +946,7 @@ return }, { name = "tokyonight.nvim", url = "folke/tokyonight.nvim", - version = "4.8.0-1" + version = "4.9.0-1" }, { name = "tree-sitter-ada", url = "briot/tree-sitter-ada", @@ -950,11 +982,11 @@ return }, { name = "tree-sitter-awk", url = "Beaglefoot/tree-sitter-awk", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-bash", url = "tree-sitter/tree-sitter-bash", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-bass", url = "vito/tree-sitter-bass", @@ -962,7 +994,7 @@ return }, { name = "tree-sitter-beancount", url = "polarmutex/tree-sitter-beancount", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-bibtex", url = "latex-lsp/tree-sitter-bibtex", @@ -986,7 +1018,7 @@ return }, { name = "tree-sitter-c", url = "tree-sitter/tree-sitter-c", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-c_sharp", url = "tree-sitter/tree-sitter-c-sharp", @@ -1051,6 +1083,10 @@ return name = "tree-sitter-cue", url = "eonpatapon/tree-sitter-cue", version = "0.0.29-1" + }, { + name = "tree-sitter-cylc", + url = "elliotfontaine/tree-sitter-cylc", + version = "0.0.1-1" }, { name = "tree-sitter-d", url = "gdamore/tree-sitter-d", @@ -1059,6 +1095,10 @@ return name = "tree-sitter-dart", url = "UserNobody14/tree-sitter-dart", version = "0.0.32-1" + }, { + name = "tree-sitter-desktop", + url = "ValdezFOmar/tree-sitter-desktop", + version = "0.0.4-1" }, { name = "tree-sitter-devicetree", url = "joelspadin/tree-sitter-devicetree", @@ -1094,7 +1134,7 @@ return }, { name = "tree-sitter-dtd", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-earthfile", url = "glehmann/tree-sitter-earthfile", @@ -1110,7 +1150,7 @@ return }, { name = "tree-sitter-editorconfig", url = "ValdezFOmar/tree-sitter-editorconfig", - version = "0.0.34-1" + version = "0.0.37-1" }, { name = "tree-sitter-eds", url = "uyha/tree-sitter-eds", @@ -1122,7 +1162,7 @@ return }, { name = "tree-sitter-elixir", url = "elixir-lang/tree-sitter-elixir", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-elm", url = "elm-tooling/tree-sitter-elm", @@ -1142,7 +1182,7 @@ return }, { name = "tree-sitter-erlang", url = "WhatsApp/tree-sitter-erlang", - version = "0.0.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-facility", url = "FacilityApi/tree-sitter-facility", @@ -1178,7 +1218,7 @@ return }, { name = "tree-sitter-fortran", url = "stadelmanma/tree-sitter-fortran", - version = "0.0.32-1" + version = "0.0.34-1" }, { name = "tree-sitter-fsh", url = "mgramigna/tree-sitter-fsh", @@ -1206,7 +1246,7 @@ return }, { name = "tree-sitter-gdscript", url = "PrestonKnopp/tree-sitter-gdscript", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-gdshader", url = "GodOfAvacyn/tree-sitter-gdshader", @@ -1226,7 +1266,7 @@ return }, { name = "tree-sitter-gitcommit", url = "gbprod/tree-sitter-gitcommit", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-gitignore", url = "shunsambongi/tree-sitter-gitignore", @@ -1234,7 +1274,7 @@ return }, { name = "tree-sitter-gleam", url = "gleam-lang/tree-sitter-gleam", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-glimmer", url = "ember-tooling/tree-sitter-glimmer", @@ -1302,7 +1342,7 @@ return }, { name = "tree-sitter-groovy", url = "murtaza64/tree-sitter-groovy", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-gstlaunch", url = "tree-sitter-grammars/tree-sitter-gstlaunch", @@ -1330,11 +1370,11 @@ return }, { name = "tree-sitter-heex", url = "connorlay/tree-sitter-heex", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-helm", url = "ngalaiko/tree-sitter-go-template", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-hjson", url = "winston0410/tree-sitter-hjson", @@ -1394,7 +1434,7 @@ return }, { name = "tree-sitter-ispc", url = "tree-sitter-grammars/tree-sitter-ispc", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-janet_simple", url = "sogaiu/tree-sitter-janet-simple", @@ -1406,7 +1446,7 @@ return }, { name = "tree-sitter-javascript", url = "tree-sitter/tree-sitter-javascript", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-jq", url = "flurie/tree-sitter-jq", @@ -1442,7 +1482,7 @@ return }, { name = "tree-sitter-just", url = "IndianBoy42/tree-sitter-just", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-kconfig", url = "tree-sitter-grammars/tree-sitter-kconfig", @@ -1458,7 +1498,7 @@ return }, { name = "tree-sitter-koto", url = "koto-lang/tree-sitter-koto", - version = "0.0.30-1" + version = "0.0.33-1" }, { name = "tree-sitter-kusto", url = "Willem-J-an/tree-sitter-kusto", @@ -1498,7 +1538,7 @@ return }, { name = "tree-sitter-lua", url = "tree-sitter-grammars/tree-sitter-lua", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-luadoc", url = "tree-sitter-grammars/tree-sitter-luadoc", @@ -1522,11 +1562,11 @@ return }, { name = "tree-sitter-markdown", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-markdown_inline", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-matlab", url = "acristoffers/tree-sitter-matlab", @@ -1546,7 +1586,7 @@ return }, { name = "tree-sitter-mlir", url = "artagnon/tree-sitter-mlir", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-muttrc", url = "neomutt/tree-sitter-muttrc", @@ -1578,7 +1618,7 @@ return }, { name = "tree-sitter-nix", url = "cstrahan/tree-sitter-nix", - version = "0.0.42-1" + version = "0.0.45-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", @@ -1674,7 +1714,7 @@ return }, { name = "tree-sitter-powershell", url = "airbus-cert/tree-sitter-powershell", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-printf", url = "tree-sitter-grammars/tree-sitter-printf", @@ -1778,7 +1818,7 @@ return }, { name = "tree-sitter-regex", url = "tree-sitter/tree-sitter-regex", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-rego", url = "FallenAngel97/tree-sitter-rego", @@ -1814,15 +1854,15 @@ return }, { name = "tree-sitter-rst", url = "stsewd/tree-sitter-rst", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-ruby", url = "tree-sitter/tree-sitter-ruby", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-rust", url = "tree-sitter/tree-sitter-rust", - version = "0.0.30-1" + version = "0.0.33-1" }, { name = "tree-sitter-scala", url = "tree-sitter/tree-sitter-scala", @@ -1886,7 +1926,7 @@ return }, { name = "tree-sitter-sql", url = "derekstride/tree-sitter-sql", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-squirrel", url = "tree-sitter-grammars/tree-sitter-squirrel", @@ -1906,7 +1946,7 @@ return }, { name = "tree-sitter-styled", url = "mskelton/tree-sitter-styled", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-supercollider", url = "madskjeldgaard/tree-sitter-supercollider", @@ -1914,7 +1954,7 @@ return }, { name = "tree-sitter-superhtml", url = "kristoff-it/superhtml", - version = "0.0.6-1" + version = "0.0.9-1" }, { name = "tree-sitter-surface", url = "connorlay/tree-sitter-surface", @@ -1926,7 +1966,7 @@ return }, { name = "tree-sitter-swift", url = "alex-pinkus/tree-sitter-swift", - version = "0.0.35-1" + version = "0.0.36-1" }, { name = "tree-sitter-sxhkdrc", url = "RaafatTurki/tree-sitter-sxhkdrc", @@ -1941,8 +1981,8 @@ return version = "0.0.29-1" }, { name = "tree-sitter-t32", - url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/0f6a5b1e031c97ebf58d3c76eadb2c6bf1e4f780.zip", - version = "0.0.30-1" + url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/e455373021812abf4a0b5170caa0d882a9578bab.zip", + version = "0.0.31-1" }, { name = "tree-sitter-tablegen", url = "tree-sitter-grammars/tree-sitter-tablegen", @@ -1962,7 +2002,7 @@ return }, { name = "tree-sitter-templ", url = "vrischmann/tree-sitter-templ", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-terraform", url = "MichaHoffmann/tree-sitter-hcl", @@ -1974,7 +2014,7 @@ return }, { name = "tree-sitter-thrift", url = "tree-sitter-grammars/tree-sitter-thrift", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-tiger", url = "ambroisie/tree-sitter-tiger", @@ -1982,7 +2022,7 @@ return }, { name = "tree-sitter-tlaplus", url = "tlaplus-community/tree-sitter-tlaplus", - version = "0.0.34-1" + version = "0.0.36-1" }, { name = "tree-sitter-tmux", url = "Freed-Wu/tree-sitter-tmux", @@ -2054,7 +2094,7 @@ return }, { name = "tree-sitter-vala", url = "vala-lang/tree-sitter-vala", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-vento", url = "ventojs/tree-sitter-vento", @@ -2066,7 +2106,7 @@ return }, { name = "tree-sitter-vhdl", url = "jpt13653903/tree-sitter-vhdl", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-vhs", url = "charmbracelet/tree-sitter-vhs", @@ -2078,7 +2118,7 @@ return }, { name = "tree-sitter-vimdoc", url = "neovim/tree-sitter-vimdoc", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-vrl", url = "belltoy/tree-sitter-vrl", @@ -2110,11 +2150,11 @@ return }, { name = "tree-sitter-xml", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-xresources", url = "ValdezFOmar/tree-sitter-xresources", - version = "0.0.3-1" + version = "0.0.4-1" }, { name = "tree-sitter-yaml", url = "tree-sitter-grammars/tree-sitter-yaml", @@ -2146,7 +2186,7 @@ return }, { name = "treedoc.nvim", url = "neo451/treedoc.nvim", - version = "1.0.0-1" + version = "1.0.1-1" }, { name = "trouble.nvim", url = "folke/trouble.nvim", From 60cf258a9ae7fffe04bb31141141a91845158dcc Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sun, 10 Nov 2024 07:28:51 +0100 Subject: [PATCH 1575/1610] fix(docs): always update helptags for local plugins --- lua/lazy/manage/task/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 69a93a5..c8a2bdb 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -87,7 +87,7 @@ 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" From 7967abe55752aa90532e6bb4bd4663fe27a264cb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 11:07:59 +0100 Subject: [PATCH 1576/1610] chore(main): release 11.14.2 (#1730) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 12 ++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index fe56f44..87f2b31 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.14.1" + ".": "11.14.2" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 83a3375..f76a332 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 5bb1d91..8f56d52 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -241,7 +241,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.14.1" -- x-release-please-version +M.version = "11.14.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From e41dffcbafd7123c9c0ffb0bb1624b8e3d08c884 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 20 Nov 2024 09:08:44 +0100 Subject: [PATCH 1577/1610] docs: fix hl_group docgen --- lua/lazy/docs.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 36880a1..7791b62 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -131,6 +131,7 @@ function M.colors(opts) { "---", "---", "---" }, } Util.foreach(require(opts.modname).colors, function(group, link) + link = type(link) == "table" and vim.inspect(link) or link lines[#lines + 1] = { "**" .. opts.name .. group .. "**", "***" .. link .. "***", comments[group] or "" } end) return { content = M.table(lines) } From 25749704e442b5c8e2db49a6fe11260760c73d5f Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 20 Nov 2024 09:11:45 +0100 Subject: [PATCH 1578/1610] docs: docgen --- lua/lazy/docs.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 7791b62..b3b4d09 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -131,7 +131,7 @@ function M.colors(opts) { "---", "---", "---" }, } Util.foreach(require(opts.modname).colors, function(group, link) - link = type(link) == "table" and vim.inspect(link) or link + 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) } From 8e11d208d63de693127761cd9a5621117bf6c625 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 08:13:59 +0000 Subject: [PATCH 1579/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 61 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index c2c9695..7722a40 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -646,24 +646,42 @@ will be added to the plugin’s spec. -- 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", - versions = true, -- Honor versions in pkg sources -- the first package source that is found for a plugin will be used. sources = { "lazy", - "rockspec", + "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 = { - ---@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"} @@ -715,7 +733,7 @@ will be added to the plugin’s spec. -- 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 = 20, -- how frequently should the ui process render events + 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. @@ -730,6 +748,16 @@ will be added to the plugin’s spec. 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"] = { function(plugin) require("lazy.util").float_term(nil, { @@ -740,6 +768,17 @@ will be added to the plugin’s 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 command <d> can be one of: -- * browser: opens the github compare view. Note that this is always mapped to <K> as well, @@ -791,7 +830,7 @@ will be added to the plugin’s spec. 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 @@ -837,6 +876,8 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s ----------------------------------------------------------------------- Highlight Group Default Group Description ----------------------- ----------------------- ----------------------- + LazyBold { bold = true } + LazyButton CursorLine LazyButtonActive Visual @@ -857,10 +898,16 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s 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 @@ -897,13 +944,13 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s LazySpecial @punctuation.special - LazyTaskError ErrorMsg task errors - LazyTaskOutput MsgArea task output LazyUrl @markup.link url LazyValue @string value of a property + + LazyWarning DiagnosticWarn task errors ----------------------------------------------------------------------- ============================================================================== From 7d0fe7615a600e72c920dd0099181ae64c96ddb0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Wed, 20 Nov 2024 09:24:25 +0100 Subject: [PATCH 1580/1610] ci: docgen fixes --- lua/lazy/docs.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index b3b4d09..afee2d4 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -131,8 +131,8 @@ function M.colors(opts) { "---", "---", "---" }, } 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 "" } + 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 From 56ead98e05bb37a4ec28930a54d836d033cf00f2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 08:28:09 +0000 Subject: [PATCH 1581/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 256 +++++++++++++++++------------- 1 file changed, 148 insertions(+), 108 deletions(-) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 908d5d7..5c2bed1 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -10,11 +10,15 @@ return }, { name = "adopure.nvim", url = "Willem-J-an/adopure.nvim", - version = "1.1.2-1" + version = "1.2.0-1" }, { name = "aerial.nvim", url = "stevearc/aerial.nvim", version = "2.3.1-1" + }, { + name = "age.nvim", + url = "KingMichaelPark/age.nvim", + version = "0.1.0-1" }, { name = "ai.nvim", url = "S1M0N38/ai.nvim", @@ -30,7 +34,7 @@ return }, { name = "autosave.nvim", url = "brianhuster/autosave.nvim", - version = "0.1.1-1" + version = "0.4.1-1" }, { name = "banana.nvim", url = "CWood-sdf/banana.nvim", @@ -106,7 +110,11 @@ return }, { name = "conform.nvim", url = "stevearc/conform.nvim", - version = "8.1.0-1" + version = "8.2.0-1" + }, { + name = "cursor-text-objects.nvim", + url = "ColinKennedy/cursor-text-objects.nvim", + version = "1.1.0-1" }, { name = "cybu.nvim", url = "ghillb/cybu.nvim", @@ -154,15 +162,15 @@ return }, { name = "doris.nvim", url = "jackokring/doris.nvim", - version = "0.0.0-1" + version = "0.2.0-1" }, { name = "dressing.nvim", url = "stevearc/dressing.nvim", - version = "3.0.0-1" + version = "3.1.0-1" }, { name = "dropbar.nvim", url = "Bekaboo/dropbar.nvim", - version = "9.0.0-1" + version = "9.0.1-1" }, { name = "duck.nvim", url = "tamton-aquib/duck.nvim", @@ -178,19 +186,23 @@ return }, { name = "efmls-configs-nvim", url = "creativenull/efmls-configs-nvim", - version = "1.7.0-1" + version = "1.8.0-1" }, { name = "elixir-tools.nvim", url = "elixir-tools/elixir-tools.nvim", version = "0.16.1-1" + }, { + name = "fake.nvim", + url = "Kibadda/fake.nvim", + version = "1.0.0-1" }, { name = "feed.nvim", url = "neo451/feed.nvim", - version = "1.6.3-1" + version = "1.9.1-1" }, { name = "feline.nvim", url = "freddiehaddad/feline.nvim", - version = "1.6.3-1" + version = "1.7.0-1" }, { name = "fidget.nvim", url = "j-hui/fidget.nvim", @@ -302,7 +314,7 @@ return }, { name = "heirline.nvim", url = "rebelot/heirline.nvim", - version = "1.0.6-1" + version = "1.0.7-1" }, { name = "helpview.nvim", url = "OXY2DEV/helpview.nvim", @@ -322,7 +334,7 @@ return }, { name = "hurl.nvim", url = "jellydn/hurl.nvim", - version = "1.8.0-1" + version = "2.0.0-1" }, { name = "hydra.nvim", url = "nvimtools/hydra.nvim", @@ -338,7 +350,7 @@ return }, { name = "indent-blankline.nvim", url = "lukas-reineke/indent-blankline.nvim", - version = "3.8.3-1" + version = "3.8.5-1" }, { name = "kai.nvim", url = "Kamilcuk/kai.nvim", @@ -354,7 +366,7 @@ return }, { name = "lazy.nvim", url = "folke/lazy.nvim", - version = "11.14.1-1" + version = "11.14.2-1" }, { name = "lazydev.nvim", url = "folke/lazydev.nvim", @@ -378,7 +390,7 @@ return }, { name = "live-preview.nvim", url = "brianhuster/live-preview.nvim", - version = "0.8.1-1" + version = "0.8.3-1" }, { name = "logging.nvim", url = "NTBBloodbath/logging.nvim", @@ -403,6 +415,10 @@ return name = "ltreesitter", url = "euclidianAce/ltreesitter", version = "0.0.7-1" + }, { + name = "lua-console.nvim", + url = "YaroSpace/lua-console.nvim", + version = "1.1.0-1" }, { name = "lua-obfuscator.nvim", url = "git+ssh://git@github.com/kdssoftware/lua-obfuscator.nvim.git", @@ -434,7 +450,7 @@ return }, { name = "magazine.nvim", url = "iguanacucumber/magazine.nvim", - version = "0.2.1-1" + version = "0.4.1-1" }, { name = "mapx.nvim", url = "b0o/mapx.nvim", @@ -538,7 +554,7 @@ return }, { name = "neotest-busted", url = "MisanthropicBit/neotest-busted", - version = "0.2.1-1" + version = "0.3.0-1" }, { name = "neotest-golang", url = "fredrikaverpil/neotest-golang", @@ -550,11 +566,11 @@ return }, { name = "neotest-java", url = "rcasia/neotest-java", - version = "0.17.5-1" + version = "0.17.6-1" }, { name = "neotest-zig", url = "lawrence-laz/neotest-zig", - version = "1.3.0-1" + version = "1.3.1-1" }, { name = "netman.nvim", url = "miversen33/netman.nvim", @@ -570,7 +586,7 @@ return }, { name = "noice.nvim", url = "folke/noice.nvim", - version = "4.6.0-1" + version = "4.7.2-1" }, { name = "npackages.nvim", url = "diegofigs/npackages.nvim", @@ -586,11 +602,11 @@ return }, { name = "nvim-a2-pack", url = "dfgordon/nvim-a2-pack", - version = "0.2.0-1" + version = "0.3.0-1" }, { name = "nvim-best-practices-plugin-template", url = "ColinKennedy/nvim-best-practices-plugin-template", - version = "1.3.1-1" + version = "1.3.2-1" }, { name = "nvim-bqf", url = "kevinhwang91/nvim-bqf", @@ -726,11 +742,11 @@ return }, { name = "oil.nvim", url = "stevearc/oil.nvim", - version = "2.12.2-1" + version = "2.13.0-1" }, { name = "onedarkpro.nvim", url = "olimorris/onedarkpro.nvim", - version = "2.0.1-1" + version = "2.3.0-1" }, { name = "onenord.nvim", url = "rmehri01/onenord.nvim", @@ -742,7 +758,7 @@ return }, { name = "overseer.nvim", url = "stevearc/overseer.nvim", - version = "1.4.0-1" + version = "1.5.0-1" }, { name = "oz.nvim", url = "luxluth/oz.nvim", @@ -794,7 +810,7 @@ return }, { name = "quicker.nvim", url = "stevearc/quicker.nvim", - version = "1.1.1-1" + version = "1.2.0-1" }, { name = "rainbow-delimiters.nvim", url = "HiPhish/rainbow-delimiters.nvim", @@ -810,11 +826,11 @@ return }, { name = "render-markdown.nvim", url = "MeanderingProgrammer/render-markdown.nvim", - version = "7.4.0-1" + version = "7.5.0-1" }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", - version = "3.8.3-1" + version = "3.8.4-1" }, { name = "rime.nvim", url = "Freed-Wu/rime.nvim", @@ -838,11 +854,11 @@ return }, { name = "rocks-treesitter.nvim", url = "nvim-neorocks/rocks-treesitter.nvim", - version = "1.1.3-1" + version = "1.2.0-1" }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.41.1-1" + version = "2.42.2-1" }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", @@ -854,7 +870,7 @@ return }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "5.13.1-1" + version = "5.15.0-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -874,7 +890,7 @@ return }, { name = "sf.nvim", url = "xixiaofinland/sf.nvim", - version = "1.8.0-1" + version = "1.9.0-1" }, { name = "sg.nvim", url = "sourcegraph/sg.nvim", @@ -884,9 +900,9 @@ return url = "mrjones2014/smart-splits.nvim", version = "1.6.0-1" }, { - name = "snippets.nvim", - url = "Kibadda/snippets.nvim", - version = "1.0.0-1" + name = "snacks.nvim", + url = "folke/snacks.nvim", + version = "2.4.0-1" }, { name = "sos.nvim", url = "tmillr/sos.nvim", @@ -927,6 +943,10 @@ return 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-zf-native.nvim", url = "natecraddock/telescope-zf-native.nvim", @@ -942,11 +962,11 @@ return }, { name = "toggleterm.nvim", url = "akinsho/toggleterm.nvim", - version = "2.12.0-1" + version = "2.13.0-1" }, { name = "tokyonight.nvim", url = "folke/tokyonight.nvim", - version = "4.9.0-1" + version = "4.10.0-1" }, { name = "tree-sitter-ada", url = "briot/tree-sitter-ada", @@ -954,7 +974,7 @@ return }, { name = "tree-sitter-agda", url = "tree-sitter/tree-sitter-agda", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-angular", url = "dlvandenberg/tree-sitter-angular", @@ -986,7 +1006,7 @@ return }, { name = "tree-sitter-bash", url = "tree-sitter/tree-sitter-bash", - version = "0.0.32-1" + version = "0.0.35-1" }, { name = "tree-sitter-bass", url = "vito/tree-sitter-bass", @@ -1018,11 +1038,11 @@ return }, { name = "tree-sitter-c", url = "tree-sitter/tree-sitter-c", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-c_sharp", url = "tree-sitter/tree-sitter-c-sharp", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-cairo", url = "tree-sitter-grammars/tree-sitter-cairo", @@ -1066,11 +1086,11 @@ return }, { name = "tree-sitter-cpp", url = "tree-sitter/tree-sitter-cpp", - version = "0.0.32-1" + version = "0.0.35-1" }, { name = "tree-sitter-css", url = "tree-sitter/tree-sitter-css", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-csv", url = "tree-sitter-grammars/tree-sitter-csv", @@ -1094,19 +1114,19 @@ return }, { name = "tree-sitter-dart", url = "UserNobody14/tree-sitter-dart", - version = "0.0.32-1" + version = "0.0.34-1" }, { name = "tree-sitter-desktop", url = "ValdezFOmar/tree-sitter-desktop", - version = "0.0.4-1" + version = "0.0.6-1" }, { name = "tree-sitter-devicetree", url = "joelspadin/tree-sitter-devicetree", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-dhall", url = "jbellerb/tree-sitter-dhall", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-diff", url = "the-mikedavis/tree-sitter-diff", @@ -1134,11 +1154,11 @@ return }, { name = "tree-sitter-dtd", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-earthfile", url = "glehmann/tree-sitter-earthfile", - version = "0.0.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-ebnf", url = "RubixDev/ebnf", @@ -1150,7 +1170,7 @@ return }, { name = "tree-sitter-editorconfig", url = "ValdezFOmar/tree-sitter-editorconfig", - version = "0.0.37-1" + version = "0.0.41-1" }, { name = "tree-sitter-eds", url = "uyha/tree-sitter-eds", @@ -1178,7 +1198,7 @@ return }, { name = "tree-sitter-embedded_template", url = "tree-sitter/tree-sitter-embedded-template", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-erlang", url = "WhatsApp/tree-sitter-erlang", @@ -1210,7 +1230,7 @@ return }, { name = "tree-sitter-foam", url = "FoamScience/tree-sitter-foam", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-forth", url = "AlexanderBrevig/tree-sitter-forth", @@ -1246,7 +1266,7 @@ return }, { name = "tree-sitter-gdscript", url = "PrestonKnopp/tree-sitter-gdscript", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-gdshader", url = "GodOfAvacyn/tree-sitter-gdshader", @@ -1262,7 +1282,7 @@ return }, { name = "tree-sitter-gitattributes", url = "tree-sitter-grammars/tree-sitter-gitattributes", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-gitcommit", url = "gbprod/tree-sitter-gitcommit", @@ -1302,7 +1322,7 @@ return }, { name = "tree-sitter-go", url = "tree-sitter/tree-sitter-go", - version = "0.0.31-1" + version = "0.0.34-1" }, { name = "tree-sitter-goctl", url = "chaozwn/tree-sitter-goctl", @@ -1338,7 +1358,7 @@ return }, { name = "tree-sitter-gren", url = "MaeBrooks/tree-sitter-gren", - version = "0.0.2-1" + version = "0.0.3-1" }, { name = "tree-sitter-groovy", url = "murtaza64/tree-sitter-groovy", @@ -1358,7 +1378,7 @@ return }, { name = "tree-sitter-haskell", url = "tree-sitter/tree-sitter-haskell", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-haskell_persistent", url = "MercuryTechnologies/tree-sitter-haskell-persistent", @@ -1398,7 +1418,7 @@ return }, { name = "tree-sitter-html", url = "tree-sitter/tree-sitter-html", - version = "0.0.30-1" + version = "0.0.33-1" }, { name = "tree-sitter-html_tags", url = "nvim-neorocks/luarocks-stub", @@ -1422,7 +1442,7 @@ return }, { name = "tree-sitter-idl", url = "cathaysia/tree-sitter-idl", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-ini", url = "justinmk/tree-sitter-ini", @@ -1430,7 +1450,7 @@ return }, { name = "tree-sitter-inko", url = "inko-lang/tree-sitter-inko", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-ispc", url = "tree-sitter-grammars/tree-sitter-ispc", @@ -1442,11 +1462,11 @@ return }, { name = "tree-sitter-java", url = "tree-sitter/tree-sitter-java", - version = "0.0.32-1" + version = "0.0.34-1" }, { name = "tree-sitter-javascript", url = "tree-sitter/tree-sitter-javascript", - version = "0.0.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-jq", url = "flurie/tree-sitter-jq", @@ -1454,11 +1474,11 @@ return }, { name = "tree-sitter-jsdoc", url = "tree-sitter/tree-sitter-jsdoc", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-json", url = "tree-sitter/tree-sitter-json", - version = "0.0.30-1" + version = "0.0.33-1" }, { name = "tree-sitter-json5", url = "Joakker/tree-sitter-json5", @@ -1478,11 +1498,11 @@ return }, { name = "tree-sitter-julia", url = "tree-sitter/tree-sitter-julia", - version = "0.0.30-1" + version = "0.0.34-1" }, { name = "tree-sitter-just", url = "IndianBoy42/tree-sitter-just", - version = "0.0.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-kconfig", url = "tree-sitter-grammars/tree-sitter-kconfig", @@ -1510,7 +1530,7 @@ return }, { name = "tree-sitter-latex", url = "latex-lsp/tree-sitter-latex", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-ledger", url = "cbarrete/tree-sitter-ledger", @@ -1586,7 +1606,7 @@ return }, { name = "tree-sitter-mlir", url = "artagnon/tree-sitter-mlir", - version = "0.0.35-1" + version = "0.0.38-1" }, { name = "tree-sitter-muttrc", url = "neomutt/tree-sitter-muttrc", @@ -1618,7 +1638,7 @@ return }, { name = "tree-sitter-nix", url = "cstrahan/tree-sitter-nix", - version = "0.0.45-1" + version = "0.0.50-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", @@ -1631,6 +1651,10 @@ return 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.12-1" }, { name = "tree-sitter-objc", url = "tree-sitter-grammars/tree-sitter-objc", @@ -1642,11 +1666,11 @@ return }, { name = "tree-sitter-ocaml", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.32-1" + version = "0.0.34-1" }, { name = "tree-sitter-ocaml_interface", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.33-1" + version = "0.0.35-1" }, { name = "tree-sitter-ocamllex", url = "atom-ocaml/tree-sitter-ocamllex", @@ -1678,15 +1702,15 @@ return }, { name = "tree-sitter-perl", url = "tree-sitter-perl/tree-sitter-perl", - version = "0.0.35-1" + version = "0.0.36-1" }, { name = "tree-sitter-php", url = "tree-sitter/tree-sitter-php", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-php_only", url = "tree-sitter/tree-sitter-php", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-phpdoc", url = "claytonrcarter/tree-sitter-phpdoc", @@ -1718,7 +1742,7 @@ return }, { name = "tree-sitter-printf", url = "tree-sitter-grammars/tree-sitter-printf", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-prisma", url = "victorhqc/tree-sitter-prisma", @@ -1738,7 +1762,7 @@ return }, { name = "tree-sitter-properties", url = "tree-sitter-grammars/tree-sitter-properties", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-proto", url = "treywood/tree-sitter-proto", @@ -1754,7 +1778,7 @@ return }, { name = "tree-sitter-pug", url = "zealot128/tree-sitter-pug", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-puppet", url = "tree-sitter-grammars/tree-sitter-puppet", @@ -1770,11 +1794,11 @@ return }, { name = "tree-sitter-python", url = "tree-sitter/tree-sitter-python", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-ql", url = "tree-sitter/tree-sitter-ql", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-qmldir", url = "tree-sitter-grammars/tree-sitter-qmldir", @@ -1786,11 +1810,11 @@ return }, { name = "tree-sitter-query", url = "tree-sitter-grammars/tree-sitter-query", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-r", url = "r-lib/tree-sitter-r", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-racket", url = "6cdh/tree-sitter-racket", @@ -1818,7 +1842,7 @@ return }, { name = "tree-sitter-regex", url = "tree-sitter/tree-sitter-regex", - version = "0.0.33-1" + version = "0.0.37-1" }, { name = "tree-sitter-rego", url = "FallenAngel97/tree-sitter-rego", @@ -1858,15 +1882,19 @@ return }, { name = "tree-sitter-ruby", url = "tree-sitter/tree-sitter-ruby", - version = "0.0.32-1" + version = "0.0.33-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.33-1" + version = "0.0.35-1" }, { name = "tree-sitter-scala", url = "tree-sitter/tree-sitter-scala", - version = "0.0.36-1" + version = "0.0.37-1" }, { name = "tree-sitter-scfg", url = "rockorager/tree-sitter-scfg", @@ -1926,7 +1954,7 @@ return }, { name = "tree-sitter-sql", url = "derekstride/tree-sitter-sql", - version = "0.0.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-squirrel", url = "tree-sitter-grammars/tree-sitter-squirrel", @@ -1934,7 +1962,7 @@ return }, { name = "tree-sitter-ssh_config", url = "tree-sitter-grammars/tree-sitter-ssh-config", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-starlark", url = "tree-sitter-grammars/tree-sitter-starlark", @@ -1954,7 +1982,7 @@ return }, { name = "tree-sitter-superhtml", url = "kristoff-it/superhtml", - version = "0.0.9-1" + version = "0.0.10-1" }, { name = "tree-sitter-surface", url = "connorlay/tree-sitter-surface", @@ -1963,10 +1991,14 @@ return 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.36-1" + version = "0.0.38-1" }, { name = "tree-sitter-sxhkdrc", url = "RaafatTurki/tree-sitter-sxhkdrc", @@ -1981,8 +2013,8 @@ return version = "0.0.29-1" }, { name = "tree-sitter-t32", - url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/e455373021812abf4a0b5170caa0d882a9578bab.zip", - version = "0.0.31-1" + url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/476f0d8ab4b012d3b6f9598890217ada70f1a8ba.zip", + version = "0.0.34-1" }, { name = "tree-sitter-tablegen", url = "tree-sitter-grammars/tree-sitter-tablegen", @@ -1994,15 +2026,15 @@ return }, { name = "tree-sitter-tcl", url = "tree-sitter-grammars/tree-sitter-tcl", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-teal", url = "euclidianAce/tree-sitter-teal", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-templ", url = "vrischmann/tree-sitter-templ", - version = "0.0.34-1" + version = "0.0.37-1" }, { name = "tree-sitter-terraform", url = "MichaHoffmann/tree-sitter-hcl", @@ -2042,7 +2074,7 @@ return }, { name = "tree-sitter-tsx", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-turtle", url = "GordianDziwis/tree-sitter-turtle", @@ -2054,7 +2086,7 @@ return }, { name = "tree-sitter-typescript", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-typespec", url = "happenslol/tree-sitter-typespec", @@ -2066,11 +2098,11 @@ return }, { name = "tree-sitter-typst", url = "uben0/tree-sitter-typst", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-udev", url = "tree-sitter-grammars/tree-sitter-udev", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-ungrammar", url = "tree-sitter-grammars/tree-sitter-ungrammar", @@ -2078,7 +2110,7 @@ return }, { name = "tree-sitter-unison", url = "kylegoetz/tree-sitter-unison", - version = "0.0.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-usd", url = "ColinKennedy/tree-sitter-usd", @@ -2090,7 +2122,7 @@ return }, { name = "tree-sitter-v", url = "vlang/v-analyzer", - version = "0.0.34-1" + version = "0.0.38-1" }, { name = "tree-sitter-vala", url = "vala-lang/tree-sitter-vala", @@ -2106,7 +2138,7 @@ return }, { name = "tree-sitter-vhdl", url = "jpt13653903/tree-sitter-vhdl", - version = "0.0.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-vhs", url = "charmbracelet/tree-sitter-vhs", @@ -2130,7 +2162,7 @@ return }, { name = "tree-sitter-wgsl", url = "szebniok/tree-sitter-wgsl", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-wgsl_bevy", url = "tree-sitter-grammars/tree-sitter-wgsl-bevy", @@ -2150,11 +2182,11 @@ return }, { name = "tree-sitter-xml", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-xresources", url = "ValdezFOmar/tree-sitter-xresources", - version = "0.0.4-1" + version = "0.0.10-1" }, { name = "tree-sitter-yaml", url = "tree-sitter-grammars/tree-sitter-yaml", @@ -2174,19 +2206,19 @@ return }, { name = "tree-sitter-zig", url = "tree-sitter-grammars/tree-sitter-zig", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-ziggy", url = "kristoff-it/ziggy", - version = "0.0.6-1" + version = "0.0.7-1" }, { name = "tree-sitter-ziggy_schema", url = "kristoff-it/ziggy", - version = "0.0.6-1" + version = "0.0.7-1" }, { name = "treedoc.nvim", url = "neo451/treedoc.nvim", - version = "1.0.1-1" + version = "1.0.3-1" }, { name = "trouble.nvim", url = "folke/trouble.nvim", @@ -2203,6 +2235,10 @@ return 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", @@ -2219,6 +2255,10 @@ return name = "windline.nvim", url = "windwp/windline.nvim", version = "1.1.0-1" + }, { + name = "wormhole.nvim", + url = "NStefan002/wormhole.nvim", + version = "1.1.1-1" }, { name = "wrapping-paper.nvim", url = "benlubas/wrapping-paper.nvim", @@ -2230,7 +2270,7 @@ return }, { name = "yazi.nvim", url = "mikavilpas/yazi.nvim", - version = "6.4.3-1" + version = "6.6.0-1" }, { name = "zen-mode.nvim", url = "folke/zen-mode.nvim", From 9570a5ae7b17dcde4718c7458fd986c10f015a99 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 5 Dec 2024 09:06:28 +0100 Subject: [PATCH 1582/1610] feat(plugin): show error for local plugins that don't exist. Fixes #1773 --- lua/lazy/core/plugin.lua | 1 + lua/lazy/manage/init.lua | 3 +++ lua/lazy/manage/task/plugin.lua | 11 +++++++++++ 3 files changed, 15 insertions(+) diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 97347a7..a282132 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -243,6 +243,7 @@ function M.update_state() 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/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/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index c8a2bdb..841cc6c 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -97,4 +97,15 @@ M.docs = { end, } +M.exists = { + skip = function(plugin) + return not plugin._.is_local + 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 From a44e9cd165e11fa61ccfbea2a3cc1aaa3bcfc4f1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 09:10:16 +0100 Subject: [PATCH 1583/1610] chore(main): release 11.15.0 (#1835) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 87f2b31..23b0e13 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.14.2" + ".": "11.15.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index f76a332..6ec2c9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 8f56d52..3b32f5c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -241,7 +241,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.14.2" -- x-release-please-version +M.version = "11.15.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 3388a26417c48b15d5266d954f62a4d47fe99490 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 08:11:36 +0000 Subject: [PATCH 1584/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 184 ++++++++++++++++-------------- 1 file changed, 100 insertions(+), 84 deletions(-) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 5c2bed1..6cfdb3f 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -34,7 +34,7 @@ return }, { name = "autosave.nvim", url = "brianhuster/autosave.nvim", - version = "0.4.1-1" + version = "0.4.2-1" }, { name = "banana.nvim", url = "CWood-sdf/banana.nvim", @@ -54,7 +54,7 @@ return }, { name = "bufferline.nvim", url = "akinsho/bufferline.nvim", - version = "4.8.0-1" + version = "4.9.0-1" }, { name = "care.nvim", url = "max397574/care.nvim", @@ -106,7 +106,7 @@ return }, { name = "commons.nvim", url = "linrongbin16/commons.nvim", - version = "19.0.0-1" + version = "21.1.0-1" }, { name = "conform.nvim", url = "stevearc/conform.nvim", @@ -114,7 +114,7 @@ return }, { name = "cursor-text-objects.nvim", url = "ColinKennedy/cursor-text-objects.nvim", - version = "1.1.0-1" + version = "1.3.0-1" }, { name = "cybu.nvim", url = "ghillb/cybu.nvim", @@ -162,7 +162,7 @@ return }, { name = "doris.nvim", url = "jackokring/doris.nvim", - version = "0.2.0-1" + version = "0.3.2-1" }, { name = "dressing.nvim", url = "stevearc/dressing.nvim", @@ -170,7 +170,7 @@ return }, { name = "dropbar.nvim", url = "Bekaboo/dropbar.nvim", - version = "9.0.1-1" + version = "9.0.2-1" }, { name = "duck.nvim", url = "tamton-aquib/duck.nvim", @@ -198,7 +198,7 @@ return }, { name = "feed.nvim", url = "neo451/feed.nvim", - version = "1.9.1-1" + version = "1.12.0-1" }, { name = "feline.nvim", url = "freddiehaddad/feline.nvim", @@ -242,7 +242,7 @@ return }, { name = "fzfx.nvim", url = "linrongbin16/fzfx.nvim", - version = "6.4.0-1" + version = "7.0.0-1" }, { name = "galileo.nvim", url = "S1M0N38/galileo.nvim", @@ -266,7 +266,7 @@ return }, { name = "gitlinker.nvim", url = "linrongbin16/gitlinker.nvim", - version = "4.13.2-1" + version = "5.0.0-1" }, { name = "gitsigns.nvim", url = "lewis6991/gitsigns.nvim", @@ -294,7 +294,7 @@ return }, { name = "guard.nvim", url = "nvimdev/guard.nvim", - version = "1.0.3-1" + version = "1.0.4-1" }, { name = "hardhat.nvim", url = "TheSnakeWitcher/hardhat.nvim", @@ -306,7 +306,7 @@ return }, { name = "haskell-tools.nvim", url = "mrcjkb/haskell-tools.nvim", - version = "4.3.1-1" + version = "4.3.2-1" }, { name = "headlines.nvim", url = "lukas-reineke/headlines.nvim", @@ -350,7 +350,7 @@ return }, { name = "indent-blankline.nvim", url = "lukas-reineke/indent-blankline.nvim", - version = "3.8.5-1" + version = "3.8.6-1" }, { name = "kai.nvim", url = "Kamilcuk/kai.nvim", @@ -370,7 +370,7 @@ return }, { name = "lazydev.nvim", url = "folke/lazydev.nvim", - version = "1.8.0-1" + version = "1.9.0-1" }, { name = "lean.nvim", url = "Julian/lean.nvim", @@ -415,6 +415,10 @@ 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", @@ -431,6 +435,10 @@ 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", @@ -530,7 +538,7 @@ return }, { name = "neorg-interim-ls", url = "benlubas/neorg-interim-ls", - version = "1.2.1-1" + version = "1.3.0-1" }, { name = "neorg-se", url = "benlubas/neorg-se", @@ -582,7 +590,7 @@ return }, { name = "no-neck-pain.nvim", url = "shortcuts/no-neck-pain.nvim", - version = "2.0.6-1" + version = "2.1.3-1" }, { name = "noice.nvim", url = "folke/noice.nvim", @@ -606,7 +614,7 @@ return }, { name = "nvim-best-practices-plugin-template", url = "ColinKennedy/nvim-best-practices-plugin-template", - version = "1.3.2-1" + version = "1.4.0-1" }, { name = "nvim-bqf", url = "kevinhwang91/nvim-bqf", @@ -826,7 +834,7 @@ return }, { name = "render-markdown.nvim", url = "MeanderingProgrammer/render-markdown.nvim", - version = "7.5.0-1" + version = "7.6.0-1" }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", @@ -838,7 +846,7 @@ return }, { name = "rocks-config.nvim", url = "nvim-neorocks/rocks-config.nvim", - version = "3.0.0-1" + version = "3.1.0-1" }, { name = "rocks-dev.nvim", url = "nvim-neorocks/rocks-dev.nvim", @@ -870,7 +878,7 @@ return }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "5.15.0-1" + version = "5.17.1-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -898,11 +906,11 @@ return }, { name = "smart-splits.nvim", url = "mrjones2014/smart-splits.nvim", - version = "1.6.0-1" + version = "1.7.0-1" }, { name = "snacks.nvim", url = "folke/snacks.nvim", - version = "2.4.0-1" + version = "2.6.0-1" }, { name = "sos.nvim", url = "tmillr/sos.nvim", @@ -982,11 +990,11 @@ return }, { name = "tree-sitter-apex", url = "aheber/tree-sitter-sfapex", - version = "0.0.36-1" + version = "0.0.39-1" }, { name = "tree-sitter-arduino", url = "tree-sitter-grammars/tree-sitter-arduino", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-asm", url = "RubixDev/tree-sitter-asm", @@ -994,7 +1002,7 @@ return }, { name = "tree-sitter-astro", url = "virchau13/tree-sitter-astro", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-authzed", url = "mleonidas/tree-sitter-authzed", @@ -1006,7 +1014,7 @@ return }, { name = "tree-sitter-bash", url = "tree-sitter/tree-sitter-bash", - version = "0.0.35-1" + version = "0.0.36-1" }, { name = "tree-sitter-bass", url = "vito/tree-sitter-bass", @@ -1042,7 +1050,7 @@ return }, { name = "tree-sitter-c_sharp", url = "tree-sitter/tree-sitter-c-sharp", - version = "0.0.32-1" + version = "0.0.34-1" }, { name = "tree-sitter-cairo", url = "tree-sitter-grammars/tree-sitter-cairo", @@ -1054,7 +1062,11 @@ return }, { name = "tree-sitter-chatito", url = "tree-sitter-grammars/tree-sitter-chatito", - version = "0.0.29-1" + version = "0.0.30-1" + }, { + name = "tree-sitter-cli", + url = "FourierTransformer/tree-sitter-cli", + version = "0.24.4-1" }, { name = "tree-sitter-clojure", url = "sogaiu/tree-sitter-clojure", @@ -1154,7 +1166,7 @@ return }, { name = "tree-sitter-dtd", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-earthfile", url = "glehmann/tree-sitter-earthfile", @@ -1170,7 +1182,7 @@ return }, { name = "tree-sitter-editorconfig", url = "ValdezFOmar/tree-sitter-editorconfig", - version = "0.0.41-1" + version = "0.0.44-1" }, { name = "tree-sitter-eds", url = "uyha/tree-sitter-eds", @@ -1182,7 +1194,7 @@ return }, { name = "tree-sitter-elixir", url = "elixir-lang/tree-sitter-elixir", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-elm", url = "elm-tooling/tree-sitter-elm", @@ -1238,7 +1250,7 @@ return }, { name = "tree-sitter-fortran", url = "stadelmanma/tree-sitter-fortran", - version = "0.0.34-1" + version = "0.0.36-1" }, { name = "tree-sitter-fsh", url = "mgramigna/tree-sitter-fsh", @@ -1294,7 +1306,7 @@ return }, { name = "tree-sitter-gleam", url = "gleam-lang/tree-sitter-gleam", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-glimmer", url = "ember-tooling/tree-sitter-glimmer", @@ -1322,7 +1334,7 @@ return }, { name = "tree-sitter-go", url = "tree-sitter/tree-sitter-go", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-goctl", url = "chaozwn/tree-sitter-goctl", @@ -1334,7 +1346,7 @@ return }, { name = "tree-sitter-gomod", url = "camdencheek/tree-sitter-go-mod", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-gosum", url = "tree-sitter-grammars/tree-sitter-go-sum", @@ -1350,7 +1362,7 @@ return }, { name = "tree-sitter-gpg", url = "tree-sitter-grammars/tree-sitter-gpg-config", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-graphql", url = "bkegley/tree-sitter-graphql", @@ -1414,7 +1426,7 @@ return }, { name = "tree-sitter-hoon", url = "urbit-pilled/tree-sitter-hoon", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-html", url = "tree-sitter/tree-sitter-html", @@ -1430,7 +1442,7 @@ return }, { name = "tree-sitter-http", url = "rest-nvim/tree-sitter-http", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-hurl", url = "pfeiferj/tree-sitter-hurl", @@ -1450,7 +1462,7 @@ return }, { name = "tree-sitter-inko", url = "inko-lang/tree-sitter-inko", - version = "0.0.32-1" + version = "0.0.36-1" }, { name = "tree-sitter-ispc", url = "tree-sitter-grammars/tree-sitter-ispc", @@ -1462,7 +1474,7 @@ return }, { name = "tree-sitter-java", url = "tree-sitter/tree-sitter-java", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-javascript", url = "tree-sitter/tree-sitter-javascript", @@ -1474,7 +1486,7 @@ return }, { name = "tree-sitter-jsdoc", url = "tree-sitter/tree-sitter-jsdoc", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-json", url = "tree-sitter/tree-sitter-json", @@ -1498,11 +1510,11 @@ return }, { name = "tree-sitter-julia", url = "tree-sitter/tree-sitter-julia", - version = "0.0.34-1" + version = "0.0.38-1" }, { name = "tree-sitter-just", url = "IndianBoy42/tree-sitter-just", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-kconfig", url = "tree-sitter-grammars/tree-sitter-kconfig", @@ -1534,7 +1546,7 @@ return }, { name = "tree-sitter-ledger", url = "cbarrete/tree-sitter-ledger", - version = "0.0.30-1" + version = "0.0.33-1" }, { name = "tree-sitter-leo", url = "r001/tree-sitter-leo", @@ -1582,11 +1594,11 @@ return }, { name = "tree-sitter-markdown", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.35-1" + version = "0.0.36-1" }, { name = "tree-sitter-markdown_inline", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.35-1" + version = "0.0.36-1" }, { name = "tree-sitter-matlab", url = "acristoffers/tree-sitter-matlab", @@ -1606,7 +1618,7 @@ return }, { name = "tree-sitter-mlir", url = "artagnon/tree-sitter-mlir", - version = "0.0.38-1" + version = "0.0.40-1" }, { name = "tree-sitter-muttrc", url = "neomutt/tree-sitter-muttrc", @@ -1614,7 +1626,7 @@ return }, { name = "tree-sitter-nasm", url = "naclsn/tree-sitter-nasm", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-nginx", url = "opa-oz/tree-sitter-nginx", @@ -1638,7 +1650,7 @@ return }, { name = "tree-sitter-nix", url = "cstrahan/tree-sitter-nix", - version = "0.0.50-1" + version = "0.0.51-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", @@ -1654,7 +1666,7 @@ return }, { name = "tree-sitter-nu", url = "nushell/tree-sitter-nu", - version = "0.0.12-1" + version = "0.0.20-1" }, { name = "tree-sitter-objc", url = "tree-sitter-grammars/tree-sitter-objc", @@ -1698,19 +1710,19 @@ return }, { name = "tree-sitter-pem", url = "tree-sitter-grammars/tree-sitter-pem", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-perl", url = "tree-sitter-perl/tree-sitter-perl", - version = "0.0.36-1" + version = "0.0.37-1" }, { name = "tree-sitter-php", url = "tree-sitter/tree-sitter-php", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-php_only", url = "tree-sitter/tree-sitter-php", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-phpdoc", url = "claytonrcarter/tree-sitter-phpdoc", @@ -1730,7 +1742,7 @@ return }, { name = "tree-sitter-poe_filter", url = "tree-sitter-grammars/tree-sitter-poe-filter", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-pony", url = "tree-sitter-grammars/tree-sitter-pony", @@ -1738,7 +1750,7 @@ return }, { name = "tree-sitter-powershell", url = "airbus-cert/tree-sitter-powershell", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-printf", url = "tree-sitter-grammars/tree-sitter-printf", @@ -1794,7 +1806,7 @@ return }, { name = "tree-sitter-python", url = "tree-sitter/tree-sitter-python", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-ql", url = "tree-sitter/tree-sitter-ql", @@ -1814,7 +1826,7 @@ return }, { name = "tree-sitter-r", url = "r-lib/tree-sitter-r", - version = "0.0.32-1" + version = "0.0.34-1" }, { name = "tree-sitter-racket", url = "6cdh/tree-sitter-racket", @@ -1862,7 +1874,7 @@ return }, { name = "tree-sitter-robot", url = "Hubro/tree-sitter-robot", - version = "0.0.29-1" + version = "0.0.32-1" }, { name = "tree-sitter-robots", url = "opa-oz/tree-sitter-robots-txt", @@ -1890,11 +1902,11 @@ return }, { name = "tree-sitter-rust", url = "tree-sitter/tree-sitter-rust", - version = "0.0.35-1" + version = "0.0.37-1" }, { name = "tree-sitter-scala", url = "tree-sitter/tree-sitter-scala", - version = "0.0.37-1" + version = "0.0.39-1" }, { name = "tree-sitter-scfg", url = "rockorager/tree-sitter-scfg", @@ -1910,7 +1922,7 @@ return }, { name = "tree-sitter-sflog", url = "aheber/tree-sitter-sfapex", - version = "0.0.34-1" + version = "0.0.36-1" }, { name = "tree-sitter-slang", url = "tree-sitter-grammars/tree-sitter-slang", @@ -1934,15 +1946,15 @@ return }, { name = "tree-sitter-solidity", url = "JoranHonig/tree-sitter-solidity", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-soql", url = "aheber/tree-sitter-sfapex", - version = "0.0.35-1" + version = "0.0.37-1" }, { name = "tree-sitter-sosl", url = "aheber/tree-sitter-sfapex", - version = "0.0.34-1" + version = "0.0.36-1" }, { name = "tree-sitter-sourcepawn", url = "nilshelmig/tree-sitter-sourcepawn", @@ -1954,7 +1966,7 @@ return }, { name = "tree-sitter-sql", url = "derekstride/tree-sitter-sql", - version = "0.0.33-1" + version = "0.0.37-1" }, { name = "tree-sitter-squirrel", url = "tree-sitter-grammars/tree-sitter-squirrel", @@ -1974,7 +1986,7 @@ return }, { name = "tree-sitter-styled", url = "mskelton/tree-sitter-styled", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-supercollider", url = "madskjeldgaard/tree-sitter-supercollider", @@ -1982,7 +1994,7 @@ return }, { name = "tree-sitter-superhtml", url = "kristoff-it/superhtml", - version = "0.0.10-1" + version = "0.0.11-1" }, { name = "tree-sitter-surface", url = "connorlay/tree-sitter-surface", @@ -1998,7 +2010,7 @@ return }, { name = "tree-sitter-swift", url = "alex-pinkus/tree-sitter-swift", - version = "0.0.38-1" + version = "0.0.41-1" }, { name = "tree-sitter-sxhkdrc", url = "RaafatTurki/tree-sitter-sxhkdrc", @@ -2013,8 +2025,8 @@ return version = "0.0.29-1" }, { name = "tree-sitter-t32", - url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/476f0d8ab4b012d3b6f9598890217ada70f1a8ba.zip", - version = "0.0.34-1" + url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/7c8579685e34116c61971240780b316c54be698b.zip", + version = "0.0.37-1" }, { name = "tree-sitter-tablegen", url = "tree-sitter-grammars/tree-sitter-tablegen", @@ -2030,11 +2042,11 @@ return }, { name = "tree-sitter-teal", url = "euclidianAce/tree-sitter-teal", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-templ", url = "vrischmann/tree-sitter-templ", - version = "0.0.37-1" + version = "0.0.38-1" }, { name = "tree-sitter-terraform", url = "MichaHoffmann/tree-sitter-hcl", @@ -2066,7 +2078,7 @@ return }, { name = "tree-sitter-toml", url = "tree-sitter-grammars/tree-sitter-toml", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-tsv", url = "tree-sitter-grammars/tree-sitter-csv", @@ -2090,7 +2102,7 @@ return }, { name = "tree-sitter-typespec", url = "happenslol/tree-sitter-typespec", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-typoscript", url = "Teddytrombone/tree-sitter-typoscript", @@ -2134,11 +2146,11 @@ return }, { name = "tree-sitter-verilog", url = "gmlarumbe/tree-sitter-systemverilog", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-vhdl", url = "jpt13653903/tree-sitter-vhdl", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-vhs", url = "charmbracelet/tree-sitter-vhs", @@ -2146,7 +2158,7 @@ return }, { name = "tree-sitter-vim", url = "tree-sitter-grammars/tree-sitter-vim", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-vimdoc", url = "neovim/tree-sitter-vimdoc", @@ -2182,15 +2194,15 @@ return }, { name = "tree-sitter-xml", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-xresources", url = "ValdezFOmar/tree-sitter-xresources", - version = "0.0.10-1" + version = "0.0.12-1" }, { name = "tree-sitter-yaml", url = "tree-sitter-grammars/tree-sitter-yaml", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-yang", url = "Hubro/tree-sitter-yang", @@ -2206,7 +2218,7 @@ return }, { name = "tree-sitter-zig", url = "tree-sitter-grammars/tree-sitter-zig", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-ziggy", url = "kristoff-it/ziggy", @@ -2250,11 +2262,15 @@ return }, { name = "which-key.nvim", url = "folke/which-key.nvim", - version = "3.13.3-1" + version = "3.14.1-1" }, { name = "windline.nvim", url = "windwp/windline.nvim", version = "1.1.0-1" + }, { + name = "winmove.nvim", + url = "MisanthropicBit/winmove.nvim", + version = "0.1.0-1" }, { name = "wormhole.nvim", url = "NStefan002/wormhole.nvim", @@ -2270,7 +2286,7 @@ return }, { name = "yazi.nvim", url = "mikavilpas/yazi.nvim", - version = "6.6.0-1" + version = "6.6.1-1" }, { name = "zen-mode.nvim", url = "folke/zen-mode.nvim", @@ -2278,5 +2294,5 @@ return }, { name = "zk-nvim", url = "zk-org/zk-nvim", - version = "0.1.0-1" + version = "0.1.1-1" } } \ No newline at end of file From ee64abc76be2b237b95d241a924b0323005b868a Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 6 Dec 2024 20:28:50 +0100 Subject: [PATCH 1585/1610] feat(plugin): added support for virtual plugins. Closes #1836 --- lua/lazy/core/loader.lua | 8 ++++++-- lua/lazy/core/meta.lua | 2 ++ lua/lazy/core/plugin.lua | 6 ++++-- lua/lazy/core/util.lua | 2 +- lua/lazy/types.lua | 1 + 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c6a7271..1501efd 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -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 diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 6e781a0..abb2508 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -213,6 +213,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 diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index a282132..37d1a8f 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -237,12 +237,14 @@ 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 bdd42dd..9db7f14 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -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 diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 5921169..0dbba9a 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -60,6 +60,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[] From b08dba8107b5bdaaa007f18cf6c0cc0e0fd576aa Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Dec 2024 07:57:03 +0100 Subject: [PATCH 1586/1610] fix(render): show correct key for home. Fixes #1796 --- lua/lazy/view/render.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index e1eec6c..16c6659 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -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 From 656cf4309396b7b8b62984e923bf8d8a0013f7d7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 7 Dec 2024 11:52:43 +0100 Subject: [PATCH 1587/1610] fix(plugin): don't check if dir exists for virtual plugins --- lua/lazy/manage/task/plugin.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 841cc6c..cec9762 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -99,7 +99,7 @@ M.docs = { M.exists = { skip = function(plugin) - return not plugin._.is_local + return not plugin._.is_local or plugin.virtual end, run = function(self) if not Util.file_exists(self.plugin.dir) then From 014d1d6d78df4e58f962158e6e00261d8632612c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Dec 2024 21:44:18 +0100 Subject: [PATCH 1588/1610] chore(main): release 11.16.0 (#1838) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 23b0e13..228572b 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.15.0" + ".": "11.16.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ec2c9c..009055b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 3b32f5c..9a49aaa 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -241,7 +241,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.15.0" -- x-release-please-version +M.version = "11.16.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 703be1dda35e142e76e94e7503cf67d6b98a1d35 Mon Sep 17 00:00:00 2001 From: Daemon <demonphoenix42@gmail.com> Date: Mon, 9 Dec 2024 13:40:21 -0800 Subject: [PATCH 1589/1610] fix(types): ensure all fields for `LazyPluginSpec` are optional (#1843) > After updating lua_ls to [v3.13.3](https://github.com/LuaLS/lua-language-server/releases/tag/3.13.3) noticed my plugin scripts using `@type LazyPluginSpec` now have `missing-fields` warnings. It seems they have changed how `missing-fields` diagnostics work with inherited types: https://github.com/LuaLS/lua-language-server/commit/7b2d58537fea87d1fefec894ac17b3bd73681e63. Duplicate offending fields as optional in type `LazyPluginSpec` Closes: #1842 --- lua/lazy/types.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 0dbba9a..6e406bb 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -75,6 +75,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[] From b97ee167f594c69656f985f919a00435a7bc7045 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 05:18:15 +0000 Subject: [PATCH 1590/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 7722a40..68bbee4 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -540,9 +540,7 @@ function. keys = { { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" }, }, - config = function() - require("neo-tree").setup() - end, + opts = {}, } < From 7c493713bc2cb392706866eeba53aaef6c8e9fc6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 20:12:21 +0100 Subject: [PATCH 1591/1610] chore(main): release 11.16.1 (#1844) :robot: I have created a release *beep* *boop* --- ## [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) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 228572b..b82a64f 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.16.0" + ".": "11.16.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 009055b..f65347f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9a49aaa..335b664 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -241,7 +241,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.16.0" -- x-release-please-version +M.version = "11.16.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 805b85c2ea3bd6f9506ef22cbd6e3a39172b5b08 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Fri, 13 Dec 2024 19:56:52 +0100 Subject: [PATCH 1592/1610] fix(meta): when a plugin is both optional and disabled, then just delete it from the list --- lua/lazy/core/meta.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index abb2508..88263a2 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -305,7 +305,11 @@ function M:fix_disabled() 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) + if plugin.optional then + self:del(plugin.name) + else + self:disable(plugin) + end end end self:rebuild() From 7e6c863bc7563efbdd757a310d17ebc95166cef3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 19:58:17 +0100 Subject: [PATCH 1593/1610] chore(main): release 11.16.2 (#1854) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index b82a64f..d5dbcb3 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.16.1" + ".": "11.16.2" } diff --git a/CHANGELOG.md b/CHANGELOG.md index f65347f..015288e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 335b664..2ae4079 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -241,7 +241,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.16.1" -- x-release-please-version +M.version = "11.16.2" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From a9c660d6ef1b396869d3d951760aa7a3dbfe575f Mon Sep 17 00:00:00 2001 From: Shihua Zeng <76579810+Bekaboo@users.noreply.github.com> Date: Sat, 4 Jan 2025 22:40:44 -0700 Subject: [PATCH 1594/1610] feat(config,render): allow customizing the debug icon (#1863) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description lazy.nvim allows users to configure all icons except for the debug icon. This PR enables user to configure the debug icon with `ui.icons.debug` ## Screenshots Before: ![image](https://github.com/user-attachments/assets/42b02fd9-58e6-4ebc-a1a7-c5e91f07a11a) After (with config `{ ui = { icons = { debug = ' ' } } }`): ![image](https://github.com/user-attachments/assets/3ade5392-a988-4a10-86fc-f52b41a690c5) --- lua/lazy/core/config.lua | 1 + lua/lazy/view/render.lua | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 2ae4079..9939763 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -96,6 +96,7 @@ M.defaults = { icons = { cmd = " ", config = "", + debug = "●", event = " ", favorite = " ", ft = " ", diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 16c6659..8c49a1b 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -759,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 From 72aa3a2624be5dc240646084f7b6a38eb99eb2ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sun, 5 Jan 2025 05:41:31 +0000 Subject: [PATCH 1595/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 68bbee4..6870e89 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -706,6 +706,7 @@ will be added to the plugin’s spec. icons = { cmd = " ", config = "", + debug = "●", event = " ", favorite = " ", ft = " ", From 4df5c4d65a3bbf801edd9ec55fb1ae55cfa72dd0 Mon Sep 17 00:00:00 2001 From: Eduardo Bray <ebray187@gmail.com> Date: Mon, 6 Jan 2025 17:14:06 -0300 Subject: [PATCH 1596/1610] fix(config): add missing space on the default debug icon (#1879) ## Description Adds the missing space from a9c660d ## Screenshots Current: ![imagen](https://github.com/user-attachments/assets/9a3a1a0c-43ad-49f3-8b39-b3250f53ec40) After: ![imagen](https://github.com/user-attachments/assets/3b3d4dfd-3c03-4db9-8f61-d2bd4f9ed22d) --- lua/lazy/core/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 9939763..49339e5 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -96,7 +96,7 @@ M.defaults = { icons = { cmd = " ", config = "", - debug = "●", + debug = "● ", event = " ", favorite = " ", ft = " ", From d8f26efd456190241afd1b0f5235fe6fdba13d4a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Mon, 6 Jan 2025 20:14:50 +0000 Subject: [PATCH 1597/1610] chore(build): auto-generate docs --- doc/lazy.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 6870e89..2ae3b36 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -706,7 +706,7 @@ will be added to the plugin’s spec. icons = { cmd = " ", config = "", - debug = "●", + debug = "● ", event = " ", favorite = " ", ft = " ", From 4f30c61b64d3fb8a04fd6660989b09241aa1b127 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 30 Jan 2025 20:13:53 +0100 Subject: [PATCH 1598/1610] ci: check --- lua/lazy/core/meta.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 88263a2..58397fd 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -14,6 +14,9 @@ local Util = require("lazy.core.util") ---@field pkgs table<string, number> local M = {} +if false then + dd("foo") +end ---@param spec LazySpecLoader ---@return LazyMeta function M.new(spec) From 5586fda88de57b33b723f75d5327b36165663077 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Thu, 30 Jan 2025 20:14:57 +0100 Subject: [PATCH 1599/1610] ci: remove debug --- lua/lazy/core/meta.lua | 3 --- 1 file changed, 3 deletions(-) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 58397fd..88263a2 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -14,9 +14,6 @@ local Util = require("lazy.core.util") ---@field pkgs table<string, number> local M = {} -if false then - dd("foo") -end ---@param spec LazySpecLoader ---@return LazyMeta function M.new(spec) From 7527af40ddd4a93a02911be570b32609b9d4ea53 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 19:19:03 +0000 Subject: [PATCH 1600/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 504 +++++++++++++++++------------- 1 file changed, 292 insertions(+), 212 deletions(-) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 6cfdb3f..d3ba8f6 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -10,11 +10,11 @@ return }, { name = "adopure.nvim", url = "Willem-J-an/adopure.nvim", - version = "1.2.0-1" + version = "2.1.0-1" }, { name = "aerial.nvim", url = "stevearc/aerial.nvim", - version = "2.3.1-1" + version = "2.4.0-1" }, { name = "age.nvim", url = "KingMichaelPark/age.nvim", @@ -22,7 +22,7 @@ return }, { name = "ai.nvim", url = "S1M0N38/ai.nvim", - version = "1.3.0-1" + version = "1.5.0-1" }, { name = "astral.nvim", url = "rootiest/astral.nvim", @@ -35,10 +35,14 @@ return name = "autosave.nvim", url = "brianhuster/autosave.nvim", version = "0.4.2-1" + }, { + name = "avante.nvim", + url = "yetone/avante.nvim", + version = "0.0.15-1" }, { name = "banana.nvim", url = "CWood-sdf/banana.nvim", - version = "0.1.0-1" + version = "0.2.0-1" }, { name = "bars-n-lines.nvim", url = "OXY2DEV/bars-N-lines.nvim", @@ -54,7 +58,7 @@ return }, { name = "bufferline.nvim", url = "akinsho/bufferline.nvim", - version = "4.9.0-1" + version = "4.9.1-1" }, { name = "care.nvim", url = "max397574/care.nvim", @@ -62,7 +66,11 @@ return }, { 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", @@ -74,7 +82,7 @@ return }, { name = "cmp-rg", url = "lukas-reineke/cmp-rg", - version = "1.3.9-1" + version = "1.3.11-1" }, { name = "colorbox.nvim", url = "linrongbin16/colorbox.nvim", @@ -86,7 +94,7 @@ 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", @@ -106,11 +114,23 @@ return }, { name = "commons.nvim", url = "linrongbin16/commons.nvim", - version = "21.1.0-1" + version = "26.0.0-1" }, { name = "conform.nvim", url = "stevearc/conform.nvim", - version = "8.2.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.0beta-9" }, { name = "cursor-text-objects.nvim", url = "ColinKennedy/cursor-text-objects.nvim", @@ -122,7 +142,7 @@ return }, { name = "dante.nvim", url = "S1M0N38/dante.nvim", - version = "1.2.0-1" + version = "1.3.1-1" }, { name = "daylight.nvim", url = "NTBBloodbath/daylight.nvim", @@ -159,18 +179,26 @@ return name = "donut.nvim", url = "NStefan002/donut.nvim", 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 = "3.1.0-1" + version = "3.1.1-1" }, { name = "dropbar.nvim", url = "Bekaboo/dropbar.nvim", - version = "9.0.2-1" + version = "11.0.0-1" }, { name = "duck.nvim", url = "tamton-aquib/duck.nvim", @@ -186,23 +214,23 @@ return }, { name = "efmls-configs-nvim", url = "creativenull/efmls-configs-nvim", - version = "1.8.0-1" + version = "1.9.0-1" }, { name = "elixir-tools.nvim", url = "elixir-tools/elixir-tools.nvim", - version = "0.16.1-1" + version = "0.17.0-1" }, { name = "fake.nvim", url = "Kibadda/fake.nvim", - version = "1.0.0-1" + version = "4.0.1-1" }, { name = "feed.nvim", url = "neo451/feed.nvim", - version = "1.12.0-1" + version = "1.16.4-1" }, { name = "feline.nvim", url = "freddiehaddad/feline.nvim", - version = "1.7.0-1" + version = "1.7.1-1" }, { name = "fidget.nvim", url = "j-hui/fidget.nvim", @@ -242,7 +270,7 @@ return }, { name = "fzfx.nvim", url = "linrongbin16/fzfx.nvim", - version = "7.0.0-1" + version = "8.0.0-1" }, { name = "galileo.nvim", url = "S1M0N38/galileo.nvim", @@ -262,11 +290,11 @@ return }, { 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 = "5.0.0-1" + version = "5.0.1-1" }, { name = "gitsigns.nvim", url = "lewis6991/gitsigns.nvim", @@ -294,7 +322,7 @@ return }, { name = "guard.nvim", url = "nvimdev/guard.nvim", - version = "1.0.4-1" + version = "2.1.2-1" }, { name = "hardhat.nvim", url = "TheSnakeWitcher/hardhat.nvim", @@ -306,11 +334,11 @@ return }, { name = "haskell-tools.nvim", url = "mrcjkb/haskell-tools.nvim", - version = "4.3.2-1" + version = "4.4.0-1" }, { name = "headlines.nvim", url = "lukas-reineke/headlines.nvim", - version = "4.0.2-1" + version = "5.0.0-1" }, { name = "heirline.nvim", url = "rebelot/heirline.nvim", @@ -326,7 +354,7 @@ return }, { name = "hlchunk.nvim", url = "shellRaining/hlchunk.nvim", - version = "1.1.0-1" + version = "1.3.0-1" }, { name = "hotpot.nvim", url = "rktjmp/hotpot.nvim", @@ -334,7 +362,7 @@ return }, { name = "hurl.nvim", url = "jellydn/hurl.nvim", - version = "2.0.0-1" + version = "2.0.1-1" }, { name = "hydra.nvim", url = "nvimtools/hydra.nvim", @@ -346,11 +374,11 @@ return }, { 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.8.6-1" + version = "3.8.7-1" }, { name = "kai.nvim", url = "Kamilcuk/kai.nvim", @@ -366,7 +394,7 @@ return }, { name = "lazy.nvim", url = "folke/lazy.nvim", - version = "11.14.2-1" + version = "11.16.2-1" }, { name = "lazydev.nvim", url = "folke/lazydev.nvim", @@ -374,15 +402,15 @@ return }, { name = "lean.nvim", url = "Julian/lean.nvim", - version = "2024.10.1-1" + 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", @@ -390,7 +418,7 @@ return }, { name = "live-preview.nvim", url = "brianhuster/live-preview.nvim", - version = "0.8.3-1" + version = "0.9.4-1" }, { name = "logging.nvim", url = "NTBBloodbath/logging.nvim", @@ -422,7 +450,7 @@ return }, { name = "lua-console.nvim", url = "YaroSpace/lua-console.nvim", - version = "1.1.0-1" + version = "1.2.3-1" }, { name = "lua-obfuscator.nvim", url = "git+ssh://git@github.com/kdssoftware/lua-obfuscator.nvim.git", @@ -442,7 +470,7 @@ return }, { name = "luarocks-build-treesitter-parser", url = "nvim-neorocks/luarocks-build-treesitter-parser", - version = "5.0.2-1" + version = "6.0.0-1" }, { name = "luarocks-build-treesitter-parser-cpp", url = "nvim-neorocks/luarocks-build-treesitter-parser-cpp", @@ -450,7 +478,7 @@ return }, { name = "mag-nvim-lsp", url = "iguanacucumber/mag-nvim-lsp", - version = "0.1-1" + version = "0.2-1" }, { name = "mag-nvim-lua", url = "iguanacucumber/mag-nvim-lua", @@ -458,19 +486,15 @@ return }, { name = "magazine.nvim", url = "iguanacucumber/magazine.nvim", - version = "0.4.1-1" + version = "0.4.4-1" }, { name = "mapx.nvim", url = "b0o/mapx.nvim", version = "0.2.1-1" - }, { - name = "markdown.nvim", - url = "MeanderingProgrammer/render-markdown.nvim", - version = "5.0.1-1" }, { name = "markview.nvim", url = "OXY2DEV/markview.nvim", - version = "24.0.0-1" + version = "25.1.0-1" }, { name = "mason-lspconfig.nvim", url = "williamboman/mason-lspconfig.nvim", @@ -483,10 +507,14 @@ return 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 = "mkdnflow.nvim", url = "jakewvincent/mkdnflow.nvim", @@ -510,11 +538,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.3.3-1" + version = "1.4.0-1" }, { name = "neodev.nvim", url = "folke/neodev.nvim", @@ -522,15 +550,19 @@ return }, { name = "neogen", url = "danymat/neogen", - version = "2.19.4-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 = "9.1.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", @@ -538,7 +570,11 @@ return }, { name = "neorg-interim-ls", url = "benlubas/neorg-interim-ls", - version = "1.3.0-1" + version = "2.1.0-1" + }, { + name = "neorg-query", + url = "benlubas/neorg-query", + version = "1.2.0-1" }, { name = "neorg-se", url = "benlubas/neorg-se", @@ -558,19 +594,23 @@ return }, { name = "neotest", url = "nvim-neotest/neotest", - version = "5.6.1-1" + version = "5.8.0-1" }, { name = "neotest-busted", url = "MisanthropicBit/neotest-busted", - version = "0.3.0-1" + version = "0.5.0-1" + }, { + name = "neotest-dotnet", + url = "Issafalcon/neotest-dotnet", + version = "stable-1" }, { name = "neotest-golang", url = "fredrikaverpil/neotest-golang", - version = "1.5.0-1" + version = "1.9.1-1" }, { name = "neotest-haskell", url = "mrcjkb/neotest-haskell", - version = "2.1.0-1" + version = "2.1.1-1" }, { name = "neotest-java", url = "rcasia/neotest-java", @@ -579,6 +619,10 @@ return 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", @@ -590,11 +634,11 @@ return }, { name = "no-neck-pain.nvim", url = "shortcuts/no-neck-pain.nvim", - version = "2.1.3-1" + version = "2.1.5-1" }, { name = "noice.nvim", url = "folke/noice.nvim", - version = "4.7.2-1" + version = "4.9.0-1" }, { name = "npackages.nvim", url = "diegofigs/npackages.nvim", @@ -610,11 +654,11 @@ return }, { name = "nvim-a2-pack", url = "dfgordon/nvim-a2-pack", - version = "0.3.0-1" + version = "0.3.1-1" }, { name = "nvim-best-practices-plugin-template", url = "ColinKennedy/nvim-best-practices-plugin-template", - version = "1.4.0-1" + version = "1.6.0-1" }, { name = "nvim-bqf", url = "kevinhwang91/nvim-bqf", @@ -634,7 +678,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", @@ -647,6 +691,10 @@ return 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", @@ -678,7 +726,7 @@ return }, { name = "nvim-lspconfig", url = "neovim/nvim-lspconfig", - version = "1.0.0-1" + version = "1.6.0-1" }, { name = "nvim-metals", url = "scalameta/nvim-metals", @@ -686,11 +734,11 @@ return }, { name = "nvim-nio", url = "nvim-neotest/nvim-nio", - version = "1.10.0-1" + version = "1.10.1-1" }, { name = "nvim-notify", url = "rcarriga/nvim-notify", - version = "3.14.0-1" + version = "3.15.0-1" }, { name = "nvim-parinfer", url = "gpanders/nvim-parinfer", @@ -702,7 +750,7 @@ return }, { name = "nvim-possession", url = "gennaro-tedesco/nvim-possession", - version = "0.0.15-1" + version = "0.0.17-1" }, { name = "nvim-scrollview", url = "dstein64/nvim-scrollview", @@ -710,7 +758,7 @@ return }, { name = "nvim-smuggler", url = "Klafyvel/nvim-smuggler", - version = "0.4.2-1" + version = "0.5.0-1" }, { name = "nvim-snippets", url = "garymjr/nvim-snippets", @@ -723,6 +771,10 @@ 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", @@ -742,7 +794,11 @@ return }, { name = "nvim-window-picker", url = "s1n7ax/nvim-window-picker", - version = "2.0.3-1" + version = "2.3.1-1" + }, { + name = "obazel.nvim", + url = "glindstedt/obazel.nvim", + version = "0.1.1-1" }, { name = "obsidian.nvim", url = "epwalsh/obsidian.nvim", @@ -750,11 +806,11 @@ return }, { name = "oil.nvim", url = "stevearc/oil.nvim", - version = "2.13.0-1" + version = "2.14.0-1" }, { name = "onedarkpro.nvim", url = "olimorris/onedarkpro.nvim", - version = "2.3.0-1" + version = "2.8.0-1" }, { name = "onenord.nvim", url = "rmehri01/onenord.nvim", @@ -762,7 +818,7 @@ return }, { name = "otter.nvim", url = "jmbuhr/otter.nvim", - version = "2.5.0-1" + version = "2.6.0-1" }, { name = "overseer.nvim", url = "stevearc/overseer.nvim", @@ -770,7 +826,7 @@ return }, { 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", @@ -794,7 +850,7 @@ return }, { name = "persisted.nvim", url = "olimorris/persisted.nvim", - version = "2.0.1-1" + version = "2.0.2-1" }, { name = "persistence.nvim", url = "folke/persistence.nvim", @@ -818,11 +874,11 @@ return }, { name = "quicker.nvim", url = "stevearc/quicker.nvim", - version = "1.2.0-1" + version = "1.3.0-1" }, { name = "rainbow-delimiters.nvim", url = "HiPhish/rainbow-delimiters.nvim", - version = "0.7.0-1" + version = "0.8.0-1" }, { name = "remember.nvim", url = "vladdoster/remember.nvim", @@ -834,11 +890,11 @@ return }, { name = "render-markdown.nvim", url = "MeanderingProgrammer/render-markdown.nvim", - version = "7.6.0-1" + version = "7.8.0-1" }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", - version = "3.8.4-1" + version = "3.9.1-1" }, { name = "rime.nvim", url = "Freed-Wu/rime.nvim", @@ -854,19 +910,19 @@ return }, { name = "rocks-git.nvim", url = "nvim-neorocks/rocks-git.nvim", - version = "2.5.1-1" + version = "2.5.2-1" }, { name = "rocks-lazy.nvim", url = "nvim-neorocks/rocks-lazy.nvim", - version = "1.1.1-1" + version = "1.1.2-1" }, { name = "rocks-treesitter.nvim", url = "nvim-neorocks/rocks-treesitter.nvim", - version = "1.2.0-1" + version = "1.3.0-1" }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.42.2-1" + version = "2.43.0-1" }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", @@ -878,7 +934,7 @@ return }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "5.17.1-1" + version = "5.24.2-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -886,7 +942,7 @@ return }, { name = "screenkey.nvim", url = "NStefan002/screenkey.nvim", - version = "2.2.1-1" + version = "2.4.2-1" }, { name = "scrollbar.nvim", url = "Xuyuanp/scrollbar.nvim", @@ -906,11 +962,11 @@ return }, { name = "smart-splits.nvim", url = "mrjones2014/smart-splits.nvim", - version = "1.7.0-1" + version = "1.8.1-1" }, { name = "snacks.nvim", url = "folke/snacks.nvim", - version = "2.6.0-1" + version = "2.15.0-1" }, { name = "sos.nvim", url = "tmillr/sos.nvim", @@ -946,7 +1002,7 @@ return }, { 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", @@ -955,6 +1011,14 @@ return 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.0.5-1" }, { name = "telescope-zf-native.nvim", url = "natecraddock/telescope-zf-native.nvim", @@ -970,11 +1034,11 @@ return }, { name = "toggleterm.nvim", url = "akinsho/toggleterm.nvim", - version = "2.13.0-1" + version = "2.13.1-1" }, { name = "tokyonight.nvim", url = "folke/tokyonight.nvim", - version = "4.10.0-1" + version = "4.11.0-1" }, { name = "tree-sitter-ada", url = "briot/tree-sitter-ada", @@ -990,7 +1054,7 @@ return }, { name = "tree-sitter-apex", url = "aheber/tree-sitter-sfapex", - version = "0.0.39-1" + version = "0.0.45-1" }, { name = "tree-sitter-arduino", url = "tree-sitter-grammars/tree-sitter-arduino", @@ -1002,7 +1066,7 @@ return }, { name = "tree-sitter-astro", url = "virchau13/tree-sitter-astro", - version = "0.0.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-authzed", url = "mleonidas/tree-sitter-authzed", @@ -1010,11 +1074,11 @@ return }, { name = "tree-sitter-awk", url = "Beaglefoot/tree-sitter-awk", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-bash", url = "tree-sitter/tree-sitter-bash", - version = "0.0.36-1" + version = "0.0.39-1" }, { name = "tree-sitter-bass", url = "vito/tree-sitter-bass", @@ -1030,7 +1094,7 @@ return }, { name = "tree-sitter-bicep", url = "tree-sitter-grammars/tree-sitter-bicep", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-bitbake", url = "tree-sitter-grammars/tree-sitter-bitbake", @@ -1042,15 +1106,15 @@ return }, { name = "tree-sitter-bp", url = "ambroisie/tree-sitter-bp", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-c", url = "tree-sitter/tree-sitter-c", - version = "0.0.34-1" + version = "0.0.38-1" }, { name = "tree-sitter-c_sharp", url = "tree-sitter/tree-sitter-c-sharp", - version = "0.0.34-1" + version = "0.0.38-1" }, { name = "tree-sitter-cairo", url = "tree-sitter-grammars/tree-sitter-cairo", @@ -1063,10 +1127,14 @@ return 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.24.4-1" + version = "0.24.5-1" }, { name = "tree-sitter-clojure", url = "sogaiu/tree-sitter-clojure", @@ -1098,11 +1166,11 @@ return }, { name = "tree-sitter-cpp", url = "tree-sitter/tree-sitter-cpp", - version = "0.0.35-1" + version = "0.0.39-1" }, { name = "tree-sitter-css", url = "tree-sitter/tree-sitter-css", - version = "0.0.31-1" + version = "0.0.35-1" }, { name = "tree-sitter-csv", url = "tree-sitter-grammars/tree-sitter-csv", @@ -1110,7 +1178,7 @@ return }, { name = "tree-sitter-cuda", url = "tree-sitter-grammars/tree-sitter-cuda", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-cue", url = "eonpatapon/tree-sitter-cue", @@ -1142,7 +1210,7 @@ return }, { name = "tree-sitter-diff", url = "the-mikedavis/tree-sitter-diff", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-disassembly", url = "ColinKennedy/tree-sitter-disassembly", @@ -1150,11 +1218,11 @@ return }, { name = "tree-sitter-djot", url = "treeman/tree-sitter-djot", - version = "0.0.29-1" + version = "0.0.33-1" }, { name = "tree-sitter-dockerfile", url = "camdencheek/tree-sitter-dockerfile", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-dot", url = "rydesun/tree-sitter-dot", @@ -1170,7 +1238,7 @@ return }, { name = "tree-sitter-earthfile", url = "glehmann/tree-sitter-earthfile", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-ebnf", url = "RubixDev/ebnf", @@ -1182,7 +1250,7 @@ return }, { name = "tree-sitter-editorconfig", url = "ValdezFOmar/tree-sitter-editorconfig", - version = "0.0.44-1" + version = "0.0.47-1" }, { name = "tree-sitter-eds", url = "uyha/tree-sitter-eds", @@ -1194,11 +1262,11 @@ return }, { name = "tree-sitter-elixir", url = "elixir-lang/tree-sitter-elixir", - version = "0.0.35-1" + version = "0.0.38-1" }, { name = "tree-sitter-elm", url = "elm-tooling/tree-sitter-elm", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-elsa", url = "glapa-grossklag/tree-sitter-elsa", @@ -1210,15 +1278,15 @@ return }, { name = "tree-sitter-embedded_template", url = "tree-sitter/tree-sitter-embedded-template", - version = "0.0.32-1" + version = "0.0.34-1" }, { name = "tree-sitter-erlang", url = "WhatsApp/tree-sitter-erlang", - version = "0.0.33-1" + version = "0.0.36-1" }, { name = "tree-sitter-facility", url = "FacilityApi/tree-sitter-facility", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-faust", url = "khiner/tree-sitter-faust", @@ -1238,7 +1306,7 @@ return }, { name = "tree-sitter-fish", url = "ram02z/tree-sitter-fish", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-foam", url = "FoamScience/tree-sitter-foam", @@ -1250,7 +1318,7 @@ return }, { name = "tree-sitter-fortran", url = "stadelmanma/tree-sitter-fortran", - version = "0.0.36-1" + version = "0.0.41-1" }, { name = "tree-sitter-fsh", url = "mgramigna/tree-sitter-fsh", @@ -1258,7 +1326,7 @@ return }, { name = "tree-sitter-fsharp", url = "ionide/tree-sitter-fsharp", - version = "0.0.9-1" + version = "0.0.10-1" }, { name = "tree-sitter-func", url = "tree-sitter-grammars/tree-sitter-func", @@ -1270,15 +1338,15 @@ return }, { name = "tree-sitter-gap", url = "gap-system/tree-sitter-gap", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-gaptst", url = "gap-system/tree-sitter-gaptst", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-gdscript", url = "PrestonKnopp/tree-sitter-gdscript", - version = "0.0.32-1" + version = "0.0.34-1" }, { name = "tree-sitter-gdshader", url = "GodOfAvacyn/tree-sitter-gdshader", @@ -1330,11 +1398,11 @@ return }, { name = "tree-sitter-gnuplot", url = "dpezto/tree-sitter-gnuplot", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-go", url = "tree-sitter/tree-sitter-go", - version = "0.0.35-1" + version = "0.0.38-1" }, { name = "tree-sitter-goctl", url = "chaozwn/tree-sitter-goctl", @@ -1342,11 +1410,11 @@ return }, { name = "tree-sitter-godot_resource", url = "PrestonKnopp/tree-sitter-godot-resource", - version = "0.0.29-1" + version = "0.0.32-1" }, { name = "tree-sitter-gomod", url = "camdencheek/tree-sitter-go-mod", - version = "0.0.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-gosum", url = "tree-sitter-grammars/tree-sitter-go-sum", @@ -1354,7 +1422,7 @@ return }, { name = "tree-sitter-gotmpl", url = "ngalaiko/tree-sitter-go-template", - version = "0.0.30-1" + version = "0.0.35-1" }, { name = "tree-sitter-gowork", url = "omertuc/tree-sitter-go-work", @@ -1370,11 +1438,11 @@ return }, { name = "tree-sitter-gren", url = "MaeBrooks/tree-sitter-gren", - version = "0.0.3-1" + version = "0.0.6-1" }, { name = "tree-sitter-groovy", url = "murtaza64/tree-sitter-groovy", - version = "0.0.30-1" + version = "0.0.33-1" }, { name = "tree-sitter-gstlaunch", url = "tree-sitter-grammars/tree-sitter-gstlaunch", @@ -1382,7 +1450,7 @@ return }, { name = "tree-sitter-hack", url = "slackhq/tree-sitter-hack", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-hare", url = "tree-sitter-grammars/tree-sitter-hare", @@ -1402,11 +1470,11 @@ return }, { name = "tree-sitter-heex", url = "connorlay/tree-sitter-heex", - version = "0.0.30-1" + version = "0.0.34-1" }, { name = "tree-sitter-helm", url = "ngalaiko/tree-sitter-go-template", - version = "0.0.31-1" + version = "0.0.35-1" }, { name = "tree-sitter-hjson", url = "winston0410/tree-sitter-hjson", @@ -1426,11 +1494,11 @@ return }, { name = "tree-sitter-hoon", url = "urbit-pilled/tree-sitter-hoon", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-html", url = "tree-sitter/tree-sitter-html", - version = "0.0.33-1" + version = "0.0.35-1" }, { name = "tree-sitter-html_tags", url = "nvim-neorocks/luarocks-stub", @@ -1442,7 +1510,7 @@ return }, { name = "tree-sitter-http", url = "rest-nvim/tree-sitter-http", - version = "0.0.32-1" + version = "0.0.34-1" }, { name = "tree-sitter-hurl", url = "pfeiferj/tree-sitter-hurl", @@ -1450,11 +1518,15 @@ return }, { name = "tree-sitter-hyprlang", url = "tree-sitter-grammars/tree-sitter-hyprlang", - version = "0.0.29-1" + version = "0.0.33-1" }, { name = "tree-sitter-idl", url = "cathaysia/tree-sitter-idl", version = "0.0.31-1" + }, { + name = "tree-sitter-idris", + url = "kayhide/tree-sitter-idris", + version = "0.0.1-1" }, { name = "tree-sitter-ini", url = "justinmk/tree-sitter-ini", @@ -1462,7 +1534,11 @@ return }, { name = "tree-sitter-inko", url = "inko-lang/tree-sitter-inko", - version = "0.0.36-1" + 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", @@ -1470,15 +1546,15 @@ return }, { name = "tree-sitter-janet_simple", url = "sogaiu/tree-sitter-janet-simple", - version = "0.0.29-1" + version = "0.0.32-1" }, { name = "tree-sitter-java", url = "tree-sitter/tree-sitter-java", - version = "0.0.35-1" + version = "0.0.39-1" }, { name = "tree-sitter-javascript", url = "tree-sitter/tree-sitter-javascript", - version = "0.0.33-1" + version = "0.0.35-1" }, { name = "tree-sitter-jq", url = "flurie/tree-sitter-jq", @@ -1486,11 +1562,11 @@ return }, { name = "tree-sitter-jsdoc", url = "tree-sitter/tree-sitter-jsdoc", - version = "0.0.33-1" + version = "0.0.35-1" }, { name = "tree-sitter-json", url = "tree-sitter/tree-sitter-json", - version = "0.0.33-1" + version = "0.0.35-1" }, { name = "tree-sitter-json5", url = "Joakker/tree-sitter-json5", @@ -1510,15 +1586,15 @@ return }, { name = "tree-sitter-julia", url = "tree-sitter/tree-sitter-julia", - version = "0.0.38-1" + version = "0.0.40-1" }, { name = "tree-sitter-just", url = "IndianBoy42/tree-sitter-just", - version = "0.0.34-1" + version = "0.0.36-1" }, { name = "tree-sitter-kconfig", url = "tree-sitter-grammars/tree-sitter-kconfig", - version = "0.0.29-1" + version = "0.0.32-1" }, { name = "tree-sitter-kdl", url = "tree-sitter-grammars/tree-sitter-kdl", @@ -1526,11 +1602,11 @@ return }, { name = "tree-sitter-kotlin", url = "fwcd/tree-sitter-kotlin", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-koto", url = "koto-lang/tree-sitter-koto", - version = "0.0.33-1" + version = "0.0.37-1" }, { name = "tree-sitter-kusto", url = "Willem-J-an/tree-sitter-kusto", @@ -1538,7 +1614,7 @@ return }, { name = "tree-sitter-lalrpop", url = "traxys/tree-sitter-lalrpop", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-latex", url = "latex-lsp/tree-sitter-latex", @@ -1550,7 +1626,7 @@ return }, { name = "tree-sitter-leo", url = "r001/tree-sitter-leo", - version = "0.0.29-1" + version = "0.0.33-1" }, { name = "tree-sitter-linkerscript", url = "tree-sitter-grammars/tree-sitter-linkerscript", @@ -1562,7 +1638,7 @@ return }, { name = "tree-sitter-liquidsoap", url = "savonet/tree-sitter-liquidsoap", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-llvm", url = "benwilliamgraham/tree-sitter-llvm", @@ -1570,7 +1646,7 @@ return }, { name = "tree-sitter-lua", url = "tree-sitter-grammars/tree-sitter-lua", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-luadoc", url = "tree-sitter-grammars/tree-sitter-luadoc", @@ -1582,7 +1658,7 @@ return }, { name = "tree-sitter-luau", url = "tree-sitter-grammars/tree-sitter-luau", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-m68k", url = "grahambates/tree-sitter-m68k", @@ -1594,15 +1670,15 @@ return }, { name = "tree-sitter-markdown", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.36-1" + version = "0.0.37-1" }, { name = "tree-sitter-markdown_inline", url = "tree-sitter-grammars/tree-sitter-markdown", - version = "0.0.36-1" + version = "0.0.37-1" }, { name = "tree-sitter-matlab", url = "acristoffers/tree-sitter-matlab", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-menhir", url = "Kerl13/tree-sitter-menhir", @@ -1618,7 +1694,7 @@ return }, { name = "tree-sitter-mlir", url = "artagnon/tree-sitter-mlir", - version = "0.0.40-1" + version = "0.0.43-1" }, { name = "tree-sitter-muttrc", url = "neomutt/tree-sitter-muttrc", @@ -1630,11 +1706,11 @@ return }, { name = "tree-sitter-nginx", url = "opa-oz/tree-sitter-nginx", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-nickel", url = "nickel-lang/tree-sitter-nickel", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-nim", url = "alaviss/tree-sitter-nim", @@ -1650,7 +1726,7 @@ return }, { name = "tree-sitter-nix", url = "cstrahan/tree-sitter-nix", - version = "0.0.51-1" + version = "0.0.54-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", @@ -1666,11 +1742,11 @@ return }, { name = "tree-sitter-nu", url = "nushell/tree-sitter-nu", - version = "0.0.20-1" + version = "0.0.30-1" }, { name = "tree-sitter-objc", url = "tree-sitter-grammars/tree-sitter-objc", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-objdump", url = "ColinKennedy/tree-sitter-objdump", @@ -1678,11 +1754,11 @@ return }, { name = "tree-sitter-ocaml", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.34-1" + version = "0.0.38-1" }, { name = "tree-sitter-ocaml_interface", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.35-1" + version = "0.0.39-1" }, { name = "tree-sitter-ocamllex", url = "atom-ocaml/tree-sitter-ocamllex", @@ -1690,7 +1766,7 @@ return }, { name = "tree-sitter-odin", url = "tree-sitter-grammars/tree-sitter-odin", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-org", url = "milisims/tree-sitter-org", @@ -1714,15 +1790,15 @@ return }, { name = "tree-sitter-perl", url = "tree-sitter-perl/tree-sitter-perl", - version = "0.0.37-1" + version = "0.0.38-1" }, { name = "tree-sitter-php", url = "tree-sitter/tree-sitter-php", - version = "0.0.35-1" + version = "0.0.37-1" }, { name = "tree-sitter-php_only", url = "tree-sitter/tree-sitter-php", - version = "0.0.35-1" + version = "0.0.38-1" }, { name = "tree-sitter-phpdoc", url = "claytonrcarter/tree-sitter-phpdoc", @@ -1742,7 +1818,7 @@ return }, { name = "tree-sitter-poe_filter", url = "tree-sitter-grammars/tree-sitter-poe-filter", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-pony", url = "tree-sitter-grammars/tree-sitter-pony", @@ -1750,7 +1826,7 @@ return }, { name = "tree-sitter-powershell", url = "airbus-cert/tree-sitter-powershell", - version = "0.0.32-1" + version = "0.0.36-1" }, { name = "tree-sitter-printf", url = "tree-sitter-grammars/tree-sitter-printf", @@ -1758,7 +1834,7 @@ return }, { name = "tree-sitter-prisma", url = "victorhqc/tree-sitter-prisma", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-problog", url = "foxyseta/tree-sitter-prolog", @@ -1774,7 +1850,7 @@ return }, { name = "tree-sitter-properties", url = "tree-sitter-grammars/tree-sitter-properties", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-proto", url = "treywood/tree-sitter-proto", @@ -1794,7 +1870,7 @@ return }, { name = "tree-sitter-puppet", url = "tree-sitter-grammars/tree-sitter-puppet", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-purescript", url = "postsolar/tree-sitter-purescript", @@ -1806,7 +1882,7 @@ return }, { name = "tree-sitter-python", url = "tree-sitter/tree-sitter-python", - version = "0.0.33-1" + version = "0.0.39-1" }, { name = "tree-sitter-ql", url = "tree-sitter/tree-sitter-ql", @@ -1818,11 +1894,11 @@ return }, { name = "tree-sitter-qmljs", url = "yuja/tree-sitter-qmljs", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-query", url = "tree-sitter-grammars/tree-sitter-query", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-r", url = "r-lib/tree-sitter-r", @@ -1842,7 +1918,7 @@ return }, { name = "tree-sitter-rbs", url = "joker1007/tree-sitter-rbs", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-re2c", url = "tree-sitter-grammars/tree-sitter-re2c", @@ -1854,7 +1930,7 @@ return }, { name = "tree-sitter-regex", url = "tree-sitter/tree-sitter-regex", - version = "0.0.37-1" + version = "0.0.40-1" }, { name = "tree-sitter-rego", url = "FallenAngel97/tree-sitter-rego", @@ -1882,7 +1958,7 @@ return }, { name = "tree-sitter-roc", url = "faldor20/tree-sitter-roc", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-ron", url = "tree-sitter-grammars/tree-sitter-ron", @@ -1890,11 +1966,11 @@ return }, { name = "tree-sitter-rst", url = "stsewd/tree-sitter-rst", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-ruby", url = "tree-sitter/tree-sitter-ruby", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-runescript", url = "2004Scape/tree-sitter-runescript", @@ -1902,15 +1978,15 @@ return }, { name = "tree-sitter-rust", url = "tree-sitter/tree-sitter-rust", - version = "0.0.37-1" + version = "0.0.40-1" }, { name = "tree-sitter-scala", url = "tree-sitter/tree-sitter-scala", - version = "0.0.39-1" + version = "0.0.44-1" }, { name = "tree-sitter-scfg", url = "rockorager/tree-sitter-scfg", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-scheme", url = "6cdh/tree-sitter-scheme", @@ -1922,15 +1998,19 @@ return }, { name = "tree-sitter-sflog", url = "aheber/tree-sitter-sfapex", - version = "0.0.36-1" + version = "0.0.42-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.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-smali", url = "tree-sitter-grammars/tree-sitter-smali", @@ -1942,23 +2022,23 @@ return }, { name = "tree-sitter-snakemake", url = "osthomas/tree-sitter-snakemake", - version = "0.0.29-1" + version = "0.0.31-1" }, { name = "tree-sitter-solidity", url = "JoranHonig/tree-sitter-solidity", - version = "0.0.31-1" + version = "0.0.34-1" }, { name = "tree-sitter-soql", url = "aheber/tree-sitter-sfapex", - version = "0.0.37-1" + version = "0.0.44-1" }, { name = "tree-sitter-sosl", url = "aheber/tree-sitter-sfapex", - version = "0.0.36-1" + version = "0.0.42-1" }, { name = "tree-sitter-sourcepawn", url = "nilshelmig/tree-sitter-sourcepawn", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-sparql", url = "GordianDziwis/tree-sitter-sparql", @@ -1966,7 +2046,7 @@ return }, { name = "tree-sitter-sql", url = "derekstride/tree-sitter-sql", - version = "0.0.37-1" + version = "0.0.39-1" }, { name = "tree-sitter-squirrel", url = "tree-sitter-grammars/tree-sitter-squirrel", @@ -1974,11 +2054,11 @@ return }, { name = "tree-sitter-ssh_config", url = "tree-sitter-grammars/tree-sitter-ssh-config", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-starlark", url = "tree-sitter-grammars/tree-sitter-starlark", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-strace", url = "sigmaSd/tree-sitter-strace", @@ -1994,7 +2074,7 @@ return }, { name = "tree-sitter-superhtml", url = "kristoff-it/superhtml", - version = "0.0.11-1" + version = "0.0.12-1" }, { name = "tree-sitter-surface", url = "connorlay/tree-sitter-surface", @@ -2010,11 +2090,11 @@ return }, { name = "tree-sitter-swift", url = "alex-pinkus/tree-sitter-swift", - version = "0.0.41-1" + version = "0.0.44-1" }, { name = "tree-sitter-sxhkdrc", url = "RaafatTurki/tree-sitter-sxhkdrc", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-systemtap", url = "ok-ryoko/tree-sitter-systemtap", @@ -2025,8 +2105,8 @@ return version = "0.0.29-1" }, { name = "tree-sitter-t32", - url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/7c8579685e34116c61971240780b316c54be698b.zip", - version = "0.0.37-1" + 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", @@ -2042,11 +2122,11 @@ return }, { name = "tree-sitter-teal", url = "euclidianAce/tree-sitter-teal", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-templ", url = "vrischmann/tree-sitter-templ", - version = "0.0.38-1" + version = "0.0.44-1" }, { name = "tree-sitter-terraform", url = "MichaHoffmann/tree-sitter-hcl", @@ -2086,7 +2166,7 @@ return }, { name = "tree-sitter-tsx", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.31-1" + version = "0.0.34-1" }, { name = "tree-sitter-turtle", url = "GordianDziwis/tree-sitter-turtle", @@ -2098,11 +2178,11 @@ return }, { name = "tree-sitter-typescript", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.31-1" + version = "0.0.34-1" }, { name = "tree-sitter-typespec", url = "happenslol/tree-sitter-typespec", - version = "0.0.31-1" + version = "0.0.33-1" }, { name = "tree-sitter-typoscript", url = "Teddytrombone/tree-sitter-typoscript", @@ -2134,7 +2214,7 @@ return }, { name = "tree-sitter-v", url = "vlang/v-analyzer", - version = "0.0.38-1" + version = "0.0.42-1" }, { name = "tree-sitter-vala", url = "vala-lang/tree-sitter-vala", @@ -2142,19 +2222,19 @@ return }, { name = "tree-sitter-vento", url = "ventojs/tree-sitter-vento", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-verilog", url = "gmlarumbe/tree-sitter-systemverilog", - version = "0.0.34-1" + version = "0.0.38-1" }, { name = "tree-sitter-vhdl", url = "jpt13653903/tree-sitter-vhdl", - version = "0.0.34-1" + version = "0.0.37-1" }, { name = "tree-sitter-vhs", url = "charmbracelet/tree-sitter-vhs", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-vim", url = "tree-sitter-grammars/tree-sitter-vim", @@ -2194,15 +2274,15 @@ return }, { name = "tree-sitter-xml", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-xresources", url = "ValdezFOmar/tree-sitter-xresources", - version = "0.0.12-1" + version = "0.0.19-1" }, { name = "tree-sitter-yaml", url = "tree-sitter-grammars/tree-sitter-yaml", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-yang", url = "Hubro/tree-sitter-yang", @@ -2218,15 +2298,15 @@ return }, { name = "tree-sitter-zig", url = "tree-sitter-grammars/tree-sitter-zig", - version = "0.0.32-1" + version = "0.0.34-1" }, { name = "tree-sitter-ziggy", url = "kristoff-it/ziggy", - version = "0.0.7-1" + version = "0.0.8-1" }, { name = "tree-sitter-ziggy_schema", url = "kristoff-it/ziggy", - version = "0.0.7-1" + version = "0.0.8-1" }, { name = "treedoc.nvim", url = "neo451/treedoc.nvim", @@ -2234,7 +2314,7 @@ return }, { name = "trouble.nvim", url = "folke/trouble.nvim", - version = "3.6.0-1" + version = "3.7.0-1" }, { name = "ts-comments.nvim", url = "folke/ts-comments.nvim", @@ -2242,7 +2322,7 @@ return }, { name = "tsc.nvim", url = "dmmulroy/tsc.nvim", - version = "2.4.1-1" + version = "2.5.0-1" }, { name = "twilight.nvim", url = "folke/twilight.nvim", @@ -2254,15 +2334,15 @@ return }, { 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.3-1" + version = "1.0.2-1" }, { name = "which-key.nvim", url = "folke/which-key.nvim", - version = "3.14.1-1" + version = "3.16.0-1" }, { name = "windline.nvim", url = "windwp/windline.nvim", @@ -2270,7 +2350,7 @@ return }, { name = "winmove.nvim", url = "MisanthropicBit/winmove.nvim", - version = "0.1.0-1" + version = "0.1.1-1" }, { name = "wormhole.nvim", url = "NStefan002/wormhole.nvim", @@ -2286,7 +2366,7 @@ return }, { name = "yazi.nvim", url = "mikavilpas/yazi.nvim", - version = "6.6.1-1" + version = "7.5.1-1" }, { name = "zen-mode.nvim", url = "folke/zen-mode.nvim", @@ -2294,5 +2374,5 @@ return }, { name = "zk-nvim", url = "zk-org/zk-nvim", - version = "0.1.1-1" + version = "0.2.0-1" } } \ No newline at end of file From f15a93907ddad3d9139aea465ae18336d87f5ce6 Mon Sep 17 00:00:00 2001 From: JINNOUCHI Yasushi <delphinus35+github@me.com> Date: Thu, 6 Feb 2025 15:53:12 +0900 Subject: [PATCH 1601/1610] fix(ui): do not show virt_lines for messages (#1904) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description <!-- Describe the big picture of your changes to communicate to the maintainers why we should accept this pull request. --> https://github.com/neovim/neovim/pull/31959 has introduced virtual lines for showing diagnostics. If this is enabled (default value), messages from lazy.nvim, such as `update available` are shown as virtual lines in addition to virtual texts. ## Related Issue(s) <!-- If this PR fixes any issues, please link to the issue here. - Fixes #<issue_number> --> ## Screenshots <!-- Add screenshots of the changes if applicable. --> * ***before*** - <img width="592" alt="スクリーンショット 2025-01-27 16 42 27" src="https://github.com/user-attachments/assets/6994ac84-4862-4532-81ee-80f4015181e5" /> * ***after*** - <img width="585" alt="スクリーンショット 2025-01-27 16 42 58" src="https://github.com/user-attachments/assets/d19f63dc-fb6d-434f-89cf-a0bc49d31c5f" /> --- lua/lazy/view/render.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index 8c49a1b..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 From c6a57a3534d3494bcc5ff9b0586e141bdb0280eb Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 15 Feb 2025 08:19:49 +0100 Subject: [PATCH 1602/1610] feat(util): pass lang to `vim.notify` so that snacks notifier can render the ft. Closes #1919 --- lua/lazy/core/util.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 9db7f14..83e8a92 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -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") From ac21a639c7ecfc8b822dcc9455deceea3778f839 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com> Date: Sat, 15 Feb 2025 07:25:07 +0000 Subject: [PATCH 1603/1610] chore(build): auto-generate rockspec mappings --- lua/lazy/community/_generated.lua | 224 +++++++++++++++++------------- 1 file changed, 128 insertions(+), 96 deletions(-) diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index d3ba8f6..7e41487 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -38,7 +38,7 @@ return }, { name = "avante.nvim", url = "yetone/avante.nvim", - version = "0.0.15-1" + version = "0.0.18-1" }, { name = "banana.nvim", url = "CWood-sdf/banana.nvim", @@ -83,10 +83,14 @@ return name = "cmp-rg", url = "lukas-reineke/cmp-rg", 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", @@ -114,7 +118,7 @@ return }, { name = "commons.nvim", url = "linrongbin16/commons.nvim", - version = "26.0.0-1" + version = "27.0.0-1" }, { name = "conform.nvim", url = "stevearc/conform.nvim", @@ -130,7 +134,7 @@ return }, { name = "cord.nvim", url = "vyfor/cord.nvim", - version = "2.0.0beta-9" + version = "2.0.3-1" }, { name = "cursor-text-objects.nvim", url = "ColinKennedy/cursor-text-objects.nvim", @@ -158,7 +162,7 @@ return }, { name = "decipher.nvim", url = "MisanthropicBit/decipher.nvim", - version = "1.0.2-1" + version = "1.0.3-1" }, { name = "delog.nvim", url = "ej-shafran/delog.nvim", @@ -198,7 +202,7 @@ return }, { name = "dropbar.nvim", url = "Bekaboo/dropbar.nvim", - version = "11.0.0-1" + version = "12.0.0-1" }, { name = "duck.nvim", url = "tamton-aquib/duck.nvim", @@ -234,7 +238,7 @@ return }, { 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", @@ -270,7 +274,7 @@ return }, { name = "fzfx.nvim", url = "linrongbin16/fzfx.nvim", - version = "8.0.0-1" + version = "8.1.1-1" }, { name = "galileo.nvim", url = "S1M0N38/galileo.nvim", @@ -298,7 +302,7 @@ return }, { name = "gitsigns.nvim", url = "lewis6991/gitsigns.nvim", - version = "0.9.0-1" + version = "1.0.0-1" }, { name = "glow.nvim", url = "ellisonleao/glow.nvim", @@ -334,7 +338,7 @@ return }, { name = "haskell-tools.nvim", url = "mrcjkb/haskell-tools.nvim", - version = "4.4.0-1" + version = "4.4.2-1" }, { name = "headlines.nvim", url = "lukas-reineke/headlines.nvim", @@ -346,7 +350,7 @@ return }, { name = "helpview.nvim", url = "OXY2DEV/helpview.nvim", - version = "1.1.0-1" + version = "2.0.1-1" }, { name = "hibiscus.nvim", url = "udayvir-singh/hibiscus.nvim", @@ -362,7 +366,7 @@ return }, { name = "hurl.nvim", url = "jellydn/hurl.nvim", - version = "2.0.1-1" + version = "2.1.0-1" }, { name = "hydra.nvim", url = "nvimtools/hydra.nvim", @@ -371,6 +375,10 @@ 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", @@ -450,7 +458,7 @@ return }, { name = "lua-console.nvim", url = "YaroSpace/lua-console.nvim", - version = "1.2.3-1" + version = "1.2.4-1" }, { name = "lua-obfuscator.nvim", url = "git+ssh://git@github.com/kdssoftware/lua-obfuscator.nvim.git", @@ -494,7 +502,7 @@ return }, { name = "markview.nvim", url = "OXY2DEV/markview.nvim", - version = "25.1.0-1" + version = "25.3.1-1" }, { name = "mason-lspconfig.nvim", url = "williamboman/mason-lspconfig.nvim", @@ -515,6 +523,10 @@ return name = "mini.nvim", url = "echasnovski/mini.nvim", 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", @@ -574,7 +586,7 @@ return }, { name = "neorg-query", url = "benlubas/neorg-query", - version = "1.2.0-1" + version = "1.3.1-1" }, { name = "neorg-se", url = "benlubas/neorg-se", @@ -606,7 +618,7 @@ return }, { name = "neotest-golang", url = "fredrikaverpil/neotest-golang", - version = "1.9.1-1" + version = "1.10.1-1" }, { name = "neotest-haskell", url = "mrcjkb/neotest-haskell", @@ -638,7 +650,7 @@ return }, { name = "noice.nvim", url = "folke/noice.nvim", - version = "4.9.0-1" + version = "4.10.0-1" }, { name = "npackages.nvim", url = "diegofigs/npackages.nvim", @@ -658,7 +670,7 @@ return }, { name = "nvim-best-practices-plugin-template", url = "ColinKennedy/nvim-best-practices-plugin-template", - version = "1.6.0-1" + version = "1.7.0-1" }, { name = "nvim-bqf", url = "kevinhwang91/nvim-bqf", @@ -750,7 +762,7 @@ return }, { name = "nvim-possession", url = "gennaro-tedesco/nvim-possession", - version = "0.0.17-1" + version = "0.1.0-1" }, { name = "nvim-scrollview", url = "dstein64/nvim-scrollview", @@ -810,7 +822,7 @@ return }, { name = "onedarkpro.nvim", url = "olimorris/onedarkpro.nvim", - version = "2.8.0-1" + version = "2.9.0-1" }, { name = "onenord.nvim", url = "rmehri01/onenord.nvim", @@ -818,7 +830,7 @@ return }, { name = "otter.nvim", url = "jmbuhr/otter.nvim", - version = "2.6.0-1" + version = "2.6.1-1" }, { name = "overseer.nvim", url = "stevearc/overseer.nvim", @@ -890,11 +902,11 @@ return }, { name = "render-markdown.nvim", url = "MeanderingProgrammer/render-markdown.nvim", - version = "7.8.0-1" + version = "8.0.0-1" }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", - version = "3.9.1-1" + version = "3.11.1-1" }, { name = "rime.nvim", url = "Freed-Wu/rime.nvim", @@ -914,7 +926,7 @@ return }, { name = "rocks-lazy.nvim", url = "nvim-neorocks/rocks-lazy.nvim", - version = "1.1.2-1" + version = "1.2.0-1" }, { name = "rocks-treesitter.nvim", url = "nvim-neorocks/rocks-treesitter.nvim", @@ -922,7 +934,7 @@ return }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.43.0-1" + version = "2.43.1-1" }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", @@ -934,7 +946,7 @@ return }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "5.24.2-1" + version = "5.24.4-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -966,7 +978,7 @@ return }, { name = "snacks.nvim", url = "folke/snacks.nvim", - version = "2.15.0-1" + version = "2.20.0-1" }, { name = "sos.nvim", url = "tmillr/sos.nvim", @@ -1018,7 +1030,7 @@ return }, { name = "telescope-frecency.nvim", url = "nvim-telescope/telescope-frecency.nvim", - version = "1.0.5-1" + version = "1.2.0-1" }, { name = "telescope-zf-native.nvim", url = "natecraddock/telescope-zf-native.nvim", @@ -1054,7 +1066,7 @@ return }, { name = "tree-sitter-apex", url = "aheber/tree-sitter-sfapex", - version = "0.0.45-1" + version = "0.0.47-1" }, { name = "tree-sitter-arduino", url = "tree-sitter-grammars/tree-sitter-arduino", @@ -1062,7 +1074,7 @@ return }, { name = "tree-sitter-asm", url = "RubixDev/tree-sitter-asm", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-astro", url = "virchau13/tree-sitter-astro", @@ -1078,7 +1090,7 @@ return }, { name = "tree-sitter-bash", url = "tree-sitter/tree-sitter-bash", - version = "0.0.39-1" + version = "0.0.40-1" }, { name = "tree-sitter-bass", url = "vito/tree-sitter-bass", @@ -1110,11 +1122,11 @@ return }, { name = "tree-sitter-c", url = "tree-sitter/tree-sitter-c", - version = "0.0.38-1" + version = "0.0.41-1" }, { name = "tree-sitter-c_sharp", url = "tree-sitter/tree-sitter-c-sharp", - version = "0.0.38-1" + version = "0.0.40-1" }, { name = "tree-sitter-cairo", url = "tree-sitter-grammars/tree-sitter-cairo", @@ -1134,7 +1146,7 @@ return }, { name = "tree-sitter-cli", url = "FourierTransformer/tree-sitter-cli", - version = "0.24.5-1" + version = "0.25.1-2" }, { name = "tree-sitter-clojure", url = "sogaiu/tree-sitter-clojure", @@ -1166,11 +1178,11 @@ return }, { name = "tree-sitter-cpp", url = "tree-sitter/tree-sitter-cpp", - version = "0.0.39-1" + version = "0.0.41-1" }, { name = "tree-sitter-css", url = "tree-sitter/tree-sitter-css", - version = "0.0.35-1" + version = "0.0.36-1" }, { name = "tree-sitter-csv", url = "tree-sitter-grammars/tree-sitter-csv", @@ -1182,7 +1194,7 @@ return }, { name = "tree-sitter-cue", url = "eonpatapon/tree-sitter-cue", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-cylc", url = "elliotfontaine/tree-sitter-cylc", @@ -1198,7 +1210,7 @@ return }, { name = "tree-sitter-desktop", url = "ValdezFOmar/tree-sitter-desktop", - version = "0.0.6-1" + version = "0.0.8-1" }, { name = "tree-sitter-devicetree", url = "joelspadin/tree-sitter-devicetree", @@ -1218,7 +1230,7 @@ return }, { name = "tree-sitter-djot", url = "treeman/tree-sitter-djot", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-dockerfile", url = "camdencheek/tree-sitter-dockerfile", @@ -1234,11 +1246,11 @@ return }, { name = "tree-sitter-dtd", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-earthfile", url = "glehmann/tree-sitter-earthfile", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-ebnf", url = "RubixDev/ebnf", @@ -1246,7 +1258,7 @@ return }, { name = "tree-sitter-ecma", url = "nvim-neorocks/luarocks-stub", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-editorconfig", url = "ValdezFOmar/tree-sitter-editorconfig", @@ -1262,7 +1274,7 @@ return }, { name = "tree-sitter-elixir", url = "elixir-lang/tree-sitter-elixir", - version = "0.0.38-1" + version = "0.0.39-1" }, { name = "tree-sitter-elm", url = "elm-tooling/tree-sitter-elm", @@ -1279,10 +1291,14 @@ return 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.36-1" + version = "0.0.40-1" }, { name = "tree-sitter-facility", url = "FacilityApi/tree-sitter-facility", @@ -1326,7 +1342,7 @@ return }, { name = "tree-sitter-fsharp", url = "ionide/tree-sitter-fsharp", - version = "0.0.10-1" + version = "0.0.11-1" }, { name = "tree-sitter-func", url = "tree-sitter-grammars/tree-sitter-func", @@ -1374,7 +1390,7 @@ return }, { name = "tree-sitter-gleam", url = "gleam-lang/tree-sitter-gleam", - version = "0.0.33-1" + version = "0.0.35-1" }, { name = "tree-sitter-glimmer", url = "ember-tooling/tree-sitter-glimmer", @@ -1402,7 +1418,7 @@ return }, { name = "tree-sitter-go", url = "tree-sitter/tree-sitter-go", - version = "0.0.38-1" + version = "0.0.39-1" }, { name = "tree-sitter-goctl", url = "chaozwn/tree-sitter-goctl", @@ -1458,7 +1474,7 @@ return }, { name = "tree-sitter-haskell", url = "tree-sitter/tree-sitter-haskell", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-haskell_persistent", url = "MercuryTechnologies/tree-sitter-haskell-persistent", @@ -1498,7 +1514,7 @@ return }, { name = "tree-sitter-html", url = "tree-sitter/tree-sitter-html", - version = "0.0.35-1" + version = "0.0.36-1" }, { name = "tree-sitter-html_tags", url = "nvim-neorocks/luarocks-stub", @@ -1510,7 +1526,7 @@ return }, { name = "tree-sitter-http", url = "rest-nvim/tree-sitter-http", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-hurl", url = "pfeiferj/tree-sitter-hurl", @@ -1518,11 +1534,11 @@ return }, { name = "tree-sitter-hyprlang", url = "tree-sitter-grammars/tree-sitter-hyprlang", - version = "0.0.33-1" + version = "0.0.34-1" }, { name = "tree-sitter-idl", url = "cathaysia/tree-sitter-idl", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-idris", url = "kayhide/tree-sitter-idris", @@ -1546,15 +1562,23 @@ return }, { name = "tree-sitter-janet_simple", url = "sogaiu/tree-sitter-janet-simple", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-java", url = "tree-sitter/tree-sitter-java", - version = "0.0.39-1" + version = "0.0.40-1" }, { name = "tree-sitter-javascript", url = "tree-sitter/tree-sitter-javascript", - version = "0.0.35-1" + 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", @@ -1566,7 +1590,7 @@ return }, { name = "tree-sitter-json", url = "tree-sitter/tree-sitter-json", - version = "0.0.35-1" + version = "0.0.36-1" }, { name = "tree-sitter-json5", url = "Joakker/tree-sitter-json5", @@ -1586,7 +1610,7 @@ return }, { name = "tree-sitter-julia", url = "tree-sitter/tree-sitter-julia", - version = "0.0.40-1" + version = "0.0.42-1" }, { name = "tree-sitter-just", url = "IndianBoy42/tree-sitter-just", @@ -1646,7 +1670,7 @@ return }, { name = "tree-sitter-lua", url = "tree-sitter-grammars/tree-sitter-lua", - version = "0.0.32-1" + version = "0.0.33-1" }, { name = "tree-sitter-luadoc", url = "tree-sitter-grammars/tree-sitter-luadoc", @@ -1678,7 +1702,7 @@ return }, { name = "tree-sitter-matlab", url = "acristoffers/tree-sitter-matlab", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-menhir", url = "Kerl13/tree-sitter-menhir", @@ -1694,7 +1718,7 @@ return }, { name = "tree-sitter-mlir", url = "artagnon/tree-sitter-mlir", - version = "0.0.43-1" + version = "0.0.44-1" }, { name = "tree-sitter-muttrc", url = "neomutt/tree-sitter-muttrc", @@ -1726,7 +1750,7 @@ return }, { name = "tree-sitter-nix", url = "cstrahan/tree-sitter-nix", - version = "0.0.54-1" + version = "0.0.56-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", @@ -1742,11 +1766,11 @@ return }, { name = "tree-sitter-nu", url = "nushell/tree-sitter-nu", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-objc", url = "tree-sitter-grammars/tree-sitter-objc", - version = "0.0.30-1" + version = "0.0.31-1" }, { name = "tree-sitter-objdump", url = "ColinKennedy/tree-sitter-objdump", @@ -1754,15 +1778,15 @@ return }, { name = "tree-sitter-ocaml", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.38-1" + version = "0.0.39-1" }, { name = "tree-sitter-ocaml_interface", url = "tree-sitter/tree-sitter-ocaml", - version = "0.0.39-1" + version = "0.0.40-1" }, { name = "tree-sitter-ocamllex", url = "atom-ocaml/tree-sitter-ocamllex", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-odin", url = "tree-sitter-grammars/tree-sitter-odin", @@ -1790,15 +1814,15 @@ return }, { name = "tree-sitter-perl", url = "tree-sitter-perl/tree-sitter-perl", - version = "0.0.38-1" + version = "0.0.41-1" }, { name = "tree-sitter-php", url = "tree-sitter/tree-sitter-php", - version = "0.0.37-1" + version = "0.0.38-1" }, { name = "tree-sitter-php_only", url = "tree-sitter/tree-sitter-php", - version = "0.0.38-1" + version = "0.0.39-1" }, { name = "tree-sitter-phpdoc", url = "claytonrcarter/tree-sitter-phpdoc", @@ -1830,7 +1854,7 @@ return }, { name = "tree-sitter-printf", url = "tree-sitter-grammars/tree-sitter-printf", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-prisma", url = "victorhqc/tree-sitter-prisma", @@ -1882,7 +1906,7 @@ return }, { name = "tree-sitter-python", url = "tree-sitter/tree-sitter-python", - version = "0.0.39-1" + version = "0.0.40-1" }, { name = "tree-sitter-ql", url = "tree-sitter/tree-sitter-ql", @@ -1898,7 +1922,7 @@ return }, { name = "tree-sitter-query", url = "tree-sitter-grammars/tree-sitter-query", - version = "0.0.31-1" + version = "0.0.34-1" }, { name = "tree-sitter-r", url = "r-lib/tree-sitter-r", @@ -1915,6 +1939,10 @@ return 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", @@ -1966,11 +1994,11 @@ return }, { name = "tree-sitter-rst", url = "stsewd/tree-sitter-rst", - version = "0.0.31-1" + version = "0.0.32-1" }, { name = "tree-sitter-ruby", url = "tree-sitter/tree-sitter-ruby", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-runescript", url = "2004Scape/tree-sitter-runescript", @@ -1978,11 +2006,11 @@ return }, { name = "tree-sitter-rust", url = "tree-sitter/tree-sitter-rust", - version = "0.0.40-1" + version = "0.0.41-1" }, { name = "tree-sitter-scala", url = "tree-sitter/tree-sitter-scala", - version = "0.0.44-1" + version = "0.0.46-1" }, { name = "tree-sitter-scfg", url = "rockorager/tree-sitter-scfg", @@ -1998,7 +2026,7 @@ return }, { name = "tree-sitter-sflog", url = "aheber/tree-sitter-sfapex", - version = "0.0.42-1" + version = "0.0.44-1" }, { name = "tree-sitter-slang", url = "tree-sitter-grammars/tree-sitter-slang", @@ -2030,11 +2058,11 @@ return }, { name = "tree-sitter-soql", url = "aheber/tree-sitter-sfapex", - version = "0.0.44-1" + version = "0.0.46-1" }, { name = "tree-sitter-sosl", url = "aheber/tree-sitter-sfapex", - version = "0.0.42-1" + version = "0.0.44-1" }, { name = "tree-sitter-sourcepawn", url = "nilshelmig/tree-sitter-sourcepawn", @@ -2042,7 +2070,7 @@ return }, { name = "tree-sitter-sparql", url = "GordianDziwis/tree-sitter-sparql", - version = "0.0.29-1" + version = "0.0.30-1" }, { name = "tree-sitter-sql", url = "derekstride/tree-sitter-sql", @@ -2074,7 +2102,7 @@ return }, { name = "tree-sitter-superhtml", url = "kristoff-it/superhtml", - version = "0.0.12-1" + version = "0.0.13-1" }, { name = "tree-sitter-surface", url = "connorlay/tree-sitter-surface", @@ -2090,7 +2118,7 @@ return }, { name = "tree-sitter-swift", url = "alex-pinkus/tree-sitter-swift", - version = "0.0.44-1" + version = "0.0.45-1" }, { name = "tree-sitter-sxhkdrc", url = "RaafatTurki/tree-sitter-sxhkdrc", @@ -2126,7 +2154,7 @@ return }, { name = "tree-sitter-templ", url = "vrischmann/tree-sitter-templ", - version = "0.0.44-1" + version = "0.0.45-1" }, { name = "tree-sitter-terraform", url = "MichaHoffmann/tree-sitter-hcl", @@ -2166,7 +2194,7 @@ return }, { name = "tree-sitter-tsx", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.34-1" + version = "0.0.35-1" }, { name = "tree-sitter-turtle", url = "GordianDziwis/tree-sitter-turtle", @@ -2178,7 +2206,7 @@ return }, { name = "tree-sitter-typescript", url = "tree-sitter/tree-sitter-typescript", - version = "0.0.34-1" + version = "0.0.36-1" }, { name = "tree-sitter-typespec", url = "happenslol/tree-sitter-typespec", @@ -2190,7 +2218,7 @@ return }, { name = "tree-sitter-typst", url = "uben0/tree-sitter-typst", - version = "0.0.32-1" + version = "0.0.35-1" }, { name = "tree-sitter-udev", url = "tree-sitter-grammars/tree-sitter-udev", @@ -2214,7 +2242,7 @@ return }, { name = "tree-sitter-v", url = "vlang/v-analyzer", - version = "0.0.42-1" + version = "0.0.43-1" }, { name = "tree-sitter-vala", url = "vala-lang/tree-sitter-vala", @@ -2230,11 +2258,11 @@ return }, { name = "tree-sitter-vhdl", url = "jpt13653903/tree-sitter-vhdl", - version = "0.0.37-1" + version = "0.0.38-1" }, { name = "tree-sitter-vhs", url = "charmbracelet/tree-sitter-vhs", - version = "0.0.30-1" + version = "0.0.32-1" }, { name = "tree-sitter-vim", url = "tree-sitter-grammars/tree-sitter-vim", @@ -2274,7 +2302,7 @@ return }, { name = "tree-sitter-xml", url = "tree-sitter-grammars/tree-sitter-xml", - version = "0.0.35-1" + version = "0.0.36-1" }, { name = "tree-sitter-xresources", url = "ValdezFOmar/tree-sitter-xresources", @@ -2302,11 +2330,11 @@ return }, { name = "tree-sitter-ziggy", url = "kristoff-it/ziggy", - version = "0.0.8-1" + version = "0.0.9-1" }, { name = "tree-sitter-ziggy_schema", url = "kristoff-it/ziggy", - version = "0.0.8-1" + version = "0.0.9-1" }, { name = "treedoc.nvim", url = "neo451/treedoc.nvim", @@ -2314,7 +2342,7 @@ return }, { name = "trouble.nvim", url = "folke/trouble.nvim", - version = "3.7.0-1" + version = "3.7.1-1" }, { name = "ts-comments.nvim", url = "folke/ts-comments.nvim", @@ -2338,7 +2366,7 @@ return }, { name = "vgit.nvim", url = "tanvirtin/vgit.nvim", - version = "1.0.2-1" + version = "1.0.6-1" }, { name = "which-key.nvim", url = "folke/which-key.nvim", @@ -2350,7 +2378,7 @@ return }, { name = "winmove.nvim", url = "MisanthropicBit/winmove.nvim", - version = "0.1.1-1" + version = "0.1.2-1" }, { name = "wormhole.nvim", url = "NStefan002/wormhole.nvim", @@ -2363,10 +2391,14 @@ return 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 = "7.5.1-1" + version = "7.5.4-1" }, { name = "zen-mode.nvim", url = "folke/zen-mode.nvim", From f81a3fb7feaf460ec7c8c983682b4a693b18fdd4 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 15 Feb 2025 23:06:09 +0100 Subject: [PATCH 1604/1610] fix(meta): disable top-level specs before the rest. Closes #1889 --- lua/lazy/core/meta.lua | 26 +++++++++++++++++++------- lua/lazy/types.lua | 1 + 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 88263a2..5e026f4 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 @@ -302,16 +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 - if plugin.optional then - self:del(plugin.name) - else - self:disable(plugin) + local function check(top) + for _, plugin in pairs(self.plugins) do + if plugin._.top == 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 + end end end end + -- disable top-level plugins first, since they may have non-top-level frags + -- that disable other plugins + check(true) + self:rebuild() + -- then disable non-top-level plugins + check(false) self:rebuild() return changes end diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 6e406bb..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 From e5e9bf48211a13d9ee6c1077c88327c49c1ab4a0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Sat, 15 Feb 2025 23:09:58 +0100 Subject: [PATCH 1605/1610] test: fix tests --- lua/lazy/core/meta.lua | 2 +- tests/core/plugin_spec.lua | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 5e026f4..0a55656 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -306,7 +306,7 @@ function M:fix_disabled() local changes = 0 local function check(top) for _, plugin in pairs(self.plugins) do - if plugin._.top == top then + 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 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 From a8c6db5da7bd382094606340eed015d14fbb5654 Mon Sep 17 00:00:00 2001 From: Salomon Popp <hi@salomonpopp.me> Date: Mon, 24 Feb 2025 07:20:35 +0100 Subject: [PATCH 1606/1610] style(types): add optional return value for `LazyKeysSpec` rhs (#1924) ## Description <!-- Describe the big picture of your changes to communicate to the maintainers why we should accept this pull request. --> when `expr=true` the rhs function should return a string. example ```lua { keys = { { '<leader>j', function() return require('dial.map').inc_normal() end, expr = true, desc = 'Increment value', } } } ``` ## Related Issue(s) <!-- If this PR fixes any issues, please link to the issue here. - Fixes #<issue_number> --> ## Screenshots <!-- Add screenshots of the changes if applicable. --> --- lua/lazy/core/handler/keys.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 96a205c8cea5476e5a87ed228acf2f221e4eae64 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 19:14:41 +0100 Subject: [PATCH 1607/1610] chore(main): release 11.17.0 (#1877) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 15 +++++++++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index d5dbcb3..e392eaf 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.16.2" + ".": "11.17.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 015288e..d4dde26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## [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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 49339e5..16b5e2c 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -242,7 +242,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.16.2" -- x-release-please-version +M.version = "11.17.0" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") From 1c9ba3704564a2e34a22191bb89678680ffeb245 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Feb 2025 20:02:30 +0100 Subject: [PATCH 1608/1610] fix(bootstrap): support for older Neovim versions --- bootstrap.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bootstrap.lua b/bootstrap.lua index 88c1a44..c934c48 100644 --- a/bootstrap.lua +++ b/bootstrap.lua @@ -6,6 +6,7 @@ local M = {} function M.setup() + local uv = vim.uv or vim.loop if vim.env.LAZY_STDPATH then local root = vim.fn.fnamemodify(vim.env.LAZY_STDPATH, ":p"):gsub("[\\/]$", "") for _, name in ipairs({ "config", "data", "state", "cache" }) do @@ -13,12 +14,12 @@ function M.setup() 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", From d51cf6978321d659e68a8bc38ee806bd2517a196 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre <folke.lemaitre@gmail.com> Date: Tue, 25 Feb 2025 20:18:25 +0100 Subject: [PATCH 1609/1610] fix(meta): rebuild dirty right after disable. See #1889 --- lua/lazy/core/meta.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 0a55656..6fbdfc4 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -314,6 +314,7 @@ function M:fix_disabled() else self:disable(plugin) end + self:rebuild() end end end @@ -321,10 +322,8 @@ function M:fix_disabled() -- disable top-level plugins first, since they may have non-top-level frags -- that disable other plugins check(true) - self:rebuild() -- then disable non-top-level plugins check(false) - self:rebuild() return changes end From 6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 20:19:57 +0100 Subject: [PATCH 1610/1610] chore(main): release 11.17.1 (#1927) :robot: I have created a release *beep* *boop* --- ## [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)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/.release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ lua/lazy/core/config.lua | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index e392eaf..dd77c5c 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.17.0" + ".": "11.17.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index d4dde26..521777a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # 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) diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 16b5e2c..603dd1a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -242,7 +242,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.17.0" -- x-release-please-version +M.version = "11.17.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy")