+
+### hooks
+autoload -Uz add-zsh-hook
+_sev_exectime=
+function sev_precmd {
+ # change terminal title
+ # TODO: update and send BEL when job status changes
+ print -Pn "\e]2;%(1j,%j,)%#${SSH_CLIENT+$USER@$HOST:}%~\e\\"
+ # bell if exec takes 5s
+ if (( SECONDS - _sev_exectime >= 5 )) print "\a"
+ # we could update vcs_info here, but let prompt take care of it
+ # if it doesn't use vcs, it can be ignored safely
+}
+add-zsh-hook precmd sev_precmd
+function sev_preexec {
+ # change terminal title to show command
+ print -Pnf "\e]2;%s\e\\" "%#${SSH_CLIENT+$USER@$HOST:}$1"
+ # save last exec time for bell
+ # XXX: does not run for blank cmdline
+ _sev_exectime=$SECONDS
+}
+add-zsh-hook preexec sev_preexec
+function sev_chpwd {
+ # echo dir on cwd change
+ ls -AF
+}
+add-zsh-hook chpwd sev_chpwd
+
+### system-specific configs and aliases
+case "$OSTYPE"; in
+ freebsd*)
+ # colors
+ export CLICOLOR=
+ export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
+
+ ## sound
+ function s { sysctl hw.snd.default_unit${1:+\=$1} }
+ alias vol mixer
+
+ ## install port dependencies from pkg (like pkgsrc `bmake bin-install')
+ # XXX: should probably use package-depends where possible, breaks when
+ # port name is different to package name
+ # (eg. graphics/sdl20 == sdl2, devel/glib20 == glib2, etc)
+ function portpkg {
+ case "$1" {
+ build|run)
+ sudo pkg install -AU $(make ${1}-depends-list |
+ sed 's_/usr/ports/_ _' | tr -d '\n')
+ ;;
+ *) echo "Usage: \`portpkg <build|run>' in a port directory"
+ return 1;;
+ }
+ };;
+ netbsd)
+ ## sound
+ function s {
+ if [[ -z "$1" ]] {
+ ll /dev/mixer /dev/sound /dev/audio
+ return
+ }
+ for x in mixer sound audio; do
+ ln -sf /dev/$x"$1" /dev/$x
+ done
+ }
+ function vol {
+ if [[ -z "$1" ]] {
+ for x in $(mixerctl -a | grep 'outputs\.master'); do
+ echo $x
+ done
+ return
+ }
+ mixerctl -w outputs.master"$2"="$1"
+ };;
+ *)
+ ## sound
+ # TODO: test alsa/oss/sndio/portaudio/pulse in order of importance
+ function s {}
+ function vol {}
+esac
+
+### modules & styles
+## vcs
+zstyle ':vcs_info:*' enable git
+#zstyle ':vcs_info:git*' check-for-changes true #too slow
+zstyle ':vcs_info:git*:dotfiles' check-for-changes true
+zstyle ':vcs_info:git*' check-for-staged-changes true
+autoload -Uz vcs_info
+
+## compinit
+zstyle ':completion:*' auto-description '[arg] %d'
+zstyle ':completion:*' expand suffix
+zstyle ':completion:*' format '# %d'
+zstyle ':completion:*' group-name ''
+zstyle ':completion:*' ignore-parents parent
+zstyle ':completion:*' insert-unambiguous false
+zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
+zstyle ':completion:*' list-prompt '%B%i%b'
+zstyle ':completion:*' list-suffixes true
+zstyle ':completion:*' matcher-list '' 'm:{[:lower:]}={[:upper:]}' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} r:|[._-]=* r:|=*' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} l:|=* r:|=*'
+zstyle ':completion:*' menu select=1
+zstyle ':completion:*' original false
+zstyle ':completion:*' select-prompt '%B%l%b'
+zstyle ':completion:*' verbose true
+autoload -Uz compinit && compinit
+
+## prompt
+# do this last so prompt can potentially override other settings
+autoload -Uz promptinit && promptinit
+prompt arrows