#!/usr/bin/env ydsh

# for fzf key binding

function _fzf_select(q : String, list : [String], opts : String) : String? {
    command -v fzf &>> /dev/null || return $none

    importenv FZF_DEFAULT_OPTS : ""
    var fzf_opt = "--height 40% --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS --bind=ctrl-r:toggle-sort $opts +m"

    var arg = ['-q', $q]
    if $q.empty() { $arg.clear(); }
    var ret0= "$(printf "%s\n" ${$list} | sort | uniq | FZF_DEFAULT_OPTS=$fzf_opt fzf $arg)"
    return $ret.empty() ? $none : $ret
}

function _fzf_search_hist(q : String, list : [String]?) : String? {
    $list || return $none

    importenv FZF_SEARCH_HIST_OPTS : ""
    return $_fzf_select($q, $list!, $FZF_SEARCH_HIST_OPTS)
}

function _fzf_select_files(q : String, list : [String]?) : String? {
    command -v fzf &>> /dev/null || return $none

    importenv FZF_DEFAULT_OPTS : ""
    importenv FZF_SELECT_FILES_OPTS : "--preview 'cat {}'"
    var fzf_opt = "--height 40% --bind=ctrl-z:igz:ignore --reverse $FZF_DEFAULT_OPTS" + 
                  "-m --header-lines=1 --preview 'echo {}' --preview-window down:3:wrap --min-height 15"
    var ret : [String]
    (command ps -eo user,pid,ppid,start,time,command 2> /dev/null ||
      command ps -eo user,pid,ppid,time,args) | FZF_DEFAULT_OPTS=$fzf_opt fzf | 
      for line in $STDIN {
        var r = $/^[^ ]+[ ]+([0-9]+)/.match($line).get(1) ?? continue
        $ret.add($r)
      }
    return $ret
}

# CTRL-R
$LINE_EDIT.action('fzf-search-hist', 'hist-select', $_fzf_search_hist)
$LINE_EDIT.bind("^R", 'fzf-search-hist')

# CTRL-T
$LINE_EDIT.action('fzf-select-files', 'insert', $_fzf_select_files)
$LINE_EDIT.bind('^T', 'fzf-select-files')

# ALT-C
$LINE_EDIT.action('fzf-cd', 'replace-whole-accept', $_fzf_cd)
$LINE_EDIT.bind('^[c', 'fzf-cd')

# ALT-K
$LINE_EDIT.action('fzf-kill-ring', 'kill-ring-select', $_fzf_select_killring)
$LINE_EDIT.bind('^[k', 'fzf-kill-ring')