色生成整套 Neovim 主題)
mini.hues 配置化色彩方案生成器用兩個基礎(chǔ)色生成整套 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兩個必填基礎(chǔ)色自動推導(dǎo)出一套協(xié)調(diào)的 Neovim 配色方案。讀完本文你將掌握setup()的全部配置項、Oklch 色彩空間下的調(diào)色板生成原理、四大季節(jié)內(nèi)置主題與randomhue隨機主題的使用方式以及如何借助make_palette()/apply_palette()等公開 API 對主題進行二次定制。mini.hues 是什么mini.hues 是 mini.nvim 庫中負責(zé)生成可配置配色方案的獨立 Lua 模塊。它的核心設(shè)計思路非常簡單用戶只需指定背景色與前景色兩個基礎(chǔ)色其余所有顏色語法高亮、UI 元素、診斷、Tree-sitter、插件高亮等都由模塊自動計算并盡量讓它們之間保持足夠的感知差異perceptually different。模塊將生成的高亮組寫入全局表MiniHues可通過:lua MiniHues.*手動訪問。需要特別注意的是調(diào)用setup()本身并不會注冊一個:colorscheme它只是創(chuàng)建一套協(xié)調(diào)的高亮組要形成真正的配色方案還需要按 創(chuàng)建自己的配色方案 一節(jié)的操作封裝成 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.錯誤相關(guān)校驗見 hues.lua。該模塊沒有運行時選項因此設(shè)置vim.b.minihues_config不會產(chǎn)生任何效果。完整配置說明setup()接受的配置表結(jié)構(gòu)與默認值如下源自 hues.lua 與 readme 的 Default config 一節(jié){ -- REQUIRED 基礎(chǔ)色#rrggbb 十六進制字符串 background nil, foreground nil, -- 非基礎(chǔ)色使用的色相數(shù)量0 到 8 n_hues 8, -- 飽和度low | lowmedium | medium | mediumhigh | high saturation medium, -- 強調(diào)色用于部分選中 UI 元素。可選值 -- bg, fg, red, orange, yellow, green, cyan, azure, blue, purple accent bg, -- 插件集成。default false 可關(guān)閉全部集成也可按插件單獨設(shè)置 plugins { default true }, -- 是否根據(jù)相關(guān)事件自動調(diào)整部分高亮組 autoadjust true, }各配置項的作用配置項取值范圍默認值說明background/foreground#rrggbb無必填調(diào)色板生成的唯一輸入基礎(chǔ)色二者明度必須相反n_hues08 整數(shù)8非基礎(chǔ)顏色使用的色相數(shù)量。色相在色環(huán)上等距分布并盡量遠離兩個基礎(chǔ)色的色相saturationlow/lowmedium/medium/mediumhigh/highmedium彩色文本的飽和度等級對應(yīng) Oklch 色彩空間中的 Chroma 值accentbg、fg或八種非基礎(chǔ)色名bg用于Search、FloatBorder、Title、CursorLineNr等選中 UI 元素的強調(diào)色plugins表鍵為插件名或default{ default true }控制是否為各插件創(chuàng)建高亮組autoadjust布爾值true是否根據(jù)fillchars、pumborder等選項自動調(diào)整MsgSeparator、Pmenusaturation 與 chroma 的對應(yīng)關(guān)系在 make_palette 的實現(xiàn)中飽和度等級被直接映射為 Oklch 的 Chroma 數(shù)值local chroma ({ low 4, lowmedium 6, medium 8, mediumhigh 12, high 16 })[saturation]也就是說low對應(yīng) Chroma 4high對應(yīng) Chroma 16等級越高非基礎(chǔ)色越鮮艷。plugins 與 autoadjust 細節(jié)插件集成config.plugins決定了為哪些受支持插件創(chuàng)建高亮組。規(guī)則為若某個插件名見下文插件列表有對應(yīng)條目則使用該條目否則回退到config.plugins.default。限制集成數(shù)量可以減少啟動時間。例如只加載 mini.nvim 自身集成require(mini.hues).setup({ background #11262d, foreground #c0c8cc, plugins { default false, [nvim-mini/mini.nvim] true, }, })自動調(diào)整autoadjust true時生效實現(xiàn)見 hues.luaMsgSeparator根據(jù)fillchars中的msgsep標志調(diào)整若為空白則高亮背景否則高亮前景Pmenu補全菜單根據(jù)pumborder值調(diào)整Neovim 0.12帶邊框時與浮動窗口一致但邊框無強調(diào)色前景否則與CursorLine一致從而讓補全菜單與普通浮動窗口區(qū)分開來。配置示例從基礎(chǔ)色到風(fēng)格微調(diào)readme 與 doc/mini-hues.txt 提供了大量可直接套用的配置使用時只保留一行setup調(diào)用即可local setup require(mini.hues).setup -- 選擇背景與前景色按色調(diào)區(qū)分 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 -- 控制非基礎(chǔ)色相數(shù)量 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 }) -- 選擇強調(diào)色 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 })調(diào)色板生成原理Oklch 色彩空間mini.hues 的調(diào)色板生成MiniHues.make_palette()完全在Oklch色彩空間中完成。Oklch 用三個數(shù)值描述顏色明度 Lightnessl0黑到 100白彩度 Chromac正值越大越鮮艷0 為灰色色相 Hueh0360 的周期值對應(yīng)色環(huán)上的本色。模塊內(nèi)部的十六進制與 Oklch 轉(zhuǎn)換、gamut clipping 等底層能力依賴同庫的 mini.colors相關(guān)色空間說明見 doc/mini-colors.txt。算法流程概述依據(jù) hues.lua 的文檔注釋make_palette()的生成流程如下提取基礎(chǔ)色通道取出背景色與前景色的明度、彩度、色相生成參考明度背景邊界取 0 或 100 中更接近背景明度者前景邊界與背景邊界不同的一端0 或 100 的另一者中間值背景與前景明度的算術(shù)平均值計算底色明度階梯通過改變背景色的明度生成bg_edge/bg_edge2靠近邊界與bg_mid/bg_mid2靠近中間兩組明暗變體前景同理確定彩度依據(jù)config.saturation選取非基礎(chǔ)色的 Chroma生成非基礎(chǔ)色色相在色環(huán)上擬合一個含n_hues個等距點的圓形網(wǎng)格使其盡量遠離背景與前景色相保證非基礎(chǔ)色與基礎(chǔ)色差異最大化。例如背景色相 0、前景色相 180、n_hues 2時網(wǎng)格為{ 90, 270 }對 8 個參考色相紅、橙、黃、綠、青、藍、紫等分別取網(wǎng)格中最近的值從而即使色相數(shù)量減少仍能沿用紅色綠色等同一套術(shù)語輸出兩套明度的非基礎(chǔ)色每個色相都生成前景明度與背景明度_bg后綴兩個變體計算強調(diào)色基于config.accent生成accent與accent_bg兩個變體。輸出調(diào)色板結(jié)構(gòu)make_palette()返回的調(diào)色板表結(jié)構(gòu)如下字段含義詳見 hues.luabg/fg傳入的基礎(chǔ)色bg_edge/bg_edge2/bg_mid/bg_mid2背景色的明度變體fg_edge/fg_edge2/fg_mid/fg_mid2同理red、orange、yellow、green、cyan、azure、blue、purple前景明度的非基礎(chǔ)色帶_bg后綴者為背景明度變體accent/accent_bg前景/背景明度的強調(diào)色。需要說明的是部分生成顏色無法用#rrggbb精確表示此時會執(zhí)行 gamut clipping在不改變色相的前提下以最優(yōu)方式降低明度與彩度來得到可表示的十六進制值且并非所有顏色都會被高亮組使用部分字段僅為完整性而保留。公開 APIsetup、make_palette、apply_palette、get_palette、gen_random_base_colorsmini.hues 對外暴露五個主要函數(shù)均可在MiniHues全局表中訪問MiniHues.setup(config)模塊入口等價于make_palette()與apply_palette()的組合見 hues.lua調(diào)用后會導(dǎo)出全局表MiniHues、校驗并應(yīng)用配置。MiniHues.make_palette(config)僅計算調(diào)色板而不應(yīng)用接受與setup()相同的配置結(jié)構(gòu)必須有background、foreground??捎糜陬A(yù)覽或二次加工調(diào)色板。MiniHues.apply_palette(palette, plugins, opts)根據(jù)給定調(diào)色板創(chuàng)建高亮組與終端色。適合微調(diào)配色板后再應(yīng)用的場景l(fā)ocal 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控制自動調(diào)整。實現(xiàn)見 hues.lua。此外apply_palette()還會根據(jù)背景明度推導(dǎo)vim.g.terminal_color_0至terminal_color_15共 16 個終端色見 hues.lua。MiniHues.get_palette()返回最近一次通過apply_palette()應(yīng)用含setup()內(nèi)部調(diào)用的調(diào)色板副本實現(xiàn)見 hues.lua。MiniHues.gen_random_base_colors(opts)基于隨機色相與啟發(fā)式明度/彩度生成一組基礎(chǔ)色返回{ background ..., foreground ... }。它尊重background選項深色背景bg明度 15、彩度 3fg明度 80、彩度 1淺色背景bg明度 90、彩度 1fg明度 20、彩度 1。opts.gen_hue可傳入一個返回色相數(shù)值的函數(shù)來限制生成范圍默認math.random(0, 359)見 hues.lua。若在啟動階段調(diào)用建議先執(zhí)行math.randomseed(vim.loop.hrtime())以保證隨機性local hues require(mini.hues) math.randomseed(vim.loop.hrtime()) hues.setup(hues.gen_random_base_colors())也可以借助 mini.colors 自行復(fù)刻類似邏輯例如固定明度、只隨機色相l(xiāng)ocal 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), }內(nèi)置配色方案mini.hues 附帶多個現(xiàn)成配色方案文件位于倉庫 colors 目錄。四季主題miniwintericy winter 寒冬色調(diào)azure天藍背景。實現(xiàn)見 colors/miniwinter.lua它按background深/淺分別內(nèi)置了 Oklch 參數(shù)推導(dǎo)出的完整調(diào)色板再調(diào)用apply_palette()并設(shè)置vim.g.colors_name miniwinterminispringblooming spring 春意色調(diào)綠色背景colors/minispring.luaminisummerhot summer 盛夏色調(diào)棕/黃背景colors/minisummer.luaminiautumncooling autumn 秋涼色調(diào)紫色背景colors/miniautumn.lua。randomhue 隨機主題randomhue使用隨機生成的同色相背景與前景每次執(zhí)行:colorscheme randomhue都會得到一組新的隨機但經(jīng)過仔細挑選的顏色。其本質(zhì)是MiniHues.setup()與MiniHues.gen_random_base_colors()的組合并對background做了微調(diào)見 doc/mini-hues.txt。倉庫 colors/randomhue.lua 的實現(xiàn)展示了完整流程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直接以常規(guī):colorscheme方式激活即可。如需查看當(dāng)前生效配置可執(zhí)行:lua print(vim.inspect(MiniHues.config))如何創(chuàng)建自己的配色方案依據(jù) doc/mini-hues.txt 的說明創(chuàng)建自定義主題只需兩步在任意runtimepath可達的 colors 目錄通常是 Neovim 配置目錄下的 colors 文件夾中新建myscheme.lua文件名即主題名在文件中先調(diào)用require(mini.hues).setup()傳入你的調(diào)色板然后設(shè)置vim.g.colors_name myscheme。關(guān)于 cterm 顏色為保持實現(xiàn)簡潔mini.hues不定義 cterm 顏色僅依賴termguicolors若終端模擬器支持 24 位色Neovim 通常會自動啟用。若終端無法支持真彩色可改用 mini.colors 的MiniColors.colorscheme:add_cterm_attributes()定義支持 16 色的自定義主題。受支持的插件高亮組mini.hues 會為內(nèi)置 UI、語法、LSP、診斷、Tree-sitter、LSP semantic tokens 以及以下插件創(chuàng)建高亮組或經(jīng)過驗證確認其默認高亮可正常工作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 倉庫安裝??蛇xmain分支默認含最新開發(fā)版改動處于 beta 階段或stable分支僅在發(fā)布時更新代碼經(jīng)過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 * },安裝完成后務(wù)必調(diào)用帶background與foreground字段的require(mini.hues).setup()才會生效。若在 Windows 上遇到路徑過長錯誤error: unable to create file ...: Filename too long可執(zhí)行g(shù)it config --system core.longpaths true后重裝或?qū)⒉寮惭b到路徑更短的位置。測試與驗證倉庫 tests/test_hues.lua 覆蓋了模塊的核心行為校驗setup()后_G.MiniHues與MiniHues.config的類型與字段值、autoadjust切換后的高亮調(diào)整、以及make_palette()→apply_palette()→get_palette()的完整應(yīng)用閉環(huán)。閱讀測試可以更直觀地理解每個配置項的實際約束例如背景色校驗與配色方案重載時的行為。與 mini.base16 的關(guān)系mini.nvim 中還有一個 mini.base16 模塊它同樣基于基礎(chǔ)色生成配色方案但遵循 Base16 規(guī)范、使用預(yù)定義的十六色系統(tǒng)。如果你的需求是 Base16 風(fēng)格的固定模板配色可參考 readmes/mini-base16.md而 mini.hues 的優(yōu)勢在于基于 Oklch 的感知均勻計算與更細粒度的色相/飽和度/強調(diào)色控制。兩者面向不同偏好可按需選擇?!久赓M下載鏈接】mini.nvimLibrary of 45 independent Lua modules improving Neovim experience with minimal effort項目地址: https://gitcode.com/GitHub_Trending/mi/mini.nvim創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考