mirror of
https://github.com/LazyVim/LazyVim.git
synced 2025-06-25 18:28:50 +02:00
perf(startup): render a file opened from the cmdline as soon as possible and get rid of lazy_file logic
This commit is contained in:
parent
b29d169afb
commit
965a469ca8
1 changed files with 27 additions and 66 deletions
|
@ -3,7 +3,6 @@ local Plugin = require("lazy.core.plugin")
|
||||||
---@class lazyvim.util.plugin
|
---@class lazyvim.util.plugin
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
M.use_lazy_file = true
|
|
||||||
M.lazy_file_events = { "BufReadPost", "BufNewFile", "BufWritePre" }
|
M.lazy_file_events = { "BufReadPost", "BufNewFile", "BufWritePre" }
|
||||||
|
|
||||||
---@type table<string, string>
|
---@type table<string, string>
|
||||||
|
@ -55,76 +54,38 @@ function M.extra_idx(name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Properly load file based plugins without blocking the UI
|
|
||||||
function M.lazy_file()
|
function M.lazy_file()
|
||||||
M.use_lazy_file = M.use_lazy_file and vim.fn.argc(-1) > 0
|
-- This autocmd will only trigger when a file was loaded from the cmdline.
|
||||||
|
-- It will render the file as quickly as possible.
|
||||||
|
vim.api.nvim_create_autocmd("BufReadPost", {
|
||||||
|
once = true,
|
||||||
|
callback = function(event)
|
||||||
|
-- Skip if we already entered vim
|
||||||
|
if vim.v.vim_did_enter == 1 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Try to guess the filetype (may change later on during Neovim startup)
|
||||||
|
local ft = vim.filetype.match({ buf = event.buf })
|
||||||
|
if ft then
|
||||||
|
-- Add treesitter highlights and fallback to syntax
|
||||||
|
local lang = vim.treesitter.language.get_lang(ft)
|
||||||
|
if not (lang and pcall(vim.treesitter.start, event.buf, lang)) then
|
||||||
|
vim.bo[event.buf].syntax = ft
|
||||||
|
vim.notify("Could not load treesitter for " .. ft, "warn", { title = "LazyVim" })
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Trigger early redraw
|
||||||
|
vim.cmd([[redraw]])
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
-- Add support for the LazyFile event
|
-- Add support for the LazyFile event
|
||||||
local Event = require("lazy.core.handler.event")
|
local Event = require("lazy.core.handler.event")
|
||||||
|
|
||||||
if M.use_lazy_file then
|
Event.mappings.LazyFile = { id = "LazyFile", event = M.lazy_file_events }
|
||||||
-- We'll handle delayed execution of events ourselves
|
Event.mappings["User LazyFile"] = Event.mappings.LazyFile
|
||||||
Event.mappings.LazyFile = { id = "LazyFile", event = "User", pattern = "LazyFile" }
|
|
||||||
Event.mappings["User LazyFile"] = Event.mappings.LazyFile
|
|
||||||
else
|
|
||||||
-- Don't delay execution of LazyFile events, but let lazy know about the mapping
|
|
||||||
Event.mappings.LazyFile = { id = "LazyFile", event = { "BufReadPost", "BufNewFile", "BufWritePre" } }
|
|
||||||
Event.mappings["User LazyFile"] = Event.mappings.LazyFile
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local events = {} ---@type {event: string, buf: number, data?: any}[]
|
|
||||||
|
|
||||||
local done = false
|
|
||||||
local function load()
|
|
||||||
if #events == 0 or done then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
done = true
|
|
||||||
vim.api.nvim_del_augroup_by_name("lazy_file")
|
|
||||||
|
|
||||||
---@type table<string,string[]>
|
|
||||||
local skips = {}
|
|
||||||
for _, event in ipairs(events) do
|
|
||||||
local augroups = Event.get_augroups(event.event)
|
|
||||||
local groups = vim.tbl_filter(function(t)
|
|
||||||
return not vim.tbl_contains({ t }, "filetypedetect")
|
|
||||||
end, augroups)
|
|
||||||
skips[event.event] = skips[event.event] or groups
|
|
||||||
end
|
|
||||||
|
|
||||||
vim.api.nvim_exec_autocmds("User", { pattern = "LazyFile", modeline = false })
|
|
||||||
for _, event in ipairs(events) do
|
|
||||||
if vim.api.nvim_buf_is_valid(event.buf) then
|
|
||||||
Event.trigger({
|
|
||||||
event = event.event,
|
|
||||||
exclude = skips[event.event],
|
|
||||||
data = event.data,
|
|
||||||
buf = event.buf,
|
|
||||||
})
|
|
||||||
if vim.bo[event.buf].filetype then
|
|
||||||
Event.trigger({
|
|
||||||
event = "FileType",
|
|
||||||
buf = event.buf,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
vim.api.nvim_exec_autocmds("CursorMoved", { modeline = false })
|
|
||||||
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(M.lazy_file_events, {
|
|
||||||
group = vim.api.nvim_create_augroup("lazy_file", { clear = true }),
|
|
||||||
callback = function(event)
|
|
||||||
table.insert(events, event)
|
|
||||||
load()
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.fix_imports()
|
function M.fix_imports()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue