● 明白,纯讨论不做计划。让我系统地给你讲一下。
Neovim 主题的本质
一个主题就是一个 Lua 文件,告诉 Neovim "哪个元素用什么颜色"。你在 scheme.lua 里写的 vim.cmd("hi FloatBorder guifg=#ff9303") 就已经是在做这件事了。
主题的核心结构
调色板 (Palette) → 语义映射 (Theme) → Highlight 设置
定义 8-15 个颜色 颜色 → 用途 写入 nvim_set_hl
第一层:调色板
就是你挑选的一组基础颜色,通常包括:
local p = {
bg0 = "#1a1b26", -- 主背景
bg1 = "#24283b", -- 浮窗/侧边栏背景
bg2 = "#383f58", -- 选中行/高亮背景
fg0 = "#c0caf5", -- 主文字
fg1 = "#565f89", -- 次要文字(注释、行号)
red = "#f7768e",
orange = "#ff9303",
yellow = "#e0af68",
green = "#9ece6a",
cyan = "#7dcfff",
blue = "#7aa2f7",
purple = "#bb9af7",
}
第二层:语义映射
把调色板颜色分配给语法和 UI 元素。Neovim 的 highlight group 分几大类:
编辑器 UI(约 30 个核心 group)
- Normal — 主编辑区
- CursorLine, Visual, Search — 交互状态
- Pmenu, NormalFloat, FloatBorder — 弹出窗口
- StatusLine, LineNr, SignColumn — 边栏
语法高亮(传统 vim group,约 15 个)
- Comment, String, Number, Keyword, Function, Type, Operator ...
Treesitter capture(现代语法,约 20 个)
- @variable, @function, @keyword, @string, @type, @comment ...
- 大多数可以 link 到传统 group,不用重复定义
LSP 诊断(4 个级别)
- DiagnosticError, DiagnosticWarn, DiagnosticInfo, DiagnosticHint
插件(按需)
- Telescope, Neo-tree, Lazy, GitSigns 等各有自己的 group
第三层:写入
vim.api.nvim_set_hl(0, "Normal", { fg = p.fg0, bg = p.bg0 })
vim.api.nvim_set_hl(0, "Comment", { fg = p.fg1, italic = true })
vim.api.nvim_set_hl(0, "String", { fg = p.green })
-- "link" 可以让一个 group 继承另一个
vim.api.nvim_set_hl(0, "@string", { link = "String" })
nvim_set_hl 的参数
┌───────────┬───────────────────────────────┐
│ 参数 │ 含义 │
├───────────┼───────────────────────────────┤
│ fg │ 前景色(文字颜色) │
├───────────┼───────────────────────────────┤
│ bg │ 背景色 │
├───────────┼───────────────────────────────┤
│ bold │ 粗体 (true/false) │
├───────────┼───────────────────────────────┤
│ italic │ 斜体 │
├───────────┼───────────────────────────────┤
│ underline │ 下划线 │
├───────────┼───────────────────────────────┤
│ sp │ 特殊颜色(用于下划线/波浪线) │
├───────────┼───────────────────────────────┤
│ link │ 链接到另一个 group │
└───────────┴───────────────────────────────┘
一个最小完整主题的文件结构
~/.config/nvim/colors/mytheme.lua -- 主题入口,放这里 :colorscheme mytheme 就能用
入口文件内容:
vim.cmd("hi clear")
vim.g.colors_name = "mytheme"
-- 1. 调色板
local p = { ... }
-- 2. 设置所有 highlight group
vim.api.nvim_set_hl(0, "Normal", { fg = p.fg, bg = p.bg })
-- ... 大概 80-120 行就能覆盖日常使用
实用开发技巧
1. :Inspect — 光标放在任何文字上,看它对应什么 highlight group,这是最重要的工具
2. :hi — 列出所有当前 highlight group
3. :hi <Name> — 查看某个 group 的值
4. :so $VIMRUNTIME/syntax/hitest.vim — 显示所有 group 的颜色预览
学习顺序建议
1. 先掌握 :Inspect,理解光标下的文字对应哪些 group
2. 挑一个小范围(比如只做语法高亮的 15 个 group),选好调色板,写出来看效果
3. 逐步扩展到 UI group、treesitter、LSP、插件
4. 最后处理边界情况(terminal colors、diff 颜色等)
有什么具体不清楚的可以继续问。