ddns-go: 6.7.7 -> 6.8.0 (#373902)
[NixPkgs.git] / nixos / modules / programs / zsh / zsh-syntax-highlighting.nix
blob07b4633bccd243e5f5a105aaf05672f9f1b40296
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
8 let
9   cfg = config.programs.zsh.syntaxHighlighting;
12   imports = [
13     (lib.mkRenamedOptionModule
14       [ "programs" "zsh" "enableSyntaxHighlighting" ]
15       [ "programs" "zsh" "syntaxHighlighting" "enable" ]
16     )
17     (lib.mkRenamedOptionModule
18       [ "programs" "zsh" "syntax-highlighting" "enable" ]
19       [ "programs" "zsh" "syntaxHighlighting" "enable" ]
20     )
21     (lib.mkRenamedOptionModule
22       [ "programs" "zsh" "syntax-highlighting" "highlighters" ]
23       [ "programs" "zsh" "syntaxHighlighting" "highlighters" ]
24     )
25     (lib.mkRenamedOptionModule
26       [ "programs" "zsh" "syntax-highlighting" "patterns" ]
27       [ "programs" "zsh" "syntaxHighlighting" "patterns" ]
28     )
29   ];
31   options = {
32     programs.zsh.syntaxHighlighting = {
33       enable = lib.mkEnableOption "zsh-syntax-highlighting";
35       highlighters = lib.mkOption {
36         default = [ "main" ];
38         # https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/docs/highlighters.md
39         type = lib.types.listOf (
40           lib.types.enum ([
41             "main"
42             "brackets"
43             "pattern"
44             "cursor"
45             "regexp"
46             "root"
47             "line"
48           ])
49         );
51         description = ''
52           Specifies the highlighters to be used by zsh-syntax-highlighting.
54           The following defined options can be found here:
55           https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/docs/highlighters.md
56         '';
57       };
59       patterns = lib.mkOption {
60         default = { };
61         type = lib.types.attrsOf lib.types.str;
63         example = lib.literalExpression ''
64           {
65             "rm -rf *" = "fg=white,bold,bg=red";
66           }
67         '';
69         description = ''
70           Specifies custom patterns to be highlighted by zsh-syntax-highlighting.
72           Please refer to the docs for more information about the usage:
73           https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/docs/highlighters/pattern.md
74         '';
75       };
76       styles = lib.mkOption {
77         default = { };
78         type = lib.types.attrsOf lib.types.str;
80         example = lib.literalExpression ''
81           {
82             "alias" = "fg=magenta,bold";
83           }
84         '';
86         description = ''
87           Specifies custom styles to be highlighted by zsh-syntax-highlighting.
89           Please refer to the docs for more information about the usage:
90           https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/docs/highlighters/main.md
91         '';
92       };
93     };
94   };
96   config = lib.mkIf cfg.enable {
97     environment.systemPackages = [ pkgs.zsh-syntax-highlighting ];
99     assertions = [
100       {
101         assertion =
102           builtins.length (builtins.attrNames cfg.patterns) > 0 -> builtins.elem "pattern" cfg.highlighters;
103         message = ''
104           When highlighting patterns, "pattern" needs to be included in the list of highlighters.
105         '';
106       }
107     ];
109     programs.zsh.interactiveShellInit = lib.mkAfter (
110       lib.concatStringsSep "\n" (
111         [
112           "source ${pkgs.zsh-syntax-highlighting}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
113         ]
114         ++ lib.optional (
115           builtins.length (cfg.highlighters) > 0
116         ) "ZSH_HIGHLIGHT_HIGHLIGHTERS=(${builtins.concatStringsSep " " cfg.highlighters})"
117         ++ lib.optionals (builtins.length (builtins.attrNames cfg.patterns) > 0) (
118           lib.mapAttrsToList (
119             pattern: design: "ZSH_HIGHLIGHT_PATTERNS+=('${pattern}' '${design}')"
120           ) cfg.patterns
121         )
122         ++ lib.optionals (builtins.length (builtins.attrNames cfg.styles) > 0) (
123           lib.mapAttrsToList (styles: design: "ZSH_HIGHLIGHT_STYLES[${styles}]='${design}'") cfg.styles
124         )
125       )
126     );
127   };