function cd_to() {
    setopt localoptions pipefail no_aliases 2> /dev/null
    local dir=$1
    if [[ -z "$dir" ]]; then
        zle redisplay
        return 0
    fi
    zle push-line # Clear buffer. Auto-restored on next prompt.
    cd $dir
    zle accept-line
    local ret=$?
    unset dir # ensure this doesn't end up appearing in prompt expansion
    zle reset-prompt
}

function find_local() {
    fd . -t $1 | fzy -l 20
}

function find_global() {
    file_type=$1
    FZY_CACHE=~/.cache/fzy_paths_$file_type
    if [ -f $FZY_CACHE ]; then
        if [ $(stat -c %Y $FZY_CACHE) -lt $(date +%s -d '-1 day') ]; then
            rm $FZY_CACHE
        fi
    fi
    if [ ! -f $FZY_CACHE ]; then
        PATHS=""
        for i in "$LOCAL_SEARCH_DIRS[@]"; do
            if [ -d $i ]; then
                PATHS="$PATHS\n$i\n$(fd . $i -t $file_type -d 8)"
            fi
        done
        for i in "$REMOTE_SEARCH_DIRS[@]"; do
            if [ -d $i ]; then
                PATHS="$PATHS\n$i\n$(ssh mallorea fd . \"$i\" -t $file_type -d 8)"
            fi
        done
        echo "$PATHS" > $FZY_CACHE
    fi
    file="$(cat $FZY_CACHE | fzy -l 20)"
    echo "$file" | cat - $FZY_CACHE | awk '!x[$0]++' > /tmp/fzy_paths_$file_type && mv /tmp/fzy_paths_$file_type $FZY_CACHE
    echo "$file"
}

function open_path() {
    file_type=$1
    search_fn=$2
    selection="$($search_fn $file_type)"
    if [ "$selection" = "" ]; then
        zle reset-prompt
        return
    fi
    if [ "$LBUFFER" = "" ]; then
        if [ "$file_type" = "d" ]; then
            cd_to "$selection"
        else
            selection=$(realpath "$selection")
            parent=$(dirname "$selection")
            cd_to "$parent"
            nvim "$selection"
        fi
    else
        emulate -L zsh
        zle -I
        LBUFFER="${LBUFFER}\"$selection\""
        zle reset-prompt
    fi
}

function open_global_path_d() { open_path d find_global }
function open_global_path_f() { open_path f find_global }
function open_local() { open_path f find_local }

function register_key() {
    zle -N $2
    bindkey "^$1" $2
    bindkey -M emacs "^$1" $2
    bindkey -M vicmd "^$1" $2
    bindkey -M viins "^$1" $2
}
