zsh-config/init.zsh
2023-03-02 11:38:12 -08:00

251 lines
6.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Main zsh config file
# Some utility stuff
autoload -U compinit && compinit
fpath+=("${ZSH_CONFIG_DIR}/functions")
ZSH_PLUGIN_DIR="${ZSH_CONFIG_DIR}/plugins"
# load_plugin <name>
function load_plugin {
source "${ZSH_PLUGIN_DIR}/${1}/${1}.plugin.zsh"
}
ZSH_EARLY_LOCAL_FILE="${ZSH_CONFIG_DIR}/local-early.zsh"
[ -e "${ZSH_EARLY_LOCAL_FILE}" ] && source "${ZSH_EARLY_LOCAL_FILE}"
# Some options
setopt autocd extendedglob rm_star_silent
unsetopt beep notify
# Show which completion we are on
zstyle ':completion:*' menu select
# Some general, random configuration
# History stuff
[ -v HISTFILE ] || HISTFILE="${HOME}/.cache/zsh/history"
[ ! -d "$(dirname "${HISTFILE}")" ] && mkdir -p "$(dirname "${HISTFILE}")"
HISTSIZE=1000
SAVEHIST=10000
# Set some random stuff
export BROWSER=firefox
export READER=zathura
alias clip="xclip -selection clipboard"
# Neovim stuff
if [[ -v NVIM ]]; then
export EDITOR=nvr
alias n=nvr
alias nvim=nvr
else
export EDITOR=nvim
alias n=nvim
fi
export VISUAL="${EDITOR}"
alias se=sudoedit
# I mess this up a lot
alias cd..="cd .."
# Enable mouse support in less
export LESS="--mouse"
# Safer file functions
local rm_confirm_flag='-i'
uname | grep -i linux >/dev/null && rm_confirm_flag='-I'
alias rm="rm ${rm_confirm_flag}"
alias cp="cp -i"
alias mv="mv -i"
# Use vi mode
bindkey -v
# Implement a replace mode
bindkey -N virep viins
bindkey -M vicmd "R" overwrite-mode
function overwrite-mode {
zle -K virep
zle .overwrite-mode
}
zle -N overwrite-mode
# Bat configuration
if which bat >/dev/null 2>&1; then
# Pager
export PAGER="bat --paging=always"
# Less syntax highlighting in interactive shells
alias less="bat --paging=always"
# Use bat instead of cat
alias cat="bat --paging=never"
alias pcat="bat -pp"
alias ncat="bat -pp --color=never"
# Bat as man pager
export MANPAGER="zsh -c 'col -bx | bat -l man -p --paging=always'"
fi
# Exa configuration
if which exa >/dev/null 2>&1; then
alias ls="exa --git -F"
alias la="ls -a"
fi
# Git aliases
alias ga="git add"
alias gaa="git add -A"
alias gco="git commit"
gcm() {
local args
for arg; do
args="${args} ${arg}"
done
git commit -m "${args:1}" # remove the leading space
}
alias gca="git commit -a"
gcam() {
local args
for arg; do
args="${args} ${arg}"
done
git commit -am "${args:1}" # remove the leading space
}
alias gp="git push"
alias gu="git pull"
alias gf="git fetch"
alias gt="git status"
# Sudo last line with <Esc><Esc>
sudo-command-line() {
[[ -z $BUFFER ]] && zle up-history
if [[ $BUFFER == sudo\ * ]]; then
LBUFFER="${LBUFFER#sudo }"
elif [[ $BUFFER == $EDITOR\ * ]]; then
LBUFFER="${LBUFFER#$EDITOR }"
LBUFFER="sudoedit $LBUFFER"
elif [[ $BUFFER == sudoedit\ * ]]; then
LBUFFER="${LBUFFER#sudoedit }"
LBUFFER="$EDITOR $LBUFFER"
else
LBUFFER="sudo $LBUFFER"
fi
}
zle -N sudo-command-line
bindkey -M vicmd "^f" sudo-command-line
bindkey -M viins "^f" sudo-command-line
# Autosuggestions
load_plugin zsh-autosuggestions
ZSH_AUTOSUGGEST_STRATEGY=(history completion)
bindkey '^ ' autosuggest-accept
# Fancy prompt (starship)
eval "$(starship init zsh)"
# Change cursor shape for different vi modes.
function __zsh_vim_key_prompt_handler {
SPACESHIP_CHAR_SYMBOL=""
local _shape=0
case "${KEYMAP}" in
main) _shape=6 ;; # vi insert: line
viins) _shape=6 ;; # vi insert: line
isearch) _shape=6 ;; # inc search: line
virep) _shape=4 ;; # vi replace: underscore
command) _shape=4 ;; # read a command: underscore
vicmd) _shape=2 ;; # vi cmd: block
visual) _shape=2 ;; # vi visual mode: block
viopp) _shape=1 ;; # vi operation pending: blinking block
*) _shape=0 ;;
esac
zle reset-prompt
printf '\e[%d q' "${_shape}"
}
function zle-keymap-select {
__zsh_vim_key_prompt_handler
}
function zle-line-init {
printf '\e[6 q'
}
zle -N zle-keymap-select
zle -N zle-line-init
# Fast switch of modes
KEYTIMEOUT=1
# Clear scrollback on ^l
__zsh_clear_screen_and_scrollback() {
echoti civis >"$TTY"
printf '%b' '\e[H\e[2J' >"$TTY"
zle .reset-prompt
zle -R
printf '%b' '\e[3J' >"$TTY"
echoti cnorm >"$TTY"
}
zle -N __zsh_clear_screen_and_scrollback
bindkey '^L' __zsh_clear_screen_and_scrollback
# Direnv
if which direnv >/dev/null 2>&1; then
eval "$(direnv hook zsh)"
fi
# Bookmarks
[ -v ZSH_BOOKMARK_DIR ] || ZSH_BOOKMARK_DIR="${HOME}/.cache/zsh/bookmarks"
[ -v ZSH_BOOKMARK_LS ] || ZSH_BOOKMARK_LS=true
source "${ZSH_CONFIG_DIR}/bookmark.zsh"
# Platform specific stuff
[ -f /usr/bin/pacman ] && source "${ZSH_CONFIG_DIR}/arch.zsh"
__ZSH_LOCAL_FILE="${ZSH_CONFIG_DIR}/local.zsh"
[ -e "${__ZSH_LOCAL_FILE}" ] && source "${__ZSH_LOCAL_FILE}"
# THE FOLLOWING PLUGINS MUST COME LAST
# FZF Integration
load_plugin fzf-tab
# Disable sort when completing `git checkout`
zstyle ':completion:*:git-checkout:*' sort false
# Set descriptions format to enable group support
zstyle ':completion:*:descriptions' format '[%d]'
# Set list-colors to enable filename colorizing
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
# Preview directory's content with exa when completing cd
zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
# Remove the '.' prefix at the start of every completion
zstyle ':fzf-tab:*' prefix ''
# Switch groups
zstyle ':fzf-tab:*' switch-group 'ctrl-h' 'ctrl-l'
# Toggle selected for all visible entries
zstyle ':fzf-tab:*' fzf-bindings 'ctrl-a:toggle-all'
# More completions
load_plugin zsh-completions
# Syntax highlighting
load_plugin zsh-syntax-highlighting
# History substring search
load_plugin zsh-history-substring-search
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
bindkey '^k' history-substring-search-up
bindkey '^j' history-substring-search-down
bindkey -M vicmd '^k' history-substring-search-up
bindkey -M vicmd '^j' history-substring-search-down
bindkey -M vicmd 'k' history-substring-search-up
bindkey -M vicmd 'j' history-substring-search-down
bindkey -M emacs '^P' history-substring-search-up
bindkey -M emacs '^N' history-substring-search-down
# Only match at the begining of the line
HISTORY_SUBSTRING_SEARCH_PREFIXED="true"
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND=""
setopt histignoredups
# Clean up internal functions
unfunction load_plugin
# Run fortune and cowsay if we are not in nvim
[[ -v NVIM ]] || fortune | cowsay -felephant-in-snake -n