123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- # Main zsh config file
- # Enable completions
- FPATH="${HOME}/.local/share/zsh/site-functions:${FPATH}"
- autoload -U compinit && compinit
- # Some utility stuff
- ZSH_PLUGIN_DIR="${ZSH_CONFIG_DIR}/plugins"
- # load_plugin <name>
- function load_plugin {
- source "${ZSH_PLUGIN_DIR}/${1}/${1}.plugin.zsh"
- }
- # cmd_exists <name>
- function cmd_exists {
- hash "${1}" >/dev/null 2>&1
- }
- # source_user_file <name>
- function source_user_file {
- local machine_specific="${ZSH_CONFIG_DIR}/${1}.${HOST}.zsh"
- local default="${ZSH_CONFIG_DIR}/${1}.zsh"
- if [ -e "${machine_specific}" ]; then
- source "${machine_specific}"
- elif [ -e "${default}" ]; then
- source "${default}"
- fi
- }
- # Load user early init file
- source_user_file "early-init"
- # Some options
- setopt autocd extendedglob rm_star_silent completealiases rc_quotes histignorespace
- unsetopt beep notify
- # Some general, random configuration
- # History stuff
- [ -v HISTFILE ] || HISTFILE="${HOME}/.cache/zsh/history"
- [ ! -d "${HISTFILE:h}" ] && mkdir -p "${HISTFILE:h}"
- HISTSIZE=1000
- SAVEHIST=10000
- # Tools for graphical sessions
- export BROWSER=mullvad-browser
- export READER=zathura
- if [[ -v WAYLAND_DISPLAY ]]; then
- function clip {
- (( ${#} >= 1 )) && (cat "${@}" | wl-copy) || wl-copy
- }
- else
- alias clip="xclip -selection clipboard"
- fi
- # I mess this up a lot
- alias cd..="cd .."
- # Make xargs, sudo, etc. understand aliases
- alias xargs='xargs '
- if cmd_exists doas; then
- __zsh_sudo_cmd=doas
- alias sudo='doas '
- alias doas='doas '
- alias sudoedit="doas $EDITOR "
- alias se="doas $EDITOR "
- else
- __zsh_sudo_cmd=sudo
- alias sudo='sudo '
- alias se='sudoedit '
- fi
- # Emacs and Neovim stuff
- if [[ -v NVIM ]]; then
- export EDITOR=nvr
- alias n=nvr
- alias nvim=nvr
- alias e=nvr
- alias emacs=nvr
- elif [[ -v INSIDE_EMACS ]]; then
- export EDITOR='emacsclient'
- alias e='emacsclient '
- alias emacs='emacsclient '
- alias n='emacsclient '
- else
- export EDITOR='emacsclient -a nvim -nw'
- # Because I keep using n by mistake
- alias emacs="${EDITOR} "
- alias n=emacs
- alias e=emacs
- fi
- export VISUAL="${EDITOR}"
- # Make SBCL *slightly* less frustrating to use on the command line
- alias sbcl='rlwrap -pblue -q "\"" sbcl'
- # Safer file functions
- alias cp="cp -i"
- alias mv="mv -i"
- # Ledger stuff
- alias ldg='ledger -f "${HOME}/finance/finances.ledger"'
- # Trash put for safety
- if cmd_exists trash-put; then
- alias rm='echo "rm: I''m unsafe! Don''t use me."; false'
- alias tp=trash-put
- alias trr=trash-restore
- alias trl=trash-list
- alias tre=trash-empty
- alias trm=trash-rm
- else
- local rm_confirm_flag='-i'
- uname | grep -i linux >/dev/null && rm_confirm_flag='-I'
- alias rm="rm ${rm_confirm_flag}"
- fi
- # Enable mouse support in less
- export LESS="--mouse"
- # Bat configuration
- if cmd_exists bat; 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 --paging=always --style=plain'"
- export MANROFFOPT="-c"
- fi
- # Eza configuration
- if cmd_exists eza; then
- alias ls="eza --git -F=auto"
- alias la="ls -a"
- alias l="ls -l"
- alias ll="ls -al"
- fi
- # Delta configuration
- if cmd_exists delta; then
- export DELTA_FEATURES='unobtrusive-line-numbers decorations side-by-side'
- export DELTA_PAGER='bat -p'
- export GIT_PAGER='delta'
- fi
- # Git aliases
- alias ga="git add"
- alias gaa="git add -A"
- alias gco="git commit"
- gcm() {
- git commit -m "${${@}}"
- }
- alias gca="git commit -a"
- gcam() {
- git commit -am "${${@}}"
- }
- alias gp="git push"
- alias gu="git pull"
- alias gf="git fetch"
- alias gt="git status"
- alias gd="git diff"
- # Sudo last line with <Esc><Esc>
- sudo-command-line() {
- [[ -z $BUFFER ]] && zle up-history
- if [[ $BUFFER == ${__zsh_sudo_cmd}\ * ]]; then
- LBUFFER="${LBUFFER#${__zsh_sudo_cmd} }"
- else
- LBUFFER="${__zsh_sudo_cmd} ${LBUFFER}"
- fi
- }
- zle -N sudo-command-line
- bindkey -M vicmd "^f" sudo-command-line
- bindkey -M viins "^f" sudo-command-line
- # Use vi mode
- bindkey -v
- # Fast switch of modes
- KEYTIMEOUT=1
- # 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
- # 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
- # Clear scrollback on ^l
- __zsh_clear_screen_and_scrollback() {
- echoti civis >"$TTY"
- printf '%b' '\e[H\e[2J' >"$TTY"
- printf '%b' '\e[3J' >"$TTY"
- echoti cnorm >"$TTY"
- zle .reset-prompt
- zle -R
- }
- zle -N __zsh_clear_screen_and_scrollback
- bindkey '^L' __zsh_clear_screen_and_scrollback
- # Direnv
- if cmd_exists direnv; then
- eval "$(direnv hook zsh)"
- fi
- # Pyenv
- if cmd_exists pyenv; then
- export PYENV_ROOT="${HOME}/.pyenv"
- [[ -d "${PYENV_ROOT/bin}" ]] && export PATH="${PYENV_ROOT}/bin:${PATH}"
- eval "$(pyenv init - zsh)"
- fi
- # Bookmarks
- [[ -v BM_CWD_LS ]] || BM_CWD_LS=1
- [[ -v BM_MODE ]] || BM_MODE=daemon
- [[ -v BM_AUTO_RELOAD ]] || BM_AUTO_RELOAD=1
- source "${ZSH_CONFIG_DIR}/emacs-bookmark.zsh"
- # Platform specific stuff
- [ -f /usr/bin/pacman ] && source "${ZSH_CONFIG_DIR}/arch.zsh"
- # 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 eza when completing cd
- zstyle ':fzf-tab:complete:cd:*' fzf-preview 'eza -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'
- # Autosuggestions
- load_plugin zsh-autosuggestions
- ZSH_AUTOSUGGEST_STRATEGY=(history completion)
- bindkey '^ ' autosuggest-accept
- # Load user init file
- source_user_file 'local'
- # THE FOLLOWING PLUGINS MUST COME LAST
- # More completions
- load_plugin zsh-completions
- # Syntax highlighting
- load_plugin fast-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 beginning of the line
- HISTORY_SUBSTRING_SEARCH_PREFIXED="true"
- HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND=""
- setopt histignoredups
- # Run fortune and cowsay if we are not in nvim or ssh
- if cmd_exists fortune && cmd_exists cowsay; then
- [[ -v NVIM ]] || [[ -v SSH_CLIENT ]] || \
- fortune | cowsay -felephant-in-snake -n
- fi
- # Clean up internal functions
- unfunction load_plugin
- unfunction cmd_exists
- unfunction source_user_file
|