# For interactive shells HISTFILE=~/.zhistory HISTSIZE=10000 SAVEHIST=10000 setopt \ ALWAYS_TO_END \ APPEND_HISTORY \ AUTO_CD \ AUTO_LIST \ AUTO_MENU \ AUTO_PARAM_SLASH \ AUTO_PUSHD \ BANG_HIST \ C_BASES \ COMPLETE_IN_WORD \ EXTENDED_GLOB \ EXTENDED_HISTORY \ HIST_EXPIRE_DUPS_FIRST \ HIST_FIND_NO_DUPS \ HIST_IGNORE_DUPS \ HIST_IGNORE_SPACE \ HIST_LEX_WORDS \ HIST_SAVE_NO_DUPS \ HIST_VERIFY \ INTERACTIVE_COMMENTS \ LONG_LIST_JOBS \ MULTIOS \ NO_CLOBBER \ NO_HUP \ NOMATCH \ NOTIFY \ PUSHD_IGNORE_DUPS \ PUSHD_SILENT \ PUSHD_TO_HOME \ RC_QUOTES \ SHARE_HISTORY unsetopt \ BEEP \ CDABLE_VARS \ HIST_BEEP \ LIST_BEEP \ FLOW_CONTROL \ MAIL_WARNING \ HUP \ BG_NICE \ CHECK_JOBS # vi keybindings bindkey -v # Allow core files ulimit -c unlimited DIRSTACKSIZE=16 # Set terminal title case $TERM in xterm*|screen*) autoload -U add-zsh-hook _term_precmd() { emulate -L zsh if test -n "${TMUX}" ; then print -Pn "\e]2;%16<..<%~\e\\" else # this will also work in tmux but is not what we want print -Pn "\e]0;%n@%m: %~\a" fi } _term_preexec() { emulate -L zsh setopt LOCAL_OPTIONS setopt EXTENDED_GLOB # extract the first word of the command that is not a match for the # pattern # (w) = match word # (r) = subscript value, not index local cmd=${1[(wr)^(*=*|sudo|ssh|mosh|-*)]:gs/%/%%} if test -n "${TMUX}" ; then print -Pn "\e]2;${cmd}\e\\" else # this will also work in tmux but is not what we want print -Pn "\e]0;%n@%m: %~ ($cmd)\a" fi } add-zsh-hook precmd _term_precmd add-zsh-hook preexec _term_preexec ;; esac autoload -U colors && colors PS1="%{$fg[black]%}[%{$fg[yellow]%}%h%{$fg[black]%}] %{%(!.$fg[red].$fg[green])%}%8>..>%n%>>%{$fg[white]%}@%{$fg[blue]%}%12>..>%m%>>%{$fg[white]%}:%{$fg[green]%}%32<...<%~%<<%{$fg[white]%}%#%{$reset_color%} " zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} zstyle ':completion::complete:*' use-cache on zstyle ':completion::complete:*' cache-path "${ZDOTDIR:-$HOME}/.zcompcache" # .profile is universal emulate sh -c '. /etc/profile' emulate sh -c '. ~/.profile' # Deduplicate the path typeset -U path # Additional Keybindings bindkey '^[[A' history-search-backward bindkey '^[[B' history-search-forward # ctrl-arrow keys bindkey '^[[1;5C' forward-word bindkey '^[[1;5D' backward-word bindkey '^P' up-history bindkey '^N' down-history bindkey '^?' backward-delete-char bindkey '^h' backward-delete-char # ok, a few emacs convenience bindings bindkey '^w' backward-kill-word bindkey '^r' history-incremental-search-backward # delete really deletes bindkey "^[[3~" delete-char source_if_existing() { if test -e "${1}" ; then source "${1}" ; else false ; fi } source_first_existing() { while (($#)); do if test -e "${1}" ; then source "${1}" return fi shift done return 1 } # Source extras and aliases if interactive if [[ $- == *i* ]] ; then source_if_existing $HOME/.aliases source_if_existing $HOME/.aliases.local # zsh-only-ism to avoid error if glob doesn't expand # specifically sets NULLGLOB for this one glob for file in $HOME/.zshrc.d/[a-zA-Z0-9]*.zsh(N) ; do source "$file" done # extra completions, prompt fpath=(~/.zshrc.completions ~/.zshrc.d/matir_prompt ~/.zshrc.d/agnoster_prompt $fpath) # Homebrew on mac if test -x /opt/homebrew/bin/brew ; then eval $(/opt/homebrew/bin/brew shellenv) fi # Completion zstyle ':compinstall' filename "${HOME}/.zshrc" zstyle ':completion:*' users root ${USER} # Modules after fpath autoload -Uz compinit && compinit -i autoload -Uz promptinit && promptinit # Virtualenvwrapper source_first_existing \ /usr/share/virtualenvwrapper/virtualenvwrapper_lazy.sh \ /usr/bin/virtualenvwrapper_lazy.sh \ /opt/homebrew/bin/virtualenvwrapper_lazy.sh if command ls --version >/dev/null 2>&1 ; then alias ls="$(whence -p ls) --color=auto" fi # Syntax highlighting and substring search source_first_existing \ /usr/share/{,zsh/plugins/}zsh-syntax-highlighting/zsh-syntax-highlighting.zsh if source_if_existing ${HOME}/.zshrc.d/_zsh-history-substring-search.zsh ; then bindkey '^[[A' history-substring-search-up bindkey '^[[B' history-substring-search-down bindkey -M vicmd 'k' history-substring-search-up bindkey -M vicmd 'j' history-substring-search-down fi # Suggestions if source_first_existing \ /usr/share/{,zsh/plugins/}zsh-autosuggestions/zsh-autosuggestions.zsh ; then # Works well for solarized ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=10" # Strategy -- note that 'completion' is slow AF ZSH_AUTOSUGGEST_STRATEGY=(history) fi # History alias fullhist="history 1" alias longhist="history -1000" # direnv if present if command -v direnv >/dev/null 2>&1 ; then eval "$(direnv hook zsh)" fi fi # End interactive-only block # In case ack is named ack-grep if [ -x /usr/bin/ack-grep ] ; then alias ack='/usr/bin/ack-grep' fi # Pip packages and other local resources if test -d ${HOME}/.local/bin ; then PATH=${PATH}:${HOME}/.local/bin fi if test -z "${PAGER}" && command -v less >/dev/null 2>&1; then export PAGER="less" fi # Load any local settings source_if_existing $HOME/.zshrc.local # separate interactive block based on .zshrc.local if [[ $- == *i* ]] ; then # Set prompt based on local settings if test -f "${HOME}/.zprompt" ; then THEME=${THEME:=$(cat "${HOME}/.zprompt")} fi if command -v starship >/dev/null 2>&1 ; then : ${THEME:=starship} if [ "${THEME}" = "starship" ] ; then eval "$(starship init zsh)" fi fi prompt "${THEME:-matir}" >/dev/null 2>&1 fi