export XDG_CONFIG_HOME="$HOME/.config"
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_DATA_HOME="$HOME/.local/share"
export EDITOR="vim"
export VIMINIT="source $XDG_CONFIG_HOME/vim/vimrc"
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'
export GNUPGHOME="$XDG_DATA_HOME/gnupg"
LISTMAX=32768
WORDCHARS="*?[];!#~"
local grep=""
local grep_color="auto"
local ls=""
local ls_color="auto"
local ls_on_cd="yes"
local ls_on_init="no"
local simple_prompt="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}'

__find_command() {
	which "$1" &>/dev/null && echo "$1" || echo "$2"
}

if [ -n "$grep" -o -n "$grep_color" ]; then
	: ${grep:=$(__find_command ggrep grep)}
	[ -n "$grep_color" -a "$grep_color[1]" != - ] &&
		grep_color="--color=$grep_color"
	if echo x | $grep $grep_color x &>/dev/null; then
		alias grep="$grep $grep_color"
	fi
fi
alias fgrep="grep -F"

if [ -n "$ls" -o -n "$ls_color" ]; then
	: ${ls:=$(__find_command gls ls)}
	[ -n "$ls_color" -a "$ls_color[1]" != - ] &&
		ls_color="--color=$ls_color"
	if $ls $ls_color &>/dev/null; then
		alias ls="$ls $ls_color"
	fi
fi
[ "$ls_on_cd" = yes ] && chpwd() { ls }
[ "$ls_on_init" = yes ] && ls

case $TERM_PROGRAM in
	Apple_Terminal)
		__update_terminal_cwd() {
			printf '\e]7;%s\a' "file://$HOSTNAME${PWD// /%20}"
		}
		;;
	*)
		__update_terminal_cwd() {}
		;;
esac

if [ "$simple_prompt" = yes ]; then
	set_prompt() {
		local branch
		[ -n "$1" ] && branch="%F{black}%B(%b%F{cyan}$1%F{black}%B)%b%f"

		PS1="%m:%c$branch%B%(!.#.$)%b "
		PS2="%B>%b "
		RPS1="%(1j.%F{yellow}%j%f.)%(?..%(1j. .)%F{red}%?%f)"
		RPS2="%(1_.%F{black}%B(%_%)%b%f.)"
	}
else
	set_prompt() {
		local branch
		[ -n "$1" ] && branch="%F{36}(%F{78}$1%F{36})"

		PS1="%F{23}%m %F{29}%c$branch%F{36}%(!.#.>)%f "
		PS2="%B>%b "
		RPS1="%(1j.%F{yellow}%j%f.)%(?..%(1j. .)%F{red}%?%f)"
		RPS2="%(1_.%F{black}%B(%_%)%b%f.)"
	}
fi
set_prompt

__precmd() {
	__update_terminal_cwd

	local branch=$(git symbolic-ref HEAD 2>/dev/null)
	branch=${branch##refs/heads/}

	if [ -z "$branch" ]; then
		branch=$(fossil branch current 2>/dev/null)
	fi

	set_prompt $branch
}

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;%c · %m\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 | ofarc -ttar -x -
				;;
			*.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

make() {
	case "$PWD" in
		# pkgsrc needs bmake and does not like MAKEFLAGS including -j.
		*/pkgsrc*)
			MAKEFLAGS= =$(__find_command bmake make) $@
			;;
		*)
			=make $@
			;;
	esac
}

alias tmux="tmux -f $XDG_CONFIG_HOME/tmux/tmux.conf"

if which fossil &>/dev/null; then
	alias fl="fossil"
	alias flc="fossil changes --differ"

	fld() {
		if which colordiff &>/dev/null; then
			fossil diff -N "$@" | colordiff | less -FRX
		else
			red="$(tput setaf 1)"
			green="$(tput setaf 2)"
			reset="$(tput sgr0)"
			fossil diff -N "$@" | sed "s/^+.*$/$green&$reset/" |
				sed "s/^-.*$/$red&$reset/" | less -FRX
		fi
	}
fi

# pkgsrc does not like MAKEFLAGS including -j
which pkg_chk &>/dev/null && alias pkg_chk="MAKEFLAGS= pkg_chk"
which pkg_rolling-replace &>/dev/null &&
	alias pkg_rolling-replace="MAKEFLAGS= pkg_rolling-replace"
which url2pkg &>/dev/null && alias url2pkg="MAKEFLAGS= url2pkg"

# mpv does not like locales that use , as decimal point.
alias mpv="LC_ALL=C mpv"

alias gpg-ssh="SSH_AUTH_SOCK=$GNUPGHOME/S.gpg-agent.ssh ssh"
alias gpg-ssh-add="SSH_AUTH_SOCK=$GNUPGHOME/S.gpg-agent.ssh ssh-add"
alias gpg-sftp="SSH_AUTH_SOCK=$GNUPGHOME/S.gpg-agent.ssh sftp"

pwnk() {
	local clipboard
	if which pbcopy &>/dev/null; then
		clipboard=pbcopy
	elif which xclip &>/dev/null; then
		clipboard=xclip
	else
		echo "No clipboard handler found!"
		return 1
	fi

	cryptopassphrase $@ | tr -d '\n' | $clipboard
}
alias pw="pwnk -k ~/.cryptopassphrase.key"
alias pws="pwnk -k ~/.cryptopassphrase-server.key"

ixio() { curl -F 'f:1=<-' ix.io }
0x0st() { curl -F'file=@-' https://0x0.st }

unset fgrep grep grep_color ls ls_color ls_on_cd ls_on_init simple_prompt
unset HISTFILE
