Files
dotfiles/zsh/.zshrc
2026-03-18 14:38:46 +13:00

181 lines
5.4 KiB
Bash

# Path to your Oh My Zsh installation.
export ZSH="$HOME/.oh-my-zsh"
# History configuration
HISTFILE=$HOME/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt APPEND_HISTORY # Append to history file, don't overwrite
setopt SHARE_HISTORY # Share history across all sessions
setopt HIST_IGNORE_DUPS # Don't record duplicate consecutive commands
setopt HIST_IGNORE_ALL_DUPS # Delete old duplicate entries
setopt HIST_FIND_NO_DUPS # Don't show duplicates when searching
setopt HIST_IGNORE_SPACE # Don't record commands starting with space
setopt HIST_SAVE_NO_DUPS # Don't save duplicates to history file
setopt HIST_REDUCE_BLANKS # Remove extra blanks from commands
setopt INC_APPEND_HISTORY # Write to history file immediately, not on shell exit
# Homebrew Setup
if [[ "$(uname)" == "Darwin" ]]; then
eval "$(/opt/homebrew/bin/brew shellenv)" 2>/dev/null || eval "$(/usr/local/bin/brew shellenv)" 2>/dev/null
BREW_PREFIX=$(brew --prefix)
elif [[ "$(uname)" == "Linux" ]]; then
[ -d "/home/linuxbrew/.linuxbrew" ] && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
BREW_PREFIX="/home/linuxbrew/.linuxbrew"
fi
# Zsh Completions (must be set before sourcing Oh My Zsh)
if [ -d "$BREW_PREFIX/share/zsh-completions" ]; then
FPATH="$BREW_PREFIX/share/zsh-completions:$FPATH"
fi
# Set name of the theme to load
ZSH_THEME="" # Using Starship instead
# Plugin configuration
plugins=(
brew
globalias
git
git-commit
direnv
nvm
pyenv
zoxide
fzf
history-substring-search
colored-man-pages
sudo
gh
golang
extract
command-not-found
)
# Only use tmux if not on macOS
if [[ "$(uname)" != "Darwin" ]]; then
plugins+=(tmux)
ZSH_TMUX_AUTOSTART=true
ZSH_TMUX_AUTOCONNECT=true
ZSH_TMUX_AUTOSTART_ONCE=true
ZSH_TMUX_ITERM2=true
fi
ZOXIDE_CMD_OVERRIDE=cd
GLOBALIAS_FILTER_VALUES=(ls cat find grep top htop diff cd regen_protos cherrypick deploy_page deploy_service setup_venv claude_local claude_devbox)
DISABLE_LS_COLORS="true"
source $ZSH/oh-my-zsh.sh
# Brew-installed plugins (source manually since they aren't in $ZSH/plugins)
if [ -f "$BREW_PREFIX/share/zsh-autosuggestions/zsh-autosuggestions.zsh" ]; then
source "$BREW_PREFIX/share/zsh-autosuggestions/zsh-autosuggestions.zsh"
fi
if [ -f "$BREW_PREFIX/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" ]; then
source "$BREW_PREFIX/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
fi
# History substring search bindings (functions provided by history-substring-search plugin)
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
bindkey '^[OA' history-substring-search-up
bindkey '^[OB' history-substring-search-down
# Starship initialization
eval "$(starship init zsh)"
# --- User Settings ---
# Preferred editor for local and remote sessions
export EDITOR='nano'
# Java Setup (Homebrew only)
if command -v brew &> /dev/null && brew --prefix openjdk &>/dev/null; then
export PATH="$(brew --prefix openjdk)/bin:$PATH"
fi
# CUSTOM ALIASES
alias z="nano $HOME/.zshrc"
alias s="omz reload"
alias h="history"
alias c="cursor ."
# Modern replacements
alias ls='eza --icons --group-directories-first --git --git-repos --header "$@"'
alias cat='bat --style plain'
alias find='fd'
alias grep='rg'
alias top='btop'
alias htop='btop'
alias diff='difft'
# Navigation & Utilities
alias ..="cd .."
alias ...="cd ../.."
alias ll='ls -l'
alias la='ls -a'
alias lla='ls -la'
alias q="exit"
alias path='echo -e ${PATH//:/\\n}'
alias j="java -jar"
# Git aliases
alias ga="git add"
alias gco="git checkout"
alias gca="git commit --amend"
alias gcm="git commit -m"
alias gl="git log"
alias gp="git push"
alias gpl="git pull"
alias gplr="git pull --rebase"
alias gs="git status"
alias gd='git diff'
alias gds='git diff --staged'
alias glg="git log --graph --oneline --decorate --all"
alias gbn="git rev-parse --abbrev-ref HEAD"
# msw-dotfiles sync function
function update_dotfiles() {
local repo="$HOME/work/msw-dotfiles"
local msg="${1:-Backing up dotfile changes}"
git -C "$repo" add -A
# If the index is different from origin/main, we have work to do
if ! git -C "$repo" diff-index --quiet origin/main; then
# 1. Commit if Index != HEAD
if ! git -C "$repo" diff-index --quiet HEAD; then
echo "Committing local changes..."
git -C "$repo" commit -m "$msg"
fi
# 2. Sync with remote
echo "Syncing with GitHub..."
git -C "$repo" pull --rebase origin main && git -C "$repo" push origin main
else
echo "Dotfiles are already up to date with origin/main."
fi
}
alias dotup="update_dotfiles"
# Source Canva-specific configuration if present
[ -f "$HOME/.canva.zsh" ] && source "$HOME/.canva.zsh"
# Expand aliases on Enter before executing (respects globalias filter)
function expand-alias-and-accept-line() {
local -a words
# Use (z) to split into shell words, handle potential empty LBUFFER
words=(${(z)LBUFFER})
if (( ${#words} > 0 )); then
local last_word=${words[-1]}
# Check if the last word is in our filter list
if [[ ! " ${GLOBALIAS_FILTER_VALUES[*]} " == *" $last_word "* ]]; then
zle _expand_alias
fi
fi
zle accept-line
}
zle -N expand-alias-and-accept-line
bindkey '^M' expand-alias-and-accept-line
bindkey '^J' expand-alias-and-accept-line