Use VimEnter time for more accurate startup duration in starter dashboard

Prioritize _G.nvim_vimenter_done (recorded when runtime plugins and ShaDa
are fully loaded) for the startup time displayed in mini.starter's footer,
falling back to _G.nvim_init_done if unavailable. This makes the reported
duration much closer to what --startuptime measures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
xfy 2026-05-28 16:05:59 +08:00
parent ae765f7438
commit 0747abefee
2 changed files with 18 additions and 5 deletions

View File

@ -86,3 +86,7 @@ vim.g.moonflyTransparent = true
-- 应用 colorscheme。catppuccin-mocha 的定义在 colors/catppuccin-mocha.lua 中。
-- 该文件是一个精简版,只包含 Mocha 变体的调色板和高亮组定义。
vim.cmd("colorscheme catppuccin-mocha")
-- 记录 init.lua 执行完成时间(含 colorscheme供启动页展示更接近 --startuptime 的耗时。
-- pack.lua 中的 footer 优先使用 VimEnter 时间,回退到此时间点。
_G.nvim_init_done = (vim.uv or vim.loop).hrtime()

View File

@ -27,9 +27,15 @@ local lazy = require("lazy")
local pick = require("pick")
require("git")
-- 缓存启动耗时。pack.lua 在 init.lua 末尾加载,此时核心配置已全部就绪,
-- 计算出的时间就是真正的启动耗时。避免 starter 页脚在后续渲染时数值持续增长。
local startup_ms = ((vim.uv or vim.loop).hrtime() - _G.nvim_start_time) / 1e6
-- 在 VimEnter 时记录完整启动时间(此时 runtime 插件、ShaDa 等已加载完毕),
-- 使启动页显示的耗时更接近 --startuptime 的口径。
-- starter 的 autoopen 在 VimEnter 之后渲染footer 可以安全读取此值。
vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
_G.nvim_vimenter_done = (vim.uv or vim.loop).hrtime()
end,
})
-- ---------------------------------------------------------------------------
-- 插件安装声明
@ -99,8 +105,11 @@ starter.setup({
-- 已加载的模块数(动态统计,包含直接加载和懒加载)
local loaded = vim.tbl_count(require("lazy")._loaded)
local total = #all_modules
-- startup_ms 在 pack.lua 加载时一次性计算,避免后续渲染时数值变化
local text = string.format(" %d/%d modules | %.0f ms", loaded, total, startup_ms)
-- 优先使用 VimEnter 时间runtime 插件、ShaDa 等已加载,最接近 --startuptime
-- 回退到 init.lua 完成时间,最后回退到当前时间(理论上不会走到)
local end_time = _G.nvim_vimenter_done or _G.nvim_init_done or (vim.uv or vim.loop).hrtime()
local ms = (end_time - _G.nvim_start_time) / 1e6
local text = string.format(" %d/%d modules | %.0f ms", loaded, total, ms)
local text_width = vim.fn.strdisplaywidth(text)
-- 计算左填充空格数以实现居中
local pad = math.floor((max_header_width - text_width) / 2)