diff --git a/fzf-completion.bash b/fzf-completion.bash index c78dfa3..4aa1611 100644 --- a/fzf-completion.bash +++ b/fzf-completion.bash @@ -8,6 +8,11 @@ # - $FZF_COMPLETION_TRIGGER (default: '**') # - $FZF_COMPLETION_OPTS (default: empty) +_fzf_orig_completion_filter() { + sed 's/.*-F *\([^ ]*\).* \([^ ]*\)$/export _fzf_orig_completion_\2=\1;/' | + sed 's/[^a-z0-9_= ;]/_/g' +} + _fzf_opts_completion() { local cur prev opts COMPREPLY=() @@ -89,7 +94,7 @@ _fzf_path_completion() { } _fzf_list_completion() { - local cur selected trigger cmd src + local cur selected trigger cmd src ret read -r src cmd=$(echo ${COMP_WORDS[0]} | sed 's/[^a-z0-9_=]/_/g') trigger=${FZF_COMPLETION_TRIGGER:-**} @@ -109,7 +114,15 @@ _fzf_list_completion() { else shift orig=$(eval "echo \$_fzf_orig_completion_$cmd") - [ -n "$orig" ] && type "$orig" > /dev/null && $orig "$@" + if [ -n "$orig" ] && type "$orig" > /dev/null; then + $orig "$@" + elif [ -n "$_fzf_completion_loader" ]; then + _completion_loader "$@" + ret=$? + eval $(complete | grep "\-F.* $cmd$" | _fzf_orig_completion_filter) + source $BASH_SOURCE + return $ret + fi fi } @@ -153,7 +166,7 @@ EOF _fzf_ssh_completion() { _fzf_list_completion '+m' "$@" << "EOF" - cat <(cat ~/.ssh/config /etc/ssh/ssh_config 2> /dev/null | grep -i ^host) <(grep -v '^\s*\(#\|$\)' /etc/hosts) | awk '{print $2}' | sort -u + cat <(cat ~/.ssh/config /etc/ssh/ssh_config 2> /dev/null | grep -i ^host | grep -v '*') <(grep -v '^\s*\(#\|$\)' /etc/hosts) | awk '{print $2}' | sort -u EOF } @@ -186,13 +199,15 @@ a_cmds=" x_cmds="kill ssh telnet unset unalias export" # Preserve existing completion -if [ "$_fzf_completion_loaded" != '0.8.6' ]; then +if [ "$_fzf_completion_loaded" != '0.8.6-1' ]; then # Really wish I could use associative array but OSX comes with bash 3.2 :( eval $(complete | grep '\-F' | grep -v _fzf_ | - grep -E -w "$(echo $d_cmds $f_cmds $a_cmds $x_cmds | sed 's/ /|/g' | sed 's/+/\\+/g')" | - sed 's/.*-F *\([^ ]*\).* \([^ ]*\)$/export _fzf_orig_completion_\2=\1;/' | - sed 's/[^a-z0-9_= ;]/_/g') - export _fzf_completion_loaded=0.8.6.1 + grep -E " ($(echo $d_cmds $f_cmds $a_cmds $x_cmds | sed 's/ /|/g' | sed 's/+/\\+/g'))$" | _fzf_orig_completion_filter) + export _fzf_completion_loaded=0.8.6-1 +fi + +if type _completion_loader > /dev/null; then + _fzf_completion_loader=1 fi # Directory