export EDITOR="vim"
export PAGER="less"
export LS_COLORS='di=34:ow=44;37:tw=44;37:st=44;37:ex=31:su=7;31:sg=7;31:ln=33:or=7;33:pi=32:do=32:bd=35:cd=35:so=32:*.bz2=36:*.dmg=36:*.gz=36:*.gpg=36:*.rar=36:*.tar=36:*.tbz2=36:*.tgz=36:*.xz=36:*.zip=36:*.orig=90:*~=90'
LISTMAX=32768
WORDCHARS="*?[];!#~"
local grep=""
local grep_color="auto"
local fgrep=""
local ls=""
local ls_color="auto"
local ls_on_cd="yes"
local ls_on_init="no"

bindkey -v
# history-incremental-search-backward is much more useful than
# _history-complete-*
bindkey "^R" history-incremental-search-backward
# Add a few other emacs bindings for convenience, as it's sometimes quicker to
# use those than to switch between modes.
bindkey "^A" beginning-of-line
bindkey "^E" end-of-line
bindkey "^D" delete-char-or-list
# backward-kill-word behaves more like vim, whereas vi-backward-kill-word is
# the vi behaviour.
bindkey "^W" backward-kill-word

setopt no_bg_nice
setopt no_nomatch
setopt extended_glob
setopt autocd
setopt auto_pushd

autoload -U compinit
compinit -C

# Ignore case on completion
zstyle ':completion:*' matcher-list 'm:{A-Z}={a-z} m:{a-z}={A-Z}'

if [ -n "$grep" -o -n "$grep_color" ]; then
	if [ -z "$grep" ]; then
		if which ggrep &>/dev/null; then
			grep="ggrep"
		else
			grep="grep"
		fi
	fi
	[ -n "$grep_color" -a "$grep_color[1]" != "-" ] && \
		grep_color="--color=$grep_color"
	alias grep="$grep $grep_color"
fi

if [ -n "$fgrep" -o -n "$grep_color" ]; then
	if [ -z "$fgrep" ]; then
		if which ggrep &>/dev/null; then
			fgrep="ggrep -F"
		else
			fgrep="fgrep"
		fi
	fi
	[ -n "$grep_color" -a "$grep_color[1]" != "-" ] && \
		grep_color="--color=$grep_color"
	alias fgrep="$fgrep $grep_color"
fi

if [ -n "$ls" -o -n "$ls_color" ]; then
	if [ -z "$ls" ]; then
		if which gls &>/dev/null; then
			ls="gls"
		else
			ls="ls"
		fi
	fi
	[ -n "$ls_color" -a "$ls_color[1]" != "-" ] && \
		ls_color="--color=$ls_color"
	alias ls="$ls $ls_color"
fi

if [ "$ls_on_cd" = "yes" ]; then
	chpwd() {
		ls
	}
fi

if [ "$TERM_PROGRAM" = "Apple_Terminal" ]; then
	update_terminal_cwd() {
		printf '\e]7;%s\a' "file://$HOSTNAME${PWD// /%20}"
	}
else
	update_terminal_cwd() {
	}
fi

set_prompt() {
	PS1="%m:%c$@%B%(!.#.$)%b "
	PS2="%B>%b "
	RPS1="%(1j.%{$(print "\e[1;33m")%}%j%{$(print "\e[0m")%}.)"
	RPS1+="%(?..%(1j. .)%{$(print "\e[1;31m")%}%?%{$(print "\e[0m")%})"
	RPS2="%(1_.%{$(print "\e[1;30m")%}(%_%)%{$(print "\e[0m")%}.)"
}
set_prompt

_precmd() {
	update_terminal_cwd

	local branch_name
	branch_name="$(git symbolic-ref HEAD 2>/dev/null)"
	branch_name="${branch_name##refs/heads/}"
	if [ -n "$branch_name" -a "$branch_name" != "master" ]; then
		local branch
		branch="%{$(print "\e[1;30m")%}("
		branch+="%{$(print "\e[0;36m")%}$branch_name"
		branch+="%{$(print "\e[1;30m")%})%{$(print "\e[0m")%}"
		set_prompt "$branch"
	else
		set_prompt
	fi
}

case $TERM in
	aterm|Eterm|rxvt*|uxterm*|xterm*)

		# Use set_title if you want to change the term title
		set_title() {
			# Without this, precmd would override it
			precmd() {
				_precmd
			}
			print -Pn "\e]0;$@\a"
		}

		unset_title() {
			precmd() {
				print -Pn "\e]0;%m:%c\a"
				_precmd
			}
		}

		unset_title
		;;
	*)
		precmd() {
			_precmd
		}
		;;
esac

extr() {
	for i in $@; do
		case $i in
			*.7z)
				7za x $i
				;;
			*.lha)
				ofarc -x $i
				;;
			*.tar)
				ofarc -x $i
				;;
			*.tbz | *.tbz2 | *.tar.bz2)
				bzcat $i | ofarc -ttar -x -
				;;
			*.tgz | *.tar.gz)
				ofarc -x $i
				;;
			*.txz | *.tar.xz)
				xzcat $i | tar xfv -
				;;
			*.rar)
				unrar x $i
				;;
			*.zip)
				ofarc -x $i
				;;
			# These have to be the last for obvious reasons
			*.bz2)
				bunzip2 $i
				;;
			*.gz)
				ofarc -x $i
				;;
			*.xz)
				unxz $i
				;;
			*)
				echo "$i: Unknown file type"
				false
				;;
		esac
	done
}
for ext in 7z lha tar tbz tbz2 tar.bz2 tgz tar.gz txz tar.xz rar zip bz2 gz xz
do
	alias -s "$ext=extr"
done

[ "$EDITOR" = "vim" ] && alias vi=vim
which gpg2 &>/dev/null && alias gpg=gpg2

[ "$ls_on_init" = "yes" ] && ls

function ixio() {
	curl -F 'f:1=<-' ix.io
}

unset fgrep grep grep_color ls ls_color ls_on_cd ls_on_init
