FEATURED · 精选文章

mini.hues 配置化色彩方案生成器:用两个基础色生成整套 Neovim 主题

发布时间 / 2026/9/16 14:05:27
来源 / 创域科博编辑部
栏目 / 资讯中心
mini.hues 配置化色彩方案生成器:用两个基础色生成整套 Neovim 主题 mini.hues 配置化色彩方案生成器用两个基础色生成整套 Neovim 主题【免费下载链接】mini.nvimLibrary of 45 independent Lua modules improving Neovim experience with minimal effort项目地址: https://gitcode.com/GitHub_Trending/mi/mini.nvim本文围绕 mini.nvim 库中的 mini.hues 模块展开讲解如何通过background与foreground两个必填基础色自动推导出一套协调的 Neovim 配色方案。读完本文你将掌握setup()的全部配置项、Oklch 色彩空间下的调色板生成原理、四大季节内置主题与randomhue随机主题的使用方式以及如何借助make_palette()/apply_palette()等公开 API 对主题进行二次定制。mini.hues 是什么mini.hues 是 mini.nvim 库中负责生成可配置配色方案的独立 Lua 模块。它的核心设计思路非常简单用户只需指定背景色与前景色两个基础色其余所有颜色语法高亮、UI 元素、诊断、Tree-sitter、插件高亮等都由模块自动计算并尽量让它们之间保持足够的感知差异perceptually different。模块将生成的高亮组写入全局表MiniHues可通过:lua MiniHues.*手动访问。需要特别注意的是调用setup()本身并不会注册一个:colorscheme它只是创建一套协调的高亮组要形成真正的配色方案还需要按 创建自己的配色方案 一节的操作封装成 colors 目录下的脚本。快速开始两个必填字段mini.hues 的启用方式是require(mini.hues).setup({...})其中background与foreground为必填字段均为#rrggbb十六进制字符串。源码 hues.lua 中明确校验了这一点if config.background nil or config.foreground nil then H.error(setup() needs both background and foreground.) end最简配置示例深青色背景搭配浅色前景require(mini.hues).setup({ background #11262d, foreground #c0c8cc, })此外background与foreground必须具有相反的明度一深一浅否则会抛出backgroundandforegroundshould have opposite lightness.错误相关校验见 hues.lua。该模块没有运行时选项因此设置vim.b.minihues_config不会产生任何效果。完整配置说明setup()接受的配置表结构与默认值如下源自 hues.lua 与 readme 的 Default config 一节{ -- REQUIRED 基础色#rrggbb 十六进制字符串 background nil, foreground nil, -- 非基础色使用的色相数量0 到 8 n_hues 8, -- 饱和度low | lowmedium | medium | mediumhigh | high saturation medium, -- 强调色用于部分选中 UI 元素。可选值 -- bg, fg, red, orange, yellow, green, cyan, azure, blue, purple accent bg, -- 插件集成。default false 可关闭全部集成也可按插件单独设置 plugins { default true }, -- 是否根据相关事件自动调整部分高亮组 autoadjust true, }各配置项的作用配置项取值范围默认值说明background/foreground#rrggbb无必填调色板生成的唯一输入基础色二者明度必须相反n_hues08 整数8非基础颜色使用的色相数量。色相在色环上等距分布并尽量远离两个基础色的色相saturationlow/lowmedium/medium/mediumhigh/highmedium彩色文本的饱和度等级对应 Oklch 色彩空间中的 Chroma 值accentbg、fg或八种非基础色名bg用于Search、FloatBorder、Title、CursorLineNr等选中 UI 元素的强调色plugins表键为插件名或default{ default true }控制是否为各插件创建高亮组autoadjust布尔值true是否根据fillchars、pumborder等选项自动调整MsgSeparator、Pmenusaturation 与 chroma 的对应关系在 make_palette 的实现中饱和度等级被直接映射为 Oklch 的 Chroma 数值local chroma ({ low 4, lowmedium 6, medium 8, mediumhigh 12, high 16 })[saturation]也就是说low对应 Chroma 4high对应 Chroma 16等级越高非基础色越鲜艳。plugins 与 autoadjust 细节插件集成config.plugins决定了为哪些受支持插件创建高亮组。规则为若某个插件名见下文插件列表有对应条目则使用该条目否则回退到config.plugins.default。限制集成数量可以减少启动时间。例如只加载 mini.nvim 自身集成require(mini.hues).setup({ background #11262d, foreground #c0c8cc, plugins { default false, [nvim-mini/mini.nvim] true, }, })自动调整autoadjust true时生效实现见 hues.luaMsgSeparator根据fillchars中的msgsep标志调整若为空白则高亮背景否则高亮前景Pmenu补全菜单根据pumborder值调整Neovim 0.12带边框时与浮动窗口一致但边框无强调色前景否则与CursorLine一致从而让补全菜单与普通浮动窗口区分开来。配置示例从基础色到风格微调readme 与 doc/mini-hues.txt 提供了大量可直接套用的配置使用时只保留一行setup调用即可local setup require(mini.hues).setup -- 选择背景与前景色按色调区分 setup({ background #2f1c22, foreground #cdc4c6 }) -- red setup({ background #2f1e16, foreground #cdc5c1 }) -- orange setup({ background #282211, foreground #c9c6c0 }) -- yellow setup({ background #1c2617, foreground #c4c8c2 }) -- green setup({ background #112723, foreground #c0c9c7 }) -- cyan setup({ background #11262d, foreground #c0c8cc }) -- azure setup({ background #1d2231, foreground #c4c6cd }) -- blue setup({ background #281e2c, foreground #c9c5cb }) -- purple -- 控制非基础色相数量 setup({ background #11262d, foreground #c0c8cc, n_hues 6 }) setup({ background #11262d, foreground #c0c8cc, n_hues 4 }) setup({ background #11262d, foreground #c0c8cc, n_hues 2 }) setup({ background #11262d, foreground #c0c8cc, n_hues 0 }) -- 控制文本饱和度 setup({ background #11262d, foreground #c0c8cc, saturation low }) setup({ background #11262d, foreground #c0c8cc, saturation lowmedium }) setup({ background #11262d, foreground #c0c8cc, saturation medium }) setup({ background #11262d, foreground #c0c8cc, saturation mediumhigh }) setup({ background #11262d, foreground #c0c8cc, saturation high }) -- 选择强调色 setup({ background #11262d, foreground #c0c8cc, accent bg }) setup({ background #11262d, foreground #c0c8cc, accent red }) setup({ background #11262d, foreground #c0c8cc, accent yellow }) setup({ background #11262d, foreground #c0c8cc, accent cyan }) setup({ background #11262d, foreground #c0c8cc, accent blue })调色板生成原理Oklch 色彩空间mini.hues 的调色板生成MiniHues.make_palette()完全在Oklch色彩空间中完成。Oklch 用三个数值描述颜色明度 Lightnessl0黑到 100白彩度 Chromac正值越大越鲜艳0 为灰色色相 Hueh0360 的周期值对应色环上的本色。模块内部的十六进制与 Oklch 转换、gamut clipping 等底层能力依赖同库的 mini.colors相关色空间说明见 doc/mini-colors.txt。算法流程概述依据 hues.lua 的文档注释make_palette()的生成流程如下提取基础色通道取出背景色与前景色的明度、彩度、色相生成参考明度背景边界取 0 或 100 中更接近背景明度者前景边界与背景边界不同的一端0 或 100 的另一者中间值背景与前景明度的算术平均值计算底色明度阶梯通过改变背景色的明度生成bg_edge/bg_edge2靠近边界与bg_mid/bg_mid2靠近中间两组明暗变体前景同理确定彩度依据config.saturation选取非基础色的 Chroma生成非基础色色相在色环上拟合一个含n_hues个等距点的圆形网格使其尽量远离背景与前景色相保证非基础色与基础色差异最大化。例如背景色相 0、前景色相 180、n_hues 2时网格为{ 90, 270 }对 8 个参考色相红、橙、黄、绿、青、蓝、紫等分别取网格中最近的值从而即使色相数量减少仍能沿用红色绿色等同一套术语输出两套明度的非基础色每个色相都生成前景明度与背景明度_bg后缀两个变体计算强调色基于config.accent生成accent与accent_bg两个变体。输出调色板结构make_palette()返回的调色板表结构如下字段含义详见 hues.luabg/fg传入的基础色bg_edge/bg_edge2/bg_mid/bg_mid2背景色的明度变体fg_edge/fg_edge2/fg_mid/fg_mid2同理red、orange、yellow、green、cyan、azure、blue、purple前景明度的非基础色带_bg后缀者为背景明度变体accent/accent_bg前景/背景明度的强调色。需要说明的是部分生成颜色无法用#rrggbb精确表示此时会执行 gamut clipping在不改变色相的前提下以最优方式降低明度与彩度来得到可表示的十六进制值且并非所有颜色都会被高亮组使用部分字段仅为完整性而保留。公开 APIsetup、make_palette、apply_palette、get_palette、gen_random_base_colorsmini.hues 对外暴露五个主要函数均可在MiniHues全局表中访问MiniHues.setup(config)模块入口等价于make_palette()与apply_palette()的组合见 hues.lua调用后会导出全局表MiniHues、校验并应用配置。MiniHues.make_palette(config)仅计算调色板而不应用接受与setup()相同的配置结构必须有background、foreground。可用于预览或二次加工调色板。MiniHues.apply_palette(palette, plugins, opts)根据给定调色板创建高亮组与终端色。适合微调配色板后再应用的场景local palette require(mini.hues).make_palette({ background #11262d, foreground #c0c8cc, }) palette.cyan #76e0a6 palette.cyan_bg #004629 require(mini.hues).apply_palette(palette)plugins默认取MiniHues.config.plugins决定为哪些插件建组opts.autoadjust默认取MiniHues.config.autoadjust控制自动调整。实现见 hues.lua。此外apply_palette()还会根据背景明度推导vim.g.terminal_color_0至terminal_color_15共 16 个终端色见 hues.lua。MiniHues.get_palette()返回最近一次通过apply_palette()应用含setup()内部调用的调色板副本实现见 hues.lua。MiniHues.gen_random_base_colors(opts)基于随机色相与启发式明度/彩度生成一组基础色返回{ background ..., foreground ... }。它尊重background选项深色背景bg明度 15、彩度 3fg明度 80、彩度 1浅色背景bg明度 90、彩度 1fg明度 20、彩度 1。opts.gen_hue可传入一个返回色相数值的函数来限制生成范围默认math.random(0, 359)见 hues.lua。若在启动阶段调用建议先执行math.randomseed(vim.loop.hrtime())以保证随机性local hues require(mini.hues) math.randomseed(vim.loop.hrtime()) hues.setup(hues.gen_random_base_colors())也可以借助 mini.colors 自行复刻类似逻辑例如固定明度、只随机色相local convert require(mini.colors).convert local hue math.random(0, 359) return { background convert({ l 15, c 3, h hue }, hex), foreground convert({ l 80, c 1, h hue }, hex), }内置配色方案mini.hues 附带多个现成配色方案文件位于仓库 colors 目录。四季主题miniwintericy winter 寒冬色调azure天蓝背景。实现见 colors/miniwinter.lua它按background深/浅分别内置了 Oklch 参数推导出的完整调色板再调用apply_palette()并设置vim.g.colors_name miniwinterminispringblooming spring 春意色调绿色背景colors/minispring.luaminisummerhot summer 盛夏色调棕/黄背景colors/minisummer.luaminiautumncooling autumn 秋凉色调紫色背景colors/miniautumn.lua。randomhue 随机主题randomhue使用随机生成的同色相背景与前景每次执行:colorscheme randomhue都会得到一组新的随机但经过仔细挑选的颜色。其本质是MiniHues.setup()与MiniHues.gen_random_base_colors()的组合并对background做了微调见 doc/mini-hues.txt。仓库 colors/randomhue.lua 的实现展示了完整流程local hues require(mini.hues) -- 初始化随机种子否则启动阶段不随机 math.randomseed(vim.loop.hrtime()) local base_colors hues.gen_random_base_colors() hues.setup({ background base_colors.background, foreground base_colors.foreground, n_hues 8, saturation vim.o.background dark and medium or high, accent bg, }) vim.g.colors_name randomhue直接以常规:colorscheme方式激活即可。如需查看当前生效配置可执行:lua print(vim.inspect(MiniHues.config))如何创建自己的配色方案依据 doc/mini-hues.txt 的说明创建自定义主题只需两步在任意runtimepath可达的 colors 目录通常是 Neovim 配置目录下的 colors 文件夹中新建myscheme.lua文件名即主题名在文件中先调用require(mini.hues).setup()传入你的调色板然后设置vim.g.colors_name myscheme。关于 cterm 颜色为保持实现简洁mini.hues不定义 cterm 颜色仅依赖termguicolors若终端模拟器支持 24 位色Neovim 通常会自动启用。若终端无法支持真彩色可改用 mini.colors 的MiniColors.colorscheme:add_cterm_attributes()定义支持 16 色的自定义主题。受支持的插件高亮组mini.hues 会为内置 UI、语法、LSP、诊断、Tree-sitter、LSP semantic tokens 以及以下插件创建高亮组或经过验证确认其默认高亮可正常工作mini.nvim 全家模块MiniAnimate*、MiniClue*、MiniFiles*、MiniStatusline*、MiniTabline*等见 hues.luabufferline.nvim、hydra.nvim、beacon.nvim、lazy.nvim、noice.nvim、snacks.nvim、todo-comments.nvim、trouble.nvim、which-key.nvimleap.nvim、dashboard-nvim、lspsaga.nvim、rainbow-delimiters.nvim、nvim-cmp、fzf-lua、vim-sneaknvim-bqf、nvim-ufo、gitsigns.nvim、indent-blankline.nvim、render-markdown.nvim、coc.nvim、neogit、lualine.nvimneo-tree.nvim、telescope.nvim、nvim-tree.lua、helpview.nvim、markview.nvim、hop.nvim、nvim-dap-ui、nvim-notify、pounce.nvim、barbar.nvim、blink.cmp、aerial.nvim、mason.nvim每个插件集成块均由if has_integration(插件名)条件包裹如 hues.lua 的 bufferline 部分因此通过config.plugins即可精准控制。安装方式mini.hues 可随 mini.nvim 全库安装推荐也可作为独立 Git 仓库安装。可选main分支默认含最新开发版改动处于 beta 阶段或stable分支仅在发布时更新代码经过main分支公测。以下为常见安装方式任选其一。使用 vim.packNeovim 0.12独立安装主分支vim.pack.add({ https://github.com/nvim-mini/mini.hues })stable 分支vim.pack.add({ { src https://github.com/nvim-mini/mini.hues, version stable }, })使用 mini.depsNeovim 0.12 之前主分支add(nvim-mini/mini.hues)stable 分支add({ source nvim-mini/mini.hues, checkout stable })使用 lazy.nvim主分支{ nvim-mini/mini.hues, version false },stable 分支{ nvim-mini/mini.hues, version * },安装完成后务必调用带background与foreground字段的require(mini.hues).setup()才会生效。若在 Windows 上遇到路径过长错误error: unable to create file ...: Filename too long可执行git config --system core.longpaths true后重装或将插件安装到路径更短的位置。测试与验证仓库 tests/test_hues.lua 覆盖了模块的核心行为校验setup()后_G.MiniHues与MiniHues.config的类型与字段值、autoadjust切换后的高亮调整、以及make_palette()→apply_palette()→get_palette()的完整应用闭环。阅读测试可以更直观地理解每个配置项的实际约束例如背景色校验与配色方案重载时的行为。与 mini.base16 的关系mini.nvim 中还有一个 mini.base16 模块它同样基于基础色生成配色方案但遵循 Base16 规范、使用预定义的十六色系统。如果你的需求是 Base16 风格的固定模板配色可参考 readmes/mini-base16.md而 mini.hues 的优势在于基于 Oklch 的感知均匀计算与更细粒度的色相/饱和度/强调色控制。两者面向不同偏好可按需选择。【免费下载链接】mini.nvimLibrary of 45 independent Lua modules improving Neovim experience with minimal effort项目地址: https://gitcode.com/GitHub_Trending/mi/mini.nvim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻