#!/bin/zsh
zmodload -Fa zsh/files b:zf_mv b:zf_mkdir
zmodload -F zsh/parameter p:commands p:dirstack p:functions

.autocomplete:recent-dirs:precmd() {
  if [[ ! -v functions[+autocomplete:recent-directories] ]]; then
    setopt autopushd pushdignoredups  # Set *global* shell options.
    builtin autoload -RUz chpwd_recent_filehandler

    local __=''
    builtin zstyle -s :chpwd: recent-dirs-file __ ||
        builtin zstyle ':chpwd:*' recent-dirs-file ${XDG_DATA_HOME:-$HOME/.local/share}/zsh/chpwd-recent-dirs
    builtin zstyle -s :chpwd: recent-dirs-max __ ||
        builtin zstyle ':chpwd:*' recent-dirs-max 0

    if ! (( $#dirstack[@] )); then
      local -aU reply=()
      chpwd_recent_filehandler
      dirstack=( ${^reply[@]:#$PWD}(N-/) )
    fi

    +autocomplete:recent-directories:save() {
      chpwd_recent_filehandler $PWD $dirstack[@]
    }
    add-zsh-hook chpwd +autocomplete:recent-directories:save

    +autocomplete:recent-directories() {
      reply=( ${^dirstack[@]:#$PWD(|/[^/]#)}(N) )

      local -P ancestor=$PWD:h
      while [[ $ancestor != / ]]; do
        reply=( ${reply[@]:#$ancestor} )
        ancestor=$ancestor:h
      done

      local exact=$reply[(r)*/$PREFIX$SUFFIX]
      [[ -n $exact ]] &&
          reply=( $exact ${reply[@]:#$exact} )

      (( $#reply[@] ))
    }
  fi
}
