diff options
Diffstat (limited to 'dotfiles/system/.zsh/lib/-ftb-fzf')
| -rwxr-xr-x | dotfiles/system/.zsh/lib/-ftb-fzf | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/dotfiles/system/.zsh/lib/-ftb-fzf b/dotfiles/system/.zsh/lib/-ftb-fzf new file mode 100755 index 0000000..19adf04 --- /dev/null +++ b/dotfiles/system/.zsh/lib/-ftb-fzf @@ -0,0 +1,102 @@ +#!/hint/zsh + +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 descriptoin +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 +" +local binds=tab:down,btab:up,change:top,ctrl-space:toggle +local fzf_command fzf_flags fzf_preview debug_command tmp switch_group fzf_pad +local ret=0 + +-ftb-zstyle -s fzf-command fzf_command || fzf_command=fzf +-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 -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 + +$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:=$(( lines > LINES / 3 * 2 ? LINES / 3 * 2 : lines ))} \ + --layout=reverse \ + --multi \ + --nth=2,3 \ + --print-query \ + --query=$_ftb_query \ + --tiebreak=begin \ + ${fzf_preview:+--preview=$ftb_preview_init$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 |
