# vim: ft=zsh

KEYTIMEOUT=1
# Activate vim mode.
bindkey -v

bindkey -M visual 'i' vi-insert
bindkey -M visual 'a' vi-add-next


# Yank to the system clipboard
function vi-yank-xclip {
    zle vi-yank
    echo -n "$CUTBUFFER" | \copy
}

zle -N vi-yank-xclip
bindkey -M visual 'y' vi-yank-xclip


bindkey ' ' magic-space

bindkey '^K' up-line-or-history  # C-k
bindkey -M vicmd '^K' up-line-or-history  # C-k

bindkey '^J' down-line-or-history  # C-j
bindkey -M vicmd '^J' down-line-or-history  # C-j

bindkey '^U' kill-whole-line  # C-u
bindkey -M vicmd '^U' kill-whole-line  # C-u

bindkey -M viins '\e.' insert-last-word  # M-.

bindkey '^[[Z' reverse-menu-complete  # S-Tab


bindkey -M viins '`' autosuggest-accept
bindkey -M vicmd '`' autosuggest-accept

bindkey -M viins '^?' backward-delete-char
bindkey -M vicmd '^?' backward-delete-char

bindkey -M viins '^W' backward-delete-word
bindkey -M vicmd '^W' backward-delete-word

bindkey -M viins '^H' backward-delete-char
bindkey -M vicmd '^H' backward-delete-char


insert-sudo() {
    local sudo_template="${SUDO:=sudo} "
    local template_len="${#sudo_template}"

    if [ -z "${LBUFFER}${RBUFFER}" ]; then
        zle up-history
        if [ ! "${LBUFFER::$template_len}" = "$sudo_template" ]; then
            LBUFFER="${sudo_template}${LBUFFER}"
        fi
        return
    fi

    if [ "${LBUFFER::$template_len}" = "$sudo_template" ]; then
        LBUFFER="${LBUFFER:$template_len}"
    else
        LBUFFER="${sudo_template}${LBUFFER}"
    fi
}

zle -N insert-sudo

bindkey -M vicmd '^S' insert-sudo  # C-s
bindkey -M viins '^S' insert-sudo  # C-s


popdquiet() {
    popd &>/dev/null
    zle reset-prompt
}
zle -N popdquiet
bindkey "^P" popdquiet
bindkey -M vicmd "^P" popdquiet


cddotdot() {
    cd ..
    zle reset-prompt
}
zle -N cddotdot
bindkey "^O" cddotdot
bindkey -M vicmd "^O" cddotdot

fzfhistory() {
    local cmd
cmd=$(fc -il 1 | \
      awk '{
        original = $0;
        clean = $0;
        sub(/^[ ]*[0-9]+[ ]+[0-9]{4}-[0-9]{2}-[0-9]{2}[ ]+[0-9]{2}:[0-9]{2}[ ]*/, "", clean);
        print clean "\t" original
      }' | \
      fzf \
          --ignore-case \
          --scheme=history \
          --no-multi \
          --tac \
          --tiebreak=begin,index \
          --height="$((${LINES}/4))" \
          --query="${BUFFER}" \
          --delimiter=$'\t' \
          --with-nth=1 \
          --preview="echo {2} | sed 's/\\\n/\\n/g' | highlight -O ansi -S zsh" \
          --preview-window=wrap:30%:50% | \
      cut -f1 | sed 's/\\n/\n/g')

    if [[ -n "${cmd}" ]]; then
        BUFFER="${cmd}"
        CURSOR=$#BUFFER
    fi

    zle reset-prompt
}

zle -N fzfhistory
bindkey "^R" fzfhistory
bindkey -M vicmd "^R" fzfhistory
