From f660ad35b2a28fd21778ba0a80e880e27ab32a9b Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 23 Nov 2013 20:09:56 +0900 Subject: Improve bash completion: `[DIRECTORY/][FUZZY_PATTERN]**` --- fzf-completion.bash | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) (limited to 'fzf-completion.bash') diff --git a/fzf-completion.bash b/fzf-completion.bash index e52a8f94..bdb8568e 100644 --- a/fzf-completion.bash +++ b/fzf-completion.bash @@ -31,31 +31,37 @@ _fzf_opts_completion() { } _fzf_generic_completion() { - local cur prev opts base matches + local cur prev opts base dir leftover matches COMPREPLY=() FZF_COMPLETION_TRIGGER=${FZF_COMPLETION_TRIGGER:-**} cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" if [[ ${cur} == *"$FZF_COMPLETION_TRIGGER" ]]; then base=${cur:0:${#cur}-${#FZF_COMPLETION_TRIGGER}} - base=${base%/} eval base=$base - find_opts="-name .git -prune -o -name .svn -prune -o" - if [ -z "$base" -o -d "$base" ]; then - matches=$(find ${base:-*} $1 2> /dev/null | fzf $FZF_COMPLETION_OPTS $2 | while read item; do - if [[ ${item} =~ \ ]]; then - echo -n "\"$item\" " - else - echo -n "$item " + dir="$base" + while [ 1 ]; do + if [ -z "$dir" -o -d "$dir" ]; then + leftover=${base/#"$dir"} + leftover=${leftover/#\/} + [ "$dir" = '.' ] && dir='' + matches=$(find "$dir"* $1 2> /dev/null | fzf $FZF_COMPLETION_OPTS $2 -q "$leftover" | while read item; do + if [[ ${item} =~ \ ]]; then + echo -n "\"$item\" " + else + echo -n "$item " + fi + done) + matches=${matches% } + if [ -n "$matches" ]; then + COMPREPLY=( "$matches" ) + return 0 fi - done) - matches=${matches% } - if [ -n "$matches" ]; then - COMPREPLY=( "$matches" ) - return 0 + return 1 fi - fi + dir=$(dirname "$dir") + done fi } -- cgit v1.2.3