{ inputs, ... }: { lux.shell = { homeManager = { lib, config, ... }: { # Delete zcompdump on config switch, so that we regenerate completions home.activation = { clearZshCompDump = lib.hm.dag.entryAfter [ "writeBoundary" ] '' rm -f '${config.programs.zsh.dotDir}/.zcompdump*' ''; }; programs.zsh = { enable = true; dotDir = "${config.xdg.configHome}/zsh"; enableCompletion = true; completionInit = '' setopt EXTENDED_GLOB autoload -U compinit local dump_path="${config.programs.zsh.dotDir}/.zcompdump" local cache_check=( $dump_path(#qN.mh-24) ) if (( $#cache_check )); then # Array has items: File exists and is new compinit -C else # Array is empty: File is older than 24 hours OR doesn't exist compinit zcompile "$dump_path" & fi ''; autosuggestion.enable = true; syntaxHighlighting = { enable = true; highlighters = [ "main" "brackets" "pattern" "regexp" "root" "line" ]; }; historySubstringSearch.enable = true; history = { ignoreDups = true; save = 10000; size = 10000; path = "${config.xdg.dataHome}/zsh_history"; }; profileExtra = lib.optionalString (config.home.sessionPath != [ ]) '' export PATH="$PATH''${PATH:+:}${lib.concatStringsSep ":" config.home.sessionPath}" ''; initContent = # bash '' bindkey -v export KEYTIMEOUT=1 # search history based on what's typed in the prompt autoload -U history-search-end zle -N history-beginning-search-backward-end history-search-end zle -N history-beginning-search-forward-end history-search-end bindkey "^[OA" history-beginning-search-backward-end bindkey "^[OB" history-beginning-search-forward-end # General completion behavior zstyle ':completion:*' completer _extensions _complete _approximate # Use cache zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path "$XDG_CACHE_HOME/zsh/.zcompcache" # Complete the alias zstyle ':completion:*' complete true # Autocomplete options zstyle ':completion:*' complete-options true # Completion matching control zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' zstyle ':completion:*' keep-prefix true # Group matches and describe zstyle ':completion:*' menu select zstyle ':completion:*' list-grouped false zstyle ':completion:*' list-separator ''' zstyle ':completion:*' group-name ''' zstyle ':completion:*' verbose yes zstyle ':completion:*:matches' group 'yes' zstyle ':completion:*:warnings' format '%F{red}%B-- No match for: %d --%b%f' zstyle ':completion:*:messages' format '%d' zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b' zstyle ':completion:*:descriptions' format '[%d]' # Colors zstyle ':completion:*' list-colors ''${(s.:.)LS_COLORS} # case insensitive tab completion zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories zstyle ':completion:*:*:cd:*:directory-stack' menu yes select zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path-directories' 'users' 'expand' zstyle ':completion:*:*:-command-:*:*' group-order aliases builtins functions commands zstyle ':completion:*' special-dirs true zstyle ':completion:*' squeeze-slashes true # Sort zstyle ':completion:*' sort false zstyle ":completion:*:git-checkout:*" sort false zstyle ':completion:*' file-sort modification zstyle ':completion:*:eza' sort false zstyle ':completion:complete:*:options' sort false zstyle ':completion:files' sort false ${lib.optionalString config.services.gpg-agent.enable '' gnupg_path=$(ls $XDG_RUNTIME_DIR/gnupg) export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/gnupg/$gnupg_path/S.gpg-agent.ssh" ''} ''; }; programs.starship = { enable = true; enableZshIntegration = true; settings = { add_newline = true; format = lib.concatStrings [ "$nix_shell" "$hostname" "$directory" "$git_branch" "$git_state" "$git_status" "$line_break" "$character" ]; directory = { truncation_length = 99; truncate_to_repo = false; }; nix_shell = { format = "[$symbol]($style) "; symbol = "🐚"; style = ""; }; git_status = { format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218)($ahead_behind$stashed)]($style)"; style = "cyan"; conflicted = ""; renamed = ""; deleted = ""; stashed = "≡"; }; git_state = { format = "([$state( $progress_current/$progress_total)]($style)) "; style = "bright-black"; }; line_break = { disabled = false; }; }; }; programs.eza = { enable = true; }; programs.fzf = { enable = true; enableZshIntegration = true; }; }; }; }