diff --git a/zsh/.stow-local-ignore b/zsh/.stow-local-ignore new file mode 100644 index 0000000..c9b6ced --- /dev/null +++ b/zsh/.stow-local-ignore @@ -0,0 +1,4 @@ +# Keep docs and editor junk out of $HOME when stowing. +# NOTE: this file REPLACES stow's default ignore list, so common +# defaults are repeated here on purpose. +^local$ diff --git a/zsh/.zsh/alias.zsh b/zsh/.zsh/alias.zsh new file mode 100644 index 0000000..e3192d9 --- /dev/null +++ b/zsh/.zsh/alias.zsh @@ -0,0 +1,17 @@ +alias g=git +alias ktl=kubectl +alias ktx=kubectx +alias ls='eza' +alias ll='eza -l' +alias la='eza -la' +alias lau='eza -la -s modified' +alias las='eza -la -s size' +alias ..='cd ..' +alias ...='cd ../..' + +alias -s go=$EDITOR +alias -s yaml=$EDITOR +alias -s yml=$EDITOR +alias -s json=$EDITOR +alias -s conf=$EDITOR +alias -s md=$EDITOR diff --git a/zsh/README.md b/zsh/README.md new file mode 100644 index 0000000..8401b3a --- /dev/null +++ b/zsh/README.md @@ -0,0 +1,47 @@ +# zsh + +GNU Stow package for my zsh setup. Stowed from the repo root with the +`.stowrc` defaults (`--dotfiles --target=$HOME`), i.e.: + +```sh +stow zsh # stow (idempotent, safe to re-run) +stow -R zsh # re-stow after adding/removing files in this package +stow -D zsh # unstow +``` + +## Layout + +| In this repo | Becomes (symlink) | +|-------------------------|-----------------------| +| `dot-zshrc` | `~/.zshrc` | +| `.zsh/alias.zsh` | `~/.zsh/alias.zsh` | + +Other dirs under `~/.zsh/` (e.g. `local/`, `completions/`) are **not** +managed by stow — they are plain host-side directories and never touch +this repo. + +## Host-local config: `~/.zsh/local` + +`~/.zshrc` sources every `*.zsh` file in `~/.zsh/local/` at the **end** +of the file, in alphabetical order — so anything there can override +aliases, PATH, env vars, etc. set earlier. + +This is the place for **host-specific, non-shared** config: business/work +inits, private env vars, machine-specific paths, per-host aliases and +functions. + +The directory is **not** in the repo — it exists only on each host, so +after cloning + stowing on a new machine, create it once: + +```sh +mkdir -p ~/.zsh/local +``` + +(The sourcing loop in `.zshrc` tolerates the directory being missing.) + +## Notes + +- Editing existing files (`.zshrc`, `alias.zsh`) needs no restow — they're + symlinks. Only new/deleted files in this package require `stow -R zsh`. +- zinit, Powerlevel10k and the plugins auto-clone on first shell start; + first launch may take a minute. diff --git a/zsh/dot-zshrc b/zsh/dot-zshrc new file mode 100644 index 0000000..392bde2 --- /dev/null +++ b/zsh/dot-zshrc @@ -0,0 +1,94 @@ +# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc. +# Initialization code that may require console input (password prompts, [y/n] +# confirmations, etc.) must go above this block; everything else may go below. +if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then + source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" +fi + +# Set the directory we want to store zinit and plugins +ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git" + +# Download Zinit, if it's NOT there yet +if [ ! -d "$ZINIT_HOME" ]; then + mkdir -p "$(dirname $ZINIT_HOME)" + git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME" +fi + +# Source/Load zinit +source "${ZINIT_HOME}/zinit.zsh" + +# Add in Powerlevel10k +zinit ice depth=1; zinit light romkatv/powerlevel10k + +# Add in zsh plugins +zinit light zsh-users/zsh-syntax-highlighting +zinit light zsh-users/zsh-completions +zinit light zsh-users/zsh-autosuggestions +zinit light Aloxaf/fzf-tab + +# Add in snippets +zinit snippet OMZP::aws +zinit snippet OMZP::gcloud +zinit snippet OMZP::kubectl +zinit snippet OMZP::kubectx +zinit snippet OMZP::command-not-found + +# Load completions +autoload -Uz compinit && compinit + +# Load zmv +autoload zmv + +# Recomended +zinit cdreplay -q + +# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh. +[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh + +# Keybindings +bindkey -v +bindkey '^p' history-search-backward +bindkey '^n' history-search-forward + +# History +HISTSIZE=10000 +HISTFILE=~/.zsh_history +SAVEHIST=$HISTSIZE +HISTDUP=erase +setopt appendhistory +setopt sharehistory +setopt hist_ignore_space +setopt hist_ignore_all_dups +setopt hist_save_no_dups +setopt hist_ignore_dups +setopt hist_find_no_dups + +# Completion styling +zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}' +zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" +zstyle ':completion:*' menu no +zstyle ':fzf-tab:complete:cd:*' fzf-preview 'ls --color $realpath' +zstyle ':fzf-tab:complete:__zoxide_z:*' fzf-preview 'ls --color $realpath' + +EDITOR=nvim + +# Shell integrations +eval "$(fzf --zsh)" +eval "$(zoxide init --cmd cd zsh)" + +# Go +export PATH="$HOME/go/bin:$PATH" + +# Odin +export PATH="$HOME/Repos/odin-lang/Odin:$PATH" + +export PATH="$HOME/.local/bin:$PATH" +export PATH="$HOME/.local/share/nvim/mason/bin:$PATH" + +source "$HOME/.zsh/alias.zsh" + +# Host-local inits: every *.zsh in ~/.zsh/local is sourced in alphabetical +# order. Files there are not tracked by the dotfiles repo. +for f in "$HOME/.zsh/local"/*.zsh(N); do + source "$f" +done