mirror of
				https://github.com/folke/lazy.nvim.git
				synced 2025-10-31 14:31:04 +00:00 
			
		
		
		
	feat: lazy setup with either a plugins module, or a plugins spec
This commit is contained in:
		
					parent
					
						
							
								f0894be69d
							
						
					
				
			
			
				commit
				
					
						af8b8e128e
					
				
			
		
					 8 changed files with 54 additions and 53 deletions
				
			
		|  | @ -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<string, LazyPlugin> | ||||
| 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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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() | ||||
|  |  | |||
|  | @ -147,7 +147,7 @@ end | |||
| function M.update_state() | ||||
|   ---@type table<string,FileType> | ||||
|   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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue