diff --git a/shell/completion.bash b/shell/completion.bash index 445df17..d2287c8 100644 --- a/shell/completion.bash +++ b/shell/completion.bash @@ -113,7 +113,7 @@ _fzf_opts_completion() { } _fzf_handle_dynamic_completion() { - local cmd orig_var orig ret orig_cmd + local cmd orig_var orig ret orig_cmd orig_complete cmd="$1" shift orig_cmd="$1" @@ -122,10 +122,14 @@ _fzf_handle_dynamic_completion() { if [ -n "$orig" ] && type "$orig" > /dev/null 2>&1; then $orig "$@" elif [ -n "$_fzf_completion_loader" ]; then + orig_complete=$(complete -p "$cmd") _completion_loader "$@" ret=$? - eval "$(complete | command grep "\-F.* $orig_cmd$" | _fzf_orig_completion_filter)" - source "${BASH_SOURCE[0]}" + # _completion_loader may not have updated completion for the command + if [ "$(complete -p "$cmd")" != "$orig_complete" ]; then + eval "$(complete | command grep "\-F.* $orig_cmd$" | _fzf_orig_completion_filter)" + eval "$orig_complete" + fi return $ret fi } diff --git a/test/test_go.rb b/test/test_go.rb index 03fee23..4612584 100644 --- a/test/test_go.rb +++ b/test/test_go.rb @@ -1761,6 +1761,27 @@ class TestBash < TestBase super @tmux = Tmux.new :bash end + + def test_dynamic_completion_loader + tmux.paste 'touch /tmp/foo; _fzf_completion_loader=1' + tmux.paste '_completion_loader() { complete -o default fake; }' + tmux.paste 'complete -F _fzf_path_completion -o default -o bashdefault fake' + tmux.send_keys 'fake /tmp/foo**', :Tab + tmux.until do |lines| + lines.item_count.positive? && lines.item_count == lines.match_count + end + tmux.send_keys 'C-c' + + tmux.prepare + tmux.send_keys 'fake /tmp/foo' + tmux.send_keys :Tab , 'C-u' + + tmux.prepare + tmux.send_keys 'fake /tmp/foo**', :Tab + tmux.until do |lines| + lines.item_count.positive? && lines.item_count == lines.match_count + end + end end class TestZsh < TestBase