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 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