summaryrefslogtreecommitdiff
path: root/fzf-completion.bash
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2013-11-23 20:09:56 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2013-11-23 20:12:14 +0900
commitf660ad35b2a28fd21778ba0a80e880e27ab32a9b (patch)
tree902fd415154dcbd4e0e9707979f39db5ea98b0d9 /fzf-completion.bash
parentc61738ae43c06831efb932a68a63868c46892f30 (diff)
downloadfzf-f660ad35b2a28fd21778ba0a80e880e27ab32a9b.tar.gz
Improve bash completion: `[DIRECTORY/][FUZZY_PATTERN]**<TAB>`
Diffstat (limited to 'fzf-completion.bash')
-rw-r--r--fzf-completion.bash36
1 files changed, 21 insertions, 15 deletions
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
}