{ config, lib, pkgs, ... }: let cfg = config.programs.zsh.syntaxHighlighting; in { imports = [ (lib.mkRenamedOptionModule [ "programs" "zsh" "enableSyntaxHighlighting" ] [ "programs" "zsh" "syntaxHighlighting" "enable" ] ) (lib.mkRenamedOptionModule [ "programs" "zsh" "syntax-highlighting" "enable" ] [ "programs" "zsh" "syntaxHighlighting" "enable" ] ) (lib.mkRenamedOptionModule [ "programs" "zsh" "syntax-highlighting" "highlighters" ] [ "programs" "zsh" "syntaxHighlighting" "highlighters" ] ) (lib.mkRenamedOptionModule [ "programs" "zsh" "syntax-highlighting" "patterns" ] [ "programs" "zsh" "syntaxHighlighting" "patterns" ] ) ]; options = { programs.zsh.syntaxHighlighting = { enable = lib.mkEnableOption "zsh-syntax-highlighting"; highlighters = lib.mkOption { default = [ "main" ]; # https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/docs/highlighters.md type = lib.types.listOf ( lib.types.enum ([ "main" "brackets" "pattern" "cursor" "regexp" "root" "line" ]) ); description = '' Specifies the highlighters to be used by zsh-syntax-highlighting. The following defined options can be found here: https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/docs/highlighters.md ''; }; patterns = lib.mkOption { default = { }; type = lib.types.attrsOf lib.types.str; example = lib.literalExpression '' { "rm -rf *" = "fg=white,bold,bg=red"; } ''; description = '' Specifies custom patterns to be highlighted by zsh-syntax-highlighting. Please refer to the docs for more information about the usage: https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/docs/highlighters/pattern.md ''; }; styles = lib.mkOption { default = { }; type = lib.types.attrsOf lib.types.str; example = lib.literalExpression '' { "alias" = "fg=magenta,bold"; } ''; description = '' Specifies custom styles to be highlighted by zsh-syntax-highlighting. Please refer to the docs for more information about the usage: https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/docs/highlighters/main.md ''; }; }; }; config = lib.mkIf cfg.enable { environment.systemPackages = [ pkgs.zsh-syntax-highlighting ]; assertions = [ { assertion = builtins.length (builtins.attrNames cfg.patterns) > 0 -> builtins.elem "pattern" cfg.highlighters; message = '' When highlighting patterns, "pattern" needs to be included in the list of highlighters. ''; } ]; programs.zsh.interactiveShellInit = lib.mkAfter ( lib.concatStringsSep "\n" ( [ "source ${pkgs.zsh-syntax-highlighting}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" ] ++ lib.optional ( builtins.length (cfg.highlighters) > 0 ) "ZSH_HIGHLIGHT_HIGHLIGHTERS=(${builtins.concatStringsSep " " cfg.highlighters})" ++ lib.optionals (builtins.length (builtins.attrNames cfg.patterns) > 0) ( lib.mapAttrsToList ( pattern: design: "ZSH_HIGHLIGHT_PATTERNS+=('${pattern}' '${design}')" ) cfg.patterns ) ++ lib.optionals (builtins.length (builtins.attrNames cfg.styles) > 0) ( lib.mapAttrsToList (styles: design: "ZSH_HIGHLIGHT_STYLES[${styles}]='${design}'") cfg.styles ) ) ); }; }