dotfiles/.zshrc

274 lines
12 KiB
Bash
Raw Normal View History

2022-03-18 17:50:20 -07:00
# Blake's ZSH configuration file
2023-06-16 03:48:36 -07:00
# Profiling (part 1) if needed (see line at bottom too)
# zmodload zsh/zprof
# Just in case
export SHELL_CONFIG_DIR="${SHELL_CONFIG_DIR:-"${XDG_CONFIG_HOME:-"$HOME/.config"}/shell"}"
2022-03-18 17:50:20 -07:00
# Source standard shell configuration
[ -f "$SHELL_CONFIG_DIR/shrc" ] && source "$SHELL_CONFIG_DIR/shrc"
2021-08-07 21:24:26 -07:00
### Plugins >>>
${SKIP_PLUGINS:-false} || {
2021-08-07 21:24:26 -07:00
# Load zinit >>>
{
# Install zinit if not installed
if [[ ! -f "$ZINIT_HOME_DIR/bin/zinit.zsh" ]]; then
print -P "%F{33}▓▒░ %F{220}Installing %F{33}DHARMA%F{220} Initiative Plugin Manager (%F{33}zdharma-continuum/zinit%F{220})…%f"
command mkdir -p "$ZINIT_HOME_DIR" && command chmod g-rwX "$ZINIT_HOME_DIR"
command git clone https://github.com/zdharma-continuum/zinit "$ZINIT_HOME_DIR/bin" && \
print -P "%F{33}▓▒░ %F{34}Installation successful.%f%b\n\nPlease wait while plugins install." || \
2021-08-07 21:24:26 -07:00
print -P "%F{160}▓▒░ The clone has failed.%f%b"
elif [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
2021-08-07 21:24:26 -07:00
fi
# }}")}' ' $((r-2))"'}|)}'""}| f%nfda@#$%^!@#$h&&f.fd
# ^^^^ syntax highlighting fix
2021-08-07 21:24:26 -07:00
# Source zinit
source "$ZINIT_HOME_DIR/bin/zinit.zsh"
2021-08-07 21:24:26 -07:00
autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit
# Load a few important annexes, without Turbo
# (this is currently required for annexes)
zinit light-mode for \
zdharma-continuum/z-a-rust \
zdharma-continuum/z-a-as-monitor \
zdharma-continuum/z-a-patch-dl \
zdharma-continuum/z-a-bin-gem-node
2021-08-07 21:24:26 -07:00
}
2024-05-16 04:18:19 -07:00
# )))"}"s}${fdsa}} # syntax highlighting fix
2021-08-07 21:24:26 -07:00
# <<<
2022-03-18 17:50:20 -07:00
# Load plugins >>>
# shellcheck disable=SC2262,SC2016
2021-08-07 21:24:26 -07:00
{
2021-12-16 14:37:51 -08:00
# set turbo mode and git clone depth for all plugins
2023-06-16 03:48:36 -07:00
alias zinit='ice wait"0" depth"1";zinit'
2022-03-18 17:50:20 -07:00
# Special history options
zinit snippet OMZL::history.zsh
2022-03-18 17:50:20 -07:00
# Some better completion options (waiting dots, etc)
zinit snippet OMZL::completion.zsh
2022-03-18 17:50:20 -07:00
# Terminal titling
zinit snippet OMZL::termsupport.zsh
# Required lib functions (specifically omz_urlencode)
zinit snippet OMZL::functions.zsh
# Compaudit
zinit snippet OMZL::compfix.zsh
2022-03-18 17:50:20 -07:00
2021-08-07 21:24:26 -07:00
# Quality of life
zinit load "zsh-users/zsh-autosuggestions"
zinit load "zdharma-continuum/fast-syntax-highlighting"
zinit load "jeffreytse/zsh-vi-mode"
2021-08-07 21:24:26 -07:00
zinit load "zsh-users/zsh-history-substring-search"
zinit load "zsh-users/zsh-completions"
2024-09-11 00:13:32 -07:00
if ! command -v zoxide &> /dev/null || ${SKIP_ZOXIDE:-false}; then
zinit load "agkozak/zsh-z"
fi
2021-08-07 21:24:26 -07:00
2022-10-18 02:55:22 -07:00
# Plugins for use with Nix
zinit load "chisui/zsh-nix-shell"
zinit load "spwhitt/nix-zsh-completions"
zinit snippet OMZP::direnv
2022-10-18 02:55:22 -07:00
2022-03-18 17:50:20 -07:00
## Theme
2021-09-15 00:55:59 -07:00
# terminal colors
[ -f "$SHELL_CONFIG_DIR/colors.sh" ] ||
zinit snippet 'https://github.com/chriskempson/base16-shell/blob/master/scripts/base16-onedark.sh'
2022-03-18 17:50:20 -07:00
# LS Colors
2021-09-06 17:55:39 -07:00
zinit ice atclone"dircolors -b ./src/dir_colors > colors.zsh" \
atpull'%atclone' pick"colors.zsh" nocompile'!' \
atload'zstyle ":completion:*" list-colors “${(s.:.)LS_COLORS}”'
zinit light arcticicestudio/nord-dircolors
2022-03-18 17:50:20 -07:00
# prompt
zinit load "romkatv/powerlevel10k"
"${SKIP_P10K_THEME:-false}" || careful_source "$P10K_CONFIG_LOCATION" \
"No p10k theme selected. Please use \`p10k configure\` to make one or select an existing one like this:
ln -s $SHELL_CONFIG_DIR/p10k/colorful-angular.p10k.zsh $SHELL_CONFIG_DIR/p10k/current
Set the SKIP_P10K_THEME environment variable to 'true' or make a configuration to disable this warning" $LINENO
2022-03-18 17:50:20 -07:00
# clear plugin options set at the start of this block
unalias zinit
2021-12-16 14:37:51 -08:00
# (safely) delete a bunch of aliases I don't use
unaliases() { for A in "$@";do alias "$A" > /dev/null && unalias "$A"; done; }
unaliases zi zpl zini zplg which-command run-help fsh-alias
unset -f unaliases
2021-08-07 21:24:26 -07:00
}
# <<<
}
# <<<
### ZSH-specific configuration >>>
# This section is (mostly) From manjaro's "manjaro-zsh-config" (/usr/share/zsh/manjaro-zsh-config)
2021-08-07 21:24:26 -07:00
[ -z "$HISTFILE" ] && HISTFILE="$HOME/.zsh_history"
## ZSH Options >>>
2021-08-07 21:24:26 -07:00
{
# setopt correct # Auto correct mistakes
setopt noextendedglob # Extended globbing. Allows using regular expressions with *
[ -z "$TERMUX_VERSION" ] &&
setopt nocaseglob # Case insensitive globbing (and fix for termux)
2021-08-07 21:24:26 -07:00
setopt rcexpandparam # Array expension with parameters
setopt checkjobs # Warn about running processes when exiting
setopt numericglobsort # Sort filenames numerically when it makes sense
setopt nobeep # Most important option
setopt appendhistory # Immediately append history instead of overwriting
setopt inc_append_history # save commands are added to the history immediately, otherwise only when shell exits.
setopt histfindnodups # If a new command is a duplicate, remove the older one
setopt histignorealldups # If a new command is a duplicate, remove the older one
setopt autocd # if only directory path is entered, cd there.
setopt interactive_comments # allow typing comments in line
setopt no_rm_star_silent # Ensure the user wants to execute 'rm *'
setopt rm_star_wait # Wait before accepting 'rm *' or 'rm /path/*'
setopt short_loops # allow things like 'if [ 1=1 ] { echo "okay"}' < https://zsh.sourceforge.io/Doc/Release/Shell-Grammar.html#Alternate-Forms-For-Complex-Commands
setopt pipe_fail # When a pipe fails, show the non-0 exit code for the exit code
2024-08-01 00:41:26 -07:00
disable -p '#' # Disable globbing the hash symbol
2021-08-07 21:24:26 -07:00
}
# <<<
## ZSH Completion Options >>>
{
# Mine
2023-05-06 22:37:41 -07:00
zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate
zstyle ':completion:*' completions 1
zstyle ':completion:*' expand prefix suffix
# zstyle ':completion:*' format 'Completing %d'
2023-05-06 22:37:41 -07:00
zstyle ':completion:*' glob 1
zstyle ':completion:*' group-name ''
zstyle ':completion:*' ignore-parents parent pwd ..
# zstyle ':completion:*' insert-unambiguous true
2023-05-06 22:37:41 -07:00
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
# zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s
2023-05-06 22:37:41 -07:00
zstyle ':completion:*' list-suffixes true
# zstyle ':completion:*' matcher-list '' 'm:{[:lower:]}={[:upper:]}' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|[._-]=** r:|=**'
2023-05-06 22:37:41 -07:00
zstyle ':completion:*' max-errors 1 not-numeric
# zstyle ':completion:*' menu select=0
# zstyle ':completion:*' original false
# zstyle ':completion:*' prompt 'Select a correction (%e)'
# zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s
# zstyle ':completion:*' substitute 1
# zstyle ':completion:*' verbose true
2023-05-06 22:37:41 -07:00
zstyle :compinstall filename '/home/blake/.zshrc'
2021-08-07 21:24:26 -07:00
# Manjaro's
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' # Case insensitive tab completion
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" # Colored completion (different colors for dirs/files/etc)
2021-11-06 19:48:31 -07:00
zstyle ':completion:*' rehash true # automatically find new executables in path
# Speed up completions
2021-08-07 21:24:26 -07:00
zstyle ':completion:*' accept-exact '*(N)'
zstyle ':completion:*' use-cache on
2022-03-18 17:50:20 -07:00
zstyle ':completion:*' cache-path "$ZSH_CACHE_DIR"
2021-08-07 21:24:26 -07:00
WORDCHARS=${WORDCHARS//\/[&.;]} # Don't consider certain characters part of the word
}
# <<<
## Keybinds >>>
2021-08-07 21:24:26 -07:00
bindkey -v # Enable Vi mode
bindkey '^[[7~' beginning-of-line # Home key
bindkey '^[[H' beginning-of-line # Home key
if [[ "${terminfo[khome]}" != "" ]]; then
bindkey "${terminfo[khome]}" beginning-of-line # [Home] - Go to beginning of line
fi
bindkey '^[[8~' end-of-line # End key
bindkey '^[[F' end-of-line # End key
if [[ "${terminfo[kend]}" != "" ]]; then
bindkey "${terminfo[kend]}" end-of-line # [End] - Go to end of line
fi
bindkey '^[[2~' overwrite-mode # Insert key
bindkey '^[[3~' delete-char # Delete key
bindkey '^[[C' forward-char # Right key
bindkey '^[[D' backward-char # Left key
bindkey '^[[5~' history-beginning-search-backward # Page up key
bindkey '^[[6~' history-beginning-search-forward # Page down key
# Navigate words with ctrl+arrow keys
bindkey '^[Oc' forward-word #
bindkey '^[Od' backward-word #
bindkey '^[[1;5D' backward-word #
bindkey '^[[1;5C' forward-word #
2021-09-15 00:45:59 -07:00
# Delete words with ctrl+bksp/del
2021-08-07 21:24:26 -07:00
bindkey '^H' backward-kill-word # delete previous word with ctrl+backspace
bindkey '^[[3;5~' kill-word # delete next word with ctrl+delete
bindkey '^[[Z' undo # Shift+tab undo last action
# bind UP and DOWN arrow keys to history substring search
zmodload zsh/terminfo
2021-09-15 00:45:59 -07:00
# bindkey "$terminfo[kcuu1]" history-substring-search-up
# bindkey "$terminfo[kcud1]" history-substring-search-down
2021-08-07 21:24:26 -07:00
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
# Run compaudit and such, from OMZL::compfix.zsh
handle_completion_insecurities &|
2021-08-07 21:24:26 -07:00
# <<<
# Colors and compinit >>>
2021-08-07 21:24:26 -07:00
export LESS_TERMCAP_mb=$'\E[01;32m'
export LESS_TERMCAP_md=$'\E[01;32m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;47;34m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;36m'
export LESS=-R
2023-06-16 03:48:36 -07:00
autoload -Uz compinit colors zcalc
2023-06-16 03:58:09 -07:00
# only do full compinit once per day, use cached version usually
colors
2021-08-07 21:24:26 -07:00
# <<<
# auto save and load working dir (allow `cd -` on start) >>>
# Load the last working directory
load_working_dir() {
# load the directory (and do validation to make sure it's actually a directory)
if test -f "$WORKING_DIR_SAVE_FILE"; then
2022-03-18 17:50:20 -07:00
local PREVIOUS_WORKING_DIR
PREVIOUS_WORKING_DIR="$(cat "$WORKING_DIR_SAVE_FILE")"
if test -d "$(cat "$WORKING_DIR_SAVE_FILE")"; then
cd "$PREVIOUS_WORKING_DIR" || error $LINENO
else
echo "Invalid saved working directory ($PREVIOUS_WORKING_DIR)" > /dev/null
return 1
fi
else
echo "Invalid working directory save file ($WORKING_DIR_SAVE_FILE)" > /dev/null
return 1
fi
}
SWD_INITIAL_WORKING_DIR="$(pwd)"
save_working_dir() {
if [ "$(pwd)" != "$SWD_INITIAL_WORKING_DIR" ]; then
pwd > "$WORKING_DIR_SAVE_FILE"
fi
}
autoload -U add-zsh-hook
add-zsh-hook chpwd save_working_dir
2022-03-18 17:50:20 -07:00
# shellchek disable=SC2164
2022-05-22 08:42:16 -07:00
load_working_dir && cd - > /dev/null || true
# Case insensitive globbing (fix for termux)
2022-12-20 21:28:32 -08:00
[ -n "$TERMUX_VERSION" ] && { setopt nocaseglob; zstyle ':completion:*' path-completion true; }
# <<<
2021-08-07 21:24:26 -07:00
# <<<
2022-03-18 17:50:20 -07:00
# Optionally source another zshrc
${SKIP_LOCAL_ZSHRC:-false} || careful_source "$SHELL_CONFIG_DIR/local/zshrc"
2021-09-16 02:24:30 -07:00
2023-06-16 03:48:36 -07:00
# Profiling part 2
# zprof
# vim:fdm=marker:fmr=>>>,<<<:et:ft=bash:sw=3:ts=3