diff options
| author | Junegunn Choi <junegunn.c@gmail.com> | 2014-07-18 00:22:49 +0900 |
|---|---|---|
| committer | Junegunn Choi <junegunn.c@gmail.com> | 2014-07-18 00:22:49 +0900 |
| commit | 13cd4ed5469d782fa3a6ca674f46621b836d8da8 (patch) | |
| tree | 1864fb40f86b4244bcaec51beacf79b12d76a649 /fzf-completion.bash | |
| parent | 7261d3afcd177305240320437fd9e2d927dd8cb3 (diff) | |
| download | fzf-13cd4ed5469d782fa3a6ca674f46621b836d8da8.tar.gz | |
Handle dynamically loaded completion functions (#79)
On Ubuntu/Debian, completion functions can be dynamically loaded via
_completion_loader. Since those functions are not visible when
fzf-completion.bash is loaded, we need this special hack to make it
possible to fail back to the original completion function when trigger
sequence is not found.
Diffstat (limited to 'fzf-completion.bash')
| -rw-r--r-- | fzf-completion.bash | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/fzf-completion.bash b/fzf-completion.bash index c78dfa39..4aa16110 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 |
