{ config, lib, ... }: let inherit (lib.options) mkOption; inherit (lib.types) nullOr attrsOf listOf submodule bool ints str enum; inherit (lib.strings) hasPrefix concatLines; inherit (lib.attrsets) mapAttrsToList; inherit (lib.nvim.dag) entryBetween; inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.types) hexColor; mkColorOption = target: mkOption { type = nullOr hexColor; default = null; example = "#ebdbb2"; description = '' The ${target} color to use. Written as color name or hex "#RRGGBB". ''; }; mkBoolOption = name: mkOption { type = nullOr bool; default = null; example = false; description = "Whether to enable ${name}"; }; cfg = config.vim.highlight; in { options.vim.highlight = mkOption { type = attrsOf (submodule { # See :h nvim_set_hl options = { bg = mkColorOption "background"; fg = mkColorOption "foreground"; sp = mkColorOption "special"; blend = mkOption { type = nullOr (ints.between 0 100); default = null; description = "Blend as an integer between 0 and 100"; }; bold = mkBoolOption "bold"; standout = mkBoolOption "standout"; underline = mkBoolOption "underline"; undercurl = mkBoolOption "undercurl"; underdouble = mkBoolOption "underdouble"; underdotted = mkBoolOption "underdotted"; underdashed = mkBoolOption "underdashed"; strikethrough = mkBoolOption "strikethrough"; italic = mkBoolOption "italic"; reverse = mkBoolOption "reverse"; nocombine = mkBoolOption "nocombine"; link = mkOption { type = nullOr str; default = null; description = "The name of another highlight group to link to"; }; default = mkOption { type = nullOr bool; default = null; description = "Don't override existing definition"; }; ctermfg = mkOption { type = nullOr str; default = null; description = "The cterm foreground color to use"; }; ctermbg = mkOption { type = nullOr str; default = null; description = "The cterm background color to use"; }; cterm = mkOption { type = nullOr (listOf (enum [ "bold" "underline" "undercurl" "underdouble" "underdotted" "underdashed" "strikethrough" "reverse" "inverse" "italic" "standout" "altfont" "nocombine" "NONE" ])); default = null; description = "The cterm arguments to use. See ':h highlight-args'"; }; force = mkBoolOption "force update"; }; }); default = {}; example = { SignColumn = { bg = "#282828"; }; }; description = "Custom highlights to apply"; }; config = { vim.luaConfigRC.highlight = let highlights = mapAttrsToList ( name: value: ''vim.api.nvim_set_hl(0, ${toLuaObject name}, ${toLuaObject value})'' ) cfg; in entryBetween ["lazyConfigs" "pluginConfigs" "extraPluginConfigs"] ["theme"] (concatLines highlights); }; }