From d0598c2838ff7d11a683fd56f548105c0651a351 Mon Sep 17 00:00:00 2001
From: crater2150 <crater@qwertyuiop.de>
Date: Wed, 10 Jul 2019 15:36:41 +0200
Subject: [PATCH] Major cleanup and restructuring

- remove custom module loader, use zplug for own plugins
- move config parts from modules to files
- move other module parts to separate zsh plugins
---
 README.md                                     |  48 +---
 modules/bindings/init => bindings.zsh         |  37 ++-
 completion.zsh                                |   1 +
 modules/bindings/depend                       |   1 -
 modules/color/init                            |  77 ------
 modules/color/spectrum                        |  19 --
 modules/conf/init                             |  43 ----
 modules/fasd/init                             |   6 -
 modules/helpers.zsh                           |  15 --
 modules/highlight/zsh-syntax-highlighting     |   1 -
 modules/loader.zsh                            | 221 ------------------
 modules/localrc/init                          |  10 -
 modules/prompt/depend                         |   4 -
 modules/prompt/init                           | 151 ------------
 modules/todo/init                             |  16 --
 modules/vcs/init                              | 131 -----------
 .../autoloader/autoloader.plugin.zsh          |   0
 .../highlight-config.plugin.zsh               |   2 -
 zplug.zsh                                     |  10 +-
 zshenv                                        |   2 +-
 zshrc                                         |  17 +-
 21 files changed, 38 insertions(+), 774 deletions(-)
 rename modules/bindings/init => bindings.zsh (82%)
 delete mode 100644 modules/bindings/depend
 delete mode 100644 modules/color/init
 delete mode 100644 modules/color/spectrum
 delete mode 100755 modules/conf/init
 delete mode 100644 modules/fasd/init
 delete mode 100644 modules/helpers.zsh
 delete mode 160000 modules/highlight/zsh-syntax-highlighting
 delete mode 100644 modules/loader.zsh
 delete mode 100755 modules/localrc/init
 delete mode 100644 modules/prompt/depend
 delete mode 100644 modules/prompt/init
 delete mode 100644 modules/todo/init
 delete mode 100644 modules/vcs/init
 rename modules/autoloader/init => plugins/autoloader/autoloader.plugin.zsh (100%)
 rename modules/highlight/init => plugins/highlight-config/highlight-config.plugin.zsh (92%)

diff --git a/README.md b/README.md
index 81c9d1b..073015d 100644
--- a/README.md
+++ b/README.md
@@ -4,45 +4,9 @@ crater's zsh config
 Installation:
 -------------
 
-*system-wide config*: Put repository contents in `/etc/zsh`.
-
-*user config*: copy `env_template` to $HOME/.zshenv. Change value of `$ZDOTDIR` in
-that file to the path, where the repository resides.  
-Note that this file is read before any other config files, so if any variables
-you set in there have wrong values, they are probably overwritten in another
-file.
-
-modules:
---------
-
-This zsh configuration is modular. A module consists of a folder in the modules/
-directory, containing a script file named `init` and an optional `depend` file.
-More files may be included in the folder, they will be ignored by the module
-loader. The name of the module is the name of its directory.
-
-The `init` file is executed, when a module is loaded. When and if a module is
-loaded is determined by its `depend` file and the environment variables
-`$ZMODLOAD_ONLY` and `$ZMODLOAD_BLACKLIST`.
-
-`$ZMODLOAD_BLACKLIST` is a list of modules, that will not be loaded.
-
-`$ZMODLOAD_ONLY` works as a whitelist. If it is set, only modules in this list
-and modules required by them will be loaded.
-
-A `depend` file contains the requirements for loading a module. It should
-contain lines of the form `<type> <module>`. There are 3 types for
-dependencies:
-
-- `depend <module>`: `<module>` will be loaded before the depending
-  module (the module whose `depend` file contains this rule), regardless
-  of `$ZMODLOAD_ONLY`. If the module is blacklisted, it and the depending
-  module are not loaded. Note that already queued dependencies of the depending
-  module will be loaded anyways.
-
-- `after <module>`: `<module>` will be loaded before the depending
-  module, if it would be loaded anyways. If it is either blacklisted or
-  `$ZMODLOAD_ONLY` is non-empty but does not contain `<module>`, it is not
-  loaded. This does not affect loading of the depending module.
-
-- `block <module>`: abort loading of the depending module, if `<module>`
-  is already loaded or contained in `$ZMODLOAD_ONLY`.
+From the checked out repo:
+```
+ln -s $PWD/zshenv $HOME/.zshenv
+```
+The zshenv file sets the location to the rest of the config (`$ZDOTDIR`)
+automatically, based on the link target.
diff --git a/modules/bindings/init b/bindings.zsh
similarity index 82%
rename from modules/bindings/init
rename to bindings.zsh
index dbccb62..987a6b6 100644
--- a/modules/bindings/init
+++ b/bindings.zsh
@@ -1,8 +1,6 @@
 #!/bin/zsh
 
-# Allow <esc>:q in vim mode to exit the shell
-exit(){builtin exit;}
-zle -N q exit
+bindkey -v
 
 typeset -A key
 
@@ -17,15 +15,6 @@ key[Right]=${terminfo[kcuf1]}
 key[PageUp]=${terminfo[kpp]}
 key[PageDown]=${terminfo[knp]}
 
-bindkey -M vicmd ! edit-command-line-tmux
-
-#unicode input
-autoload -U insert-unicode-char
-zle -N insert-unicode-char
-bindkey "^Vu"  insert-unicode-char
-
-bindkey "\e."  insert-last-word
-
 [[ -n "${key[Home]}"     ]]  && bindkey  "${key[Home]}"     beginning-of-line
 [[ -n "${key[End]}"      ]]  && bindkey  "${key[End]}"      end-of-line
 [[ -n "${key[Insert]}"   ]]  && bindkey  "${key[Insert]}"   yank
@@ -37,17 +26,24 @@ bindkey "\e."  insert-last-word
 [[ -n "${key[PageUp]}"   ]]  && bindkey  "${key[PageUp]}"   history-beginning-search-backward
 [[ -n "${key[PageDown]}" ]]  && bindkey  "${key[PageDown]}" history-beginning-search-forward
 
-bindkey "^[e"   expand-cmd-path         # C-e for expanding path of typed command.
-bindkey " "     magic-space             # Do history expansion on space.
-bindkey $'\177'    backward-delete-char   #backspace
-bindkey $'\10'    backward-delete-word   #C-backspace
+bindkey "^[e"   expand-cmd-path        # C-e for expanding path of typed command.
+bindkey " "     magic-space            # Do history expansion on space.
+bindkey $'\177' backward-delete-char   # backspace
+bindkey $'\10'  backward-delete-word   # C-backspace
+
+bindkey -M vicmd ! edit-command-line-tmux
+
+#unicode input
+autoload -U insert-unicode-char
+zle -N insert-unicode-char
+bindkey "^Vu"  insert-unicode-char
+
+bindkey "\e."  insert-last-word
 
 bindkey "\e[1;5D" vi-backward-blank-word
 bindkey "\e[1;5C" vi-forward-blank-word
-#bindkey . rationalise-dot
 
 bindkey $'\20' push-line-or-edit
-bindkey -s "^F" "fuck\n"
 
 # Finally, make sure the terminal is in application mode, when zle is
 # active. Only then are the values from $terminfo valid.
@@ -60,9 +56,8 @@ local function zle-line-finish () {
 zle -N zle-line-init
 zle -N zle-line-finish  
 
-insert_sudo () { zle beginning-of-line; zle -U "sudo " }
+insert_sudo () { zle beginning-of-line; zle -U "sudo "; zle end-of-line }
 zle -N insert-sudo insert_sudo
-
 bindkey "^[s" insert-sudo
 
 local function accept-or-recall-and-infer-history() {
@@ -89,5 +84,3 @@ if exists incstring; then
 	zle -N  inc-last-command
 	bindkey "^A" inc-last-command
 fi
-
-bindkey "\eb" zle-bookmarks
diff --git a/completion.zsh b/completion.zsh
index bf9c0dc..a835ceb 100644
--- a/completion.zsh
+++ b/completion.zsh
@@ -48,3 +48,4 @@ zstyle ':completion:*:processes-names' command  'ps c -u ${USER} -o command | un
 compdef _command fork
 compdef _command detach
 compdef _command ontv
+compdef _notmuch nmfind=notmuch-search
diff --git a/modules/bindings/depend b/modules/bindings/depend
deleted file mode 100644
index e453cf3..0000000
--- a/modules/bindings/depend
+++ /dev/null
@@ -1 +0,0 @@
-need autoloader
diff --git a/modules/color/init b/modules/color/init
deleted file mode 100644
index 2bbdcd3..0000000
--- a/modules/color/init
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/bin/zsh
-
-autoload -U colors && colors
-
-. $MPATH/spectrum
-reset="%{${reset_color}%}"
-
-#
-# 256-color-term or rxvt with wrong tput output
-#
-if [[ "`tput colors`" == "256" ]] || [[ "`tput colors`" == "88" ]] ; then
-	pathcolor="%{${FG[27]}%}"
-	ropathcolor="%{${FG[92]}%}"
-
-	gitdirty="%{${FX[bold]}${FG[160]}%}"
-	gitstaged="%{${FX[bold]}${FG[34]}%}"
-	gitclean="%{${FG[240]}%}"
-	stycolor="%{${FG[240]}%}"
-	exitcolor=$gitdirty
-	rpscolor="%{${FG[238]}%}"
-	gituntracked="%{$FX[bold]$FG[253]%}●%{$reset$rpscolor%}"
-
-	local usercolor_base
-	if [ "$EUID" = "0" ] || [ "$USER" = "root" ] ; then
-		usercolor_base=196
-		usercolor_mod=30
-	else
-		usercolor_base=47
-		usercolor_mod=28
-
-	fi
-	if [ ! -z $SSH_CLIENT ] || [ ! -z $SSH_CONNECTION ]; then
-		usercolor_base=$((usercolor_base + usercolor_mod))
-		hostcolor="%{${FG[226]}%}"
-	else
-		hostcolor=$gitclean
-	fi
-	usercolor="%{${FX[bold]}${FG[$usercolor_base]}%}"
-
-	for colorfile in /etc/DIR_COLORS.256 \
-	                 /etc/DIR_COLORS.256color \
-	                 /etc/colors/DIR_COLORS.256 \
-					 /etc/colors/DIR_COLORS.256color; do
-		if [ -e $colorfile ] ; then
-			eval "$(dircolors $colorfile)"
-			break;
-		fi
-	done
-else
-	pathcolor="%{$fg_bold[blue]}%}"
-
-	gitdirty="%{${fg[yellow]}%}"
-	gitstaged="%{${fg[green]}%}"
-	gitclean="%{${fg[white]}%}"
-	vcs_revision="%{${fg_bold[black]}%}"
-
-	exitcolor="$gitdirty"
-	rpscolor="%{$fg_bold[black]}%}"
-
-	if [ "$EUID" = "0" ] || [ "$USER" = "root" ] ; then
-		if [ ! -z $SSH_CLIENT ]; then
-			usercolor="%{${fg_bold[yellow]}%}"
-			hostcolor="%{${fg_no_bold[blue]}%}"
-		else
-			usercolor="%{${fg_bold[red]}%}"
-			hostcolor="%{${fg_bold[black]}%}"
-		fi
-	else
-		if [ ! -z $SSH_CLIENT ]; then
-			usercolor="%{${fg_bold[blue]}%}"
-			hostcolor="%{${fg_no_bold[blue]}%}"
-		else
-			usercolor="%{${fg_bold[green]}%}"
-			hostcolor="%{${fg_bold[black]}%}"
-		fi
-	fi
-fi
diff --git a/modules/color/spectrum b/modules/color/spectrum
deleted file mode 100644
index 8533f19..0000000
--- a/modules/color/spectrum
+++ /dev/null
@@ -1,19 +0,0 @@
-#! /bin/zsh
-# A script to make using 256 colors in zsh less painful.
-# P.C. Shyamshankar <sykora@lucentbeing.com>
-
-typeset -Ag FX FG BG
-
-FX=(
-    reset     ""
-    bold      "" no-bold      ""
-    italic    "" no-italic    ""
-    underline "" no-underline ""
-    blink     "" no-blink     ""
-    reverse   "" no-reverse   ""
-)
-
-for color in {0..255}; do
-    FG[$color]="[38;5;${color}m"
-    BG[$color]="[48;5;${color}m"
-done
diff --git a/modules/conf/init b/modules/conf/init
deleted file mode 100755
index 9e68425..0000000
--- a/modules/conf/init
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/zsh
-
-typeset -Ax conf_locations
-
-conf() {
-	if [[ $1 == -r ]]; then
-		local confconf=$(zdotfile confs)
-		if [[ -e $confconf ]]; then
-			conf_locations[conf]=$confconf
-			conf_locations+=( $(<$confconf) )
-		fi
-		return
-	fi
-
-	if [[ -z $1 ]]; then
-		echo "Available configs:"
-		for k v in ${(kv)conf_locations}; do
-			printf "%-20s %s\n" ${k}: ${(e)v}
-		done
-		return 1
-	fi
-
-	local target=${(e)conf_locations[${1}]}
-	if [[ -d ${target} ]]; then
-		cd ${target}
-		if ! [[ -w ${target} ]]; then
-			su
-		fi
-	elif [[ -f ${target} ]]; then
-		if ! [[ -w ${target} ]]; then
-			sudoedit ${target}
-		else
-			$EDITOR ${target}
-		fi
-	elif [[ -n ${target} ]]; then
-		echo "Conf target for $1 missing: $target"
-	else
-		echo "Unknown conf target: $1"
-	fi
-
-}
-
-conf -r
diff --git a/modules/fasd/init b/modules/fasd/init
deleted file mode 100644
index 5c917fd..0000000
--- a/modules/fasd/init
+++ /dev/null
@@ -1,6 +0,0 @@
-if exists fast; then
-	eval "$(fasd --init auto)"
-	bindkey '^X^A' fasd-complete    # C-x C-a to do fasd-complete (fils and directories)
-	bindkey '^X^F' fasd-complete-f  # C-x C-f to do fasd-complete-f (only files)
-	bindkey '^X^D' fasd-complete-d  # C-x C-d to do fasd-complete-d (only directories)
-fi
diff --git a/modules/helpers.zsh b/modules/helpers.zsh
deleted file mode 100644
index d788250..0000000
--- a/modules/helpers.zsh
+++ /dev/null
@@ -1,15 +0,0 @@
-
-istrue() {
-	case "$1" in
-		yes|yeah|on|true|1|y)
-			return 0;;
-	esac
-	return 1;
-}
-
-in_array() {
-	local needle=$1
-	shift
-	arr=( "${@}" )
-	(( $arr[(i)$needle] != ${#arr} + 1 ))
-}
diff --git a/modules/highlight/zsh-syntax-highlighting b/modules/highlight/zsh-syntax-highlighting
deleted file mode 160000
index 76ea9e1..0000000
--- a/modules/highlight/zsh-syntax-highlighting
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 76ea9e1df3166209d5f937f57a0833f26b1a01bd
diff --git a/modules/loader.zsh b/modules/loader.zsh
deleted file mode 100644
index dae6834..0000000
--- a/modules/loader.zsh
+++ /dev/null
@@ -1,221 +0,0 @@
-#################################################################################
-# ZSH modular config
-#################################################################################
-#
-# Helps you split up your config into modules and reuse modules from other
-# people.
-#
-# Modules are stored in the "modules" folder in your configuration directory
-# (default: /etc/zsh, if you want to use this in a user configuration file, set
-# the variable $ZDOTDIR to your zsh configuration directory in ~/.zshenv)
-#
-# Each module should have a file called "init". This file is sourced, when the
-# module is loaded and is responsible for sourcing any other files needed by the
-# module. 
-#
-# The module can use $MPATH variable, which contains the module's directory.
-
-
-#################################
-# INTERNAL MODULE LOADING STUFF #
-#################################
-
-# Path to module directory
-if [[ -z $ZMODPATH ]]; then
-	ZMODPATH=( ${ZDOTDIR:+$ZDOTDIR/modules} )
-	[[ -d /etc/zsh/modules ]] && ZMODPATH+=/etc/zsh/modules
-fi
-
-local mod_path() {
-	for dir in $ZMODPATH; do
-		if [[ -e $dir/$1 ]]; then
-			echo "$dir/$1"
-			return 0
-		fi
-	done
-	return 1
-}
-
-
-. $(mod_path helpers.zsh)
-errdetails=""
-
-modqueue=( )
-
-# Adds a module to the loading queue
-#
-# This function adds a module for later loading, if it is not already queued.
-# It calls mod_deps for dependency checking. If dependencies are not satisfied,
-# the module is not loaded.
-#
-# Parameters:
-# 1: module name
-# 2: if loaded as a dependency: is_dep
-#    otherwise empty
-# 3: if loaded as a dependency: the depending module
-#
-mod_queue() {
-	local module="$1"
-	local modsource=$(mod_path $module)
-
-	if ! mod_exists "$module" ; then
-		if [[ "$2" == "is_dep" ]]; then
-			echo "$3: Unsatisfied dependency \"$module\"";
-			return 1
-		else
-			return 2
-		fi
-	fi
-
-	in_array "$module" "${(@)modqueue}" && return 0
-
-	if mod_deps "$modsource"; then
-		modqueue=( "${(@)modqueue}" "$module" )
-	else
-		case $? in
-			1) echo "module $module not loaded because of missing dependencies: $errdetails";;
-			2) echo "module $module not loaded because of blocking module: $errdetails";;
-		esac
-	fi
-}
-
-mod_exists() {
-	mod_path "$1" &> /dev/null
-}
-
-# Checks for module dependencies
-#
-# Reads the "depend" file for a module and tries to queue all dependencies for
-# loading. If any fails, it returns 1;
-#
-# Parameters:
-# 1: Path to module
-#
-mod_deps() {
-	modpath=$1
-	! [ -e $modpath/depend ] && return 0;
-
-	while read relation dep; do
-		mod_check_dep $modpath $relation $dep
-		[ $? -gt 0 ] && return $?;
-	done < "$modpath/depend"
-	return 0;
-}
-
-mod_check_dep() {
-	modpath=$1
-	relation=$2
-	dep=$3
-	
-	#legacy entry compatibility
-	if [ -z "$dep" ]; then
-		dep="$relation"
-		relation="need"
-	fi
-	
-	if in_array "$dep" "${(@)modqueue}" && [[ "$relation" != "block" ]]; then
-		return 0;
-	fi
-
-	case "$relation"; in
-		"need")
-			if ! mod_queue "$dep" is_dep ${modpath}; then
-				errdetails="$dep"
-				return 1;
-			fi
-			;;
-		"after")
-			if ([ -z "$ZMODLOAD_ONLY" ] \
-				|| in_array "$dep" "${(@)ZMODLOAD_ONLY}") \
-			&& ! in_array "$dep" "${(@)ZMODLOAD_BLACKLIST}"; then
-					mod_queue "$dep"
-			fi ;;
-		"block")
-			if in_array "$dep" "${(@)ZMODLOAD_ONLY}" \
-				|| in_array "$dep" "${(@)modqueue}"; then
-				errdetails="$dep"
-				return 2
-			fi;;
-	esac
-}
-
-# Loads all queued modules
-#
-# After queueing all modules and dependency modules, this function calls their
-# init-scripts, if existent (if not, the module is ignored for now)
-#
-mod_load() {
-	local MPATH
-	for module in "${(@)modqueue}"; do
-		MPATH=$(mod_path $module)
-		[ -e "$(mod_path $module)/init" ] && . "$(mod_path $module)/init" 
-	done
-}
-
-# Begins module loading procedure
-#
-# Queues all modules in the module directory or, if set, only modules listed in 
-# $ZMODLOAD_ONLY
-
-mod_init() {
-
-	if [ -n "$ZMODLOAD_ONLY" ]; then
-		for module in "${(@)ZMODLOAD_ONLY}"; do
-			[ -d "$(mod_path $module)" ] && mod_queue "$module"
-		done
-	else
-		for moddir in $ZMODPATH; do
-			for module in $moddir/*(/N); do
-				if [ -z "$ZMODLOAD_BLACKLIST" ] \
-					|| ! in_array ${module:t} ${(@)ZMODLOAD_BLACKLIST}; then
-					mod_queue "${module:t}"
-				fi
-			done
-		done
-	fi
-
-	mod_load
-}
-
-# return 0 if all given modules were loaded (i.e. in the load queue)
-mod_loaded() {
-	for i in "$@"; do
-		in_array $i ${(@)modqueue} || return 1
-	done
-	return 0
-}
-
-#################################################################################
-# Utility functions for modules
-#################################################################################
-
-#
-# Register hook functions
-# see 'SPECIAL FUNCTIONS' section in zshmisc(1) for more information
-#
-
-precmd_hook() {
-	[[ -z $precmd_functions ]] && precmd_functions=()
-	precmd_functions=($precmd_functions $*)
-}
-
-chpwd_hook() {
-	[[ -z $chpwd_functions ]] && chpwd_functions=()
-	chpwd_functions=($chpwd_functions $*)
-}
-
-preexec_hook() {
-	[[ -z $preexec_functions ]] && preexec_functions=()
-	preexec_functions=($preexec_functions $*)
-}
-
-zshaddhistory_hook() {
-	[[ -z $zshaddhistory_functions ]] && zshaddhistory_functions=()
-	zshaddhistory_functions=($zshaddhistory_functions $*)
-}
-
-zshexit_hook() {
-	[[ -z $zshexit_functions ]] && zshexit_functions=()
-	zshexit_functions=($zshexit_functions $*)
-}
-
diff --git a/modules/localrc/init b/modules/localrc/init
deleted file mode 100755
index b49b068..0000000
--- a/modules/localrc/init
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/zsh
-
-load_localrc() {
-	local dir=${1:-$PWD}
-	if [[ -f $dir/.lzshrc ]]; then source $dir/.lzshrc
-	elif [[ "$dir" != "/" ]]; then load_localrc ${dir:h}
-	fi
-}
-
-chpwd_hook load_localrc
diff --git a/modules/prompt/depend b/modules/prompt/depend
deleted file mode 100644
index 8dd3066..0000000
--- a/modules/prompt/depend
+++ /dev/null
@@ -1,4 +0,0 @@
-need color
-after vcs
-after todo
-after work
diff --git a/modules/prompt/init b/modules/prompt/init
deleted file mode 100644
index 141dd50..0000000
--- a/modules/prompt/init
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/bin/zsh
-
-autoload -U colors && colors
-autoload -U promptinit
-
-PROMPT_UNICODE=${PROMPT_UNICODE:-yes}
-setopt prompt_subst
-
-PVPREFIX="╼╢"
-PVSUFFIX="╟╾"
-PR_HBAR='─'
-PR_VBAR='│'
-CORNER_LU='╭'
-CORNER_LD='╰'
-CORNER_RU='╮'
-CORNER_RD='╯'
-ARR_LEFT='◀'
-
-if [[ "$PROMPT_UNICODE" != "yes" ]]; then
-	PVPREFIX="["
-	PVSUFFIX="]"
-	PR_HBAR='-'
-	PR_VBAR='|'
-	CORNER_LU=','
-	CORNER_LD="'"
-	CORNER_RU=','
-	CORNER_RD="'"
-	ARR_LEFT='<'
-fi
-
-
-# Show screen STY and tmux number
-sty () {
-	local sty=$?
-	echo -n "${SIG_PROMPT_PREFIX}"
-	echo -n "${STY:+"SCREEN:"}${(S)STY/#*./}${STY+" - "}"
-	echo -n "${TMUX:+"TMUX:"}${TMUX/*,/}${TMUX+" - "}"
-	echo -n "%y${SIG_PROMPT_SUFFIX}"
-}
-
-# show number of attached and detached screens
-screennum() {
-	local att
-	local det
-	local dead
-	if [ -x /usr/bin/screen ]; then
-		att=`screen -ls | grep -c Attached`
-		det=`screen -ls | grep -c Detached`
-		dead=`screen -ls | grep -c Dead `
-		echo "A:$att|D:$det|?:$dead"
-	fi
-}
-
-function prompt_precmd {
-	if mod_loaded vcs; then
-		vcs_info
-	fi
-	setprompt
-	RPS1='$usercolor${ARR_LEFT}%(?::$exitcolor${PVPREFIX})$(exitstatus)%(?::${PVSUFFIX})${stycolor}${PVPREFIX}$(sty)${rpscolor}${PVSUFFIX}${CORNER_RD}$reset'
-}
-
-precmd_hook prompt_precmd
-
-# Executed after a command has been read and is to be executed.
-function prompt_preexec {
-	# if running gnu screen, set the window name to the last run command
-	# FIXME any way to make this not change certain window titles (by window
-	# number or if a title isn't already set?)
-	if [[ -n "$TMUX" ]] \
-	&& ! tmux show -w | grep -q "automatic-rename off"; then
-		local CMD=${1[(wr)^(*=*|ssh|sudo|-*)]}
-		echo -ne "\ek$CMD\e\\"
-	fi
-}
-
-if mod_loaded todo; then
-	function todo_to_read_info() {
-		count=$(todo_count all ${TO_READ_FILE:-$HOME/.to_read})
-		if [ "$count" -gt 1 ]; then
-			echo -n "${PVPREFIX}${pathcolor}To read: $((count -1)) ${rpscolor}${PVSUFFIX}"
-		elif [ "$count" -lt 0 ]; then
-			echo -n "${PVPREFIX}${pathcolor}no todo${rpscolor}${PVSUFFIX}"
-		fi
-	}
-fi
-
-preexec_hook prompt_preexec
-
-function setprompt() {
-	local -a lines infoline middleline
-	local x i filler i_width
-
-	infoline+=( "${rpscolor}${CORNER_LU}" )
-
-	### First, assemble the top line
-	# Current dir
-	[[ -w $PWD ]] && infoline+=( ${pathcolor} ) || infoline+=( ${ropathcolor} )
-	infoline+=( "${PVPREFIX} %(5~|%-1~/.../|)%3~ ${PVSUFFIX}${rpscolor}${PR_HBAR}" )
-
-	if [[ -n "$VIRTUAL_ENV" ]] then
-		local venvname=${VIRTUAL_ENV:t}
-		if [[ $venvname == "venv" ]]; then
-			venvname=${VIRTUAL_ENV:h:t}/${VIRTUAL_ENV:t}
-		fi
-		infoline+=( "${usercolor}${PVPREFIX}venv: ${venvname}${PVSUFFIX}${rpscolor}" )
-	fi
-	[[ -n "$CONDA_DEFAULT_ENV" ]] && infoline+=( "${usercolor}${PVPREFIX}conda: ${CONDA_DEFAULT_ENV}${PVSUFFIX}${rpscolor}" )
-
-	# Username & host
-	infoline+=( "%(1j.${PVPREFIX} ${gitdirty}Jobs: %j${rpscolor} ${PVSUFFIX}.)" )
-	infoline+=( "${PVPREFIX} ${usercolor}%n${reset}@${hostcolor}%m${rpscolor} ${PVSUFFIX}" )
-
-	i_width=${(S)infoline//\%\{*\%\}} # search-and-replace color escapes
-	i_width=${(%)i_width} # expand all escapes and count the chars
-	i_width=${#i_width} # expand all escapes and count the chars
-	((i_width += 2)) # workaround off by one, unknown reason
-
-	if [[ "$PROMPT_UNICODE" = "yes" ]]; then
-		filler="${rpscolor}${(l:$(( $COLUMNS - $i_width + 2))::─:)}"
-	else
-		filler="${rpscolor}${(l:$(( $COLUMNS - $i_width + 2))::-:)}"
-	fi
-	infoline[3]=( "${infoline[3]}${PR_HBAR}${filler}${PR_HBAR}" )
-	infoline+=( "${rpscolor}${CORNER_RU}" )
-
-	#middle info line
-
-	middleline+=( "${rpscolor}${PR_VBAR} ")
-
-	if mod_loaded vcs && [[ -n ${vcs_info_msg_0_} ]]; then
-		middleline+=( "$(vcs_char) ${vcs_info_msg_0_}${reset}" )
-	fi
-
-	if mod_loaded project && [[ -n $ZPROJECT ]]; then
-		middleline+=( "${pathcolor}❰${ZPROJECT[name]}❱${reset}" )
-	fi
-
-	i_width=${(S)middleline//\%\{*\%\}} # search-and-replace color escapes
-	i_width=${#${(%)i_width}} # expand all escapes and count the chars
-	filler="${rpscolor}${(l:$(( $COLUMNS - $i_width - 2)):: :)}${reset}"
-
-	### Now, assemble all prompt lines
-	lines+=( ${(j::)infoline} )
-
-
-	[[ $#middleline > 1 ]] && lines+=( "${middleline}${filler}${rpscolor}${PR_VBAR}" )
-	lines+=( "${CORNER_LD}${PVPREFIX} %(1j.${rpscolor}%j${reset} .)${usercolor}%#${reset} " )
-
-	### Finally, set the prompt
-	PROMPT=${(F)lines}
-}
diff --git a/modules/todo/init b/modules/todo/init
deleted file mode 100644
index 0b2843a..0000000
--- a/modules/todo/init
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/zsh
-if command -v todo >/dev/null; then
-	todo_count() {
-		if [ -n "$2" ]; then
-			file="--database $2"
-		else
-			file="-G"
-		fi
-		todo ${=file} -f +${1:-high} | wc -l
-	}
-	chpwd_hook todo
-else
-	todo_count() {
-		echo -1
-	}
-fi
diff --git a/modules/vcs/init b/modules/vcs/init
deleted file mode 100644
index 2c09824..0000000
--- a/modules/vcs/init
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/bin/zsh
-# vcs-info config
-#
-# Partly based on Seth House's zsh promp
-
-
-autoload -Uz vcs_info
-
-# Set up VCS_INFO
-zstyle ':vcs_info:*' enable git hg svn
-zstyle ':vcs_info:(hg*|git*):*' get-revision true
-zstyle ':vcs_info:(hg*|git*):*' check-for-changes true
-
-zstyle ':vcs_info:hg*' formats "(%s)[%i%u %b %m]" # rev+changes branch misc
-zstyle ':vcs_info:hg*' actionformats "(%s|${white}%a${rpscolor})[%i%u %b %m]"
-
-zstyle ':vcs_info:hg*:netbeans' use-simple true
-zstyle ':vcs_info:hg*:*' get-bookmarks true
-zstyle ':vcs_info:hg*:*' get-mq true
-
-zstyle ':vcs_info:hg*:*' get-unapplied true
-zstyle ':vcs_info:hg*:*' patch-format "mq(%g):%n/%c %p"
-zstyle ':vcs_info:hg*:*' nopatch-format "mq(%g):%n/%c %p"
-
-zstyle ':vcs_info:hg*:*' hgrevformat "%r" # only show local rev.
-zstyle ':vcs_info:hg*:*' branchformat "%b" # only show branch
-zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b$vcs_revision:%f%r%f"
-
-if [[ -z $(git ls-files --other --exclude-standard 2> /dev/null) ]] {
-	zstyle ':vcs_info:git*' formats "(%s) %12.12i %c%u %b%m" # hash changes branch misc
-	zstyle ':vcs_info:git*' actionformats "(%s|${white}%a${rpscolor}) %12.12i %c%u %b%m"
-} else {
-	zstyle ':vcs_info:git*' formats "(%s) %12.12i %c%u${gituntracked} %b%m" # hash changes branch misc
-	zstyle ':vcs_info:git*' actionformats "(%s|${white}%a${rpscolor}) %12.12i %c%u %b%m"
-}
-
-
-zstyle ':vcs_info:*' stagedstr "$gitstaged●$rpscolor"
-zstyle ':vcs_info:*' unstagedstr "$gitdirty●$rpscolor"
-
-# zstyle ':vcs_info:hg:*:-all-' command fakehg
-# zstyle ':vcs_info:*+*:*' debug true
-
-zstyle ':vcs_info:hg*+set-hgrev-format:*' hooks hg-hashfallback
-zstyle ':vcs_info:hg*+set-message:*' hooks mq-vcs
-zstyle ':vcs_info:git*+set-message:*' hooks git-st git-stash
-zstyle ':vcs_info:*+pre-get-data:*' hooks vcs-detect
-
-disable_pattern=()
-for i in $MPATH/filter/*(N); do
-	filter="$(readlink -f $i)(|/*)"
-	disable_pattern=("${disable_pattern[@]}" "$filter");
-done
-zstyle ':vcs_info:*' disable-patterns "${disable_pattern[@]}"
-
-+vi-vcs-detect() {
-	export VCS_DETECTED=$vcs
-}
-
-vcs_char() {
-	case $VCS_DETECTED in 
-		git) echo '±';;
-		hg)  echo '☿';;
-		svn) echo '☣';;
-		*)   echo '#';;
-	esac
-}
-
-exitstatus () {
-  local exitstatus=$?
-
-  if [ $exitstatus -ne 0 ] ; then
-    if [ $exitstatus -gt 128 -a $exitstatus -lt 163 ] ; then
-      echo "${SIG_PROMPT_PREFIX}SIG$signals[$exitstatus-127]${SIG_PROMPT_SUFFIX}"
-    else
-      echo "${SIG_PROMPT_PREFIX}${exitstatus}${SIG_PROMPT_SUFFIX}"
-    fi
-  fi
-}
-
-
-### Dynamically set hgrevformat based on if the local rev is available
-# We don't always know the local revision, e.g. if use-simple is set
-# Truncate long hash to 12-chars but also allow for multiple parents
-function +vi-hg-hashfallback() {
-    if [[ -z ${hook_com[localrev]} ]] ; then
-        local -a parents
-
-        parents=( ${(s:+:)hook_com[hash]} )
-        parents=( ${(@r:12:)parents} )
-        hook_com[rev-replace]="${(j:+:)parents}"
-
-        ret=1
-    fi
-}
-
-# Show remote ref name and number of commits ahead-of or behind
-function +vi-git-st() {
-    local ahead behind remote
-    local -a gitstatus
-
-    # Are we on a remote-tracking branch?
-    remote=${$(git rev-parse --verify ${hook_com[branch]}@{upstream} \
-        --symbolic-full-name --abbrev-ref 2>/dev/null)}
-
-    if [[ -n ${remote} ]] ; then
-        # for git prior to 1.7
-        # ahead=$(git rev-list origin/${hook_com[branch]}..HEAD | wc -l)
-        ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l)
-		(( $ahead )) && gitstatus+=( "${gitstaged}+${ahead}${rpscolor}" )
-
-        # for git prior to 1.7
-        # behind=$(git rev-list HEAD..origin/${hook_com[branch]} | wc -l)
-        behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l)
-        (( $behind )) && gitstatus+=( "${gitdirty}-${behind}${rpscolor}" )
-
-        hook_com[branch]="${hook_com[branch]} [ ${remote}${gitstatus:+ }${gitstatus} ]"
-    fi
-}
-
-
-# Show count of stashed changes
-function +vi-git-stash() {
-    local -a stashes
-
-    if [[ -s ${hook_com[base]}/.git/refs/stash ]] ; then
-        stashes=$(git stash list 2>/dev/null | wc -l)
-        hook_com[misc]+=" (${stashes} stashed)"
-    fi
-}
-
diff --git a/modules/autoloader/init b/plugins/autoloader/autoloader.plugin.zsh
similarity index 100%
rename from modules/autoloader/init
rename to plugins/autoloader/autoloader.plugin.zsh
diff --git a/modules/highlight/init b/plugins/highlight-config/highlight-config.plugin.zsh
similarity index 92%
rename from modules/highlight/init
rename to plugins/highlight-config/highlight-config.plugin.zsh
index 9bfbc2d..de7bf31 100644
--- a/modules/highlight/init
+++ b/plugins/highlight-config/highlight-config.plugin.zsh
@@ -1,5 +1,3 @@
-. /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
-
 ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern)
 
 if [[ "`tput colors`" == "256" ]] || [[ "`tput colors`" == "88" ]] ; then
diff --git a/zplug.zsh b/zplug.zsh
index af83bb9..6213521 100644
--- a/zplug.zsh
+++ b/zplug.zsh
@@ -1,7 +1,13 @@
 source $(zdotfile zplug/init.zsh)
 
 zplug "MichaelAquilina/zsh-you-should-use"
+zplug 'jreese/zsh-titles'
+
 zplug 'crater2150-zsh/fzf-widgets'
+zplug 'crater2150-zsh/conf'
+zplug 'crater2150-zsh/chroma-z', as:theme
+
+zplug $ZDOTDIR/plugins/autoloader, from:local
 
 zplug 'molovo/revolver', \
   as:command, \
@@ -11,8 +17,10 @@ zplug 'zunit-zsh/zunit', \
   use:zunit, \
   hook-build:'./build.zsh'
 
-zplug load
+zplug "zsh-users/zsh-syntax-highlighting", defer:2
+zplug $ZDOTDIR/plugins/highlight-config, from:local, defer:3
 
+zplug load
 
 if zplug check 'crater2150-zsh/fzf-widgets'; then
   # Map widgets to key
diff --git a/zshenv b/zshenv
index 0bd6471..7a689cd 100755
--- a/zshenv
+++ b/zshenv
@@ -1,4 +1,4 @@
-export ZDOTDIR=${XDG_CONFIG_HOME:-$HOME/.config}/zsh
+export ZDOTDIR="${$(readlink $HOME/.zshenv):h:a}"
 
 for i in $ZDOTDIR/env/*.zsh; do
 	. $i
diff --git a/zshrc b/zshrc
index 71e04da..9d890b9 100644
--- a/zshrc
+++ b/zshrc
@@ -31,30 +31,25 @@ try-source() {
 	fi
     done
 }
+exists() { command -v "$@" >/dev/null }
 
 local dirfile=$(zdotfile dirs)
 try-source $dirfile
 
 . $(zdotfile completion.zsh)
+
 source $(zdotfile zplug.zsh)
 
-bindkey -v
-
-function exists { command -v "$@" >/dev/null }
-ZMODLOAD_BLACKLIST=( ssh-agent )
+. $(zdotfile bindings.zsh)
 
 stty -ixon
 
-. $(zdotfile modules/loader.zsh) && mod_init
-
 for i in  ${ZDOTDIR:+$ZDOTDIR/aliases/*~*.zwc(N)} /etc/zsh/aliases/*~*.zwc(N); do
     . $i
 done
 
-echo $PATH | grep -q 'local' || . /etc/zsh/zprofile
-echo $PATH | grep -q 'sbin' || . /etc/zsh/zprofile
-
+if ! (grep -q 'local' <<<$PATH && grep -q 'sbin'  <<<$PATH); then
+    . /etc/zsh/zprofile
+fi
 
 FZF_ALT_C_COMMAND="fd -t d"
-
-exists todo && todo