# -*- mode: sh; -*-
setopt hist_ignore_space
setopt inc_append_history_time
setopt transient_rprompt

WORDCHARS=${${WORDCHARS//[-.=]}//[\/]}

zmodload zsh/terminfo

bindkey '\e[3~' delete-char

bindkey '\C-hd' describe-key-briefly

dc () {
  if [[ -x ./docker-compose ]]
  then
    ./docker-compose "$@"
  else
    docker-compose "$@"
  fi
}
compdef '_dispatch docker-compose docker-compose' dc

field () {
  awk "{ print \$${1:-0} }"
}
alias f=field

delink () {
  if [[ ! -h "$1" ]]
  then
    echo "$1 is not a symlink"
    return 1
  fi
  local src=$(readlink "$1")
  rm "$1"
  cp "$src" "$1"
  chmod u+w "$1"
}

mvlink () {
	src="$1"
	target="$2"
	if [[ -h "$src" ]]
	then
		echo "$src is already a symlink"
		return src
	fi
	if [[ -f "$target" ]]
	then
		echo "$target already exists"
	fi
	if [[ -d "$target" ]]
	then
		target="$target/$(basename $src)"
	fi
	mv "$src" "$target"
	ln -s "$target" "$src"
}

backward-argument () {
  local WORDCHARS="\!\`~#@$%^&*()-_=+[{]}\|;:,<.>/?\'\""
  zle backward-word
}

forward-argument () {
  local WORDCHARS="\!\`~#@$%^&*()-_=+[{]}\|;:,<.>/?\'\""
  zle forward-word
}

backward-kill-argument () {
  local WORDCHARS="\!\`~#@$%^&*()-_=+[{]}\|;:,<.>/?\'\""
  zle backward-kill-word
}

kill-argument () {
  local WORDCHARS="\!\`~#@$%^&*()-_=+[{]}\|;:,<.>/?\'\""
  zle kill-word
}

zle -N backward-argument
zle -N forward-argument
zle -N kill-argument
zle -N backward-kill-argument
bindkey '\e^b' backward-argument
bindkey '\e^f' forward-argument
bindkey '\e^d' backward-kill-argument
bindkey '\e^k' kill-argument

autoload -Uz edit-command-line
zle -N edit-command-line
bindkey '^x^e' edit-command-line

sort=${commands[gsort]:-$commands[sort]}

ds () {
  du -hd1 "$@" | $sort -h
}
zle-upify() {
  buf="$(echo "$BUFFER" | sed 's/[ |]*$//')"
  tmp="$(mktemp)"
  eval "$buf |& up -o '$tmp' 2>/dev/null"
  cmd="$(tail -n +2 "$tmp")"
  rm -f "$tmp"
  BUFFER="$BUFFER | $cmd"
  zle end-of-line
}
zle -N zle-upify

bindkey '\e^u' zle-upify
bindkey '\e^p' zle-upify

# returns the first ghq root, whereas $GHQ_ROOT returns all
hash -d p=$ghq_root[0]
hash -d go=${GOPATH:-$HOME/go}

zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path ${XDG_CACHE_HOME:-$HOME/.cache}/zsh/completion

zle -C hist-complete complete-word _generic
zstyle ':completion:hist-complete:*' completer _history
bindkey '\e ' hist-complete

zstyle ':completion:*' matcher-list 'm:{a-zA-Z-_}={A-Za-z_-}' 'r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' completer _expand _complete _match

zstyle -e ':completion:*' hosts 'reply=($(< ~/.hosts))'
zstyle ':completion:*:ssh:*' tag-order '! users'

# General configuration

if [[ $TERM == "dumb" ]]
then
  PROMPT='%B%F{green}%n %F{blue}%~%b%f
%# '
  unsetopt zle
else
  if [[ -f "$ZDOTDIR/.p10k.zsh" ]]
  then
    source $ZDOTDIR/.p10k.zsh
  fi
fi

export FZF_CTRL_T_COMMAND='(fd --hidden --follow --exclude ".git" .) 2> /dev/null'
export FZF_ALT_C_COMMAND='fd --type d --hidden --follow --exclude ".git" .'
export FZF_DEFAULT_COMMAND=$FZF_CTRL_T_COMMAND

bindkey '^t' transpose-chars
bindkey '^x^f' fzf-file-widget

zstyle ":anyframe:selector:fzf:" command "fzf --height 40%"

bindkey '\es' anyframe-widget-cd-ghq-repository
bindkey '\ej' anyframe-widget-cd-ghq-repository
bindkey '^x^k' anyframe-widget-kill

unsetopt flow_control       # Let me use ^S and ^Q

esetenv () {
  emacsclient -e "(setenv \"$1\" \"$2\")"
}

ecpenv () {
  esetenv "$1" "${(P)1}"
}
compdef '_parameters' ecpenv