From 172168ba41d22ff3229d15a86ad7535a372c4ced Mon Sep 17 00:00:00 2001 From: Cameron Reed Date: Sun, 28 Jan 2024 21:00:14 -0700 Subject: [PATCH] Add zsh config to Home Manager --- common/users/cameron/home-manager/zsh.nix | 139 ++++++++++++++++++++++ common/users/cameron/home.nix | 2 + 2 files changed, 141 insertions(+) create mode 100644 common/users/cameron/home-manager/zsh.nix diff --git a/common/users/cameron/home-manager/zsh.nix b/common/users/cameron/home-manager/zsh.nix new file mode 100644 index 0000000..2296bad --- /dev/null +++ b/common/users/cameron/home-manager/zsh.nix @@ -0,0 +1,139 @@ +{ pkgs, lib, config, osConfig, ... }: + +{ + programs.zsh = { + enable = true; + enableCompletion = true; + + dotDir = ".config/zsh"; + + initExtraFirst = '' +[[ $- != *i* ]] && return + ''; + + initExtraBeforeCompInit = '' +mkdir -p ${config.home.homeDirectory}/.cache/zsh + +zstyle ':completion:*' completer _expand _complete _ignored +zstyle ':completion:*' ignore-parents parent pwd .. directory +zstyle ':completion:*' max-errors 2 +zstyle ':completion:*' prompt 'Corrected %e errors' +zstyle ':completion:*' squeeze-slashes true +zstyle ':completion:*' cache-path ${config.home.homeDirectory}/.cache/zsh/zcompcache +zstyle :compinstall filename "${config.home.homeDirectory}/.config/zsh/.zshrc" + ''; + + completionInit = "autoload -Uz compinit && compinit -d ${config.home.homeDirectory}/.cache/zsh/zcompcache"; + + history = { + path = "${config.home.homeDirectory}/.local/state/zsh/history"; + ignoreSpace = true; + }; + + initExtra = '' +typeset -g -A key + +key[Home]="''${terminfo[khome]}" +key[End]="''${terminfo[kend]}" +key[Insert]="''${terminfo[kich1]}" +key[Backspace]="''${terminfo[kbs]}" +key[Delete]="''${terminfo[kdch1]}" +key[Up]="''${terminfo[kcuu1]}" +key[Down]="''${terminfo[kcud1]}" +key[Left]="''${terminfo[kcub1]}" +key[Right]="''${terminfo[kcuf1]}" +key[PageUp]="''${terminfo[kpp]}" +key[PageDown]="''${terminfo[knp]}" +key[Shift-Tab]="''${terminfo[kcbt]}" +key[Control-Left]="''${terminfo[kLFT5]}" +key[Control-Right]="''${terminfo[kRIT5]}" + +# setup key accordingly +[[ -n "''${key[Home]}" ]] && bindkey -- "''${key[Home]}" beginning-of-line +[[ -n "''${key[End]}" ]] && bindkey -- "''${key[End]}" end-of-line +[[ -n "''${key[Insert]}" ]] && bindkey -- "''${key[Insert]}" overwrite-mode +[[ -n "''${key[Backspace]}" ]] && bindkey -- "''${key[Backspace]}" backward-delete-char +[[ -n "''${key[Delete]}" ]] && bindkey -- "''${key[Delete]}" delete-char +[[ -n "''${key[Up]}" ]] && bindkey -- "''${key[Up]}" up-line-or-history +[[ -n "''${key[Down]}" ]] && bindkey -- "''${key[Down]}" down-line-or-history +[[ -n "''${key[Left]}" ]] && bindkey -- "''${key[Left]}" backward-char +[[ -n "''${key[Right]}" ]] && bindkey -- "''${key[Right]}" forward-char +[[ -n "''${key[PageUp]}" ]] && bindkey -- "''${key[PageUp]}" beginning-of-buffer-or-history +[[ -n "''${key[PageDown]}" ]] && bindkey -- "''${key[PageDown]}" end-of-buffer-or-history +[[ -n "''${key[Shift-Tab]}" ]] && bindkey -- "''${key[Shift-Tab]}" reverse-menu-complete +[[ -n "''${key[Control-Left]}" ]] && bindkey -- "''${key[Control-Left]}" backward-word +[[ -n "''${key[Control-Right]}" ]] && bindkey -- "''${key[Control-Right]}" forward-word + +# Finally, make sure the terminal is in application mode, when zle is +# active. Only then are the values from $terminfo valid. +if (( ''${+terminfo[smkx]} && ''${+terminfo[rmkx]} )); then + autoload -Uz add-zle-hook-widget + function zle_application_mode_start { echoti smkx } + function zle_application_mode_stop { echoti rmkx } + add-zle-hook-widget -Uz zle-line-init zle_application_mode_start + add-zle-hook-widget -Uz zle-line-finish zle_application_mode_stop +fi + +# Configure prompt +setopt prompt_subst +PROMPT_COLORS="" +PROMPT_PREFIXES="" + +function set_prompt() { + local colors=(''${(@s:~:)PROMPT_COLORS}) + local prefixes=(''${(@s:~:)PROMPT_PREFIXES}) + + local prefix="" + for i in $(seq 1 "''${#prefixes[@]}"); do + prefix+="%F{''${colors[$i]:-255}}''${prefixes[$i]}%F{255} " + done + + PROMPT="[''${prefix}%n@%m %1~]%(#.#.$) " +} + +typeset -a precmd_functions +precmd_functions+=(set_prompt) + + +# Initialize direnv if it exists +if command -v direnv &> /dev/null; then + eval "$(direnv hook zsh)" +fi + + +if [ "$TERM" = "xterm-kitty" ]; then + alias ssh='kitty +kitten ssh' + alias clear='printf "\033c"' +fi + ''; + + shellAliases = { + grep = "grep --color=auto"; + ls = "ls --color=auto"; + + nv = "nvim"; + nvd = "nvim ."; + nvc = "nvim -c \"edit \$MYVIMRC\""; + nvp = "nvim ${config.home.homeDirectory}/projects"; + + c = "clear"; + e = "echo"; + pf = "printf"; + nf = "neofetch"; + + x = "exit"; + ":q" = "exit"; + ":wq" = "exit"; + }; + + + profileExtra = '' +[[ -f ~/.profile ]] && . ~/.profile +[[ -f $ZDOTDIR/.zshrc ]] && . $ZDOTDIR/.zshrc + +if [ "$XDG_SESSION_TYPE" = "wayland" ]; then + export MOZ_ENABLE_WAYLAND=1 +fi + ''; + }; +} diff --git a/common/users/cameron/home.nix b/common/users/cameron/home.nix index 83cc613..4c3fbf8 100644 --- a/common/users/cameron/home.nix +++ b/common/users/cameron/home.nix @@ -10,6 +10,8 @@ ./home-manager/hyprpaper.nix ./home-manager/swaylock.nix ./home-manager/waybar.nix + + ./home-manager/zsh.nix ]; home.username = "cameron";