2022-11-20 21:33:47 +00:00
|
|
|
local M = {}
|
|
|
|
|
|
|
|
---@alias LazyProfile {name: string, time: number, [number]:LazyProfile}
|
|
|
|
|
|
|
|
---@type LazyProfile[]
|
|
|
|
M._profiles = { { name = "lazy" } }
|
|
|
|
|
|
|
|
---@param name string?
|
|
|
|
---@param time number?
|
|
|
|
function M.track(name, time)
|
2022-11-20 21:34:55 +00:00
|
|
|
if name then
|
|
|
|
local entry = {
|
|
|
|
name = name,
|
2022-11-23 15:10:16 +00:00
|
|
|
time = time or vim.loop.hrtime(),
|
2022-11-20 21:34:55 +00:00
|
|
|
}
|
|
|
|
table.insert(M._profiles[#M._profiles], entry)
|
|
|
|
|
|
|
|
if not time then
|
|
|
|
table.insert(M._profiles, entry)
|
|
|
|
end
|
2022-11-23 15:10:16 +00:00
|
|
|
return entry
|
2022-11-20 21:34:55 +00:00
|
|
|
else
|
2022-11-24 21:03:00 +00:00
|
|
|
---@type LazyProfile
|
2022-11-20 21:34:55 +00:00
|
|
|
local entry = table.remove(M._profiles)
|
2022-11-23 15:10:16 +00:00
|
|
|
entry.time = vim.loop.hrtime() - entry.time
|
|
|
|
return entry
|
2022-11-20 21:34:55 +00:00
|
|
|
end
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
|
|
|
|
2022-11-25 21:50:17 +00:00
|
|
|
function M.try(fn, msg)
|
|
|
|
-- error handler
|
|
|
|
local error_handler = function(err)
|
|
|
|
local Config = require("lazy.core.config")
|
|
|
|
local trace = {}
|
|
|
|
local level = 1
|
|
|
|
while true do
|
|
|
|
local info = debug.getinfo(level, "Sln")
|
|
|
|
if not info then
|
|
|
|
break
|
|
|
|
end
|
|
|
|
if info.what == "Lua" and not info.source:find("lazy.nvim") then
|
|
|
|
local source = info.source:sub(2)
|
|
|
|
if source:find(Config.options.package_path, 1, true) == 1 then
|
|
|
|
source = source:sub(#Config.options.package_path + 1):gsub("^/opt/", ""):gsub("^/start/", "")
|
|
|
|
end
|
|
|
|
source = vim.fn.fnamemodify(source, ":p:~:.")
|
|
|
|
local line = " - " .. source .. ":" .. info.currentline
|
|
|
|
if info.name then
|
|
|
|
line = line .. " _in_ **" .. info.name .. "**"
|
|
|
|
end
|
|
|
|
table.insert(trace, line)
|
|
|
|
end
|
|
|
|
level = level + 1
|
|
|
|
end
|
|
|
|
vim.schedule(function()
|
|
|
|
msg = msg .. "\n\n" .. err
|
|
|
|
if #trace > 0 then
|
|
|
|
msg = msg .. "\n\n# stacktrace:\n" .. table.concat(trace, "\n")
|
|
|
|
end
|
|
|
|
M.error(msg)
|
|
|
|
end)
|
|
|
|
return err
|
|
|
|
end
|
|
|
|
|
|
|
|
---@type boolean, any
|
|
|
|
local ok, result = xpcall(fn, error_handler)
|
|
|
|
return ok and result or nil
|
|
|
|
end
|
|
|
|
|
2022-11-25 14:35:40 +00:00
|
|
|
-- Fast implementation to check if a table is a list
|
|
|
|
---@param t table
|
|
|
|
function M.is_list(t)
|
|
|
|
local i = 0
|
|
|
|
---@diagnostic disable-next-line: no-unknown
|
|
|
|
for _ in pairs(t) do
|
|
|
|
i = i + 1
|
|
|
|
if t[i] == nil then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
2022-11-20 21:33:47 +00:00
|
|
|
function M.very_lazy()
|
2022-11-20 21:34:55 +00:00
|
|
|
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,
|
|
|
|
})
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
|
|
|
|
2022-11-24 21:03:00 +00:00
|
|
|
---@alias FileType "file"|"directory"|"link"
|
|
|
|
---@alias DirEntry {name: string, path: string, type: FileType}[]
|
2022-11-20 21:33:47 +00:00
|
|
|
---@param path string
|
2022-11-24 21:03:00 +00:00
|
|
|
---@param fn fun(path: string, name:string, type:FileType)
|
|
|
|
function M.scandir(path, fn)
|
2022-11-20 21:34:55 +00:00
|
|
|
local dir = vim.loop.fs_opendir(path, nil, 100)
|
|
|
|
if dir then
|
2022-11-24 21:03:00 +00:00
|
|
|
local entries = vim.loop.fs_readdir(dir) --[[@as DirEntry[]]
|
2022-11-20 21:34:55 +00:00
|
|
|
while entries do
|
|
|
|
for _, entry in ipairs(entries) do
|
|
|
|
entry.path = path .. "/" .. entry.name
|
2022-11-24 21:03:00 +00:00
|
|
|
fn(path .. "/" .. entry.name, entry.name, entry.type)
|
2022-11-20 21:34:55 +00:00
|
|
|
end
|
|
|
|
entries = vim.loop.fs_readdir(dir)
|
|
|
|
end
|
|
|
|
vim.loop.fs_closedir(dir)
|
|
|
|
end
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
2022-11-24 21:03:00 +00:00
|
|
|
---@param path string
|
|
|
|
---@param fn fun(path: string, name:string, type:FileType)
|
|
|
|
function M.ls(path, fn)
|
|
|
|
local handle = vim.loop.fs_scandir(path)
|
|
|
|
while handle do
|
|
|
|
local name, t = vim.loop.fs_scandir_next(handle)
|
|
|
|
if not name then
|
|
|
|
break
|
2022-11-20 21:34:55 +00:00
|
|
|
end
|
2022-11-24 21:03:00 +00:00
|
|
|
fn(path .. "/" .. name, name, t)
|
2022-11-20 21:34:55 +00:00
|
|
|
end
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
|
|
|
|
2022-11-24 21:03:00 +00:00
|
|
|
---@param path string
|
|
|
|
---@param fn fun(path: string, name:string, type:FileType)
|
|
|
|
function M.walk(path, fn)
|
|
|
|
M.ls(path, function(child, name, type)
|
|
|
|
if type == "directory" then
|
|
|
|
M.walk(child, fn)
|
2022-11-20 21:34:55 +00:00
|
|
|
end
|
2022-11-24 21:03:00 +00:00
|
|
|
fn(child, name, type)
|
|
|
|
end)
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
|
|
|
|
2022-11-24 21:03:00 +00:00
|
|
|
---@param root string
|
|
|
|
---@param fn fun(modname:string, modpath:string)
|
|
|
|
function M.lsmod(root, fn)
|
|
|
|
M.ls(root, function(path, name, type)
|
|
|
|
if type == "file" and name:sub(-4) == ".lua" then
|
|
|
|
fn(name:sub(1, -5), path)
|
|
|
|
elseif type == "directory" and vim.loop.fs_stat(path .. "/init.lua") then
|
|
|
|
fn(name, path .. "/init.lua")
|
|
|
|
end
|
|
|
|
end)
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
|
|
|
|
2022-11-25 21:50:17 +00:00
|
|
|
function M.notify(msg, level)
|
|
|
|
vim.notify(msg, level, {
|
|
|
|
on_open = function(win)
|
|
|
|
vim.wo[win].conceallevel = 3
|
|
|
|
vim.wo[win].concealcursor = ""
|
|
|
|
vim.wo[win].spell = false
|
|
|
|
local buf = vim.api.nvim_win_get_buf(win)
|
|
|
|
vim.bo[buf].filetype = "markdown"
|
|
|
|
end,
|
2022-11-20 21:34:55 +00:00
|
|
|
title = "lazy.nvim",
|
|
|
|
})
|
2022-11-20 21:33:47 +00:00
|
|
|
end
|
|
|
|
|
2022-11-25 21:50:17 +00:00
|
|
|
function M.error(msg)
|
|
|
|
M.notify(msg, vim.log.levels.ERROR)
|
|
|
|
end
|
|
|
|
|
2022-11-22 21:35:06 +00:00
|
|
|
function M.info(msg)
|
2022-11-25 21:50:17 +00:00
|
|
|
M.notify(msg, vim.log.levels.INFO)
|
2022-11-22 21:35:06 +00:00
|
|
|
end
|
|
|
|
|
2022-11-20 21:33:47 +00:00
|
|
|
return M
|