172 lines
4.4 KiB
Lua
172 lines
4.4 KiB
Lua
|
local LazyUtil = require("lazy.core.util")
|
||
|
|
||
|
---@class lazyvim.util: LazyUtilCore
|
||
|
---@field ui lazyvim.util.ui
|
||
|
---@field lsp lazyvim.util.lsp
|
||
|
---@field root lazyvim.util.root
|
||
|
---@field telescope lazyvim.util.telescope
|
||
|
---@field terminal lazyvim.util.terminal
|
||
|
---@field toggle lazyvim.util.toggle
|
||
|
---@field format lazyvim.util.format
|
||
|
---@field plugin lazyvim.util.plugin
|
||
|
---@field extras lazyvim.util.extras
|
||
|
---@field inject lazyvim.util.inject
|
||
|
---@field news lazyvim.util.news
|
||
|
---@field json lazyvim.util.json
|
||
|
---@field lualine lazyvim.util.lualine
|
||
|
local M = {}
|
||
|
|
||
|
---@type table<string, string|string[]>
|
||
|
local deprecated = {
|
||
|
get_clients = "lsp",
|
||
|
on_attach = "lsp",
|
||
|
on_rename = "lsp",
|
||
|
root_patterns = { "root", "patterns" },
|
||
|
get_root = { "root", "get" },
|
||
|
float_term = { "terminal", "open" },
|
||
|
toggle_diagnostics = { "toggle", "diagnostics" },
|
||
|
toggle_number = { "toggle", "number" },
|
||
|
fg = "ui",
|
||
|
}
|
||
|
|
||
|
setmetatable(M, {
|
||
|
__index = function(t, k)
|
||
|
if LazyUtil[k] then
|
||
|
return LazyUtil[k]
|
||
|
end
|
||
|
local dep = deprecated[k]
|
||
|
if dep then
|
||
|
local mod = type(dep) == "table" and dep[1] or dep
|
||
|
local key = type(dep) == "table" and dep[2] or k
|
||
|
M.deprecate([[require("lazyvim.util").]] .. k, [[require("lazyvim.util").]] .. mod .. "." .. key)
|
||
|
---@diagnostic disable-next-line: no-unknown
|
||
|
t[mod] = require("lazyvim.util." .. mod) -- load here to prevent loops
|
||
|
return t[mod][key]
|
||
|
end
|
||
|
---@diagnostic disable-next-line: no-unknown
|
||
|
t[k] = require("lazyvim.util." .. k)
|
||
|
return t[k]
|
||
|
end,
|
||
|
})
|
||
|
|
||
|
function M.is_win()
|
||
|
return vim.loop.os_uname().sysname:find("Windows") ~= nil
|
||
|
end
|
||
|
|
||
|
---@param plugin string
|
||
|
function M.has(plugin)
|
||
|
return require("lazy.core.config").spec.plugins[plugin] ~= nil
|
||
|
end
|
||
|
|
||
|
---@param fn fun()
|
||
|
function M.on_very_lazy(fn)
|
||
|
vim.api.nvim_create_autocmd("User", {
|
||
|
pattern = "VeryLazy",
|
||
|
callback = function()
|
||
|
fn()
|
||
|
end,
|
||
|
})
|
||
|
end
|
||
|
|
||
|
---@param name string
|
||
|
function M.opts(name)
|
||
|
local plugin = require("lazy.core.config").plugins[name]
|
||
|
if not plugin then
|
||
|
return {}
|
||
|
end
|
||
|
local Plugin = require("lazy.core.plugin")
|
||
|
return Plugin.values(plugin, "opts", false)
|
||
|
end
|
||
|
|
||
|
function M.deprecate(old, new)
|
||
|
M.warn(("`%s` is deprecated. Please use `%s` instead"):format(old, new), {
|
||
|
title = "LazyVim",
|
||
|
once = true,
|
||
|
stacktrace = true,
|
||
|
stacklevel = 6,
|
||
|
})
|
||
|
end
|
||
|
|
||
|
-- delay notifications till vim.notify was replaced or after 500ms
|
||
|
function M.lazy_notify()
|
||
|
local notifs = {}
|
||
|
local function temp(...)
|
||
|
table.insert(notifs, vim.F.pack_len(...))
|
||
|
end
|
||
|
|
||
|
local orig = vim.notify
|
||
|
vim.notify = temp
|
||
|
|
||
|
local timer = vim.loop.new_timer()
|
||
|
local check = assert(vim.loop.new_check())
|
||
|
|
||
|
local replay = function()
|
||
|
timer:stop()
|
||
|
check:stop()
|
||
|
if vim.notify == temp then
|
||
|
vim.notify = orig -- put back the original notify if needed
|
||
|
end
|
||
|
vim.schedule(function()
|
||
|
---@diagnostic disable-next-line: no-unknown
|
||
|
for _, notif in ipairs(notifs) do
|
||
|
vim.notify(vim.F.unpack_len(notif))
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
-- wait till vim.notify has been replaced
|
||
|
check:start(function()
|
||
|
if vim.notify ~= temp then
|
||
|
replay()
|
||
|
end
|
||
|
end)
|
||
|
-- or if it took more than 500ms, then something went wrong
|
||
|
timer:start(500, 0, replay)
|
||
|
end
|
||
|
|
||
|
---@param name string
|
||
|
---@param fn fun(name:string)
|
||
|
function M.on_load(name, fn)
|
||
|
local Config = require("lazy.core.config")
|
||
|
if Config.plugins[name] and Config.plugins[name]._.loaded then
|
||
|
fn(name)
|
||
|
else
|
||
|
vim.api.nvim_create_autocmd("User", {
|
||
|
pattern = "LazyLoad",
|
||
|
callback = function(event)
|
||
|
if event.data == name then
|
||
|
fn(name)
|
||
|
return true
|
||
|
end
|
||
|
end,
|
||
|
})
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Wrapper around vim.keymap.set that will
|
||
|
-- not create a keymap if a lazy key handler exists.
|
||
|
-- It will also set `silent` to true by default.
|
||
|
function M.safe_keymap_set(mode, lhs, rhs, opts)
|
||
|
local keys = require("lazy.core.handler").handlers.keys
|
||
|
---@cast keys LazyKeysHandler
|
||
|
local modes = type(mode) == "string" and { mode } or mode
|
||
|
|
||
|
---@param m string
|
||
|
modes = vim.tbl_filter(function(m)
|
||
|
return not (keys.have and keys:have(lhs, m))
|
||
|
end, modes)
|
||
|
|
||
|
-- do not create the keymap if a lazy keys handler exists
|
||
|
if #modes > 0 then
|
||
|
opts = opts or {}
|
||
|
opts.silent = opts.silent ~= false
|
||
|
if opts.remap and not vim.g.vscode then
|
||
|
---@diagnostic disable-next-line: no-unknown
|
||
|
opts.remap = nil
|
||
|
end
|
||
|
vim.keymap.set(modes, lhs, rhs, opts)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return M
|