mirror of
				https://github.com/folke/lazy.nvim.git
				synced 2025-10-31 06:21:14 +00:00 
			
		
		
		
	style: formatting
This commit is contained in:
		
					parent
					
						
							
								e73626a344
							
						
					
				
			
			
				commit
				
					
						0219a531ed
					
				
			
		
					 9 changed files with 698 additions and 695 deletions
				
			
		|  | @ -10,78 +10,78 @@ M.dirty = false | |||
| M.did_setup = false | ||||
| 
 | ||||
| function M.hash(modpath) | ||||
| 	local stat = vim.loop.fs_stat(modpath) | ||||
| 	if stat then | ||||
| 		return stat.mtime.sec .. stat.mtime.nsec .. stat.size | ||||
| 	end | ||||
| 	error("Could not hash " .. modpath) | ||||
|   local stat = vim.loop.fs_stat(modpath) | ||||
|   if stat then | ||||
|     return stat.mtime.sec .. stat.mtime.nsec .. stat.size | ||||
|   end | ||||
|   error("Could not hash " .. modpath) | ||||
| end | ||||
| 
 | ||||
| function M.load_cache() | ||||
| 	local f = io.open(cache_file, "rb") | ||||
| 	if f then | ||||
| 		M.cache = vim.mpack.decode(f:read("*a")) or {} | ||||
| 		f:close() | ||||
| 	end | ||||
|   local f = io.open(cache_file, "rb") | ||||
|   if f then | ||||
|     M.cache = vim.mpack.decode(f:read("*a")) or {} | ||||
|     f:close() | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| function M.save_cache() | ||||
| 	if M.dirty then | ||||
| 		for key, entry in pairs(M.cache) do | ||||
| 			if not entry.used then | ||||
| 				M.cache[key] = nil | ||||
| 			end | ||||
| 			entry.used = nil | ||||
| 		end | ||||
| 		local f = assert(io.open(cache_file, "wb")) | ||||
| 		f:write(vim.mpack.encode(M.cache)) | ||||
| 		f:close() | ||||
| 	end | ||||
|   if M.dirty then | ||||
|     for key, entry in pairs(M.cache) do | ||||
|       if not entry.used then | ||||
|         M.cache[key] = nil | ||||
|       end | ||||
|       entry.used = nil | ||||
|     end | ||||
|     local f = assert(io.open(cache_file, "wb")) | ||||
|     f:write(vim.mpack.encode(M.cache)) | ||||
|     f:close() | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| function M.setup() | ||||
| 	M.load_cache() | ||||
| 	vim.api.nvim_create_autocmd("VimLeave", { | ||||
| 		callback = function() | ||||
| 			M.save_cache() | ||||
| 		end, | ||||
| 	}) | ||||
|   M.load_cache() | ||||
|   vim.api.nvim_create_autocmd("VimLeave", { | ||||
|     callback = function() | ||||
|       M.save_cache() | ||||
|     end, | ||||
|   }) | ||||
| end | ||||
| 
 | ||||
| function M.load(modpath, modname) | ||||
| 	if not M.did_setup then | ||||
| 		M.setup() | ||||
| 		M.did_setup = true | ||||
| 	end | ||||
| 	if type(package.loaded[modname]) ~= "table" then | ||||
| 		---@type fun()?, string? | ||||
| 		local chunk, err | ||||
| 		local entry = M.cache[modname] | ||||
|   if not M.did_setup then | ||||
|     M.setup() | ||||
|     M.did_setup = true | ||||
|   end | ||||
|   if type(package.loaded[modname]) ~= "table" then | ||||
|     ---@type fun()?, string? | ||||
|     local chunk, err | ||||
|     local entry = M.cache[modname] | ||||
| 
 | ||||
| 		if entry and M.hash(modpath) == entry.hash then | ||||
| 			entry.used = true | ||||
| 			chunk, err = loadstring(entry.chunk, "@" .. modpath) | ||||
| 		end | ||||
|     if entry and M.hash(modpath) == entry.hash then | ||||
|       entry.used = true | ||||
|       chunk, err = loadstring(entry.chunk, "@" .. modpath) | ||||
|     end | ||||
| 
 | ||||
| 		-- not cached, or failed to load chunk | ||||
| 		if not chunk then | ||||
| 			vim.schedule(function() | ||||
| 				vim.notify("not cached") | ||||
| 			end) | ||||
| 			chunk, err = loadfile(modpath) | ||||
| 			if chunk then | ||||
| 				M.cache[modname] = { hash = M.hash(modpath), chunk = string.dump(chunk, true), used = true } | ||||
| 				M.dirty = true | ||||
| 			end | ||||
| 		end | ||||
|     -- not cached, or failed to load chunk | ||||
|     if not chunk then | ||||
|       vim.schedule(function() | ||||
|         vim.notify("not cached") | ||||
|       end) | ||||
|       chunk, err = loadfile(modpath) | ||||
|       if chunk then | ||||
|         M.cache[modname] = { hash = M.hash(modpath), chunk = string.dump(chunk, true), used = true } | ||||
|         M.dirty = true | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
| 		if not chunk then | ||||
| 			error(err) | ||||
| 		end | ||||
| 		---@diagnostic disable-next-line: no-unknown | ||||
| 		package.loaded[modname] = chunk() | ||||
| 	end | ||||
| 	return package.loaded[modname] | ||||
|     if not chunk then | ||||
|       error(err) | ||||
|     end | ||||
|     ---@diagnostic disable-next-line: no-unknown | ||||
|     package.loaded[modname] = chunk() | ||||
|   end | ||||
|   return package.loaded[modname] | ||||
| end | ||||
| 
 | ||||
| return M | ||||
|  |  | |||
|  | @ -4,19 +4,19 @@ local M = {} | |||
| 
 | ||||
| ---@class LazyConfig | ||||
| M.defaults = { | ||||
| 	opt = true, | ||||
| 	plugins = {}, | ||||
| 	plugins_local = { | ||||
| 		path = vim.fn.expand("~/projects"), | ||||
| 		patterns = { | ||||
| 			"folke", | ||||
| 		}, | ||||
| 	}, | ||||
| 	plugins_config = { | ||||
| 		module = "plugins", | ||||
| 		path = vim.fn.stdpath("config") .. "/lua/plugins", | ||||
| 	}, | ||||
| 	package_path = vim.fn.stdpath("data") .. "/site/pack/lazy", | ||||
|   opt = true, | ||||
|   plugins = {}, | ||||
|   plugins_local = { | ||||
|     path = vim.fn.expand("~/projects"), | ||||
|     patterns = { | ||||
|       "folke", | ||||
|     }, | ||||
|   }, | ||||
|   plugins_config = { | ||||
|     module = "plugins", | ||||
|     path = vim.fn.stdpath("config") .. "/lua/plugins", | ||||
|   }, | ||||
|   package_path = vim.fn.stdpath("data") .. "/site/pack/lazy", | ||||
| } | ||||
| 
 | ||||
| M.ns = vim.api.nvim_create_namespace("lazy") | ||||
|  | @ -32,37 +32,37 @@ M.has_config = {} | |||
| 
 | ||||
| ---@param opts? LazyConfig | ||||
| function M.setup(opts) | ||||
| 	M.options = vim.tbl_deep_extend("force", M.defaults, opts or {}) | ||||
|   M.options = vim.tbl_deep_extend("force", M.defaults, opts or {}) | ||||
| 
 | ||||
| 	vim.fn.mkdir(M.options.package_path, "p") | ||||
|   vim.fn.mkdir(M.options.package_path, "p") | ||||
| 
 | ||||
| 	for _, entry in ipairs(Util.scandir(M.options.plugins_config.path)) do | ||||
| 		local name, modpath | ||||
|   for _, entry in ipairs(Util.scandir(M.options.plugins_config.path)) do | ||||
|     local name, modpath | ||||
| 
 | ||||
| 		if entry.type == "file" then | ||||
| 			modpath = entry.path | ||||
| 			name = entry.name:match("(.*)%.lua") | ||||
| 		elseif entry.type == "directory" then | ||||
| 			modpath = M.options.plugins_config.path .. "/" .. entry.name .. "/init.lua" | ||||
| 			if vim.loop.fs_stat(modpath) then | ||||
| 				name = entry.name | ||||
| 			end | ||||
| 		end | ||||
|     if entry.type == "file" then | ||||
|       modpath = entry.path | ||||
|       name = entry.name:match("(.*)%.lua") | ||||
|     elseif entry.type == "directory" then | ||||
|       modpath = M.options.plugins_config.path .. "/" .. entry.name .. "/init.lua" | ||||
|       if vim.loop.fs_stat(modpath) then | ||||
|         name = entry.name | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
| 		if name then | ||||
| 			M.has_config[M.options.plugins_config.module .. "." .. name] = modpath | ||||
| 		end | ||||
| 	end | ||||
|     if name then | ||||
|       M.has_config[M.options.plugins_config.module .. "." .. name] = modpath | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
| 	vim.api.nvim_create_autocmd("User", { | ||||
| 		pattern = "VeryLazy", | ||||
| 		once = true, | ||||
| 		callback = function() | ||||
| 			-- require("lazy.view").setup() | ||||
| 		end, | ||||
| 	}) | ||||
|   vim.api.nvim_create_autocmd("User", { | ||||
|     pattern = "VeryLazy", | ||||
|     once = true, | ||||
|     callback = function() | ||||
|       -- require("lazy.view").setup() | ||||
|     end, | ||||
|   }) | ||||
| 
 | ||||
| 	Util.very_lazy() | ||||
|   Util.very_lazy() | ||||
| end | ||||
| 
 | ||||
| return M | ||||
|  |  | |||
|  | @ -2,69 +2,69 @@ local M = {} | |||
| 
 | ||||
| ---@param opts? LazyConfig | ||||
| function M.setup(opts) | ||||
| 	--FIXME:  preload() | ||||
|   --FIXME:  preload() | ||||
| 
 | ||||
| 	local Util = require("lazy.util") | ||||
| 	local Config = require("lazy.config") | ||||
| 	local Plugin = require("lazy.plugin") | ||||
|   local Util = require("lazy.util") | ||||
|   local Config = require("lazy.config") | ||||
|   local Plugin = require("lazy.plugin") | ||||
| 
 | ||||
| 	Util.track("lazy_setup") | ||||
|   Util.track("lazy_setup") | ||||
| 
 | ||||
| 	Util.track("lazy_config") | ||||
| 	Config.setup(opts) | ||||
| 	Util.track() | ||||
|   Util.track("lazy_config") | ||||
|   Config.setup(opts) | ||||
|   Util.track() | ||||
| 
 | ||||
| 	Util.track("plugin_normalize") | ||||
| 	Plugin.normalize(Config.options.plugins) | ||||
| 	if not Config.plugins.lazy then | ||||
| 		Plugin.plugin({ | ||||
| 			"folke/lazy.nvim", | ||||
| 			opt = false, | ||||
| 		}) | ||||
| 	end | ||||
| 	Util.track() | ||||
|   Util.track("plugin_normalize") | ||||
|   Plugin.normalize(Config.options.plugins) | ||||
|   if not Config.plugins.lazy then | ||||
|     Plugin.plugin({ | ||||
|       "folke/lazy.nvim", | ||||
|       opt = false, | ||||
|     }) | ||||
|   end | ||||
|   Util.track() | ||||
| 
 | ||||
| 	Util.track("plugin_process") | ||||
| 	Plugin.process() | ||||
| 	Util.track() | ||||
|   Util.track("plugin_process") | ||||
|   Plugin.process() | ||||
|   Util.track() | ||||
| 
 | ||||
| 	Util.track("lazy_install") | ||||
| 	for _, plugin in pairs(Config.plugins) do | ||||
| 		if not plugin.installed then | ||||
| 			-- require("lazy.manager").install({ | ||||
| 			-- 	wait = true, | ||||
| 			-- }) | ||||
| 			break | ||||
| 		end | ||||
| 	end | ||||
| 	Util.track() | ||||
|   Util.track("lazy_install") | ||||
|   for _, plugin in pairs(Config.plugins) do | ||||
|     if not plugin.installed then | ||||
|       -- require("lazy.manager").install({ | ||||
|       -- 	wait = true, | ||||
|       -- }) | ||||
|       break | ||||
|     end | ||||
|   end | ||||
|   Util.track() | ||||
| 
 | ||||
| 	Util.track("loader_setup") | ||||
| 	local Loader = require("lazy.loader") | ||||
| 	Loader.setup() | ||||
| 	Util.track() | ||||
|   Util.track("loader_setup") | ||||
|   local Loader = require("lazy.loader") | ||||
|   Loader.setup() | ||||
|   Util.track() | ||||
| 
 | ||||
| 	Loader.init_plugins() | ||||
|   Loader.init_plugins() | ||||
| 
 | ||||
| 	Util.track() -- end setup | ||||
| 	vim.cmd("do User LazyDone") | ||||
|   Util.track() -- end setup | ||||
|   vim.cmd("do User LazyDone") | ||||
| end | ||||
| 
 | ||||
| function M.stats() | ||||
| 	local ret = { | ||||
| 		count = 0, | ||||
| 		loaded = 0, | ||||
| 	} | ||||
|   local ret = { | ||||
|     count = 0, | ||||
|     loaded = 0, | ||||
|   } | ||||
| 
 | ||||
| 	for _, plugin in pairs(require("lazy.config").plugins) do | ||||
| 		ret.count = ret.count + 1 | ||||
|   for _, plugin in pairs(require("lazy.config").plugins) do | ||||
|     ret.count = ret.count + 1 | ||||
| 
 | ||||
| 		if plugin.loaded then | ||||
| 			ret.loaded = ret.loaded + 1 | ||||
| 		end | ||||
| 	end | ||||
|     if plugin.loaded then | ||||
|       ret.loaded = ret.loaded + 1 | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
| 	return ret | ||||
|   return ret | ||||
| end | ||||
| 
 | ||||
| return M | ||||
|  |  | |||
|  | @ -6,18 +6,18 @@ local M = {} | |||
| ---@alias LoaderType "event"|"ft"|"module"|"keys"|"cmd" | ||||
| ---@type LoaderType[] | ||||
| M.types = { | ||||
| 	"event", | ||||
| 	"ft", | ||||
| 	"module", | ||||
| 	"keys", | ||||
| 	"cmd", | ||||
|   "event", | ||||
|   "ft", | ||||
|   "module", | ||||
|   "keys", | ||||
|   "cmd", | ||||
| } | ||||
| 
 | ||||
| ---@type table<LoaderType, table<string, string[]>> | ||||
| M.loaders = {} | ||||
| 
 | ||||
| for _, type in ipairs(M.types) do | ||||
| 	M.loaders[type] = {} | ||||
|   M.loaders[type] = {} | ||||
| end | ||||
| 
 | ||||
| ---@type LazyPlugin[] | ||||
|  | @ -25,203 +25,203 @@ M.need_setup = {} | |||
| 
 | ||||
| ---@param plugin LazyPlugin | ||||
| function M.add(plugin) | ||||
| 	if plugin.init or plugin.opt == false and plugin.config then | ||||
| 		table.insert(M.need_setup, plugin) | ||||
| 	end | ||||
|   if plugin.init or plugin.opt == false and plugin.config then | ||||
|     table.insert(M.need_setup, plugin) | ||||
|   end | ||||
| 
 | ||||
| 	for _, loader_type in ipairs(M.types) do | ||||
| 		---@type string[]|string | ||||
| 		local loaders = plugin[loader_type] | ||||
| 		if loaders then | ||||
| 			loaders = type(loaders) == "table" and loaders or { loaders } | ||||
| 			---@cast loaders string[] | ||||
| 			for _, loader in ipairs(loaders) do | ||||
| 				if not M.loaders[loader_type][loader] then | ||||
| 					M.loaders[loader_type][loader] = {} | ||||
| 				end | ||||
| 				table.insert(M.loaders[loader_type][loader], plugin.name) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
|   for _, loader_type in ipairs(M.types) do | ||||
|     ---@type string[]|string | ||||
|     local loaders = plugin[loader_type] | ||||
|     if loaders then | ||||
|       loaders = type(loaders) == "table" and loaders or { loaders } | ||||
|       ---@cast loaders string[] | ||||
|       for _, loader in ipairs(loaders) do | ||||
|         if not M.loaders[loader_type][loader] then | ||||
|           M.loaders[loader_type][loader] = {} | ||||
|         end | ||||
|         table.insert(M.loaders[loader_type][loader], plugin.name) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| function M.setup() | ||||
| 	local group = vim.api.nvim_create_augroup("lazy_loader", { | ||||
| 		clear = true, | ||||
| 	}) | ||||
|   local group = vim.api.nvim_create_augroup("lazy_loader", { | ||||
|     clear = true, | ||||
|   }) | ||||
| 
 | ||||
| 	-- modules | ||||
| 	table.insert(package.loaders, 2, M.module) | ||||
|   -- modules | ||||
|   table.insert(package.loaders, 2, M.module) | ||||
| 
 | ||||
| 	-- events | ||||
| 	Util.track("loader_events") | ||||
| 	for event, plugins in pairs(M.loaders.event) do | ||||
| 		if event == "VimEnter" and vim.v.vim_did_enter == 1 then | ||||
| 			M.load(plugins) | ||||
| 		else | ||||
| 			local user_event = event:match("User (.*)") | ||||
| 			vim.api.nvim_create_autocmd(user_event and "User" or event, { | ||||
| 				once = true, | ||||
| 				group = group, | ||||
| 				pattern = user_event, | ||||
| 				callback = function() | ||||
| 					Util.track("event: " .. (user_event or event)) | ||||
| 					M.load(plugins) | ||||
| 					Util.track() | ||||
| 				end, | ||||
| 			}) | ||||
| 		end | ||||
| 	end | ||||
| 	Util.track() | ||||
|   -- events | ||||
|   Util.track("loader_events") | ||||
|   for event, plugins in pairs(M.loaders.event) do | ||||
|     if event == "VimEnter" and vim.v.vim_did_enter == 1 then | ||||
|       M.load(plugins) | ||||
|     else | ||||
|       local user_event = event:match("User (.*)") | ||||
|       vim.api.nvim_create_autocmd(user_event and "User" or event, { | ||||
|         once = true, | ||||
|         group = group, | ||||
|         pattern = user_event, | ||||
|         callback = function() | ||||
|           Util.track("event: " .. (user_event or event)) | ||||
|           M.load(plugins) | ||||
|           Util.track() | ||||
|         end, | ||||
|       }) | ||||
|     end | ||||
|   end | ||||
|   Util.track() | ||||
| 
 | ||||
| 	-- filetypes | ||||
| 	Util.track("loader_filetypes") | ||||
| 	for ft, plugins in pairs(M.loaders.ft) do | ||||
| 		vim.api.nvim_create_autocmd("FileType", { | ||||
| 			once = true, | ||||
| 			pattern = ft, | ||||
| 			group = group, | ||||
| 			callback = function() | ||||
| 				Util.track("filetype: " .. ft) | ||||
| 				M.load(plugins) | ||||
| 				Util.track() | ||||
| 			end, | ||||
| 		}) | ||||
| 	end | ||||
| 	Util.track() | ||||
|   -- filetypes | ||||
|   Util.track("loader_filetypes") | ||||
|   for ft, plugins in pairs(M.loaders.ft) do | ||||
|     vim.api.nvim_create_autocmd("FileType", { | ||||
|       once = true, | ||||
|       pattern = ft, | ||||
|       group = group, | ||||
|       callback = function() | ||||
|         Util.track("filetype: " .. ft) | ||||
|         M.load(plugins) | ||||
|         Util.track() | ||||
|       end, | ||||
|     }) | ||||
|   end | ||||
|   Util.track() | ||||
| 
 | ||||
| 	-- keys | ||||
| 	Util.track("loader_keys") | ||||
| 	for keys, plugins in pairs(M.loaders.keys or {}) do | ||||
| 		vim.keymap.set("n", keys, function() | ||||
| 			vim.keymap.del("n", keys) | ||||
| 			Util.track("keys: " .. keys) | ||||
| 			M.load(plugins) | ||||
| 			vim.api.nvim_input(keys) | ||||
| 			Util.track() | ||||
| 		end) | ||||
| 	end | ||||
| 	Util.track() | ||||
|   -- keys | ||||
|   Util.track("loader_keys") | ||||
|   for keys, plugins in pairs(M.loaders.keys or {}) do | ||||
|     vim.keymap.set("n", keys, function() | ||||
|       vim.keymap.del("n", keys) | ||||
|       Util.track("keys: " .. keys) | ||||
|       M.load(plugins) | ||||
|       vim.api.nvim_input(keys) | ||||
|       Util.track() | ||||
|     end) | ||||
|   end | ||||
|   Util.track() | ||||
| 
 | ||||
| 	-- commands | ||||
| 	Util.track("loader_commands") | ||||
| 	for cmd, plugins in pairs(M.loaders.cmd or {}) do | ||||
| 		vim.api.nvim_create_user_command(cmd, function(event) | ||||
| 			vim.api.nvim_del_user_command(cmd) | ||||
| 			Util.track("cmd: " .. cmd) | ||||
| 			M.load(plugins) | ||||
| 			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 | ||||
| 				) | ||||
| 			) | ||||
| 			Util.track() | ||||
| 		end, { | ||||
| 			bang = true, | ||||
| 			nargs = "*", | ||||
| 		}) | ||||
| 	end | ||||
| 	Util.track() | ||||
|   -- commands | ||||
|   Util.track("loader_commands") | ||||
|   for cmd, plugins in pairs(M.loaders.cmd or {}) do | ||||
|     vim.api.nvim_create_user_command(cmd, function(event) | ||||
|       vim.api.nvim_del_user_command(cmd) | ||||
|       Util.track("cmd: " .. cmd) | ||||
|       M.load(plugins) | ||||
|       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 | ||||
|         ) | ||||
|       ) | ||||
|       Util.track() | ||||
|     end, { | ||||
|       bang = true, | ||||
|       nargs = "*", | ||||
|     }) | ||||
|   end | ||||
|   Util.track() | ||||
| end | ||||
| 
 | ||||
| function M.init_plugins() | ||||
| 	Util.track("loader_plugin_init") | ||||
| 	for _, plugin in ipairs(M.need_setup) do | ||||
| 		if plugin.init then | ||||
| 			Util.track(plugin.name) | ||||
| 			plugin.init() | ||||
| 			Util.track() | ||||
| 		end | ||||
| 		if plugin.opt == false then | ||||
| 			M.load(plugin) | ||||
| 		end | ||||
| 	end | ||||
| 	Util.track() | ||||
|   Util.track("loader_plugin_init") | ||||
|   for _, plugin in ipairs(M.need_setup) do | ||||
|     if plugin.init then | ||||
|       Util.track(plugin.name) | ||||
|       plugin.init() | ||||
|       Util.track() | ||||
|     end | ||||
|     if plugin.opt == false then | ||||
|       M.load(plugin) | ||||
|     end | ||||
|   end | ||||
|   Util.track() | ||||
| end | ||||
| 
 | ||||
| ---@param modname string | ||||
| function M.module(modname) | ||||
| 	local idx = modname:find(".", 1, true) or #modname + 1 | ||||
|   local idx = modname:find(".", 1, true) or #modname + 1 | ||||
| 
 | ||||
| 	while idx do | ||||
| 		local name = modname:sub(1, idx - 1) | ||||
| 		local plugins = M.loaders.module[name] | ||||
| 		if plugins then | ||||
| 			M.load(plugins) | ||||
| 			M.loaders.module[name] = nil | ||||
| 		end | ||||
| 		idx = modname:find(".", idx + 1, true) | ||||
| 	end | ||||
|   while idx do | ||||
|     local name = modname:sub(1, idx - 1) | ||||
|     local plugins = M.loaders.module[name] | ||||
|     if plugins then | ||||
|       M.load(plugins) | ||||
|       M.loaders.module[name] = nil | ||||
|     end | ||||
|     idx = modname:find(".", idx + 1, true) | ||||
|   end | ||||
| 
 | ||||
| 	---@diagnostic disable-next-line: no-unknown | ||||
| 	local mod = package.loaded[modname] | ||||
| 	if type(mod) == "table" then | ||||
| 		return function() | ||||
| 			return mod | ||||
| 		end | ||||
| 	end | ||||
|   ---@diagnostic disable-next-line: no-unknown | ||||
|   local mod = package.loaded[modname] | ||||
|   if type(mod) == "table" then | ||||
|     return function() | ||||
|       return mod | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| ---@param plugins string|LazyPlugin|string[]|LazyPlugin[] | ||||
| function M.load(plugins) | ||||
| 	if type(plugins) == "string" or plugins.name then | ||||
| 		plugins = { plugins } | ||||
| 	end | ||||
|   if type(plugins) == "string" or plugins.name then | ||||
|     plugins = { plugins } | ||||
|   end | ||||
| 
 | ||||
| 	for _, plugin in ipairs(plugins) do | ||||
| 		if type(plugin) == "string" then | ||||
| 			plugin = Config.plugins[plugin] | ||||
| 		end | ||||
| 		---@cast plugin LazyPlugin | ||||
|   for _, plugin in ipairs(plugins) do | ||||
|     if type(plugin) == "string" then | ||||
|       plugin = Config.plugins[plugin] | ||||
|     end | ||||
|     ---@cast plugin LazyPlugin | ||||
| 
 | ||||
| 		if not plugin.loaded then | ||||
| 			plugin.loaded = true | ||||
|     if not plugin.loaded then | ||||
|       plugin.loaded = true | ||||
| 
 | ||||
| 			Util.track(plugin.name) | ||||
| 			M.packadd(plugin) | ||||
|       Util.track(plugin.name) | ||||
|       M.packadd(plugin) | ||||
| 
 | ||||
| 			if plugin.requires then | ||||
| 				M.load(plugin.requires) | ||||
| 			end | ||||
|       if plugin.requires then | ||||
|         M.load(plugin.requires) | ||||
|       end | ||||
| 
 | ||||
| 			if plugin.config then | ||||
| 				plugin.config() | ||||
| 			end | ||||
|       if plugin.config then | ||||
|         plugin.config() | ||||
|       end | ||||
| 
 | ||||
| 			Util.track() | ||||
| 		end | ||||
| 	end | ||||
|       Util.track() | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| ---@param plugin LazyPlugin | ||||
| function M.packadd(plugin) | ||||
| 	if plugin.opt then | ||||
| 		vim.cmd.packadd(plugin.pack) | ||||
| 		M.source_plugin_files(plugin, true) | ||||
| 	else | ||||
| 		vim.opt.runtimepath:append(plugin.dir) | ||||
| 		M.source_plugin_files(plugin) | ||||
| 		M.source_plugin_files(plugin, true) | ||||
| 	end | ||||
|   if plugin.opt then | ||||
|     vim.cmd.packadd(plugin.pack) | ||||
|     M.source_plugin_files(plugin, true) | ||||
|   else | ||||
|     vim.opt.runtimepath:append(plugin.dir) | ||||
|     M.source_plugin_files(plugin) | ||||
|     M.source_plugin_files(plugin, true) | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| ---@param plugin LazyPlugin | ||||
| ---@param after? boolean | ||||
| function M.source_plugin_files(plugin, after) | ||||
| 	local pattern = (after and "/after" or "") .. ("/plugin/" .. "**/*.\\(vim\\|lua\\)") | ||||
|   local pattern = (after and "/after" or "") .. ("/plugin/" .. "**/*.\\(vim\\|lua\\)") | ||||
| 
 | ||||
| 	local _, entries = pcall(vim.fn.glob, plugin.dir .. "/" .. pattern, false, true) | ||||
|   local _, entries = pcall(vim.fn.glob, plugin.dir .. "/" .. pattern, false, true) | ||||
| 
 | ||||
| 	if entries then | ||||
| 		---@cast entries string[] | ||||
| 		for _, file in ipairs(entries) do | ||||
| 			vim.cmd("silent source " .. file) | ||||
| 		end | ||||
| 	end | ||||
|   if entries then | ||||
|     ---@cast entries string[] | ||||
|     for _, file in ipairs(entries) do | ||||
|       vim.cmd("silent source " .. file) | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| return M | ||||
|  |  | |||
|  | @ -11,127 +11,127 @@ local M = {} | |||
| ---@param opts? ManagerOpts | ||||
| ---@param filter? fun(plugin:LazyPlugin):boolean? | ||||
| function M.run(operation, opts, filter) | ||||
| 	opts = opts or {} | ||||
| 	local plugins = opts.plugins or Config.plugins | ||||
|   opts = opts or {} | ||||
|   local plugins = opts.plugins or Config.plugins | ||||
| 
 | ||||
| 	if opts.clear then | ||||
| 		M.clear() | ||||
| 	end | ||||
|   if opts.clear then | ||||
|     M.clear() | ||||
|   end | ||||
| 
 | ||||
| 	if opts.show then | ||||
| 		require("lazy.view").show() | ||||
| 	end | ||||
|   if opts.show then | ||||
|     require("lazy.view").show() | ||||
|   end | ||||
| 
 | ||||
| 	---@type Runner | ||||
| 	local runner = Runner.new() | ||||
|   ---@type Runner | ||||
|   local runner = Runner.new() | ||||
| 
 | ||||
| 	local on_done = function() | ||||
| 		vim.cmd([[do User LazyRender]]) | ||||
| 	end | ||||
|   local on_done = function() | ||||
|     vim.cmd([[do User LazyRender]]) | ||||
|   end | ||||
| 
 | ||||
| 	-- install missing plugins | ||||
| 	for _, plugin in pairs(plugins) do | ||||
| 		if filter == nil or filter(plugin) then | ||||
| 			runner:add(Task.new(plugin, operation)) | ||||
| 		end | ||||
| 	end | ||||
|   -- install missing plugins | ||||
|   for _, plugin in pairs(plugins) do | ||||
|     if filter == nil or filter(plugin) then | ||||
|       runner:add(Task.new(plugin, operation)) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
| 	if runner:is_empty() then | ||||
| 		return on_done() | ||||
| 	end | ||||
|   if runner:is_empty() then | ||||
|     return on_done() | ||||
|   end | ||||
| 
 | ||||
| 	vim.cmd([[do User LazyRender]]) | ||||
|   vim.cmd([[do User LazyRender]]) | ||||
| 
 | ||||
| 	-- wait for install to finish | ||||
| 	runner:wait(function() | ||||
| 		-- check if we need to do any post-install hooks | ||||
| 		for _, plugin in ipairs(runner:plugins()) do | ||||
| 			if plugin.dirty and (plugin.opt == false or plugin.run) then | ||||
| 				runner:add(Task.new(plugin, "run")) | ||||
| 			end | ||||
| 			plugin.dirty = false | ||||
| 		end | ||||
| 		-- wait for post-install to finish | ||||
| 		runner:wait(on_done) | ||||
| 	end) | ||||
|   -- wait for install to finish | ||||
|   runner:wait(function() | ||||
|     -- check if we need to do any post-install hooks | ||||
|     for _, plugin in ipairs(runner:plugins()) do | ||||
|       if plugin.dirty and (plugin.opt == false or plugin.run) then | ||||
|         runner:add(Task.new(plugin, "run")) | ||||
|       end | ||||
|       plugin.dirty = false | ||||
|     end | ||||
|     -- wait for post-install to finish | ||||
|     runner:wait(on_done) | ||||
|   end) | ||||
| 
 | ||||
| 	-- auto show if there are tasks running | ||||
| 	if opts.show == nil then | ||||
| 		require("lazy.view").show() | ||||
| 	end | ||||
|   -- auto show if there are tasks running | ||||
|   if opts.show == nil then | ||||
|     require("lazy.view").show() | ||||
|   end | ||||
| 
 | ||||
| 	if opts.wait then | ||||
| 		runner:wait() | ||||
| 	end | ||||
| 	return runner | ||||
|   if opts.wait then | ||||
|     runner:wait() | ||||
|   end | ||||
|   return runner | ||||
| end | ||||
| 
 | ||||
| ---@param opts? ManagerOpts | ||||
| function M.install(opts) | ||||
| 	---@param plugin LazyPlugin | ||||
| 	M.run("install", opts, function(plugin) | ||||
| 		return plugin.uri and not plugin.installed | ||||
| 	end) | ||||
|   ---@param plugin LazyPlugin | ||||
|   M.run("install", opts, function(plugin) | ||||
|     return plugin.uri and not plugin.installed | ||||
|   end) | ||||
| end | ||||
| 
 | ||||
| ---@param opts? ManagerOpts | ||||
| function M.update(opts) | ||||
| 	---@param plugin LazyPlugin | ||||
| 	M.run("update", opts, function(plugin) | ||||
| 		return plugin.uri and plugin.installed | ||||
| 	end) | ||||
|   ---@param plugin LazyPlugin | ||||
|   M.run("update", opts, function(plugin) | ||||
|     return plugin.uri and plugin.installed | ||||
|   end) | ||||
| end | ||||
| 
 | ||||
| ---@param opts? ManagerOpts | ||||
| function M.clean(opts) | ||||
| 	M.check_clean() | ||||
| 	---@param plugin LazyPlugin | ||||
| 	M.run("clean", opts, function(plugin) | ||||
| 		return plugin.uri == nil and plugin.installed | ||||
| 	end) | ||||
|   M.check_clean() | ||||
|   ---@param plugin LazyPlugin | ||||
|   M.run("clean", opts, function(plugin) | ||||
|     return plugin.uri == nil and plugin.installed | ||||
|   end) | ||||
| end | ||||
| 
 | ||||
| function M.check_clean() | ||||
| 	---@type table<string,boolean> | ||||
| 	local packs = {} | ||||
| 	for _, plugin in pairs(Config.plugins) do | ||||
| 		packs[plugin.pack] = plugin.opt | ||||
| 	end | ||||
|   ---@type table<string,boolean> | ||||
|   local packs = {} | ||||
|   for _, plugin in pairs(Config.plugins) do | ||||
|     packs[plugin.pack] = plugin.opt | ||||
|   end | ||||
| 
 | ||||
| 	for _, opt in ipairs({ "opt", "start" }) do | ||||
| 		local site = Config.options.package_path .. "/" .. opt | ||||
| 		if Util.file_exists(site) then | ||||
| 			for _, pack in ipairs(Util.scandir(site)) do | ||||
| 				if packs[pack.name] ~= (opt == "opt") then | ||||
| 					---@type LazyPlugin | ||||
| 					local plugin = { | ||||
| 						name = pack.name, | ||||
| 						pack = pack.name, | ||||
| 						dir = site .. "/" .. pack.name, | ||||
| 						opt = opt == "opt", | ||||
| 						installed = true, | ||||
| 					} | ||||
| 					Config.plugins[pack.name] = plugin | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
|   for _, opt in ipairs({ "opt", "start" }) do | ||||
|     local site = Config.options.package_path .. "/" .. opt | ||||
|     if Util.file_exists(site) then | ||||
|       for _, pack in ipairs(Util.scandir(site)) do | ||||
|         if packs[pack.name] ~= (opt == "opt") then | ||||
|           ---@type LazyPlugin | ||||
|           local plugin = { | ||||
|             name = pack.name, | ||||
|             pack = pack.name, | ||||
|             dir = site .. "/" .. pack.name, | ||||
|             opt = opt == "opt", | ||||
|             installed = true, | ||||
|           } | ||||
|           Config.plugins[pack.name] = plugin | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| function M.clear() | ||||
| 	for pack, plugin in pairs(Config.plugins) do | ||||
| 		-- clear finished tasks | ||||
| 		if plugin.tasks then | ||||
| 			---@param task Task | ||||
| 			plugin.tasks = vim.tbl_filter(function(task) | ||||
| 				return task.running | ||||
| 			end, plugin.tasks) | ||||
| 		end | ||||
| 		-- clear cleaned plugins | ||||
| 		if plugin.uri == nil and not plugin.installed then | ||||
| 			Config.plugins[pack] = nil | ||||
| 		end | ||||
| 	end | ||||
|   for pack, plugin in pairs(Config.plugins) do | ||||
|     -- clear finished tasks | ||||
|     if plugin.tasks then | ||||
|       ---@param task Task | ||||
|       plugin.tasks = vim.tbl_filter(function(task) | ||||
|         return task.running | ||||
|       end, plugin.tasks) | ||||
|     end | ||||
|     -- clear cleaned plugins | ||||
|     if plugin.uri == nil and not plugin.installed then | ||||
|       Config.plugins[pack] = nil | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| return M | ||||
|  |  | |||
|  | @ -29,113 +29,113 @@ local M = {} | |||
| 
 | ||||
| ---@param plugin LazyPlugin | ||||
| function M.plugin(plugin) | ||||
| 	local pkg = plugin[1] | ||||
| 	if type(pkg) ~= "string" then | ||||
| 		Util.error("Invalid plugin spec " .. vim.inspect(plugin)) | ||||
| 	end | ||||
|   local pkg = plugin[1] | ||||
|   if type(pkg) ~= "string" then | ||||
|     Util.error("Invalid plugin spec " .. vim.inspect(plugin)) | ||||
|   end | ||||
| 
 | ||||
| 	plugin.uri = plugin.uri or ("https://github.com/" .. pkg .. ".git") | ||||
| 	plugin.pack = plugin.pack or plugin.name | ||||
|   plugin.uri = plugin.uri or ("https://github.com/" .. pkg .. ".git") | ||||
|   plugin.pack = plugin.pack or plugin.name | ||||
| 
 | ||||
| 	if not plugin.name then | ||||
| 		local name = plugin.uri:gsub("%.git$", ""):match("/([^/]+)$") | ||||
| 		plugin.pack = name | ||||
| 		if not name then | ||||
| 			name = pkg:gsub("%W+", "_") | ||||
| 		end | ||||
| 		name = name:gsub("[%.%-]n?vim$", "") | ||||
| 		name = name:gsub("^n?vim[%-%.]", "") | ||||
| 		name = name:gsub("%.lua$", "") | ||||
| 		name = name:gsub("%.", "_") | ||||
| 		plugin.name = name:lower() | ||||
| 	end | ||||
|   if not plugin.name then | ||||
|     local name = plugin.uri:gsub("%.git$", ""):match("/([^/]+)$") | ||||
|     plugin.pack = name | ||||
|     if not name then | ||||
|       name = pkg:gsub("%W+", "_") | ||||
|     end | ||||
|     name = name:gsub("[%.%-]n?vim$", "") | ||||
|     name = name:gsub("^n?vim[%-%.]", "") | ||||
|     name = name:gsub("%.lua$", "") | ||||
|     name = name:gsub("%.", "_") | ||||
|     plugin.name = name:lower() | ||||
|   end | ||||
| 
 | ||||
| 	if Config.plugins[plugin.name] then | ||||
| 		for k, v in ipairs(plugin) do | ||||
| 			Config.plugins[plugin.name][k] = v | ||||
| 		end | ||||
| 		return Config.plugins[plugin.name] | ||||
| 	else | ||||
| 		Config.plugins[plugin.name] = plugin | ||||
| 	end | ||||
| 	return plugin | ||||
|   if Config.plugins[plugin.name] then | ||||
|     for k, v in ipairs(plugin) do | ||||
|       Config.plugins[plugin.name][k] = v | ||||
|     end | ||||
|     return Config.plugins[plugin.name] | ||||
|   else | ||||
|     Config.plugins[plugin.name] = plugin | ||||
|   end | ||||
|   return plugin | ||||
| end | ||||
| 
 | ||||
| ---@param plugin LazyPlugin | ||||
| function M.process_local(plugin) | ||||
| 	for _, pattern in ipairs(Config.options.plugins_local.patterns) do | ||||
| 		if plugin[1]:find(pattern) then | ||||
| 			plugin.uri = Config.options.plugins_local.path .. "/" .. plugin.pack | ||||
| 			return | ||||
| 		end | ||||
| 	end | ||||
|   for _, pattern in ipairs(Config.options.plugins_local.patterns) do | ||||
|     if plugin[1]:find(pattern) then | ||||
|       plugin.uri = Config.options.plugins_local.path .. "/" .. plugin.pack | ||||
|       return | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| ---@param plugin LazyPlugin | ||||
| function M.process_config(plugin) | ||||
| 	local name = plugin.name | ||||
| 	local modname = Config.options.plugins_config.module .. "." .. name | ||||
|   local name = plugin.name | ||||
|   local modname = Config.options.plugins_config.module .. "." .. name | ||||
| 
 | ||||
| 	local file = Config.has_config[modname] | ||||
| 	if file then | ||||
| 		-- use dofile and then add to modules. Since we know where to look, this is faster | ||||
| 		local ok, spec = pcall(Cache.load, file, modname) | ||||
| 		if ok then | ||||
| 			-- add to loaded modules | ||||
| 			if spec.requires then | ||||
| 				spec.requires = M.normalize(spec.requires) | ||||
| 			end | ||||
|   local file = Config.has_config[modname] | ||||
|   if file then | ||||
|     -- use dofile and then add to modules. Since we know where to look, this is faster | ||||
|     local ok, spec = pcall(Cache.load, file, modname) | ||||
|     if ok then | ||||
|       -- add to loaded modules | ||||
|       if spec.requires then | ||||
|         spec.requires = M.normalize(spec.requires) | ||||
|       end | ||||
| 
 | ||||
| 			---@diagnostic disable-next-line: no-unknown | ||||
| 			for k, v in pairs(spec) do | ||||
| 				---@diagnostic disable-next-line: no-unknown | ||||
| 				plugin[k] = v | ||||
| 			end | ||||
| 			M.plugin(plugin) | ||||
| 		else | ||||
| 			Util.error("Failed to load plugin config for " .. name .. "\n" .. spec) | ||||
| 		end | ||||
| 	end | ||||
|       ---@diagnostic disable-next-line: no-unknown | ||||
|       for k, v in pairs(spec) do | ||||
|         ---@diagnostic disable-next-line: no-unknown | ||||
|         plugin[k] = v | ||||
|       end | ||||
|       M.plugin(plugin) | ||||
|     else | ||||
|       Util.error("Failed to load plugin config for " .. name .. "\n" .. spec) | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| ---@param spec table | ||||
| ---@param results? LazyPlugin[] | ||||
| function M.normalize(spec, results) | ||||
| 	results = results or {} | ||||
| 	if type(spec) == "string" then | ||||
| 		table.insert(results, M.plugin({ spec }).name) | ||||
| 	elseif #spec > 1 or vim.tbl_islist(spec) then | ||||
| 		---@cast spec LazyPlugin[] | ||||
| 		for _, s in ipairs(spec) do | ||||
| 			M.normalize(s, results) | ||||
| 		end | ||||
| 	else | ||||
| 		---@cast spec LazyPlugin | ||||
| 		spec = M.plugin(spec) | ||||
|   results = results or {} | ||||
|   if type(spec) == "string" then | ||||
|     table.insert(results, M.plugin({ spec }).name) | ||||
|   elseif #spec > 1 or vim.tbl_islist(spec) then | ||||
|     ---@cast spec LazyPlugin[] | ||||
|     for _, s in ipairs(spec) do | ||||
|       M.normalize(s, results) | ||||
|     end | ||||
|   else | ||||
|     ---@cast spec LazyPlugin | ||||
|     spec = M.plugin(spec) | ||||
| 
 | ||||
| 		if spec.requires then | ||||
| 			-- TODO: fix multiple requires in different packages | ||||
| 			spec.requires = M.normalize(spec.requires) | ||||
| 		end | ||||
| 		table.insert(results, spec.name) | ||||
| 	end | ||||
| 	return results | ||||
|     if spec.requires then | ||||
|       -- TODO: fix multiple requires in different packages | ||||
|       spec.requires = M.normalize(spec.requires) | ||||
|     end | ||||
|     table.insert(results, spec.name) | ||||
|   end | ||||
|   return results | ||||
| end | ||||
| 
 | ||||
| function M.process() | ||||
| 	for _, plugin in pairs(Config.plugins) do | ||||
| 		M.process_config(plugin) | ||||
| 	end | ||||
|   for _, plugin in pairs(Config.plugins) do | ||||
|     M.process_config(plugin) | ||||
|   end | ||||
| 
 | ||||
| 	for _, plugin in pairs(Config.plugins) do | ||||
| 		if plugin.opt == nil then | ||||
| 			plugin.opt = Config.options.opt | ||||
| 		end | ||||
| 		plugin.dir = Config.options.package_path .. "/" .. (plugin.opt and "opt" or "start") .. "/" .. plugin.pack | ||||
| 		plugin.installed = Util.file_exists(plugin.dir) | ||||
| 		M.process_local(plugin) | ||||
| 		Loader.add(plugin) | ||||
| 	end | ||||
|   for _, plugin in pairs(Config.plugins) do | ||||
|     if plugin.opt == nil then | ||||
|       plugin.opt = Config.options.opt | ||||
|     end | ||||
|     plugin.dir = Config.options.package_path .. "/" .. (plugin.opt and "opt" or "start") .. "/" .. plugin.pack | ||||
|     plugin.installed = Util.file_exists(plugin.dir) | ||||
|     M.process_local(plugin) | ||||
|     Loader.add(plugin) | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| return M | ||||
|  |  | |||
|  | @ -8,179 +8,179 @@ M._profiles = { { name = "lazy" } } | |||
| ---@param name string? | ||||
| ---@param time number? | ||||
| function M.track(name, time) | ||||
| 	if name then | ||||
| 		local entry = { | ||||
| 			name = name, | ||||
| 			time = time or M.time(), | ||||
| 		} | ||||
| 		table.insert(M._profiles[#M._profiles], entry) | ||||
|   if name then | ||||
|     local entry = { | ||||
|       name = name, | ||||
|       time = time or M.time(), | ||||
|     } | ||||
|     table.insert(M._profiles[#M._profiles], entry) | ||||
| 
 | ||||
| 		if not time then | ||||
| 			table.insert(M._profiles, entry) | ||||
| 		end | ||||
| 	else | ||||
| 		local entry = table.remove(M._profiles) | ||||
| 		entry.time = M.time() - entry.time | ||||
| 	end | ||||
|     if not time then | ||||
|       table.insert(M._profiles, entry) | ||||
|     end | ||||
|   else | ||||
|     local entry = table.remove(M._profiles) | ||||
|     entry.time = M.time() - entry.time | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| function M.time() | ||||
| 	return vim.loop.hrtime() / 1000000 | ||||
|   return vim.loop.hrtime() / 1000000 | ||||
| end | ||||
| 
 | ||||
| function M.file_exists(file) | ||||
| 	return vim.loop.fs_stat(file) ~= nil | ||||
|   return vim.loop.fs_stat(file) ~= nil | ||||
| end | ||||
| 
 | ||||
| ---@param ms number | ||||
| ---@param fn fun() | ||||
| function M.throttle(ms, fn) | ||||
| 	local timer = vim.loop.new_timer() | ||||
| 	local running = false | ||||
| 	local first = true | ||||
|   local timer = vim.loop.new_timer() | ||||
|   local running = false | ||||
|   local first = true | ||||
| 
 | ||||
| 	return function() | ||||
| 		if not running then | ||||
| 			if first then | ||||
| 				fn() | ||||
| 				first = false | ||||
| 			end | ||||
|   return function() | ||||
|     if not running then | ||||
|       if first then | ||||
|         fn() | ||||
|         first = false | ||||
|       end | ||||
| 
 | ||||
| 			timer:start(ms, 0, function() | ||||
| 				running = false | ||||
| 				vim.schedule(fn) | ||||
| 			end) | ||||
|       timer:start(ms, 0, function() | ||||
|         running = false | ||||
|         vim.schedule(fn) | ||||
|       end) | ||||
| 
 | ||||
| 			running = true | ||||
| 		end | ||||
| 	end | ||||
|       running = true | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| function M.very_lazy() | ||||
| 	local function _load() | ||||
| 		vim.defer_fn(function() | ||||
| 			vim.cmd("do User VeryLazy") | ||||
| 		end, 100) | ||||
| 	end | ||||
|   local function _load() | ||||
|     vim.defer_fn(function() | ||||
|       vim.cmd("do User VeryLazy") | ||||
|     end, 100) | ||||
|   end | ||||
| 
 | ||||
| 	vim.api.nvim_create_autocmd("User", { | ||||
| 		pattern = "LazyDone", | ||||
| 		once = true, | ||||
| 		callback = function() | ||||
| 			if vim.v.vim_did_enter == 1 then | ||||
| 				_load() | ||||
| 			else | ||||
| 				vim.api.nvim_create_autocmd("VimEnter", { | ||||
| 					once = true, | ||||
| 					callback = function() | ||||
| 						_load() | ||||
| 					end, | ||||
| 				}) | ||||
| 			end | ||||
| 		end, | ||||
| 	}) | ||||
|   vim.api.nvim_create_autocmd("User", { | ||||
|     pattern = "LazyDone", | ||||
|     once = true, | ||||
|     callback = function() | ||||
|       if vim.v.vim_did_enter == 1 then | ||||
|         _load() | ||||
|       else | ||||
|         vim.api.nvim_create_autocmd("VimEnter", { | ||||
|           once = true, | ||||
|           callback = function() | ||||
|             _load() | ||||
|           end, | ||||
|         }) | ||||
|       end | ||||
|     end, | ||||
|   }) | ||||
| end | ||||
| 
 | ||||
| ---@param path string | ||||
| function M.scandir(path) | ||||
| 	---@type {name: string, path: string, type: "file"|"directory"|"link"}[] | ||||
| 	local ret = {} | ||||
|   ---@type {name: string, path: string, type: "file"|"directory"|"link"}[] | ||||
|   local ret = {} | ||||
| 
 | ||||
| 	local dir = vim.loop.fs_opendir(path, nil, 100) | ||||
|   local dir = vim.loop.fs_opendir(path, nil, 100) | ||||
| 
 | ||||
| 	if dir then | ||||
| 		---@type {name: string, path: string, type: "file"|"directory"|"link"}[] | ||||
| 		local entries = vim.loop.fs_readdir(dir) | ||||
| 		while entries do | ||||
| 			for _, entry in ipairs(entries) do | ||||
| 				entry.path = path .. "/" .. entry.name | ||||
| 				table.insert(ret, entry) | ||||
| 			end | ||||
| 			entries = vim.loop.fs_readdir(dir) | ||||
| 		end | ||||
| 		vim.loop.fs_closedir(dir) | ||||
| 	end | ||||
|   if dir then | ||||
|     ---@type {name: string, path: string, type: "file"|"directory"|"link"}[] | ||||
|     local entries = vim.loop.fs_readdir(dir) | ||||
|     while entries do | ||||
|       for _, entry in ipairs(entries) do | ||||
|         entry.path = path .. "/" .. entry.name | ||||
|         table.insert(ret, entry) | ||||
|       end | ||||
|       entries = vim.loop.fs_readdir(dir) | ||||
|     end | ||||
|     vim.loop.fs_closedir(dir) | ||||
|   end | ||||
| 
 | ||||
| 	return ret | ||||
|   return ret | ||||
| end | ||||
| 
 | ||||
| function M.profile() | ||||
| 	local lines = { "# Profile" } | ||||
|   local lines = { "# Profile" } | ||||
| 
 | ||||
| 	---@param entry LazyProfile | ||||
| 	local function _profile(entry, depth) | ||||
| 		if entry.time < 0.5 then | ||||
| 			-- Nothing | ||||
| 		end | ||||
|   ---@param entry LazyProfile | ||||
|   local function _profile(entry, depth) | ||||
|     if entry.time < 0.5 then | ||||
|       -- Nothing | ||||
|     end | ||||
| 
 | ||||
| 		table.insert( | ||||
| 			lines, | ||||
| 			("  "):rep(depth) .. "- " .. entry.name .. ": **" .. math.floor((entry.time or 0) * 100) / 100 .. "ms**" | ||||
| 		) | ||||
|     table.insert( | ||||
|       lines, | ||||
|       ("  "):rep(depth) .. "- " .. entry.name .. ": **" .. math.floor((entry.time or 0) * 100) / 100 .. "ms**" | ||||
|     ) | ||||
| 
 | ||||
| 		for _, child in ipairs(entry) do | ||||
| 			_profile(child, depth + 1) | ||||
| 		end | ||||
| 	end | ||||
|     for _, child in ipairs(entry) do | ||||
|       _profile(child, depth + 1) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
| 	for _, entry in ipairs(M._profiles[1]) do | ||||
| 		_profile(entry, 1) | ||||
| 	end | ||||
|   for _, entry in ipairs(M._profiles[1]) do | ||||
|     _profile(entry, 1) | ||||
|   end | ||||
| 
 | ||||
| 	M.markdown(lines) | ||||
|   M.markdown(lines) | ||||
| end | ||||
| 
 | ||||
| ---@return string? | ||||
| function M.head(file) | ||||
| 	local f = io.open(file) | ||||
| 	if f then | ||||
| 		f:close() | ||||
| 		return f:read() | ||||
| 	end | ||||
|   local f = io.open(file) | ||||
|   if f then | ||||
|     f:close() | ||||
|     return f:read() | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| ---@return {branch: string, hash:string}? | ||||
| function M.git_info(dir) | ||||
| 	if M.head(dir .. "/.git/HEAD") then | ||||
| 		---@type string, string | ||||
| 		local ref, branch = slot1:match("ref: (refs/heads/(.*))") | ||||
|   if M.head(dir .. "/.git/HEAD") then | ||||
|     ---@type string, string | ||||
|     local ref, branch = slot1:match("ref: (refs/heads/(.*))") | ||||
| 
 | ||||
| 		if ref then | ||||
| 			return { | ||||
| 				branch = branch, | ||||
| 				hash = M.head(dir .. "/.git/" .. ref), | ||||
| 			} | ||||
| 		end | ||||
| 	end | ||||
|     if ref then | ||||
|       return { | ||||
|         branch = branch, | ||||
|         hash = M.head(dir .. "/.git/" .. ref), | ||||
|       } | ||||
|     end | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| ---@param msg string|string[] | ||||
| ---@param opts? table | ||||
| function M.markdown(msg, opts) | ||||
| 	if type(msg) == "table" then | ||||
| 		msg = table.concat(msg, "\n") or msg | ||||
| 	end | ||||
|   if type(msg) == "table" then | ||||
|     msg = table.concat(msg, "\n") or msg | ||||
|   end | ||||
| 
 | ||||
| 	vim.notify( | ||||
| 		msg, | ||||
| 		vim.log.levels.INFO, | ||||
| 		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 | ||||
|   vim.notify( | ||||
|     msg, | ||||
|     vim.log.levels.INFO, | ||||
|     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 | ||||
| 
 | ||||
| 				vim.treesitter.start(vim.api.nvim_win_get_buf(win), "markdown") | ||||
| 			end, | ||||
| 		}, opts or {}) | ||||
| 	) | ||||
|         vim.treesitter.start(vim.api.nvim_win_get_buf(win), "markdown") | ||||
|       end, | ||||
|     }, opts or {}) | ||||
|   ) | ||||
| end | ||||
| 
 | ||||
| function M.error(msg) | ||||
| 	vim.notify(msg, vim.log.levels.ERROR, { | ||||
| 		title = "lazy.nvim", | ||||
| 	}) | ||||
|   vim.notify(msg, vim.log.levels.ERROR, { | ||||
|     title = "lazy.nvim", | ||||
|   }) | ||||
| end | ||||
| 
 | ||||
| return M | ||||
|  |  | |||
|  | @ -14,123 +14,123 @@ local Text = require("lazy.view.text") | |||
| local M = setmetatable({}, { __index = Text }) | ||||
| 
 | ||||
| function M.render_plugins(buf, win, padding) | ||||
| 	local self = setmetatable({}, { __index = M }) | ||||
| 	self._lines = {} | ||||
| 	self.buf = buf | ||||
| 	self.win = win | ||||
| 	self.padding = padding | ||||
| 	Manager.check_clean() | ||||
|   local self = setmetatable({}, { __index = M }) | ||||
|   self._lines = {} | ||||
|   self.buf = buf | ||||
|   self.win = win | ||||
|   self.padding = padding | ||||
|   Manager.check_clean() | ||||
| 
 | ||||
| 	self.plugins = vim.tbl_values(Config.plugins) | ||||
| 	table.sort(self.plugins, function(a, b) | ||||
| 		return a.name < b.name | ||||
| 	end) | ||||
|   self.plugins = vim.tbl_values(Config.plugins) | ||||
|   table.sort(self.plugins, function(a, b) | ||||
|     return a.name < b.name | ||||
|   end) | ||||
| 
 | ||||
| 	self.progress = { | ||||
| 		total = 0, | ||||
| 		done = 0, | ||||
| 	} | ||||
|   self.progress = { | ||||
|     total = 0, | ||||
|     done = 0, | ||||
|   } | ||||
| 
 | ||||
| 	for _, plugin in ipairs(self.plugins) do | ||||
| 		if plugin.tasks then | ||||
| 			for _, task in ipairs(plugin.tasks) do | ||||
| 				self.progress.total = self.progress.total + 1 | ||||
| 				if not task.running then | ||||
| 					self.progress.done = self.progress.done + 1 | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
|   for _, plugin in ipairs(self.plugins) do | ||||
|     if plugin.tasks then | ||||
|       for _, task in ipairs(plugin.tasks) do | ||||
|         self.progress.total = self.progress.total + 1 | ||||
|         if not task.running then | ||||
|           self.progress.done = self.progress.done + 1 | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
| 	self:title() | ||||
|   self:title() | ||||
| 
 | ||||
| 	for _, section in ipairs(Sections) do | ||||
| 		self:section(section) | ||||
| 	end | ||||
|   for _, section in ipairs(Sections) do | ||||
|     self:section(section) | ||||
|   end | ||||
| 
 | ||||
| 	self:trim() | ||||
| 	self:render(buf, padding) | ||||
| 	return self | ||||
|   self:trim() | ||||
|   self:render(buf, padding) | ||||
|   return self | ||||
| end | ||||
| 
 | ||||
| function M:title() | ||||
| 	self:append("Lazy", "LazyH1") | ||||
| 	if self.progress.done < self.progress.total then | ||||
| 		self:append(" (" .. self.progress.done .. "/" .. self.progress.total .. ")", "LazyMuted"):nl() | ||||
| 		self:progressbar() | ||||
| 	else | ||||
| 		self:append(" (" .. #self.plugins .. ")", "LazyMuted"):nl() | ||||
| 	end | ||||
| 	self:nl() | ||||
|   self:append("Lazy", "LazyH1") | ||||
|   if self.progress.done < self.progress.total then | ||||
|     self:append(" (" .. self.progress.done .. "/" .. self.progress.total .. ")", "LazyMuted"):nl() | ||||
|     self:progressbar() | ||||
|   else | ||||
|     self:append(" (" .. #self.plugins .. ")", "LazyMuted"):nl() | ||||
|   end | ||||
|   self:nl() | ||||
| end | ||||
| 
 | ||||
| function M:progressbar() | ||||
| 	local width = vim.api.nvim_win_get_width(self.win) - 2 * self.padding | ||||
| 	local done = math.floor((self.progress.done / self.progress.total) * width + 0.5) | ||||
| 	self:append("", { | ||||
| 		virt_text_win_col = self.padding, | ||||
| 		virt_text = { { string.rep("─", done), "LazyProgressDone" } }, | ||||
| 	}) | ||||
| 	self:append("", { | ||||
| 		virt_text_win_col = done + self.padding, | ||||
| 		virt_text = { { string.rep("─", width - done), "LazyProgressTodo" } }, | ||||
| 	}) | ||||
|   local width = vim.api.nvim_win_get_width(self.win) - 2 * self.padding | ||||
|   local done = math.floor((self.progress.done / self.progress.total) * width + 0.5) | ||||
|   self:append("", { | ||||
|     virt_text_win_col = self.padding, | ||||
|     virt_text = { { string.rep("─", done), "LazyProgressDone" } }, | ||||
|   }) | ||||
|   self:append("", { | ||||
|     virt_text_win_col = done + self.padding, | ||||
|     virt_text = { { string.rep("─", width - done), "LazyProgressTodo" } }, | ||||
|   }) | ||||
| end | ||||
| 
 | ||||
| ---@param section LazySection | ||||
| function M:section(section) | ||||
| 	---@type LazyPlugin[] | ||||
| 	local section_plugins = {} | ||||
| 	---@param plugin LazyPlugin | ||||
| 	self.plugins = vim.tbl_filter(function(plugin) | ||||
| 		if section.filter(plugin) then | ||||
| 			table.insert(section_plugins, plugin) | ||||
| 			return false | ||||
| 		end | ||||
| 		return true | ||||
| 	end, self.plugins) | ||||
|   ---@type LazyPlugin[] | ||||
|   local section_plugins = {} | ||||
|   ---@param plugin LazyPlugin | ||||
|   self.plugins = vim.tbl_filter(function(plugin) | ||||
|     if section.filter(plugin) then | ||||
|       table.insert(section_plugins, plugin) | ||||
|       return false | ||||
|     end | ||||
|     return true | ||||
|   end, self.plugins) | ||||
| 
 | ||||
| 	local count = #section_plugins | ||||
| 	if count > 0 then | ||||
| 		self:append(section.title, "LazyH2"):append(" (" .. count .. ")", "LazyMuted"):nl() | ||||
| 		for _, plugin in ipairs(section_plugins) do | ||||
| 			self:plugin(plugin) | ||||
| 		end | ||||
| 		self:nl() | ||||
| 	end | ||||
|   local count = #section_plugins | ||||
|   if count > 0 then | ||||
|     self:append(section.title, "LazyH2"):append(" (" .. count .. ")", "LazyMuted"):nl() | ||||
|     for _, plugin in ipairs(section_plugins) do | ||||
|       self:plugin(plugin) | ||||
|     end | ||||
|     self:nl() | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| ---@param plugin LazyPlugin | ||||
| function M:plugin(plugin) | ||||
| 	self:append("  - ", "LazySpecial"):append(plugin.name) | ||||
| 	if plugin.tasks then | ||||
| 		for _, task in ipairs(plugin.tasks) do | ||||
| 			if task.running then | ||||
| 				self:append(" [" .. task.type .. "] ", "Identifier") | ||||
| 				self:append(task.status, "LazyMuted") | ||||
| 			elseif task.error then | ||||
| 				local lines = vim.split(vim.trim(task.error), "\n") | ||||
| 				self:append(" [" .. task.type .. "] ", "Identifier") | ||||
| 				for l, line in ipairs(lines) do | ||||
| 					self:append(line, "LazyError") | ||||
| 					if l ~= #lines then | ||||
| 						self:nl() | ||||
| 					end | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	self:nl() | ||||
| 	-- self:details(plugin) | ||||
|   self:append("  - ", "LazySpecial"):append(plugin.name) | ||||
|   if plugin.tasks then | ||||
|     for _, task in ipairs(plugin.tasks) do | ||||
|       if task.running then | ||||
|         self:append(" [" .. task.type .. "] ", "Identifier") | ||||
|         self:append(task.status, "LazyMuted") | ||||
|       elseif task.error then | ||||
|         local lines = vim.split(vim.trim(task.error), "\n") | ||||
|         self:append(" [" .. task.type .. "] ", "Identifier") | ||||
|         for l, line in ipairs(lines) do | ||||
|           self:append(line, "LazyError") | ||||
|           if l ~= #lines then | ||||
|             self:nl() | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|   self:nl() | ||||
|   -- self:details(plugin) | ||||
| end | ||||
| 
 | ||||
| ---@param plugin LazyPlugin | ||||
| function M:details(plugin) | ||||
| 	local git = Util.git_info(plugin.dir) | ||||
| 	if git then | ||||
| 		self:append(git.branch) | ||||
| 	end | ||||
| 	self:nl() | ||||
|   local git = Util.git_info(plugin.dir) | ||||
|   if git then | ||||
|     self:append(git.branch) | ||||
|   end | ||||
|   self:nl() | ||||
| end | ||||
| 
 | ||||
| return M | ||||
|  |  | |||
							
								
								
									
										3
									
								
								stylua.toml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								stylua.toml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| indent_type = "Spaces" | ||||
| indent_width = 2 | ||||
| column_width = 120 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue