summaryrefslogtreecommitdiffstats
path: root/modules/neovim/init/highlight.nix
blob: 9c6b721414961dc15700471d31cce5e2a20fcf10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
{
  config,
  lib,
  ...
}: let
  inherit (lib.options) mkOption;
  inherit (lib.types) nullOr attrsOf listOf submodule bool ints str enum;
  inherit (lib.strings) concatLines;
  inherit (lib.attrsets) mapAttrsToList;
  inherit (lib.nvim.dag) entryBetween;
  inherit (lib.nvim.lua) toLuaObject;

  mkColorOption = target:
    mkOption {
      type = nullOr str;
      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);
  };
}