zsh

1. .zshrc

zsh is my login and interactive shell but as my environment variables are all defined within environment.d (which allows a set of user services to share a common environment) there is no need to have the standard .zshenv or .zprofile files.

1.1. Startup

Autoload compinit, a module that provides completions for zsh.

autoload -Uz compinit

Speed up compinit by using zcompdump, a completion caching solution.

compinit -d /home/grtcdr/.cache/zsh/zcompdump

1.2. Common options

setopt append_history
setopt extended_history
setopt hist_ignore_space
setopt hist_ignore_all_dups
setopt hist_reduce_blanks
setopt hist_no_store
setopt complete_aliases
setopt share_history
setopt ignore_eof
setopt list_packed
setopt auto_remove_slash
setopt no_complete_aliases

See the manual for more information on the above options.

1.3. Completions

zstyle ':completion:*' menu select      # Display completions
zstyle ':completion:*' use-cache on     # Cache completions
zstyle ':completion:*' file-sort access # Sort files by access

For more information, see zshcompsys(1).

1.4. Prompt

PROMPT="%(4~|.../%2~|%~) $ "

1.5. Aliases

I prefer to have commands that perform changes to the filesystem to be verbose and to always prompt me for my confirmation (a protective measure).

To bypass the prompts, use the yes command, e.g. yes | <cp,rm,mv> [OPTIONS].

alias cp='cp -iv'
alias mv='mv -iv'
alias rm='rm -iv'

What is the possibly the most used command should be the quickest to access, here's a few aliases that make it more intuitive and colorful.

alias ls='ls --color=always --group-directories-first'
alias la='ls -la'
alias ll='ls -l'

cd is aliased to cdls to automate discovery, making movement between directories a bit more intuitive.

alias cd='cdls'
alias ..='cd ..'

Browse the list of installed packages and their metadata:

alias pkglist='pacman -Qq | fzf --preview-window sharp --preview "pacman -Qi {1}"'

Browse the list of packages available for download:

alias pkgsearch='pacman -Slq | fzf --multi --preview "pacman -Si {1}" | xargs -ro sudo pacman -S'

And everything else…

alias open="xdg-open"
alias wget="wget --no-hsts"
alias mbsync="mbsync --config "$HOME"/.config/mbsync/mbsyncrc"
alias vim="nvim"
alias music="ncmpcpp -q"

1.6. Functions

Define a function that lists the contents of directories upon entering them, it is aliased to cd section 1.5.

cdls() {
   builtin cd "$@" && ls
}

Define a function that brings programs to the foreground the same way they were placed in the background, originally authored by Adam Stankiewicz in his "How to boost your Vim productivity" publication.

fancy-ctrl-z() {
    if [[ $#BUFFER -eq 0 ]]; then
        BUFFER="fg"
        zle accept-line -w
    else
        zle push-input -w
        zle clear-screen -w
    fi
}

Load the functions:

zle -N fancy-ctrl-z

1.7. Keybindings

bindkey '^Z' fancy-ctrl-z
bindkey -e

1.8. Plugins

autojump, or simply j, remembers the places across the filesystem that one visits, allowing one to quickly jump between them by typing a small fraction (or component) of the path in mind.

source /usr/share/autojump/autojump.zsh