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