diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2020-02-20 00:28:16 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2020-02-20 00:28:16 +0900 |
commit | 52154153150d0014a76ef8b429b73c590cb7f755 (patch) | |
tree | 7f745c14ac4cda8a8c148daab53bf3e87423c744 /shell/completion.zsh | |
parent | 54891d11e09d3491dffa3f494199064583ac4862 (diff) |
[completion] Allow users to customize fzf options via _fzf_comprun
Related #1809 #1850
Diffstat (limited to 'shell/completion.zsh')
-rw-r--r-- | shell/completion.zsh | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/shell/completion.zsh b/shell/completion.zsh index 6adb874a..d5fccad7 100644 --- a/shell/completion.zsh +++ b/shell/completion.zsh @@ -31,20 +31,40 @@ fi ########################################################### -__fzfcmd_complete() { - [ -n "$TMUX_PANE" ] && [ "${FZF_TMUX:-0}" != 0 ] && [ ${LINES:-40} -gt 15 ] && - echo "fzf-tmux -d${FZF_TMUX_HEIGHT:-40%}" || echo "fzf" +__fzf_comprun() { + if [[ "$(type _fzf_comprun 2>&1)" =~ function ]]; then + _fzf_comprun "$@" + elif [ -n "$TMUX_PANE" ] && [ "${FZF_TMUX:-0}" != 0 ] && [ ${LINES:-40} -gt 15 ]; then + shift + fzf-tmux -d "${FZF_TMUX_HEIGHT:-40%}" "$@" + else + shift + fzf "$@" + fi +} + +# Extract the name of the command. e.g. foo=1 bar baz**<tab> +__fzf_extract_command() { + local token tokens + tokens=(${(z)1}) + for token in $tokens; do + if [[ "$token" =~ [[:alnum:]] && ! "$token" =~ "=" ]]; then + echo "$token" + return + fi + done + echo "${tokens[1]}" } __fzf_generic_path_completion() { - local base lbuf compgen fzf_opts suffix tail fzf dir leftover matches + local base lbuf cmd compgen fzf_opts suffix tail dir leftover matches base=$1 lbuf=$2 + cmd=$(__fzf_extract_command "$lbuf") compgen=$3 fzf_opts=$4 suffix=$5 tail=$6 - fzf="$(__fzfcmd_complete)" setopt localoptions nonomatch eval "base=$base" @@ -55,7 +75,7 @@ __fzf_generic_path_completion() { leftover=${leftover/#\/} [ -z "$dir" ] && dir='.' [ "$dir" != "/" ] && dir="${dir/%\//}" - matches=$(eval "$compgen $(printf %q "$dir")" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS" ${(Q)${(Z+n+)fzf}} ${(Q)${(Z+n+)fzf_opts}} -q "$leftover" | while read item; do + matches=$(eval "$compgen $(printf %q "$dir")" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS" __fzf_comprun "$cmd" ${(Q)${(Z+n+)fzf_opts}} -q "$leftover" | while read item; do echo -n "${(q)item}$suffix " done) matches=${matches% } @@ -87,17 +107,16 @@ _fzf_feed_fifo() ( ) _fzf_complete() { - local fifo fzf_opts lbuf fzf matches post + local fifo fzf_opts lbuf cmd matches post fifo="${TMPDIR:-/tmp}/fzf-complete-fifo-$$" fzf_opts=$1 lbuf=$2 + cmd=$(__fzf_extract_command "$lbuf") post="${funcstack[2]}_post" type $post > /dev/null 2>&1 || post=cat - fzf="$(__fzfcmd_complete)" - _fzf_feed_fifo "$fifo" - matches=$(cat "$fifo" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS" ${(Q)${(Z+n+)fzf}} ${(Q)${(Z+n+)fzf_opts}} -q "${(Q)prefix}" | $post | tr '\n' ' ') + matches=$(cat "$fifo" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS" __fzf_comprun "$cmd" ${(Q)${(Z+n+)fzf_opts}} -q "${(Q)prefix}" | $post | tr '\n' ' ') if [ -n "$matches" ]; then LBUFFER="$lbuf$matches" fi @@ -141,7 +160,7 @@ _fzf_complete_unalias() { } fzf-completion() { - local tokens cmd prefix trigger tail fzf matches lbuf d_cmds + local tokens cmd prefix trigger tail matches lbuf d_cmds setopt localoptions noshwordsplit noksh_arrays noposixbuiltins # http://zsh.sourceforge.net/FAQ/zshfaq03.html @@ -152,7 +171,7 @@ fzf-completion() { return fi - cmd=${tokens[1]} + cmd=$(__fzf_extract_command "$LBUFFER") # Explicitly allow for empty trigger. trigger=${FZF_COMPLETION_TRIGGER-'**'} @@ -167,8 +186,7 @@ fzf-completion() { tail=${LBUFFER:$(( ${#LBUFFER} - ${#trigger} ))} # Kill completion (do not require trigger sequence) if [ $cmd = kill -a ${LBUFFER[-1]} = ' ' ]; then - fzf="$(__fzfcmd_complete)" - matches=$(command ps -ef | sed 1d | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-50%} --min-height 15 --reverse $FZF_DEFAULT_OPTS --preview 'echo {}' --preview-window down:3:wrap $FZF_COMPLETION_OPTS" ${(Q)${(Z+n+)fzf}} -m | awk '{print $2}' | tr '\n' ' ') + matches=$(command ps -ef | sed 1d | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-50%} --min-height 15 --reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS --preview 'echo {}' --preview-window down:3:wrap" __fzf_comprun "$cmd" -m | awk '{print $2}' | tr '\n' ' ') if [ -n "$matches" ]; then LBUFFER="$LBUFFER$matches" fi |