summaryrefslogtreecommitdiff
path: root/fzf-completion.bash
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2014-07-18 00:22:49 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2014-07-18 00:22:49 +0900
commit13cd4ed5469d782fa3a6ca674f46621b836d8da8 (patch)
tree1864fb40f86b4244bcaec51beacf79b12d76a649 /fzf-completion.bash
parent7261d3afcd177305240320437fd9e2d927dd8cb3 (diff)
downloadfzf-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.bash31
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