110 lines
3.4 KiB
Plaintext
110 lines
3.4 KiB
Plaintext
|
#!/hint/zsh
|
||
|
|
||
|
# import math functions
|
||
|
autoload -Uz zmathfunc
|
||
|
zmathfunc
|
||
|
|
||
|
local tmp_dir=${TMPPREFIX:-/tmp/zsh}-fzf-tab-$USER
|
||
|
[[ -d $tmp_dir ]] || command mkdir $tmp_dir
|
||
|
|
||
|
local ftb_preview_init="
|
||
|
zmodload zsh/mapfile
|
||
|
local -a _ftb_compcap=(\"\${(@f)mapfile[$tmp_dir/compcap.$$]}\")
|
||
|
local -a _ftb_groups=(\"\${(@f)mapfile[$tmp_dir/groups.$$]}\")
|
||
|
local bs=\$'\2'
|
||
|
# get description
|
||
|
export desc=\${\${\"\$(<{f})\"%\$'\0'*}#*\$'\0'}
|
||
|
# get ctxt for current completion
|
||
|
local -A ctxt=(\"\${(@0)\${_ftb_compcap[(r)\${(b)desc}\$bs*]#*\$bs}}\")
|
||
|
# get group
|
||
|
if (( \$+ctxt[group] )); then
|
||
|
export group=\$_ftb_groups[\$ctxt[group]]
|
||
|
fi
|
||
|
# get original word
|
||
|
export word=\${(Q)ctxt[word]}
|
||
|
# get real path if it is file
|
||
|
if (( \$+ctxt[realdir] )); then
|
||
|
export realpath=\${ctxt[realdir]}\$word
|
||
|
fi
|
||
|
$(typeset -p words)
|
||
|
"
|
||
|
local default_binds=tab:down,btab:up,change:top,ctrl-space:toggle,bspace:backward-delete-char/eof,ctrl-h:backward-delete-char/eof
|
||
|
local fzf_command fzf_flags fzf_preview debug_command tmp switch_group fzf_pad fzf_min_height binds
|
||
|
local ret=0
|
||
|
|
||
|
-ftb-zstyle -s fzf-command fzf_command || fzf_command=fzf
|
||
|
-ftb-zstyle -a fzf-bindings-default tmp && binds=${(j:,:)tmp} || binds=$default_binds
|
||
|
-ftb-zstyle -a fzf-bindings tmp && binds+=,${(j:,:)tmp}
|
||
|
-ftb-zstyle -a fzf-flags fzf_flags
|
||
|
-ftb-zstyle -s fzf-preview fzf_preview
|
||
|
-ftb-zstyle -a switch-group switch_group || switch_group=(F1 F2)
|
||
|
-ftb-zstyle -s fzf-pad fzf_pad || fzf_pad=2
|
||
|
-ftb-zstyle -s fzf-min-height fzf_min_height || fzf_min_height=0
|
||
|
|
||
|
-ftb-zstyle -a debug-command debug_command && {
|
||
|
${(eX)debug_command} $fzf_flags
|
||
|
return
|
||
|
}
|
||
|
|
||
|
print -rl -- $_ftb_compcap > $tmp_dir/compcap.$$
|
||
|
print -rl -- $_ftb_groups > $tmp_dir/groups.$$
|
||
|
print -r -- ${ftb_preview_init/{f}/\$1} > $tmp_dir/ftb_preview_init.$$
|
||
|
|
||
|
binds=${binds//{_FTB_INIT_}/. $tmp_dir/ftb_preview_init.$$ {f} $'\n'}
|
||
|
|
||
|
local -i header_lines=$#_ftb_headers
|
||
|
local -i lines=$(( $#_ftb_compcap + fzf_pad + header_lines ))
|
||
|
local reload_command="$commands[zsh] -f $FZF_TAB_HOME/lib/ftb-switch-group $$ $header_lines $tmp_dir"
|
||
|
|
||
|
# detect if we will use tmux popup
|
||
|
local use_tmux_popup=0
|
||
|
if [[ $fzf_command == "ftb-tmux-popup" ]]; then
|
||
|
use_tmux_popup=1
|
||
|
fi
|
||
|
|
||
|
if (( ! use_tmux_popup )); then
|
||
|
# fzf will cause the current line to refresh, so move the cursor down.
|
||
|
echoti cud1 >/dev/tty
|
||
|
# reset cursor before call fzf
|
||
|
echoti cnorm >/dev/tty 2>/dev/null
|
||
|
fi
|
||
|
|
||
|
cat > $tmp_dir/completions.$$
|
||
|
|
||
|
local dd='gdd'
|
||
|
if (( ${+commands[$dd]} == 0 )) ; then
|
||
|
dd='dd'
|
||
|
fi
|
||
|
if (( ${+commands[$dd]} == 0 )) ; then
|
||
|
dd='true' # nop if dd is not installed
|
||
|
fi
|
||
|
|
||
|
_ftb_query="${_ftb_query}$(command "$dd" bs=1G count=1 status=none iflag=nonblock < /dev/tty 2>/dev/null)" || true
|
||
|
|
||
|
SHELL=$ZSH_NAME $fzf_command \
|
||
|
--ansi \
|
||
|
--bind=$binds \
|
||
|
--bind="${switch_group[1]}:reload($reload_command -1),${switch_group[2]}:reload($reload_command 1)" \
|
||
|
--color=hl:$(( header_lines == 0 ? 188 : 255 )) \
|
||
|
--cycle \
|
||
|
--delimiter='\x00' \
|
||
|
--expect=$continuous_trigger,$print_query,$accept_line \
|
||
|
--header-lines=$header_lines \
|
||
|
--height=${FZF_TMUX_HEIGHT:=$(( min(max(lines, fzf_min_height), LINES / 3 * 2) ))} \
|
||
|
--layout=reverse \
|
||
|
--multi \
|
||
|
--nth=2,3 \
|
||
|
--print-query \
|
||
|
--query=$_ftb_query \
|
||
|
--tiebreak=begin \
|
||
|
${fzf_preview:+--preview=${ftb_preview_init/{f}/'{f}'}$fzf_preview} \
|
||
|
$fzf_flags < $tmp_dir/completions.$$ || ret=$?
|
||
|
|
||
|
if (( ! use_tmux_popup )); then
|
||
|
echoti civis >/dev/tty 2>/dev/null
|
||
|
echoti cuu1 >/dev/tty
|
||
|
fi
|
||
|
|
||
|
command rm $tmp_dir/*.$$ 2>/dev/null
|
||
|
return $ret
|