# Managed by dotfiles/zsh/install.sh — edits made directly to ~/.zshrc will be # overwritten on the next bootstrap run. Edit zsh/zshrc in the dotfiles repo # instead. # If this account was added to the docker group (dotfiles/docker/install.sh) # but this shell's session predates that, re-exec via newgrp so docker works # without a full logout. Guarded: fires only when the group is on the account # yet missing from the running shell's groups, so the newgrp'd shell (which # has the group) cannot loop. # Only for real terminals ([ -t 0 ]): newgrp replaces the shell and would # swallow the command in scripted `zsh -i -c ...` invocations. if [ -t 0 ] && [ -S /var/run/docker.sock ] \ && id -nG "${USER:-$(id -un)}" 2>/dev/null | grep -qw docker \ && ! id -Gn 2>/dev/null | grep -qw docker; then exec newgrp docker fi # Userland tools installed by dotfiles/bin/install.sh live here. case ":$PATH:" in *":$HOME/.local/bin:"*) ;; *) export PATH="$HOME/.local/bin:$PATH" ;; esac export ZSH="$HOME/.oh-my-zsh" ZSH_THEME="robbyrussell" plugins=(git) source "$ZSH/oh-my-zsh.sh" HISTSIZE=10000 SAVEHIST=10000 setopt SHARE_HISTORY setopt HIST_IGNORE_DUPS # Delete remote branches without fighting tab-completion. # # `git push origin --delete ` completes to `origin/foo`, but `origin/foo` # is a LOCAL remote-tracking name — the ref on the server is just `foo`. So the # command zsh completes for you is the one git rejects, with "remote ref does # not exist", which reads like the branch is missing rather than misnamed. # # grmb takes either form. It fetches with --prune first so branches already # deleted on the server stop being offered at all (that is the other half of # this annoyance, and `fetch.prune = true` from dotfiles/git/install.sh makes it # automatic everywhere else). # # Named grmb, not gbd: oh-my-zsh's git plugin already binds gbd to # `git branch --delete`, aliases resolve before functions, and the collision # fails in the worst possible way — `gbd origin/foo` would quietly try to # delete a LOCAL branch instead of the remote one. Check with `type ` # before adding any g* helper here. # # grmb origin/my-branch # completed form, works # grmb my-branch other # bare form, several at once grmb() { emulate -L zsh local remote=origin b rc=0 if [ "$#" -eq 0 ]; then print -u2 "grmb: usage: grmb ... (origin/ prefix optional)" return 2 fi git fetch --prune --quiet "$remote" || return 1 for b in "$@"; do b=${b#${remote}/} if git push "$remote" --delete "$b"; then print "deleted ${remote}/${b}" else print -u2 "grmb: could not delete ${b} (already gone? check: git ls-remote --heads ${remote})" rc=1 fi done return $rc } # Per-machine customizations (secrets, keys, local overrides) live in # ~/.zshrc.local, which bootstrap never touches. See zsh/zshrc.local.example # for the variables modules look for. Loaded last so it can override anything. [ -f "$HOME/.zshrc.local" ] && source "$HOME/.zshrc.local"