From 3f0d338fb85ec594486f53a091e390a49c7627ed Mon Sep 17 00:00:00 2001 From: xfy Date: Fri, 29 May 2026 10:49:31 +0800 Subject: [PATCH] feat: ex catppuccin --- colors/ex-catppuccin-mocha.lua | 237 +++++++++++++++++++++++++++++++++ init.lua | 2 +- lua/lazy.lua | 35 +++++ lua/pack.lua | 38 ++++++ nvim-pack-lock.json | 4 + 5 files changed, 315 insertions(+), 1 deletion(-) create mode 100644 colors/ex-catppuccin-mocha.lua diff --git a/colors/ex-catppuccin-mocha.lua b/colors/ex-catppuccin-mocha.lua new file mode 100644 index 0000000..2f5df34 --- /dev/null +++ b/colors/ex-catppuccin-mocha.lua @@ -0,0 +1,237 @@ +-- This file is generated by ex-colors. The credit goes to the authors and contributors of the original colorscheme mytheme-mocha. +vim.api.nvim_set_var("colors_name", "ex-mytheme-mocha") +vim.api.nvim_set_hl(0, "@attribute", { link = "Constant" }) +vim.api.nvim_set_hl(0, "@comment.documentation", { link = "Comment" }) +vim.api.nvim_set_hl(0, "@comment.error", { bg = 15961000, fg = 1973806 }) +vim.api.nvim_set_hl(0, "@comment.note", { bg = 9024762, fg = 1973806 }) +vim.api.nvim_set_hl(0, "@comment.todo", { bg = 15912397, fg = 1973806 }) +vim.api.nvim_set_hl(0, "@comment.warning", { bg = 16376495, fg = 1973806 }) +vim.api.nvim_set_hl(0, "@constant.builtin", { fg = 16429959 }) +vim.api.nvim_set_hl(0, "@constant.macro", { link = "Macro" }) +vim.api.nvim_set_hl(0, "@constructor", { fg = 16376495 }) +vim.api.nvim_set_hl(0, "@diff.delta", { link = "diffChanged" }) +vim.api.nvim_set_hl(0, "@diff.minus", { link = "diffRemoved" }) +vim.api.nvim_set_hl(0, "@diff.plus", { link = "diffAdded" }) +vim.api.nvim_set_hl(0, "@function.builtin", { fg = 16429959 }) +vim.api.nvim_set_hl(0, "@function.call", { link = "Function" }) +vim.api.nvim_set_hl(0, "@function.macro", { fg = 16106215 }) +vim.api.nvim_set_hl(0, "@function.method", { link = "Function" }) +vim.api.nvim_set_hl(0, "@function.method.call", { link = "Function" }) +vim.api.nvim_set_hl(0, "@keyword.conditional", { link = "Conditional" }) +vim.api.nvim_set_hl(0, "@keyword.conditional.ternary", { link = "Operator" }) +vim.api.nvim_set_hl(0, "@keyword.coroutine", { link = "Keyword" }) +vim.api.nvim_set_hl(0, "@keyword.debug", { link = "Exception" }) +vim.api.nvim_set_hl(0, "@keyword.directive", { link = "PreProc" }) +vim.api.nvim_set_hl(0, "@keyword.directive.define", { link = "Define" }) +vim.api.nvim_set_hl(0, "@keyword.exception", { link = "Exception" }) +vim.api.nvim_set_hl(0, "@keyword.function", { fg = 13346551 }) +vim.api.nvim_set_hl(0, "@keyword.import", { link = "Include" }) +vim.api.nvim_set_hl(0, "@keyword.modifier", { link = "Keyword" }) +vim.api.nvim_set_hl(0, "@keyword.operator", { fg = 13346551 }) +vim.api.nvim_set_hl(0, "@keyword.repeat", { link = "Repeat" }) +vim.api.nvim_set_hl(0, "@keyword.return", { fg = 13346551 }) +vim.api.nvim_set_hl(0, "@keyword.type", { link = "Keyword" }) +vim.api.nvim_set_hl(0, "@lsp.type.enumMember", { fg = 9757397 }) +vim.api.nvim_set_hl(0, "@markup.heading", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "@markup.italic", { cterm = { italic = true }, fg = 15961000, italic = true }) +vim.api.nvim_set_hl(0, "@markup.link", { fg = 11845374 }) +vim.api.nvim_set_hl(0, "@markup.link.label", { fg = 11845374 }) +vim.api.nvim_set_hl( + 0, + "@markup.link.url", + { cterm = { italic = true, underline = true }, fg = 9024762, italic = true, underline = true } +) +vim.api.nvim_set_hl(0, "@markup.list", { fg = 9757397 }) +vim.api.nvim_set_hl(0, "@markup.list.checked", { fg = 10937249 }) +vim.api.nvim_set_hl(0, "@markup.list.unchecked", { fg = 8357020 }) +vim.api.nvim_set_hl(0, "@markup.math", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "@markup.quote", { fg = 16106215 }) +vim.api.nvim_set_hl(0, "@markup.raw", { fg = 10937249 }) +vim.api.nvim_set_hl( + 0, + "@markup.strikethrough", + { cterm = { strikethrough = true }, fg = 13489908, strikethrough = true } +) +vim.api.nvim_set_hl(0, "@markup.strong", { bold = true, cterm = { bold = true }, fg = 15961000 }) +vim.api.nvim_set_hl(0, "@markup.underline", { link = "Underlined" }) +vim.api.nvim_set_hl(0, "@module", { cterm = { italic = true }, fg = 16376495, italic = true }) +vim.api.nvim_set_hl(0, "@property", { fg = 11845374 }) +vim.api.nvim_set_hl(0, "@punctuation.bracket", { fg = 9673138 }) +vim.api.nvim_set_hl(0, "@punctuation.delimiter", { link = "Delimiter" }) +vim.api.nvim_set_hl(0, "@string.documentation", { fg = 9757397 }) +vim.api.nvim_set_hl(0, "@string.escape", { fg = 16106215 }) +vim.api.nvim_set_hl(0, "@string.regexp", { fg = 16106215 }) +vim.api.nvim_set_hl(0, "@string.special", { link = "Special" }) +vim.api.nvim_set_hl(0, "@string.special.path", { link = "Special" }) +vim.api.nvim_set_hl(0, "@string.special.symbol", { fg = 15912397 }) +vim.api.nvim_set_hl( + 0, + "@string.special.url", + { cterm = { italic = true, underline = true }, fg = 9024762, italic = true, underline = true } +) +vim.api.nvim_set_hl(0, "@tag", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "@tag.attribute", { cterm = { italic = true }, fg = 16376495, italic = true }) +vim.api.nvim_set_hl(0, "@tag.builtin", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "@tag.delimiter", { fg = 9757397 }) +vim.api.nvim_set_hl(0, "@type.builtin", { fg = 13346551 }) +vim.api.nvim_set_hl(0, "@type.definition", { link = "Type" }) +vim.api.nvim_set_hl(0, "@variable", { fg = 13489908 }) +vim.api.nvim_set_hl(0, "@variable.builtin", { fg = 15961000 }) +vim.api.nvim_set_hl(0, "@variable.member", { fg = 11845374 }) +vim.api.nvim_set_hl(0, "@variable.parameter", { fg = 15442092 }) +vim.api.nvim_set_hl(0, "Added", { fg = 10937249 }) +vim.api.nvim_set_hl(0, "Boolean", { fg = 16429959 }) +vim.api.nvim_set_hl(0, "Changed", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "Character", { fg = 9757397 }) +vim.api.nvim_set_hl(0, "ColorColumn", { bg = 3224132 }) +vim.api.nvim_set_hl(0, "Comment", { cterm = { italic = true }, fg = 9673138, italic = true }) +vim.api.nvim_set_hl(0, "ComplMatchIns", { link = "PreInsert" }) +vim.api.nvim_set_hl(0, "Conceal", { fg = 8357020 }) +vim.api.nvim_set_hl(0, "Conditional", { cterm = { italic = true }, fg = 13346551, italic = true }) +vim.api.nvim_set_hl(0, "Constant", { fg = 16429959 }) +vim.api.nvim_set_hl(0, "CurSearch", { bg = 15961000, fg = 1579045 }) +vim.api.nvim_set_hl(0, "Cursor", { bg = 16113884, fg = 1973806 }) +vim.api.nvim_set_hl(0, "CursorColumn", { bg = 1579045 }) +vim.api.nvim_set_hl(0, "CursorIM", { bg = 16113884, fg = 1973806 }) +vim.api.nvim_set_hl(0, "CursorLine", { bg = 2763580 }) +vim.api.nvim_set_hl(0, "CursorLineNr", { fg = 11845374 }) +vim.api.nvim_set_hl(0, "Delimiter", { fg = 9673138 }) +vim.api.nvim_set_hl(0, "DiagnosticError", { cterm = { italic = true }, fg = 15961000, italic = true }) +vim.api.nvim_set_hl(0, "DiagnosticFloatingError", { fg = 15961000 }) +vim.api.nvim_set_hl(0, "DiagnosticFloatingHint", { fg = 9757397 }) +vim.api.nvim_set_hl(0, "DiagnosticFloatingInfo", { fg = 9034987 }) +vim.api.nvim_set_hl(0, "DiagnosticFloatingOk", { fg = 10937249 }) +vim.api.nvim_set_hl(0, "DiagnosticFloatingWarn", { fg = 16376495 }) +vim.api.nvim_set_hl(0, "DiagnosticHint", { cterm = { italic = true }, fg = 9757397, italic = true }) +vim.api.nvim_set_hl(0, "DiagnosticInfo", { cterm = { italic = true }, fg = 9034987, italic = true }) +vim.api.nvim_set_hl(0, "DiagnosticOk", { cterm = { italic = true }, fg = 10937249, italic = true }) +vim.api.nvim_set_hl(0, "DiagnosticSignError", { fg = 15961000 }) +vim.api.nvim_set_hl(0, "DiagnosticSignHint", { fg = 9757397 }) +vim.api.nvim_set_hl(0, "DiagnosticSignInfo", { fg = 9034987 }) +vim.api.nvim_set_hl(0, "DiagnosticSignOk", { fg = 10937249 }) +vim.api.nvim_set_hl(0, "DiagnosticSignWarn", { fg = 16376495 }) +vim.api.nvim_set_hl(0, "DiagnosticUnderlineError", { cterm = { underline = true }, sp = 15961000, underline = true }) +vim.api.nvim_set_hl(0, "DiagnosticUnderlineHint", { cterm = { underline = true }, sp = 9757397, underline = true }) +vim.api.nvim_set_hl(0, "DiagnosticUnderlineInfo", { cterm = { underline = true }, sp = 9034987, underline = true }) +vim.api.nvim_set_hl(0, "DiagnosticUnderlineOk", { cterm = { underline = true }, sp = 10937249, underline = true }) +vim.api.nvim_set_hl(0, "DiagnosticUnderlineWarn", { cterm = { underline = true }, sp = 16376495, underline = true }) +vim.api.nvim_set_hl(0, "DiagnosticVirtualTextError", { cterm = { italic = true }, fg = 15961000, italic = true }) +vim.api.nvim_set_hl(0, "DiagnosticVirtualTextHint", { cterm = { italic = true }, fg = 9757397, italic = true }) +vim.api.nvim_set_hl(0, "DiagnosticVirtualTextInfo", { cterm = { italic = true }, fg = 9034987, italic = true }) +vim.api.nvim_set_hl(0, "DiagnosticVirtualTextOk", { cterm = { italic = true }, fg = 10937249, italic = true }) +vim.api.nvim_set_hl(0, "DiagnosticVirtualTextWarn", { cterm = { italic = true }, fg = 16376495, italic = true }) +vim.api.nvim_set_hl(0, "DiagnosticWarn", { cterm = { italic = true }, fg = 16376495, italic = true }) +vim.api.nvim_set_hl(0, "DiffAdd", { bg = 3555651 }) +vim.api.nvim_set_hl(0, "DiffChange", { bg = 2435388 }) +vim.api.nvim_set_hl(0, "DiffDelete", { bg = 4469316 }) +vim.api.nvim_set_hl(0, "DiffText", { bg = 4082539 }) +vim.api.nvim_set_hl(0, "Directory", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "EndOfBuffer", { fg = 4540250 }) +vim.api.nvim_set_hl(0, "Error", { fg = 15961000 }) +vim.api.nvim_set_hl( + 0, + "ErrorMsg", + { bold = true, cterm = { bold = true, italic = true }, fg = 15961000, italic = true } +) +vim.api.nvim_set_hl(0, "Exception", { fg = 13346551 }) +vim.api.nvim_set_hl(0, "FloatBorder", { bg = 1579045, fg = 9024762 }) +vim.api.nvim_set_hl(0, "FloatTitle", { bg = 1579045, fg = 10923464 }) +vim.api.nvim_set_hl(0, "FoldColumn", { fg = 7106694 }) +vim.api.nvim_set_hl(0, "Folded", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "Function", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "Identifier", { fg = 15912397 }) +vim.api.nvim_set_hl(0, "IncSearch", { bg = 8309208, fg = 1579045 }) +vim.api.nvim_set_hl(0, "Include", { fg = 13346551 }) +vim.api.nvim_set_hl(0, "Keyword", { fg = 13346551 }) +vim.api.nvim_set_hl(0, "Label", { fg = 7653356 }) +vim.api.nvim_set_hl(0, "LineNr", { fg = 4540250 }) +vim.api.nvim_set_hl(0, "LspCodeLens", { fg = 7106694 }) +vim.api.nvim_set_hl(0, "LspInlayHint", { fg = 7106694 }) +vim.api.nvim_set_hl(0, "LspReferenceRead", { bg = 4540250 }) +vim.api.nvim_set_hl(0, "LspReferenceText", { bg = 4540250 }) +vim.api.nvim_set_hl(0, "LspReferenceWrite", { bg = 4540250 }) +vim.api.nvim_set_hl(0, "LspSignatureActiveParameter", { bg = 3224132, bold = true, cterm = { bold = true } }) +vim.api.nvim_set_hl(0, "Macro", { fg = 13346551 }) +vim.api.nvim_set_hl(0, "MatchParen", { bg = 3750733, bold = true, cterm = { bold = true }, fg = 16429959 }) +vim.api.nvim_set_hl(0, "ModeMsg", { bold = true, cterm = { bold = true }, fg = 13489908 }) +vim.api.nvim_set_hl(0, "MoreMsg", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "MsgSeparator", { link = "WinSeparator" }) +vim.api.nvim_set_hl(0, "NonText", { fg = 7106694 }) +vim.api.nvim_set_hl(0, "Normal", { fg = 13489908 }) +vim.api.nvim_set_hl(0, "NormalFloat", { bg = 1579045, fg = 13489908 }) +vim.api.nvim_set_hl(0, "NormalNC", { fg = 13489908 }) +vim.api.nvim_set_hl(0, "Number", { fg = 16429959 }) +vim.api.nvim_set_hl(0, "Operator", { fg = 9034987 }) +vim.api.nvim_set_hl(0, "Pmenu", { fg = 9673138 }) +vim.api.nvim_set_hl(0, "PmenuExtra", { fg = 7106694 }) +vim.api.nvim_set_hl(0, "PmenuExtraSel", { bg = 3224132, bold = true, cterm = { bold = true }, fg = 7106694 }) +vim.api.nvim_set_hl(0, "PmenuMatch", { bold = true, cterm = { bold = true }, fg = 13489908 }) +vim.api.nvim_set_hl(0, "PmenuSbar", { bg = 3224132 }) +vim.api.nvim_set_hl(0, "PmenuSel", { bg = 3224132, bold = true, cterm = { bold = true } }) +vim.api.nvim_set_hl(0, "PmenuThumb", { bg = 7106694 }) +vim.api.nvim_set_hl(0, "PreProc", { fg = 16106215 }) +vim.api.nvim_set_hl(0, "Question", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "QuickFixLine", { bg = 3750733, bold = true, cterm = { bold = true } }) +vim.api.nvim_set_hl(0, "Repeat", { fg = 13346551 }) +vim.api.nvim_set_hl(0, "Search", { bg = 4085607, fg = 13489908 }) +vim.api.nvim_set_hl(0, "SignColumn", { fg = 4540250 }) +vim.api.nvim_set_hl(0, "Special", { fg = 16106215 }) +vim.api.nvim_set_hl(0, "SpecialKey", { link = "NonText" }) +vim.api.nvim_set_hl(0, "SpellBad", { cterm = { undercurl = true }, sp = 15961000, undercurl = true }) +vim.api.nvim_set_hl(0, "SpellCap", { cterm = { undercurl = true }, sp = 16376495, undercurl = true }) +vim.api.nvim_set_hl(0, "SpellLocal", { cterm = { undercurl = true }, sp = 9024762, undercurl = true }) +vim.api.nvim_set_hl(0, "SpellRare", { cterm = { undercurl = true }, sp = 10937249, undercurl = true }) +vim.api.nvim_set_hl(0, "Statement", { fg = 13346551 }) +vim.api.nvim_set_hl(0, "StatusLine", { fg = 13489908 }) +vim.api.nvim_set_hl(0, "StatusLineNC", { fg = 4540250 }) +vim.api.nvim_set_hl(0, "StorageClass", { fg = 16376495 }) +vim.api.nvim_set_hl(0, "String", { fg = 10937249 }) +vim.api.nvim_set_hl(0, "Structure", { fg = 16376495 }) +vim.api.nvim_set_hl(0, "Substitute", { bg = 4540250, fg = 16106215 }) +vim.api.nvim_set_hl(0, "TabLine", { bg = 1118491, fg = 7106694 }) +vim.api.nvim_set_hl(0, "TabLineSel", { link = "Normal" }) +vim.api.nvim_set_hl(0, "Tag", { bold = true, cterm = { bold = true }, fg = 11845374 }) +vim.api.nvim_set_hl(0, "TermCursor", { bg = 16113884, fg = 1973806 }) +vim.api.nvim_set_hl(0, "Title", { bold = true, cterm = { bold = true }, fg = 9024762 }) +vim.api.nvim_set_hl(0, "Todo", { bg = 15912397, bold = true, cterm = { bold = true }, fg = 1973806 }) +vim.api.nvim_set_hl(0, "Type", { fg = 16376495 }) +vim.api.nvim_set_hl(0, "Visual", { bg = 4540250, bold = true, cterm = { bold = true } }) +vim.api.nvim_set_hl(0, "VisualNOS", { bg = 4540250, bold = true, cterm = { bold = true } }) +vim.api.nvim_set_hl(0, "WarningMsg", { fg = 16376495 }) +vim.api.nvim_set_hl(0, "Whitespace", { fg = 4540250 }) +vim.api.nvim_set_hl(0, "WildMenu", { bg = 7106694 }) +vim.api.nvim_set_hl(0, "WinBar", { fg = 16113884 }) +vim.api.nvim_set_hl(0, "WinBarNC", { link = "WinBar" }) +vim.api.nvim_set_hl(0, "WinSeparator", { fg = 4540250 }) +vim.api.nvim_set_hl(0, "diffAdded", { fg = 10937249 }) +vim.api.nvim_set_hl(0, "diffChanged", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "diffFile", { fg = 9024762 }) +vim.api.nvim_set_hl(0, "diffIndexLine", { fg = 9757397 }) +vim.api.nvim_set_hl(0, "diffLine", { fg = 7106694 }) +vim.api.nvim_set_hl(0, "diffNewFile", { fg = 16429959 }) +vim.api.nvim_set_hl(0, "diffOldFile", { fg = 16376495 }) +vim.api.nvim_set_hl(0, "diffRemoved", { fg = 15961000 }) +vim.api.nvim_set_hl(0, "htmlH1", { bold = true, cterm = { bold = true }, fg = 16106215 }) +vim.api.nvim_set_hl(0, "htmlH2", { bold = true, cterm = { bold = true }, fg = 9024762 }) +vim.api.nvim_set_hl(0, "lCursor", { bg = 16113884, fg = 1973806 }) +vim.api.nvim_set_hl(0, "markdownH1", { link = "rainbow1" }) +vim.api.nvim_set_hl(0, "markdownH2", { link = "rainbow2" }) +vim.api.nvim_set_hl(0, "markdownH3", { link = "rainbow3" }) +vim.api.nvim_set_hl(0, "markdownH4", { link = "rainbow4" }) +vim.api.nvim_set_hl(0, "markdownH5", { link = "rainbow5" }) +vim.api.nvim_set_hl(0, "markdownH6", { link = "rainbow6" }) +vim.api.nvim_set_hl(0, "rainbow1", { fg = 15961000 }) +vim.api.nvim_set_hl(0, "rainbow2", { fg = 16429959 }) +vim.api.nvim_set_hl(0, "rainbow3", { fg = 16376495 }) +vim.api.nvim_set_hl(0, "rainbow4", { fg = 10937249 }) +vim.api.nvim_set_hl(0, "rainbow5", { fg = 7653356 }) +vim.api.nvim_set_hl(0, "rainbow6", { fg = 11845374 }) +vim.api.nvim_create_autocmd("CmdlineEnter", { + once = true, + callback = function() + vim.api.nvim_set_hl(0, "debugBreakpoint", { bg = 1973806, fg = 7106694 }) + vim.api.nvim_set_hl(0, "healthError", { fg = 15961000 }) + vim.api.nvim_set_hl(0, "healthSuccess", { fg = 9757397 }) + vim.api.nvim_set_hl(0, "healthWarning", { fg = 16376495 }) + end, +}) diff --git a/init.lua b/init.lua index b85bbc7..8fe94df 100644 --- a/init.lua +++ b/init.lua @@ -83,7 +83,7 @@ vim.g.moonflyTransparent = true -- 应用 colorscheme。catppuccin-mocha 的定义在 colors/catppuccin-mocha.lua 中。 -- 该文件是一个精简版,只包含 Mocha 变体的调色板和高亮组定义。 -vim.cmd("colorscheme catppuccin-mocha") +vim.cmd("colorscheme ex-catppuccin-mocha") -- 记录 init.lua 执行完成时间(含 colorscheme),供启动页展示更接近 --startuptime 的耗时。 -- pack.lua 中的 footer 优先使用 VimEnter 时间,回退到此时间点。 diff --git a/lua/lazy.lua b/lua/lazy.lua index 41db290..b8e991f 100644 --- a/lua/lazy.lua +++ b/lua/lazy.lua @@ -107,4 +107,39 @@ M.on_keys = function(name, keys, mode, fn, action, opts) end, { desc = opts.desc, buffer = opts.buffer }) end +-- --------------------------------------------------------------------------- +-- 命令触发懒加载 +-- --------------------------------------------------------------------------- +-- 参数: +-- name - 模块标识名 +-- cmd - 命令名(如 "ExColors") +-- fn - 初始化函数,在首次执行命令时调用 +-- opts - 用户命令选项(bang, nargs, desc 等) +-- +-- 原理: +-- 创建一个同名的临时用户命令,首次执行时: +-- 1. 删除临时命令(避免与插件注册的命令冲突) +-- 2. 调用 M.load(name, fn) 完成插件初始化 +-- 3. 插件初始化后通常会注册同名命令,覆盖临时命令 +-- 4. 如果插件没有注册同名命令,则递归执行该命令 +-- +-- 注意: +-- 要求插件在初始化(setup)时会注册同名用户命令。 +-- 如果插件不注册命令,可在 fn 中手动处理命令逻辑。 +M.on_cmd = function(name, cmd, fn, opts) + opts = opts or {} + vim.api.nvim_create_user_command(cmd, function(cmd_opts) + vim.api.nvim_del_user_command(cmd) + M.load(name, fn) + -- 如果插件注册了新命令,这里需要重新执行 + -- 由于 del + load 后命令可能已不存在(插件未注册) + -- 或已变成插件的命令,所以用 pcall 安全地尝试执行 + local ok = pcall(vim.cmd, cmd .. (cmd_opts.bang and "!" or "")) + if not ok then + -- 插件未注册同名命令,命令已执行完毕 + vim.notify("[" .. name .. "] 已加载", vim.log.levels.INFO) + end + end, { bang = opts.bang, nargs = opts.nargs, desc = opts.desc }) +end + return M diff --git a/lua/pack.lua b/lua/pack.lua index 541c7fc..8cdc8af 100644 --- a/lua/pack.lua +++ b/lua/pack.lua @@ -42,6 +42,7 @@ vim.pack.add({ "https://github.com/stevearc/conform.nvim", -- 格式化 "https://github.com/tpope/vim-fugitive", -- Git 集成 "https://github.com/MagicDuck/grug-far.nvim", -- 搜索替换 + "https://github.com/aileot/ex-colors.nvim", -- colorscheme 提取与优化 }, { load = false }) -- --------------------------------------------------------------------------- @@ -174,6 +175,7 @@ local all_modules = { "mason", "fugitive", "grugfar", + "ex-colors", } -- 计算 Logo 的最大显示宽度,用于页脚居中计算 @@ -466,3 +468,39 @@ end -- Normal 模式和 Visual 模式均绑定 sr lazy.on_keys("grugfar", "sr", "n", load_grug_far, open_grug_far, { desc = "搜索并替换" }) lazy.on_keys("grugfar", "sr", "x", load_grug_far, open_grug_far, { desc = "搜索并替换" }) + +-- --------------------------------------------------------------------------- +-- ex-colors.nvim — colorscheme 提取与优化(命令触发懒加载) +-- --------------------------------------------------------------------------- +-- 将当前 colorscheme 的高亮定义提取为独立的优化版 colorscheme 文件。 +-- 仅在执行 :ExColors 时加载,不占用启动时间。 +-- 生成的文件保存在 ~/.config/nvim/colors/ex-{colors_name}.lua +lazy.on_cmd("ex-colors", "ExColors", function() + vim.cmd.packadd("ex-colors.nvim") + require("ex-colors").setup({ + colors_dir = vim.fn.stdpath("config") .. "/colors", + clear_highlight = false, + reset_syntax = false, + ignore_default_colors = true, + ignore_clear = true, + omit_default = true, + relinker = require("ex-colors.presets").recommended.relinker, + required_syntaxes = { "diff", "html", "markdown" }, + included_hlgroups = require("ex-colors.presets").recommended.included_hlgroups, + excluded_hlgroups = require("ex-colors.presets").recommended.excluded_hlgroups, + included_patterns = require("ex-colors.presets").recommended.included_patterns, + excluded_patterns = require("ex-colors.presets").recommended.excluded_patterns, + autocmd_patterns = { + CmdlineEnter = { + ["*"] = { "^debug%u", "^health%u" }, + }, + }, + embedded_global_options = { "background" }, + embedded_global_variables = { + "terminal_color_0", "terminal_color_1", "terminal_color_2", "terminal_color_3", + "terminal_color_4", "terminal_color_5", "terminal_color_6", "terminal_color_7", + "terminal_color_8", "terminal_color_9", "terminal_color_10", "terminal_color_11", + "terminal_color_12", "terminal_color_13", "terminal_color_14", "terminal_color_15", + }, + }) +end, { bang = true, desc = "提取当前 colorscheme 为优化版 ex-colors" }) diff --git a/nvim-pack-lock.json b/nvim-pack-lock.json index 07cadd6..6a657e1 100644 --- a/nvim-pack-lock.json +++ b/nvim-pack-lock.json @@ -4,6 +4,10 @@ "rev": "619363c30309d29ffa631e67c8183f2a72caa373", "src": "https://github.com/stevearc/conform.nvim" }, + "ex-colors.nvim": { + "rev": "76a20ce29d160a4eb9f275a615dc8257cb15c58c", + "src": "https://github.com/aileot/ex-colors.nvim" + }, "friendly-snippets": { "rev": "6cd7280adead7f586db6fccbd15d2cac7e2188b9", "src": "https://github.com/rafamadriz/friendly-snippets"