# 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 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 basic variables export EDITOR=nvim export VISUAL="${EDITOR}" export BROWSER=firefox # Neovim aliases alias n=nvim 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 linux && 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" alias gcm="git commit -m" alias gca="git commit -a" alias gcam="git commit -am" alias gp="git push" alias gu="git pull" alias gf="git fetch" alias gt="git status" # Sudo last line with 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 "\e\e" sudo-command-line bindkey -M vicmd '\e\e' sudo-command-line bindkey -M viins '\e\e' sudo-command-line # Autosuggestions load_plugin zsh-autosuggestions # Fancy prompt (spaceship-prompt) SPACESHIP_CHAR_SUFFIX=" " SPACESHIP_VI_MODE_SHOW=false autoload -U promptinit && promptinit prompt spaceship # Change cursor shape for different vi modes. function zle-line-init zle-keymap-select { SPACESHIP_CHAR_SYMBOL="❮" local _shape=0 case "${KEYMAP}" in main) _shape=6; SPACESHIP_CHAR_SYMBOL="❯" ;; # vi insert: line viins) _shape=6; SPACESHIP_CHAR_SYMBOL="❯" ;; # 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}" } zle -N zle-keymap-select zle -N zle-line-init # 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" __ZSH_LOCAL_FILE="${ZSH_CONFIG_DIR}/local.zsh" [ -e "${__ZSH_LOCAL_FILE}" ] && source "${__ZSH_LOCAL_FILE}" # THE FOLLOWING PLUGINS MUST COME LAST # 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 -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