[bash-completion] Fix custom completion with dynamic loader enabled

After _completion_loader is called, instead of loading the entire
completion.bash file, just restore the fzf completion for the current
command. `_fzf_orig_completion_$cmd` is only set if _completion_loader
actually changed the completion options to avoid infinite loop.

Close #1170
This commit is contained in:
Junegunn Choi 2017-12-03 03:06:10 +09:00
parent 5a7b41a2cf
commit d6588fc835
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627
2 changed files with 28 additions and 3 deletions

View File

@ -113,7 +113,7 @@ _fzf_opts_completion() {
} }
_fzf_handle_dynamic_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" cmd="$1"
shift shift
orig_cmd="$1" orig_cmd="$1"
@ -122,10 +122,14 @@ _fzf_handle_dynamic_completion() {
if [ -n "$orig" ] && type "$orig" > /dev/null 2>&1; then if [ -n "$orig" ] && type "$orig" > /dev/null 2>&1; then
$orig "$@" $orig "$@"
elif [ -n "$_fzf_completion_loader" ]; then elif [ -n "$_fzf_completion_loader" ]; then
orig_complete=$(complete -p "$cmd")
_completion_loader "$@" _completion_loader "$@"
ret=$? ret=$?
eval "$(complete | command grep "\-F.* $orig_cmd$" | _fzf_orig_completion_filter)" # _completion_loader may not have updated completion for the command
source "${BASH_SOURCE[0]}" if [ "$(complete -p "$cmd")" != "$orig_complete" ]; then
eval "$(complete | command grep "\-F.* $orig_cmd$" | _fzf_orig_completion_filter)"
eval "$orig_complete"
fi
return $ret return $ret
fi fi
} }

View File

@ -1761,6 +1761,27 @@ class TestBash < TestBase
super super
@tmux = Tmux.new :bash @tmux = Tmux.new :bash
end 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 end
class TestZsh < TestBase class TestZsh < TestBase