2022-11-22 20:28:08 +00:00
|
|
|
local Util = require("lazy.core.util")
|
|
|
|
local Config = require("lazy.core.config")
|
2022-12-03 22:15:50 +00:00
|
|
|
local Handler = require("lazy.core.handler")
|
2022-11-20 21:33:47 +00:00
|
|
|
|
|
|
|
local M = {}
|
|
|
|
|
2022-12-27 16:24:40 +00:00
|
|
|
local DEFAULT_PRIORITY = 50
|
|
|
|
|
2022-11-23 15:07:57 +00:00
|
|
|
---@type LazyPlugin[]
|
|
|
|
M.loading = {}
|
2022-12-02 08:22:15 +00:00
|
|
|
M.init_done = false
|
2022-12-14 20:03:53 +00:00
|
|
|
---@type table<string,true>
|
2022-12-17 16:35:45 +00:00
|
|
|
M.disabled_rtp_plugins = { packer_compiled = true }
|
2022-11-20 21:33:47 +00:00
|
|
|
|
2022-12-01 10:06:44 +00:00
|
|
|
function M.setup()
|
2022-12-01 12:33:55 +00:00
|
|
|
-- setup handlers
|
|
|
|
Util.track("handlers")
|
2022-12-01 10:06:44 +00:00
|
|
|
Handler.setup()
|
2022-12-01 12:33:55 +00:00
|
|
|
Util.track()
|
2022-12-02 08:22:15 +00:00
|
|
|
|
2022-12-14 20:03:53 +00:00
|
|
|
for _, file in ipairs(Config.options.performance.rtp.disabled_plugins) do
|
|
|
|
M.disabled_rtp_plugins[file] = true
|
|
|
|
end
|
|
|
|
|
2022-12-22 12:49:00 +00:00
|
|
|
vim.api.nvim_create_autocmd("ColorSchemePre", {
|
|
|
|
callback = function(event)
|
|
|
|
M.colorscheme(event.match)
|
|
|
|
end,
|
|
|
|
})
|
|
|
|
|
2022-12-23 06:35:44 +00:00
|
|
|
-- 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
|
2022-12-01 10:06:44 +00:00
|
|
|
end
|
|
|
|
|
2022-12-14 20:03:53 +00:00
|
|
|
-- Startup sequence
|
|
|
|
-- 1. load any start plugins and do init
|
|
|
|
function M.startup()
|
|
|
|
Util.track({ start = "startup" })
|
|
|
|
|
2022-12-21 13:34:31 +00:00
|
|
|
-- load filetype.lua first since plugins might depend on that
|
2022-12-20 22:35:06 +00:00
|
|
|
M.source(vim.env.VIMRUNTIME .. "/filetype.lua")
|
2022-12-20 19:32:37 +00:00
|
|
|
|
2022-12-21 13:34:31 +00:00
|
|
|
-- backup original rtp
|
|
|
|
local rtp = vim.opt.rtp:get()
|
2022-12-14 20:03:53 +00:00
|
|
|
|
2022-12-22 17:46:43 +00:00
|
|
|
-- 1. 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" })
|
2022-12-26 21:59:02 +00:00
|
|
|
Util.try(function()
|
|
|
|
plugin.init(plugin)
|
|
|
|
end, "Failed to run `init` for **" .. plugin.name .. "**")
|
2022-12-22 17:46:43 +00:00
|
|
|
Util.track()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
Util.track()
|
|
|
|
|
|
|
|
-- 2. load start plugin
|
2022-12-14 20:03:53 +00:00
|
|
|
Util.track({ start = "start" })
|
2022-12-27 16:24:40 +00:00
|
|
|
for _, plugin in ipairs(M.get_start_plugins()) do
|
|
|
|
-- plugin may be loaded by another plugin in the meantime
|
|
|
|
if not plugin._.loaded then
|
2022-12-14 20:03:53 +00:00
|
|
|
M.load(plugin, { start = "start" })
|
|
|
|
end
|
|
|
|
end
|
|
|
|
Util.track()
|
|
|
|
|
2022-12-22 17:46:43 +00:00
|
|
|
-- 3. load plugins from rtp, excluding after
|
2022-12-21 13:34:31 +00:00
|
|
|
Util.track({ start = "rtp plugins" })
|
|
|
|
for _, path in ipairs(rtp) do
|
|
|
|
if not path:find("after/?$") then
|
|
|
|
M.packadd(path)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
Util.track()
|
|
|
|
|
2022-12-22 17:46:43 +00:00
|
|
|
-- 4. load after plugins
|
2022-12-15 22:23:18 +00:00
|
|
|
Util.track({ start = "after" })
|
2022-12-20 22:35:06 +00:00
|
|
|
for _, path in ipairs(vim.opt.rtp:get()) do
|
2022-12-15 22:23:18 +00:00
|
|
|
if path:find("after/?$") then
|
|
|
|
M.source_runtime(path, "plugin")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
Util.track()
|
|
|
|
|
2022-12-16 12:06:52 +00:00
|
|
|
M.init_done = true
|
|
|
|
|
2022-12-14 20:03:53 +00:00
|
|
|
Util.track()
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
|
|
|
|
2022-12-27 16:24:40 +00:00
|
|
|
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
|
|
|
|
|
2022-11-26 20:29:40 +00:00
|
|
|
---@class Loader
|
2022-11-20 21:33:47 +00:00
|
|
|
---@param plugins string|LazyPlugin|string[]|LazyPlugin[]
|
2022-11-23 15:07:57 +00:00
|
|
|
---@param reason {[string]:string}
|
2022-12-01 10:06:44 +00:00
|
|
|
function M.load(plugins, reason)
|
2022-11-26 18:33:38 +00:00
|
|
|
---@diagnostic disable-next-line: cast-local-type
|
2022-12-02 08:22:15 +00:00
|
|
|
plugins = (type(plugins) == "string" or plugins.name) and { plugins } or plugins
|
2022-11-22 20:12:33 +00:00
|
|
|
---@cast plugins (string|LazyPlugin)[]
|
2022-11-26 18:33:38 +00:00
|
|
|
|
2022-12-05 13:45:50 +00:00
|
|
|
for _, plugin in pairs(plugins) do
|
2022-12-25 13:06:41 +00:00
|
|
|
if type(plugin) == "string" then
|
2022-12-28 16:56:20 +00:00
|
|
|
if Config.plugins[plugin] then
|
2022-12-25 13:06:41 +00:00
|
|
|
plugin = Config.plugins[plugin]
|
2022-12-28 16:56:20 +00:00
|
|
|
else
|
|
|
|
Util.error("Plugin " .. plugin .. " not found")
|
|
|
|
plugin = nil
|
2022-12-25 13:06:41 +00:00
|
|
|
end
|
|
|
|
end
|
2022-12-28 16:56:20 +00:00
|
|
|
if plugin and not plugin._.loaded then
|
|
|
|
M._load(plugin, reason)
|
2022-12-26 08:35:19 +00:00
|
|
|
end
|
2022-12-28 16:56:20 +00:00
|
|
|
end
|
|
|
|
end
|
2022-12-26 08:35:19 +00:00
|
|
|
|
2022-12-28 16:56:20 +00:00
|
|
|
---@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
|
2022-11-20 21:33:47 +00:00
|
|
|
|
2022-12-28 16:56:20 +00:00
|
|
|
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
|
2022-11-23 15:07:57 +00:00
|
|
|
|
2022-12-28 16:56:20 +00:00
|
|
|
---@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
|
2022-11-20 21:33:47 +00:00
|
|
|
|
2022-12-28 16:56:20 +00:00
|
|
|
table.insert(M.loading, plugin)
|
2022-12-02 08:22:15 +00:00
|
|
|
|
2022-12-28 16:56:20 +00:00
|
|
|
Util.track({ plugin = plugin.name, start = reason.start })
|
|
|
|
Handler.disable(plugin)
|
2022-11-20 21:33:47 +00:00
|
|
|
|
2022-12-28 16:56:20 +00:00
|
|
|
vim.opt.runtimepath:prepend(plugin.dir)
|
|
|
|
local after = plugin.dir .. "/after"
|
|
|
|
if vim.loop.fs_stat(after) then
|
|
|
|
vim.opt.runtimepath:append(after)
|
|
|
|
end
|
2022-11-20 21:33:47 +00:00
|
|
|
|
2022-12-28 16:56:20 +00:00
|
|
|
if plugin.dependencies then
|
|
|
|
Util.try(function()
|
|
|
|
M.load(plugin.dependencies, {})
|
|
|
|
end, "Failed to load deps for " .. plugin.name)
|
|
|
|
end
|
2022-11-20 21:33:47 +00:00
|
|
|
|
2022-12-28 16:56:20 +00:00
|
|
|
M.packadd(plugin.dir)
|
|
|
|
if plugin.config then
|
|
|
|
M.config(plugin)
|
2022-11-20 21:34:55 +00:00
|
|
|
end
|
2022-12-28 16:56:20 +00:00
|
|
|
|
|
|
|
plugin._.loaded.time = Util.track().time
|
|
|
|
table.remove(M.loading)
|
|
|
|
vim.schedule(function()
|
|
|
|
vim.cmd("do User LazyRender")
|
|
|
|
end)
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
|
|
|
|
2022-12-22 21:41:44 +00:00
|
|
|
--- runs plugin config
|
|
|
|
---@param plugin LazyPlugin
|
|
|
|
function M.config(plugin)
|
|
|
|
local fn
|
|
|
|
if type(plugin.config) == "function" then
|
2022-12-26 21:59:02 +00:00
|
|
|
fn = function()
|
|
|
|
plugin.config(plugin)
|
|
|
|
end
|
2022-12-22 21:41:44 +00:00
|
|
|
else
|
|
|
|
local normname = Util.normname(plugin.name)
|
|
|
|
---@type table<string, string>
|
|
|
|
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()
|
2022-12-28 16:43:14 +00:00
|
|
|
local opts = plugin.config
|
|
|
|
if opts == true then
|
|
|
|
opts = nil
|
|
|
|
end
|
|
|
|
require(mods[1]).setup(opts)
|
2022-12-22 21:41:44 +00:00
|
|
|
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
|
|
|
|
|
2022-12-14 20:03:53 +00:00
|
|
|
---@param path string
|
|
|
|
function M.packadd(path)
|
|
|
|
M.source_runtime(path, "plugin")
|
|
|
|
M.ftdetect(path)
|
2022-12-03 16:43:55 +00:00
|
|
|
if M.init_done then
|
2022-12-14 20:03:53 +00:00
|
|
|
M.source_runtime(path, "after/plugin")
|
2022-12-02 08:22:15 +00:00
|
|
|
end
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
|
|
|
|
2022-12-14 20:03:53 +00:00
|
|
|
---@param path string
|
|
|
|
function M.ftdetect(path)
|
2022-12-05 13:45:50 +00:00
|
|
|
vim.cmd("augroup filetypedetect")
|
2022-12-14 20:03:53 +00:00
|
|
|
M.source_runtime(path, "ftdetect")
|
2022-12-05 13:45:50 +00:00
|
|
|
vim.cmd("augroup END")
|
|
|
|
end
|
|
|
|
|
2022-12-03 16:43:55 +00:00
|
|
|
---@param ... string
|
|
|
|
function M.source_runtime(...)
|
|
|
|
local dir = table.concat({ ... }, "/")
|
2022-12-17 12:03:34 +00:00
|
|
|
---@type string[]
|
|
|
|
local files = {}
|
2022-12-14 20:03:53 +00:00
|
|
|
Util.walk(dir, function(path, name, t)
|
|
|
|
local ext = name:sub(-3)
|
|
|
|
name = name:sub(1, -5)
|
2022-12-21 15:27:56 +00:00
|
|
|
if (t == "file" or t == "link") and (ext == "lua" or ext == "vim") and not M.disabled_rtp_plugins[name] then
|
2022-12-17 12:03:34 +00:00
|
|
|
files[#files + 1] = path
|
2022-11-20 21:34:55 +00:00
|
|
|
end
|
2022-11-24 21:04:23 +00:00
|
|
|
end)
|
2022-12-17 12:03:34 +00:00
|
|
|
-- plugin files are sourced alphabetically per directory
|
|
|
|
table.sort(files)
|
|
|
|
for _, path in ipairs(files) do
|
2022-12-20 22:35:06 +00:00
|
|
|
M.source(path)
|
2022-12-17 12:03:34 +00:00
|
|
|
end
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
|
|
|
|
2022-12-20 22:35:06 +00:00
|
|
|
function M.source(path)
|
|
|
|
Util.track({ runtime = path })
|
|
|
|
Util.try(function()
|
|
|
|
vim.cmd("silent source " .. path)
|
|
|
|
end, "Failed to source `" .. path .. "`")
|
|
|
|
Util.track()
|
|
|
|
end
|
|
|
|
|
2022-12-22 12:49:00 +00:00
|
|
|
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
|
|
|
|
|
2022-11-20 21:33:47 +00:00
|
|
|
return M
|