perf: added support for LazyFile event that properly loads file based plugins without blocking the ui

This commit is contained in:
Folke Lemaitre 2023-10-04 10:45:10 +02:00
parent f15dd301e5
commit 936d74bb61
No known key found for this signature in database
GPG key ID: 41F8B1FBACAE2040
8 changed files with 58 additions and 14 deletions

View file

@ -124,8 +124,9 @@ function M.setup(opts)
M.load("autocmds") M.load("autocmds")
end end
local group = vim.api.nvim_create_augroup("LazyVim", { clear = true })
vim.api.nvim_create_autocmd("User", { vim.api.nvim_create_autocmd("User", {
group = vim.api.nvim_create_augroup("LazyVim", { clear = true }), group = group,
pattern = "VeryLazy", pattern = "VeryLazy",
callback = function() callback = function()
if lazy_autocmds then if lazy_autocmds then
@ -135,6 +136,8 @@ function M.setup(opts)
end, end,
}) })
M.lazy_file()
require("lazy.core.util").try(function() require("lazy.core.util").try(function()
if type(M.colorscheme) == "function" then if type(M.colorscheme) == "function" then
M.colorscheme() M.colorscheme()
@ -150,6 +153,40 @@ function M.setup(opts)
}) })
end end
-- Properly load file based plugins without blocking the UI
function M.lazy_file()
local events = {} ---@type {event: string, pattern?: string, buf: number, data?: any}[]
local function load()
if #events == 0 then
return
end
vim.api.nvim_del_augroup_by_name("lazy_file")
vim.api.nvim_exec_autocmds("User", { pattern = "LazyFile", modeline = false })
for _, event in ipairs(events) do
vim.api.nvim_exec_autocmds(event.event, {
pattern = event.pattern,
modeline = false,
buffer = event.buf,
data = event.data,
})
end
events = {}
end
-- schedule wrap so that nested autocmds are executed
-- and the UI can continue rendering without blocking
load = vim.schedule_wrap(load)
vim.api.nvim_create_autocmd({ "BufReadPost", "BufWritePost", "BufNewFile" }, {
group = vim.api.nvim_create_augroup("lazy_file", { clear = true }),
callback = function(event)
table.insert(events, event)
load()
end,
})
end
---@param range? string ---@param range? string
function M.has(range) function M.has(range)
local Semver = require("lazy.manage.semver") local Semver = require("lazy.manage.semver")
@ -214,6 +251,14 @@ function M.init()
end end
return add(self, plugin, ...) return add(self, plugin, ...)
end end
-- Add support for the LazyFile event
local Event = require("lazy.core.handler.event")
local _event = Event._event
---@diagnostic disable-next-line: duplicate-set-field
Event._event = function(self, value)
return value == "LazyFile" and "User LazyFile" or _event(self, value)
end
end end
end end

View file

@ -310,7 +310,7 @@ return {
-- hunks in a commit. -- hunks in a commit.
{ {
"lewis6991/gitsigns.nvim", "lewis6991/gitsigns.nvim",
event = { "BufReadPre", "BufNewFile" }, event = "LazyFile",
opts = { opts = {
signs = { signs = {
add = { text = "" }, add = { text = "" },
@ -349,7 +349,7 @@ return {
-- instances. -- instances.
{ {
"RRethy/vim-illuminate", "RRethy/vim-illuminate",
event = { "BufReadPost", "BufNewFile" }, event = "LazyFile",
opts = { opts = {
delay = 200, delay = 200,
large_file_cutoff = 2000, large_file_cutoff = 2000,
@ -440,7 +440,7 @@ return {
{ {
"folke/todo-comments.nvim", "folke/todo-comments.nvim",
cmd = { "TodoTrouble", "TodoTelescope" }, cmd = { "TodoTrouble", "TodoTelescope" },
event = { "BufReadPost", "BufNewFile" }, event = "LazyFile",
config = true, config = true,
-- stylua: ignore -- stylua: ignore
keys = { keys = {

View file

@ -45,6 +45,6 @@ return {
{ {
"Civitasv/cmake-tools.nvim", "Civitasv/cmake-tools.nvim",
opts = {}, opts = {},
event = "BufRead", event = "LazyFile",
}, },
} }

View file

@ -1,7 +1,7 @@
return { return {
{ {
"mfussenegger/nvim-lint", "mfussenegger/nvim-lint",
event = "BufReadPost", event = "LazyFile",
opts = { opts = {
-- Event to trigger linters -- Event to trigger linters
events = { "BufWritePost", "BufReadPost", "InsertLeave" }, events = { "BufWritePost", "BufReadPost", "InsertLeave" },
@ -43,7 +43,6 @@ return {
end end
function M.lint() function M.lint()
local lint = require("lint")
local names = lint.linters_by_ft[vim.bo.filetype] or {} local names = lint.linters_by_ft[vim.bo.filetype] or {}
local ctx = { filename = vim.api.nvim_buf_get_name(0) } local ctx = { filename = vim.api.nvim_buf_get_name(0) }
ctx.dirname = vim.fn.fnamemodify(ctx.filename, ":h") ctx.dirname = vim.fn.fnamemodify(ctx.filename, ":h")

View file

@ -5,7 +5,7 @@ M.hl = {}
M.plugin = { M.plugin = {
"echasnovski/mini.hipatterns", "echasnovski/mini.hipatterns",
event = "BufReadPre", event = "LazyFile",
opts = function() opts = function()
local hi = require("mini.hipatterns") local hi = require("mini.hipatterns")
return { return {

View file

@ -2,7 +2,7 @@ return {
-- lspconfig -- lspconfig
{ {
"neovim/nvim-lspconfig", "neovim/nvim-lspconfig",
event = { "BufReadPre", "BufNewFile" }, event = "LazyFile",
dependencies = { dependencies = {
{ "folke/neoconf.nvim", cmd = "Neoconf", config = false, dependencies = { "nvim-lspconfig" } }, { "folke/neoconf.nvim", cmd = "Neoconf", config = false, dependencies = { "nvim-lspconfig" } },
{ "folke/neodev.nvim", opts = {} }, { "folke/neodev.nvim", opts = {} },
@ -203,7 +203,7 @@ return {
-- formatters -- formatters
{ {
"nvimtools/none-ls.nvim", "nvimtools/none-ls.nvim",
event = { "BufReadPre", "BufNewFile" }, event = "LazyFile",
dependencies = { "mason.nvim" }, dependencies = { "mason.nvim" },
opts = function() opts = function()
local nls = require("null-ls") local nls = require("null-ls")

View file

@ -6,7 +6,7 @@ return {
"nvim-treesitter/nvim-treesitter", "nvim-treesitter/nvim-treesitter",
version = false, -- last release is way too old and doesn't work on Windows version = false, -- last release is way too old and doesn't work on Windows
build = ":TSUpdate", build = ":TSUpdate",
event = { "BufReadPost", "BufNewFile" }, event = { "LazyFile", "VeryLazy" },
dependencies = { dependencies = {
{ {
"nvim-treesitter/nvim-treesitter-textobjects", "nvim-treesitter/nvim-treesitter-textobjects",

View file

@ -53,7 +53,7 @@ return {
-- tabs, which include filetype icons and close buttons. -- tabs, which include filetype icons and close buttons.
{ {
"akinsho/bufferline.nvim", "akinsho/bufferline.nvim",
event = "VeryLazy", event = "LazyFile",
keys = { keys = {
{ "<leader>bp", "<Cmd>BufferLineTogglePin<CR>", desc = "Toggle pin" }, { "<leader>bp", "<Cmd>BufferLineTogglePin<CR>", desc = "Toggle pin" },
{ "<leader>bP", "<Cmd>BufferLineGroupClose ungrouped<CR>", desc = "Delete non-pinned buffers" }, { "<leader>bP", "<Cmd>BufferLineGroupClose ungrouped<CR>", desc = "Delete non-pinned buffers" },
@ -166,7 +166,7 @@ return {
-- indent guides for Neovim -- indent guides for Neovim
{ {
"lukas-reineke/indent-blankline.nvim", "lukas-reineke/indent-blankline.nvim",
event = { "BufReadPost", "BufNewFile" }, event = "LazyFile",
opts = { opts = {
indent = { indent = {
char = "", char = "",
@ -197,7 +197,7 @@ return {
{ {
"echasnovski/mini.indentscope", "echasnovski/mini.indentscope",
version = false, -- wait till new 0.7.0 release to put it back on semver version = false, -- wait till new 0.7.0 release to put it back on semver
event = { "BufReadPre", "BufNewFile" }, event = "LazyFile",
opts = { opts = {
-- symbol = "▏", -- symbol = "▏",
symbol = "", symbol = "",