2022-03-18 17:50:20 -07:00
|
|
|
# Blake's ZSH configuration file
|
|
|
|
|
BIG UPDATE: shell: add profile, move calc and mkcd to files, move
shell-independent config (aliases, functions, env vars, options) to
.config/shell/shrc, make bashrc and zshrc use the same shrc, add TTY
detection for changing caps lock to escape in a TTY, add option for
skipping plugin loading, and maybe a few other things
If this goes well, I'll be tempted to call this version 1.0. Things
have been very stable for the last few months. Although, since it's the
first really big change in a while, that might make it version 2.0?
Should dotfiles have big version numbers at all? Probably not.
2022-04-08 13:36:29 -07:00
|
|
|
# Just in case
|
|
|
|
export SHELL_CONFIG_DIR="${SHELL_CONFIG_DIR:-"${XDG_CONFIG_HOME:-"$HOME/.config"}/shell"}"
|
2022-03-18 17:50:20 -07:00
|
|
|
|
BIG UPDATE: shell: add profile, move calc and mkcd to files, move
shell-independent config (aliases, functions, env vars, options) to
.config/shell/shrc, make bashrc and zshrc use the same shrc, add TTY
detection for changing caps lock to escape in a TTY, add option for
skipping plugin loading, and maybe a few other things
If this goes well, I'll be tempted to call this version 1.0. Things
have been very stable for the last few months. Although, since it's the
first really big change in a while, that might make it version 2.0?
Should dotfiles have big version numbers at all? Probably not.
2022-04-08 13:36:29 -07:00
|
|
|
# Source standard shell configuration
|
|
|
|
[ -f "$SHELL_CONFIG_DIR/shrc" ] && source "$SHELL_CONFIG_DIR/shrc"
|
2022-04-06 13:08:42 -07:00
|
|
|
|
2021-08-07 21:24:26 -07:00
|
|
|
### Plugins >>>
|
2022-04-06 13:08:42 -07:00
|
|
|
${SKIP_PLUGINS:-false} || {
|
2021-08-07 21:24:26 -07:00
|
|
|
# Load zinit >>>
|
|
|
|
{
|
|
|
|
# Install zinit if not installed
|
2021-12-07 15:17:17 -08:00
|
|
|
if [[ ! -f "$ZINIT_HOME_DIR/bin/zinit.zsh" ]]; then
|
2021-11-02 21:08:56 -07:00
|
|
|
print -P "%F{33}▓▒░ %F{220}Installing %F{33}DHARMA%F{220} Initiative Plugin Manager (%F{33}zdharma-continuum/zinit%F{220})…%f"
|
2021-12-07 15:17:17 -08:00
|
|
|
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" && \
|
2022-08-19 23:52:14 -07:00
|
|
|
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"
|
2022-06-22 00:49:33 -07:00
|
|
|
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
|
|
|
|
|
|
|
|
# Source zinit
|
2021-12-07 15:17:17 -08:00
|
|
|
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 \
|
2021-11-02 21:08:56 -07:00
|
|
|
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
|
|
|
}
|
|
|
|
# <<<
|
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
|
|
|
|
alias zinit='ice wait"!0" depth"1";zinit'
|
2021-11-02 21:08:56 -07:00
|
|
|
|
2022-03-18 17:50:20 -07:00
|
|
|
# Special history options
|
2021-08-07 21:24:26 -07:00
|
|
|
zinit snippet OMZ::lib/history.zsh
|
2022-03-18 17:50:20 -07:00
|
|
|
# Some better completion options (waiting dots, etc)
|
2021-08-07 21:24:26 -07:00
|
|
|
zinit snippet OMZ::lib/completion.zsh
|
2022-03-18 17:50:20 -07:00
|
|
|
# Terminal titling
|
|
|
|
zinit snippet OMZ::lib/termsupport.zsh
|
|
|
|
|
2021-08-07 21:24:26 -07:00
|
|
|
|
|
|
|
# Quality of life
|
|
|
|
zinit load "zsh-users/zsh-autosuggestions"
|
2021-11-02 21:08:56 -07:00
|
|
|
zinit load "zdharma-continuum/fast-syntax-highlighting"
|
2021-08-27 11:10:13 -07:00
|
|
|
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"
|
|
|
|
|
2022-03-18 17:50:20 -07:00
|
|
|
## Theme
|
2021-09-15 00:55:59 -07:00
|
|
|
# terminal colors
|
2022-06-25 16:50:35 -07:00
|
|
|
[ -f "$SHELL_CONFIG_DIR/colors.sh" ] ||
|
|
|
|
zinit snippet 'https://github.com/chriskempson/base16-shell/blob/master/scripts/base16-onedark.sh'
|
2022-04-06 13:08:42 -07:00
|
|
|
|
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-04-06 13:08:42 -07:00
|
|
|
|
2022-03-18 17:50:20 -07:00
|
|
|
# prompt
|
|
|
|
zinit load "romkatv/powerlevel10k"
|
2022-09-17 20:00:47 -07:00
|
|
|
"${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-04-06 13:08:42 -07:00
|
|
|
|
2021-11-02 21:08:56 -07:00
|
|
|
|
2022-03-18 17:50:20 -07:00
|
|
|
# clear plugin options set at the start of this block
|
2021-11-02 21:08:56 -07:00
|
|
|
unalias zinit
|
2021-12-16 14:37:51 -08:00
|
|
|
|
2022-06-25 16:50:35 -07: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
|
|
|
}
|
|
|
|
# <<<
|
|
|
|
}
|
|
|
|
# <<<
|
2022-04-06 13:08:42 -07:00
|
|
|
### ZSH-specific configuration >>>
|
2021-10-17 01:30:45 -07:00
|
|
|
# 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"
|
|
|
|
|
2021-10-17 01:20:04 -07:00
|
|
|
## ZSH Options >>>
|
2021-08-07 21:24:26 -07:00
|
|
|
{
|
|
|
|
# setopt correct # Auto correct mistakes
|
|
|
|
setopt extendedglob # Extended globbing. Allows using regular expressions with *
|
2021-11-01 10:58:48 -07:00
|
|
|
[ -z "$TERMUX_VERSION" ] &&
|
2022-04-06 13:08:42 -07:00
|
|
|
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
|
|
|
|
}
|
|
|
|
# <<<
|
|
|
|
## ZSH Completion Options >>>
|
|
|
|
{
|
|
|
|
# Mine
|
2021-11-06 19:48:31 -07:00
|
|
|
# zstyle ':completion:*' completer _expand _complete _ignored _prefix
|
|
|
|
# zstyle ':completion:*' expand prefix suffix
|
|
|
|
# zstyle ':completion:*' file-sort access
|
|
|
|
# zstyle ':completion:*' ignore-parents parent pwd directory
|
|
|
|
# zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
|
|
|
|
# zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s
|
|
|
|
# zstyle ':completion:*' matcher-list '' 'm:{[:lower:]}={[:upper:]}' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|[._-]=** r:|=**'
|
|
|
|
# zstyle ':completion:*' menu select=long
|
|
|
|
# zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s
|
|
|
|
# zstyle :compinstall filename '/home/blake/.zshrc'
|
2021-08-07 21:24:26 -07:00
|
|
|
|
|
|
|
# Manjaro's
|
2021-11-06 19:48:31 -07:00
|
|
|
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)
|
|
|
|
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
|
|
|
|
}
|
|
|
|
# <<<
|
2022-04-06 13:08:42 -07:00
|
|
|
## 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
|
|
|
|
# <<<
|
|
|
|
|
2021-08-12 01:25:33 -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
|
2021-08-12 01:25:33 -07:00
|
|
|
autoload -U compinit colors zcalc
|
2021-11-01 10:58:48 -07:00
|
|
|
compinit -d
|
2021-08-12 01:25:33 -07:00
|
|
|
colors
|
2021-08-07 21:24:26 -07:00
|
|
|
# <<<
|
2021-10-17 01:20:04 -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")"
|
2021-10-17 01:20:04 -07:00
|
|
|
if test -d "$(cat "$WORKING_DIR_SAVE_FILE")"; then
|
|
|
|
cd "$PREVIOUS_WORKING_DIR" || error $LINENO
|
|
|
|
else
|
2021-10-17 02:17:02 -07:00
|
|
|
echo "Invalid saved working directory ($PREVIOUS_WORKING_DIR)" > /dev/null
|
|
|
|
return 1
|
2021-10-17 01:20:04 -07:00
|
|
|
fi
|
|
|
|
else
|
2021-10-17 02:17:02 -07:00
|
|
|
echo "Invalid working directory save file ($WORKING_DIR_SAVE_FILE)" > /dev/null
|
|
|
|
return 1
|
2021-10-17 01:20:04 -07:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2022-08-29 12:17:46 -07:00
|
|
|
SWD_INITIAL_WORKING_DIR="$(pwd)"
|
2021-10-17 01:20:04 -07:00
|
|
|
save_working_dir() {
|
2022-08-29 12:17:46 -07:00
|
|
|
if [ "$(pwd)" != "$SWD_INITIAL_WORKING_DIR" ]; then
|
2021-12-16 03:33:18 -08:00
|
|
|
pwd > "$WORKING_DIR_SAVE_FILE"
|
|
|
|
fi
|
2021-10-17 01:20:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2021-11-21 19:53:47 -08:00
|
|
|
|
|
|
|
# Case insensitive globbing (fix for termux)
|
2022-03-03 13:41:12 -08:00
|
|
|
[ -n "$TERMUX_VERSION" ] && (setopt nocaseglob; zstyle ':completion:*' path-completion true)
|
2021-11-01 10:58:48 -07:00
|
|
|
|
2021-10-16 18:27:49 -07:00
|
|
|
# <<<
|
2021-08-07 21:24:26 -07:00
|
|
|
# <<<
|
|
|
|
|
2022-03-18 17:50:20 -07:00
|
|
|
# Optionally source another zshrc
|
2022-04-06 13:08:42 -07:00
|
|
|
${SKIP_LOCAL_ZSHRC:-false} || careful_source "$SHELL_CONFIG_DIR/local/zshrc"
|
2021-09-16 02:24:30 -07:00
|
|
|
|
2022-04-06 13:08:42 -07:00
|
|
|
# vim:fdm=marker:fmr=>>>,<<<:et:ft=bash:sw=3:ts=3
|