inputs: { config, lib, pkgs, ... }: let inherit (inputs.self.lib.theme) fgEscapeCode; dominantEscapeCode = fgEscapeCode config.theme.colors.dominant; in { programs.zsh = { enable = true; interactiveShellInit = '' source "${pkgs.grml-zsh-config}/etc/zsh/zshrc" is4 && xsource "${pkgs.grml-zsh-config}/etc/zsh/keephack" source "${pkgs.zsh-history-substring-search}/share/zsh-history-substring-search/zsh-history-substring-search.zsh" function () { local dominant_escape_code="${dominantEscapeCode}" local dim_fg_escape_code="${fgEscapeCode config.theme.colors.dimForeground}" ${builtins.readFile ../../dotfiles/zshrc} autoload -Uz shmart-prompt-dir zstyle -e ':prompt:grml*:*:items:path' token shmart-prompt-dir } # Grml's ZSH config overrides less variables export ${lib.concatStringsSep " " (lib.mapAttrsToList (variable: value: "${variable}=\"${value}\"") config.programs.less.envVariables)} ''; # otherwise it'll override the grml prompt promptInit = ""; # Grml handles that, and supports cache (faster!!!) enableGlobalCompInit = false; syntaxHighlighting = { enable = true; highlighters = ["main" "brackets" "line"]; }; shellAliases = { e = "\${(z)EDITOR}"; # Space at the end makes Zsh expand aliases after "sudo" sudo = "sudo "; }; setOptions = [ "NO_CASE_GLOB" "NO_CLOBBER" ]; }; users.defaultUserShell = pkgs.zsh; home-manager.sharedModules = [ ({config, ...}: { programs.zsh = { enable = true; # Completion is already handled by the GRML conf enableCompletion = false; history = { extended = true; expireDuplicatesFirst = true; ignoreDups = true; ignorePatterns = ["run-help *"]; # different, for expireDuplicatesFirst size = 1100; save = 1000; }; # XDG dotDir = ".config/zsh"; history.path = "${config.xdg.dataHome}/zsh/zsh_history"; plugins = [ { name = "shmart-prompt-dir"; src = inputs.shmart-prompt-dir; file = "none"; } ]; }; }) ]; }