# My zsh config file. One day, I may actually learn about zsh instead
|
|
# of just haphazardly tossing crap at it.
|
|
|
|
# basic setup / options {{{
|
|
|
|
# Common path, aliases, functions, etc. for both zsh and bash:
|
|
source ~/.sh_common
|
|
|
|
autoload -U add-zsh-hook
|
|
autoload -Uz compinit
|
|
|
|
export HISTFILE=~/.histfile
|
|
export HISTSIZE=15000
|
|
export SAVEHIST=9999999
|
|
|
|
# vi-style cycling through completions on repeated tab presses:
|
|
setopt menu_complete
|
|
|
|
# Allow arrow-key selection of completion items from a menu:
|
|
zstyle ':completion:*' menu select
|
|
|
|
# Auto-rehash so that when stuff is installed you can tab-complete it
|
|
# immediately (I have no idea what performance penalty this incurs):
|
|
zstyle ':completion:*' rehash true
|
|
|
|
setopt prompt_subst
|
|
setopt inc_append_history
|
|
setopt hist_ignore_space
|
|
setopt hist_ignore_dups
|
|
setopt autocd
|
|
setopt extendedglob
|
|
setopt autopushd pushdminus
|
|
setopt printexitvalue
|
|
unsetopt beep
|
|
bindkey -e
|
|
|
|
# Add completion for custom git commands I've written as shell scripts:
|
|
# https://stackoverflow.com/questions/38725102/how-to-add-custom-git-command-to-zsh-completion
|
|
zstyle ':completion:*:*:git:*' user-commands sel-changed:'select from changed files' \
|
|
edit-changed:'edit from selected changed files' \
|
|
do:'execute command from top of repo'
|
|
|
|
zstyle :compinstall filename '/home/brennen/.zshrc'
|
|
|
|
compinit
|
|
|
|
# }}}
|
|
|
|
# keybindings {{{
|
|
|
|
# You can get bindkey strings with Ctrl-v followed by your key sequence.
|
|
|
|
# https://wiki.archlinux.org/index.php/Zsh#History_search
|
|
# Search up/down for matching thing on arrows - you can still use ctrl-n /
|
|
# ctrl-p to move up and down in the overall command history:
|
|
autoload -Uz up-line-or-beginning-search down-line-or-beginning-search
|
|
zle -N up-line-or-beginning-search
|
|
zle -N down-line-or-beginning-search
|
|
[[ -n "${key[Up]}" ]] && bindkey "${key[Up]}" up-line-or-beginning-search
|
|
[[ -n "${key[Down]}" ]] && bindkey "${key[Down]}" down-line-or-beginning-search
|
|
|
|
# https://wiki.archlinux.org/index.php/Zsh#File_manager_key_binds
|
|
# Alt-Left for previous directory and Alt-Up for parent
|
|
cd_undo_key () {
|
|
echo
|
|
popd
|
|
zle reset-prompt
|
|
ls
|
|
zle reset-prompt
|
|
}
|
|
cd_parent_key () {
|
|
echo
|
|
pushd ..
|
|
zle reset-prompt
|
|
ls
|
|
zle reset-prompt
|
|
}
|
|
zle -N cd_parent_key
|
|
zle -N cd_undo_key
|
|
bindkey '^[[1;3A' cd_parent_key
|
|
bindkey '^[[1;3D' cd_undo_key
|
|
|
|
# Invoke h history function from .sh_common with Alt-H:
|
|
invoke_h () {
|
|
h
|
|
zle reset-prompt
|
|
}
|
|
zle -N invoke_h
|
|
bindkey '^[H' invoke_h
|
|
|
|
# fzf fuzzyfinder for use with Alt-c, Ctrl-r, Ctrl-t:
|
|
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
|
|
|
|
# }}}
|
|
|
|
# prompt configuration {{{
|
|
|
|
# Grab some colors:
|
|
autoload colors zsh/terminfo
|
|
if [[ "$terminfo[colors]" -ge 8 ]]; then
|
|
colors
|
|
fi
|
|
for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do
|
|
eval PR_$color='%{$terminfo[bold]$fg[${(L)color}]%}'
|
|
eval PR_LIGHT_$color='%{$fg[${(L)color}]%}'
|
|
(( count = $count + 1 ))
|
|
done
|
|
PR_NO_COLOR="%{$terminfo[sgr0]%}"
|
|
|
|
# Next, do per-host color and sigils.
|
|
#
|
|
# Since this will be used in a $PS1, colors can be either of the named values
|
|
# from the above loop, or numerical escapes like %F{nnn} for Foreground and
|
|
# %K{nnn} for background. The latter will only work on 256 color terminals,
|
|
# although I'm not sure what the failure mode looks like.
|
|
#
|
|
# Great for sigils:
|
|
# https://en.wikipedia.org/wiki/Unicode_Geometric_Shapes
|
|
# https://en.wikipedia.org/wiki/List_of_symbols
|
|
|
|
PR_SIGIL=\$
|
|
PR_PATH_COLOR=$PR_BLUE;
|
|
PR_TIME_COLOR=$PR_LIGHT_BLUE
|
|
PR_GIT_COLOR=$PR_NO_COLOR
|
|
PR_SIGIL_COLOR=$PR_NO_COLOR
|
|
case "$HOST" in
|
|
'catastrophe')
|
|
PR_HOST_COLOR=$PR_LIGHT_BLUE
|
|
;;
|
|
'desiderata')
|
|
PR_HOST_COLOR=$PR_LIGHT_BLUE
|
|
PR_SIGIL=★
|
|
;;
|
|
'escalation')
|
|
PR_HOST_COLOR=$PR_LIGHT_GREEN
|
|
PR_SIGIL=✩
|
|
;;
|
|
'errata')
|
|
PR_HOST_COLOR=$PR_LIGHT_BLUE
|
|
PR_SIGIL=☾
|
|
;;
|
|
'externality')
|
|
PR_HOST_COLOR=$PR_LIGHT_GREEN
|
|
PR_SIGIL=✩
|
|
;;
|
|
'exuberance')
|
|
PR_HOST_COLOR=$PR_LIGHT_YELLOW
|
|
PR_SIGIL=★
|
|
;;
|
|
'fragility')
|
|
PR_HOST_COLOR=$PR_WHITE
|
|
PR_SIGIL=❄
|
|
;;
|
|
'inertia')
|
|
PR_HOST_COLOR='%F{27}'
|
|
PR_TIME_COLOR='%F{29}'
|
|
PR_GIT_COLOR='%F{93}'
|
|
PR_SIGIL_COLOR=$PR_HOST_COLOR
|
|
# PR_SIGIL=▣
|
|
PR_SIGIL=$(fragment-bullet)
|
|
;;
|
|
'metaphor')
|
|
PR_HOST_COLOR='%F{69}'
|
|
PR_TIME_COLOR='%F{161}'
|
|
PR_GIT_COLOR='%F{32}'
|
|
PR_PATH_COLOR='%F{242}'
|
|
PR_SIGIL_COLOR='%F{220}'
|
|
# see bin/fragment-bullet:
|
|
PR_SIGIL=$(fragment-bullet)
|
|
;;
|
|
'novena-edward-norway')
|
|
PR_HOST_COLOR=$PR_LIGHT_BLUE
|
|
PR_SIGIL=❄
|
|
;;
|
|
'pisces')
|
|
PR_HOST_COLOR=$PR_GREEN
|
|
;;
|
|
'raspberrypi')
|
|
PR_HOST_COLOR=$PR_MAGENTA
|
|
;;
|
|
'kropotkin')
|
|
PR_HOST_COLOR=$PR_BLUE
|
|
;;
|
|
*)
|
|
PR_HOST_COLOR=$PR_BLUE
|
|
;;
|
|
esac
|
|
|
|
# Stash values here for inclusion at beginning of prompt:
|
|
pr_meta=""
|
|
|
|
# Run to install some color swatches in the prompt for experimenting with
|
|
# host colors and such:
|
|
function colortest {
|
|
colortest=""
|
|
for c in `seq 0 256`; do
|
|
colortest="$colortest %K{$c} $c "
|
|
done
|
|
pr_meta="$colortest "
|
|
}
|
|
|
|
# Reset the prompt on every command to get that parse_git_branch function to
|
|
# run. Because this runs before every command, there's no need to set PS1
|
|
# elsewhere. Also sets xterm title (which works for other terminals as well):
|
|
|
|
function precmd {
|
|
# http://tldp.org/HOWTO/Xterm-Title-4.html
|
|
case $TERM in
|
|
xterm*)
|
|
print -Pn "\e]0;%n@%m: %~\a"
|
|
;;
|
|
esac
|
|
|
|
pr_time="$PR_TIME_COLOR%*$PR_NO_COLOR"
|
|
pr_userhost="$PR_HOST_COLOR%n@%m$PR_NO_COLOR"
|
|
pr_path="$PR_PATH_COLOR%~$PR_NO_COLOR"
|
|
|
|
# A conditional expression - if there're one or more background jobs,
|
|
# display [number of jobs]
|
|
# http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html
|
|
pr_jobs="%1(j.[%j] .)"
|
|
|
|
pr_sigil="$PR_SIGIL_COLOR$PR_SIGIL$PR_NO_COLOR"
|
|
|
|
# __git_ps1 takes 2 parameters: Stuff for before the git prompt and stuff
|
|
# for after. See .sh_common - if the git prompt is available, it'll use
|
|
# that; otherwise it's a fallback to the much simpler parse_git_branch
|
|
# defined there.
|
|
|
|
__git_ps1 "$pr_meta$pr_time $pr_userhost:$pr_path" " $pr_jobs$pr_sigil "
|
|
}
|
|
|
|
# This will reset the prompt every so often - it definitely shouldn't happen
|
|
# in situations where, for example, the git status prompt might be really
|
|
# expensive - but it _is_ kind of neat:
|
|
# TMOUT=15
|
|
# TRAPALRM() { zle reset-prompt; }
|
|
|
|
# }}}
|
|
|
|
# history {{{
|
|
|
|
# Record directory history to a simple text file:
|
|
function chpwd {
|
|
echo "$PWD" >> ~/.directory_history
|
|
}
|
|
|
|
# Record command history using commandlog:
|
|
# https://code.p1k3.com/gitea/brennen/commandlog
|
|
# https://p1k3.com/topics/commandlog/
|
|
function bpb_preexec {
|
|
# http://zsh.sourceforge.net/Doc/Release/Functions.html
|
|
# Log the current command, if commandlog is available - $commands seems
|
|
# to be where available commands are hashed:
|
|
(( $+commands[commandlog] )) && commandlog add "$@"
|
|
}
|
|
add-zsh-hook preexec bpb_preexec
|
|
|
|
# }}}
|
|
|
|
# syntax highlighting {{{
|
|
|
|
# https://github.com/zsh-users/zsh-syntax-highlighting
|
|
# Fish-style syntax highlighting - must be last thing sourced, install with:
|
|
# sudo apt-get install zsh-syntax-highlighting
|
|
ZSH_SYNTAX_HIGHLIGHTING_PATH=/usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
|
|
[ -f "$ZSH_SYNTAX_HIGHLIGHTING_PATH" ] && source "$ZSH_SYNTAX_HIGHLIGHTING_PATH"
|
|
|
|
# }}}
|