all repos — dot @ master

Shell, editor and terminal configuration, and the tools that go with them

config/zshrc (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
# Emacs style
bindkey -e
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line
# Vi style:
# zle -N edit-command-line
# bindkey -M vicmd v edit-command-line

bindkey \^U backward-kill-line

# Enable Ctrl-x-e to edit command line
autoload -U edit-command-line

# completions. Homebrew keeps them under its own prefix, which differs by
# machine -- /opt/homebrew on Apple Silicon, /usr/local on Intel -- and formulae
# install into share/zsh/site-functions, not the share/zsh-completions this
# hardcoded until 2026-09-21. That path existed on neither Mac, so every
# brew-installed completion (_brew, _bat, _deno, ...) was silently missing.
# Probed rather than asked of `brew --prefix`, which would fork on every shell,
# and done here because compinit below is the only moment fpath is read.
for _fp in \
  "${HOMEBREW_PREFIX:-/opt/homebrew}/share/zsh/site-functions" \
  "${HOMEBREW_PREFIX:-/opt/homebrew}/share/zsh-completions" \
  /usr/local/share/zsh/site-functions \
  /usr/local/share/zsh-completions
do
  [[ -d "$_fp" ]] && fpath=("$_fp" $fpath)
done
unset _fp

# fix delete
bindkey    "^[[3~"          delete-char
bindkey    "^[3;5~"         delete-char

# Caps Lock is F20 (hammerspoon). A terminal with no tmux in front of zsh, like
# Alacritty, sends it as ESC[34~. Nothing binds that, so zsh split it and left a
# `~` at the prompt for every key repeat. Binding the whole sequence to nothing
# makes zsh consume it as one key. Wispr Flow reads the key itself.
bindkey -s '^[[34~' ''

# chpwd() { ls -A; } # Auto ls after changing directory.

CDPATH=~ # Check ~ for directories after checking . (`c/d/` matches `./c*/d*/`, then tries `~/c*/d*/`).

setopt no_auto_menu # don't complete on ambiguous cases
setopt interactive_comments # Allow comments in the terminal.
setopt BANG_HIST                 # Treat the '!' character specially during expansion.
setopt EXTENDED_HISTORY          # Write the history file in the ":start:elapsed;command" format.
setopt INC_APPEND_HISTORY        # Write to the history file immediately, not when the shell exits.
setopt SHARE_HISTORY             # Share history between all sessions.
setopt HIST_EXPIRE_DUPS_FIRST    # Expire duplicate entries first when trimming history.
setopt HIST_IGNORE_DUPS          # Don't record an entry that was just recorded again.
setopt HIST_IGNORE_ALL_DUPS      # Delete old recorded entry if new entry is a duplicate.
setopt HIST_FIND_NO_DUPS         # Do not display a line previously found.
setopt HIST_IGNORE_SPACE         # Don't record an entry starting with a space.
setopt HIST_SAVE_NO_DUPS         # Don't write duplicate entries in the history file.
setopt HIST_REDUCE_BLANKS        # Remove superfluous blanks before recording entry.
# setopt HIST_VERIFY               # Don't execute immediately upon history expansion.
# setopt HIST_BEEP                 # Beep when accessing nonexistent history.

# don't fret if globbing patterns can't be expanded, just
# use them as is. useful for curl commands with '?'
# https://superuser.com/questions/982110/how-can-i-disable-globbing-for-url-arguments-in-zsh
setopt NO_NOMATCH

# disable case sensitivity
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

# don't ask "do you wish to see all NNN possibilities"
export LISTMAX=0

# if command -v startship
# then
#   eval "$(starship init zsh)"
local pure_src="$HOME/src/sindresorhus/pure"
if [[ -d "$pure_src" ]]
then
  fpath=("$pure_src" "$fpath[@]")
  autoload -U promptinit
  promptinit
  prompt pure
  # PURE_PROMPT_SYMBOL='∴'
else
  # PROMPT="$SUPLEMENT%F{8}%1~%f ∴ "
  PROMPT="%F{244}%1~%f ∴ "
fi

# Use modern completion system
autoload -Uz compinit
compinit -u
zstyle ':completion:*' auto-description 'specify: %d'
zstyle ':completion:*' completer _expand _complete _correct _approximate
zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' group-name ''
zstyle ':completion:*' menu select=2
command -v dircolors >/dev/null 2>&1 && eval "$(dircolors -b)"
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' list-colors ''
zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s
zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=* l:|=*'
zstyle ':completion:*' menu select=long
zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s
zstyle ':completion:*' use-compctl false
zstyle ':completion:*' verbose true
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'
zstyle ':completion:*:kill:*' command 'ps -u $USER -o pid,%cpu,tty,cputime,cmd'

# Recommended by Docker autocompletion
# https://docs.docker.com/compose/completion/
# fpath=(~/.zsh/completion $fpath)
# autoload -Uz compinit && compinit -i

autoload run-help
HELPDIR=/usr/local/share/zsh/help

# function that sources the given file if it exists
source_if_exists() {
  if [[ -f "$1" ]]
  then
    source "$1"
  fi
}

source "$HOME/.profile"

# fzf setup (must come after .profile which sets up PATH for brew)
brew_prefix="$(brew --prefix 2>/dev/null || true)"
if [[ -n "$brew_prefix" ]]
then
  # Setup fzf
  if [[ ! "$PATH" == *opt/fzf/bin* ]]; then
    export PATH="$PATH:$brew_prefix/opt/fzf/bin"
  fi

  # Auto-completion
  [[ $- == *i* ]] && source "$brew_prefix/opt/fzf/shell/completion.zsh" 2> /dev/null

  # Key bindings
  source "$brew_prefix/opt/fzf/shell/key-bindings.zsh"
elif [[ "$(uname)" == "Linux" ]] && command -v fzf > /dev/null
then
  # check if file exists before sourcing with zsh
  source_if_exists /usr/share/doc/fzf/examples/key-bindings.zsh
  source_if_exists /usr/share/doc/fzf/examples/completion.zsh
  source_if_exists /usr/share/fzf/shell/key-bindings.zsh
fi

export FZF_COMPLETION_OPTS="--border --info=inline ${FZF_COMPLETION_OPTS:-}"

setup_dir_hashes() {
  local src="$HOME/src"
  if [ -d /Volumes/Sense/src ]
  then
    src=/Volumes/Sense/src
  fi
  # Named directories for the checkouts this account works in, ~dot and the
  # rest. Only those that exist: zsh prints a warning for a hash -d to a
  # missing path, and which projects a machine has is the machine's business.
  # Not `local path`: in zsh that is tied to $PATH, and assigning to it in the
  # loop would blank PATH for the rest of this function, sourced fragment
  # included.
  local name dir
  for name dir in \
    dot "$src/soarez/dot" \
    cs  "$src/soarez/cloud-setup"
  do
    [ -d "$dir" ] && hash -d "$name=$dir"
  done
  # More of them, for whatever this machine works on, from a file another layer
  # links in. Same shape: `hash -d name=path`, one per line, zsh syntax.
  local extra="${XDG_CONFIG_HOME:-$HOME/.config}/shell/dir-hashes.zsh"
  [ -r "$extra" ] && source "$extra"
}
setup_dir_hashes

# ~/bin is prepended to PATH in config/env (which, unlike the line that used to
# be here, skips it when the directory doesn't exist).

export COURSIER_CREDENTIALS=~/.config/coursier/credentials.properties


# ## Support .envrc files: https://direnv.net/docs/hook.html
# eval "$(direnv hook zsh)"

# ## https://www.jenv.be
# eval \"$( jenv init - )\"