Defer heavy modules and disable built-in plugins to reduce startup time

- Disable unused built-in plugins at top of init.lua

- Defer treesitter and lsp to VimEnter

- Use packadd for on-demand plugin loading (conform, lspconfig, fugitive)

- Defer clipboard initialization to avoid provider check blocking

- Wrap LSP/diagnostic keymaps in functions to defer module loading

- Defer mini.icons setup to VimEnter

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
xfy 2026-05-28 14:39:12 +08:00
parent f0c6f0a1e7
commit 5d40b6c245
5 changed files with 98 additions and 37 deletions

View File

@ -1,5 +1,35 @@
_G.nvim_start_time = (vim.uv or vim.loop).hrtime() _G.nvim_start_time = (vim.uv or vim.loop).hrtime()
-- 禁用不需要的内置插件,减少启动时 source 的 plugin 文件
vim.g.loaded_2html_plugin = 1
vim.g.loaded_getscript = 1
vim.g.loaded_getscriptPlugin = 1
vim.g.loaded_gzip = 1
vim.g.loaded_logipat = 1
vim.g.loaded_matchit = 1
vim.g.loaded_matchparen = 1
vim.g.loaded_netrw = 1
vim.g.loaded_netrwFileHandlers = 1
vim.g.loaded_netrwPlugin = 1
vim.g.loaded_netrwSettings = 1
vim.g.loaded_rrhelper = 1
vim.g.loaded_spellfile_plugin = 1
vim.g.loaded_tar = 1
vim.g.loaded_tarPlugin = 1
vim.g.loaded_tutor_mode_plugin = 1
vim.g.loaded_vimball = 1
vim.g.loaded_vimballPlugin = 1
vim.g.loaded_zip = 1
vim.g.loaded_zipPlugin = 1
vim.g.loaded_rplugin = 1
vim.g.loaded_tohtml = 1
vim.g.loaded_syntax = 1
vim.g.loaded_synmenu = 1
vim.g.loaded_optwin = 1
vim.g.loaded_compiler = 1
vim.g.loaded_bugreport = 1
vim.g.loaded_ftplugin = 1
require("vim._core.ui2").enable({}) require("vim._core.ui2").enable({})
require("options") require("options")
@ -7,8 +37,15 @@ require("keymaps")
require("autocmds") require("autocmds")
require("usercmds") require("usercmds")
require("pack") require("pack")
require("treesitter")
require("lsp")
vim.g.moonflyTransparent = true vim.g.moonflyTransparent = true
vim.cmd("colorscheme catppuccin-mocha") vim.cmd("colorscheme catppuccin-mocha")
-- 延迟加载 heavy 模块,避免阻塞启动
vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
require("treesitter")
require("lsp")
end,
})

View File

@ -2,6 +2,7 @@ local lazy = require("lazy")
-- conform.nvim - BufWritePre 懒加载 -- conform.nvim - BufWritePre 懒加载
local function setup_conform() local function setup_conform()
vim.cmd.packadd("conform.nvim")
local function biome_or_prettier() local function biome_or_prettier()
if vim.fs.find({ "biome.json", "biome.jsonc" }, { upward = true, stop = vim.uv.os_homedir() })[1] then if vim.fs.find({ "biome.json", "biome.jsonc" }, { upward = true, stop = vim.uv.os_homedir() })[1] then
return { "biome-check", "biome", stop_after_first = true } return { "biome-check", "biome", stop_after_first = true }
@ -44,6 +45,7 @@ end)
-- mason + LSP 配置延迟到 VimEnter避免启动时加载 -- mason + LSP 配置延迟到 VimEnter避免启动时加载
lazy.on_event("lsp", "VimEnter", "*", function() lazy.on_event("lsp", "VimEnter", "*", function()
vim.cmd.packadd("nvim-lspconfig")
require("mason").setup() require("mason").setup()
local capabilities = vim.lsp.protocol.make_client_capabilities() local capabilities = vim.lsp.protocol.make_client_capabilities()
@ -73,15 +75,15 @@ lazy.on_event("lsp", "VimEnter", "*", function()
}) })
end) end)
-- LSP keymaps -- LSP keymaps(用 function 包装延迟 vim.lsp/vim.diagnostic 模块加载)
vim.keymap.set("n", "gd", vim.lsp.buf.definition, { desc = "Go to definition" }) vim.keymap.set("n", "gd", function() vim.lsp.buf.definition() end, { desc = "Go to definition" })
vim.keymap.set("n", "gh", vim.lsp.buf.hover, { desc = "Hover" }) vim.keymap.set("n", "gh", function() vim.lsp.buf.hover() end, { desc = "Hover" })
vim.keymap.set("n", "<leader>fm", function() vim.keymap.set("n", "<leader>fm", function()
lazy.load("conform", setup_conform) lazy.load("conform", setup_conform)
require("conform").format({ lsp_fallback = true }) require("conform").format({ lsp_fallback = true })
end, { desc = "Format buffer" }) end, { desc = "Format buffer" })
vim.keymap.set("n", "df", vim.diagnostic.open_float, { desc = "Show line diagnostics" }) vim.keymap.set("n", "df", function() vim.diagnostic.open_float() end, { desc = "Show line diagnostics" })
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, { desc = "Code action" }) vim.keymap.set("n", "<leader>ca", function() vim.lsp.buf.code_action() end, { desc = "Code action" })
local diagnostic_goto = function(next, severity) local diagnostic_goto = function(next, severity)
return function() return function()
@ -100,4 +102,9 @@ vim.keymap.set("n", "[e", diagnostic_goto(false, "ERROR"), { desc = "Prev Error"
vim.keymap.set("n", "]w", diagnostic_goto(true, "WARN"), { desc = "Next Warning" }) vim.keymap.set("n", "]w", diagnostic_goto(true, "WARN"), { desc = "Next Warning" })
vim.keymap.set("n", "[w", diagnostic_goto(false, "WARN"), { desc = "Prev Warning" }) vim.keymap.set("n", "[w", diagnostic_goto(false, "WARN"), { desc = "Prev Warning" })
vim.diagnostic.config({ virtual_text = true }) vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
vim.diagnostic.config({ virtual_text = true })
end,
})

View File

@ -28,7 +28,10 @@ vim.opt.undofile = true
vim.opt.completeopt = "menuone,noselect,fuzzy,nosort" vim.opt.completeopt = "menuone,noselect,fuzzy,nosort"
vim.opt.shortmess:append("c") vim.opt.shortmess:append("c")
vim.opt.clipboard:append("unnamedplus") -- 延迟初始化 clipboard避免启动时 provider 检测阻塞SSH 环境尤其明显)
vim.schedule(function()
vim.opt.clipboard:append("unnamedplus")
end)
vim.opt.isfname:append("@-@") vim.opt.isfname:append("@-@")
vim.opt.scrolloff = 8 vim.opt.scrolloff = 8

View File

@ -8,7 +8,7 @@ vim.pack.add({
"https://github.com/mason-org/mason.nvim", "https://github.com/mason-org/mason.nvim",
"https://github.com/stevearc/conform.nvim", "https://github.com/stevearc/conform.nvim",
"https://github.com/tpope/vim-fugitive", "https://github.com/tpope/vim-fugitive",
}) }, { load = false })
-- mini.starter 启动页 -- mini.starter 启动页
local starter = require("mini.starter") local starter = require("mini.starter")
@ -90,10 +90,14 @@ end, function()
MiniFiles.reveal_cwd() MiniFiles.reveal_cwd()
end, { desc = "Toggle into currently opened file" }) end, { desc = "Toggle into currently opened file" })
-- mini.icons - 启动时加载 -- mini.icons - 首次需要时加载VimEnter 后延迟)
lazy.load("icons", function() vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
require("mini.icons").setup() require("mini.icons").setup()
end) lazy._loaded["icons"] = true
end,
})
-- mini.notify - 首次 vim.notify 调用时加载 -- mini.notify - 首次 vim.notify 调用时加载
vim.notify = function(msg, level, opts) vim.notify = function(msg, level, opts)
@ -140,7 +144,7 @@ lazy.on_keys("pick", "<leader>fw", "n", load_pick, function()
require("mini.pick").builtin.grep_live() require("mini.pick").builtin.grep_live()
end, { desc = "Live grep in project" }) end, { desc = "Live grep in project" })
vim.keymap.set("n", "<leader>ds", vim.diagnostic.setloclist, { desc = "LSP diagnostic loclist" }) vim.keymap.set("n", "<leader>ds", function() vim.diagnostic.setloclist() end, { desc = "LSP diagnostic loclist" })
lazy.on_keys("pick", "<leader>sk", "n", load_pick, function() lazy.on_keys("pick", "<leader>sk", "n", load_pick, function()
require("mini.extra").pickers.keymaps() require("mini.extra").pickers.keymaps()
@ -312,11 +316,15 @@ vim.keymap.set("n", "<leader>gD", function()
end, { desc = "Git file history" }) end, { desc = "Git file history" })
-- vim-fugitive - 按键触发 -- vim-fugitive - 按键触发
lazy.on_keys("fugitive", "<leader>gg", "n", nil, function() local function load_fugitive()
vim.cmd.packadd("vim-fugitive")
end
lazy.on_keys("fugitive", "<leader>gg", "n", load_fugitive, function()
vim.cmd("tabnew | Git | only") vim.cmd("tabnew | Git | only")
end, { desc = "Fugitive Full Page New Tab" }) end, { desc = "Fugitive Full Page New Tab" })
lazy.on_keys("fugitive", "<leader>gd", "n", nil, function() lazy.on_keys("fugitive", "<leader>gd", "n", load_fugitive, function()
vim.cmd("Gvdiffsplit") vim.cmd("Gvdiffsplit")
end, { desc = "Git diff split" }) end, { desc = "Git diff split" })

View File

@ -1,5 +1,3 @@
local treesitter = require("nvim-treesitter")
local ensure_installed = { local ensure_installed = {
"lua", "lua",
"vim", "vim",
@ -26,12 +24,18 @@ local ensure_installed = {
"make", "make",
} }
-- 延迟安装 parser避免启动时阻塞 vim.api.nvim_create_autocmd("VimEnter", {
vim.defer_fn(function() once = true,
treesitter.install(ensure_installed) callback = function()
end, 100) vim.cmd.packadd("nvim-treesitter")
local treesitter = require("nvim-treesitter")
vim.api.nvim_create_autocmd("FileType", { -- 延迟安装 parser避免阻塞
vim.defer_fn(function()
treesitter.install(ensure_installed)
end, 100)
vim.api.nvim_create_autocmd("FileType", {
pattern = "*", pattern = "*",
callback = function(args) callback = function(args)
local buf = args.buf local buf = args.buf
@ -49,4 +53,6 @@ vim.api.nvim_create_autocmd("FileType", {
pcall(vim.treesitter.start, buf, lang) pcall(vim.treesitter.start, buf, lang)
end, end,
})
end,
}) })