diff options
Diffstat (limited to 'lua/lvim/plugin-loader.lua')
-rw-r--r-- | lua/lvim/plugin-loader.lua | 226 |
1 files changed, 104 insertions, 122 deletions
diff --git a/lua/lvim/plugin-loader.lua b/lua/lvim/plugin-loader.lua index 4f1fe7c4..5949236c 100644 --- a/lua/lvim/plugin-loader.lua +++ b/lua/lvim/plugin-loader.lua @@ -3,128 +3,127 @@ local plugin_loader = {} local utils = require "lvim.utils" local Log = require "lvim.core.log" local join_paths = utils.join_paths -local in_headless = #vim.api.nvim_list_uis() == 0 --- we need to reuse this outside of init() -local compile_path = join_paths(get_config_dir(), "plugin", "packer_compiled.lua") -local snapshot_path = join_paths(get_cache_dir(), "snapshots") -local default_snapshot = join_paths(get_lvim_base_dir(), "snapshots", "default.json") +local plugins_dir = join_paths(get_runtime_dir(), "site", "pack", "lazy", "opt") function plugin_loader.init(opts) opts = opts or {} - local install_path = opts.install_path - or join_paths(vim.fn.stdpath "data", "site", "pack", "packer", "start", "packer.nvim") + local lazy_install_dir = opts.install_path + or join_paths(vim.fn.stdpath "data", "site", "pack", "lazy", "opt", "lazy.nvim") - local max_jobs = 100 - if vim.fn.has "mac" == 1 then - max_jobs = 50 + if not utils.is_directory(lazy_install_dir) then + print "Initializing first time setup" + local core_plugins_dir = join_paths(get_lvim_base_dir(), "plugins") + if utils.is_directory(core_plugins_dir) then + vim.fn.mkdir(plugins_dir, "p") + vim.loop.fs_rmdir(plugins_dir) + require("lvim.utils").fs_copy(core_plugins_dir, plugins_dir) + else + vim.fn.system { + "git", + "clone", + "--filter=blob:none", + "--branch=stable", + "https://github.com/folke/lazy.nvim.git", + lazy_install_dir, + } + + local default_snapshot_path = join_paths(get_lvim_base_dir(), "snapshots", "default.json") + local snapshot = assert(vim.fn.json_decode(vim.fn.readfile(default_snapshot_path))) + vim.fn.system { + "git", + "-C", + lazy_install_dir, + "checkout", + snapshot["lazy.nvim"].commit, + } + end end - local init_opts = { - package_root = opts.package_root or join_paths(vim.fn.stdpath "data", "site", "pack"), - compile_path = compile_path, - snapshot_path = snapshot_path, - max_jobs = max_jobs, - log = { level = "warn" }, - git = { - clone_timeout = 120, - }, - display = { - open_fn = function() - return require("packer.util").float { border = "rounded" } - end, + vim.opt.runtimepath:append(lazy_install_dir) + vim.opt.runtimepath:append(join_paths(plugins_dir, "*")) + + local lazy_cache = require "lazy.core.cache" + lazy_cache.setup { + performance = { + cache = { + enabled = true, + path = join_paths(get_cache_dir(), "lazy", "cache"), + }, }, } + -- HACK: Don't allow lazy to call setup second time + lazy_cache.setup = function() end +end - if in_headless then - init_opts.display = nil - init_opts.git.clone_timeout = 300 - end +function plugin_loader.reset_cache() + os.remove(require("lazy.core.cache").config.path) +end - if not utils.is_directory(install_path) then - print "Initializing first time setup" - print "Installing packer" - print(vim.fn.system { "git", "clone", "--depth", "1", "https://github.com/wbthomason/packer.nvim", install_path }) - vim.cmd "packadd packer.nvim" - end +function plugin_loader.reload(spec) + local Config = require "lazy.core.config" + local lazy = require "lazy" - local status_ok, packer = pcall(require, "packer") - if status_ok then - packer.on_complete = vim.schedule_wrap(function() - require("lvim.utils.hooks").run_on_packer_complete() - end) - packer.init(init_opts) - end -end + -- TODO: reset cache? and unload plugins? --- packer expects a space separated list -local function pcall_packer_command(cmd, kwargs) - local status_ok, msg = pcall(function() - require("packer")[cmd](unpack(kwargs or {})) - end) - if not status_ok then - Log:warn(cmd .. " failed with: " .. vim.inspect(msg)) - Log:trace(vim.inspect(vim.fn.eval "v:errmsg")) - end -end + Config.spec = spec -function plugin_loader.cache_clear() - if not utils.is_file(compile_path) then - return - end - if vim.fn.delete(compile_path) == 0 then - Log:debug "deleted packer_compiled.lua" - end -end + require("lazy.core.plugin").load(true) + require("lazy.core.plugin").update_state() -function plugin_loader.compile() - Log:debug "calling packer.compile()" - vim.api.nvim_create_autocmd("User", { - pattern = "PackerCompileDone", - once = true, - callback = function() - if utils.is_file(compile_path) then - Log:debug "finished compiling packer_compiled.lua" - end - end, - }) - pcall_packer_command "compile" -end + local not_installed_plugins = vim.tbl_filter(function(plugin) + return not plugin._.installed + end, Config.plugins) -function plugin_loader.recompile() - plugin_loader.cache_clear() - plugin_loader.compile() -end + require("lazy.manage").clear() -function plugin_loader.reload(configurations) - _G.packer_plugins = _G.packer_plugins or {} - for k, v in pairs(_G.packer_plugins) do - if k ~= "packer.nvim" then - _G.packer_plugins[v] = nil - end + if #not_installed_plugins > 0 then + lazy.install { wait = true } end - plugin_loader.load(configurations) - plugin_loader.ensure_plugins() + if #Config.to_clean > 0 then + -- TODO: set show to true when lazy shows something useful on clean + lazy.clean { wait = true, show = false } + end end function plugin_loader.load(configurations) Log:debug "loading plugins configuration" - local packer_available, packer = pcall(require, "packer") - if not packer_available then - Log:warn "skipping loading plugins until Packer is installed" + local lazy_available, lazy = pcall(require, "lazy") + if not lazy_available then + Log:warn "skipping loading plugins until lazy.nvim is installed" return end - local status_ok, _ = xpcall(function() - packer.reset() - packer.startup(function(use) - for _, plugins in ipairs(configurations) do - for _, plugin in ipairs(plugins) do - use(plugin) - end - end - end) + + -- remove plugins from rtp before loading lazy, so that all plugins won't be loaded on startup + vim.opt.runtimepath:remove(join_paths(plugins_dir, "*")) + + local status_ok = xpcall(function() + local opts = { + install = { + missing = true, + colorscheme = { lvim.colorscheme, "lunar", "habamax" }, + }, + ui = { + border = "rounded", + }, + root = plugins_dir, + git = { + timeout = 120, + }, + lockfile = join_paths(get_config_dir(), "lazy-lock.json"), + performance = { + rtp = { + reset = false, + }, + }, + readme = { + root = join_paths(get_runtime_dir(), "lazy", "readme"), + }, + } + + lazy.setup(configurations, opts) end, debug.traceback) if not status_ok then @@ -134,43 +133,26 @@ function plugin_loader.load(configurations) end function plugin_loader.get_core_plugins() - local list = {} + local names = {} local plugins = require "lvim.plugins" - for _, item in pairs(plugins) do - if not item.disable then - table.insert(list, item[1]:match "/(%S*)") + local get_name = require("lazy.core.plugin").Spec.get_name + for _, spec in pairs(plugins) do + if spec.enabled == true or spec.enabled == nil then + table.insert(names, get_name(spec[1])) end end - return list -end - -function plugin_loader.load_snapshot(snapshot_file) - snapshot_file = snapshot_file or default_snapshot - if not in_headless then - vim.notify("Syncing core plugins is in progress..", vim.log.levels.INFO, { title = "lvim" }) - end - Log:debug(string.format("Using snapshot file [%s]", snapshot_file)) - local core_plugins = plugin_loader.get_core_plugins() - require("packer").rollback(snapshot_file, unpack(core_plugins)) + return names end function plugin_loader.sync_core_plugins() - plugin_loader.cache_clear() local core_plugins = plugin_loader.get_core_plugins() Log:trace(string.format("Syncing core plugins: [%q]", table.concat(core_plugins, ", "))) - pcall_packer_command("sync", core_plugins) + require("lazy").sync { wait = true, plugins = core_plugins } end function plugin_loader.ensure_plugins() - vim.api.nvim_create_autocmd("User", { - pattern = "PackerComplete", - once = true, - callback = function() - plugin_loader.compile() - end, - }) - Log:debug "calling packer.install()" - pcall_packer_command "install" + Log:debug "calling lazy.install()" + require("lazy").install { wait = true } end return plugin_loader |