1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
local plugin_loader = {}
local utils = require "lvim.utils"
local Log = require "lvim.core.log"
local join_paths = utils.join_paths
local plugins_dir = join_paths(get_runtime_dir(), "site", "pack", "lazy", "opt")
function plugin_loader.init(opts)
opts = opts or {}
local lazy_install_dir = opts.install_path
or join_paths(vim.fn.stdpath "data", "site", "pack", "lazy", "opt", "lazy.nvim")
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
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
function plugin_loader.reset_cache()
os.remove(require("lazy.core.cache").config.path)
end
function plugin_loader.reload(spec)
local Config = require "lazy.core.config"
local lazy = require "lazy"
-- TODO: reset cache? and unload plugins?
Config.spec = spec
require("lazy.core.plugin").load(true)
require("lazy.core.plugin").update_state()
local not_installed_plugins = vim.tbl_filter(function(plugin)
return not plugin._.installed
end, Config.plugins)
require("lazy.manage").clear()
if #not_installed_plugins > 0 then
lazy.install { wait = true }
end
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 lazy_available, lazy = pcall(require, "lazy")
if not lazy_available then
Log:warn "skipping loading plugins until lazy.nvim is installed"
return
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
Log:warn "problems detected while loading plugins' configurations"
Log:trace(debug.traceback())
end
end
function plugin_loader.get_core_plugins()
local names = {}
local plugins = require "lvim.plugins"
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 names
end
function plugin_loader.sync_core_plugins()
local core_plugins = plugin_loader.get_core_plugins()
Log:trace(string.format("Syncing core plugins: [%q]", table.concat(core_plugins, ", ")))
require("lazy").sync { wait = true, plugins = core_plugins }
end
function plugin_loader.ensure_plugins()
Log:debug "calling lazy.install()"
require("lazy").install { wait = true }
end
return plugin_loader
|