diff --git a/completion/available/makefile.completion.bash b/completion/available/makefile.completion.bash index e72ba6fd..03d27138 100644 --- a/completion/available/makefile.completion.bash +++ b/completion/available/makefile.completion.bash @@ -1,34 +1,37 @@ # Bash completion for Makefile # Loosely adapted from http://stackoverflow.com/a/38415982/1472048 -_makecomplete() { - COMPREPLY=() +if _command_exists make || _command_exists gnumake +then + function __makefile_completions() { + COMPREPLY=() - # https://www.gnu.org/software/make/manual/html_node/Makefile-Names.html - local files=() - for f in 'GNUmakefile' 'makefile' 'Makefile' ; do - [ -f "$f" ] && files+=("$f") - done + # https://www.gnu.org/software/make/manual/html_node/Makefile-Names.html + local files=() + for f in 'GNUmakefile' 'makefile' 'Makefile' ; do + [ -f "$f" ] && files+=("$f") + done - [ "${#files[@]}" -eq 0 ] && return 0 + [ "${#files[@]}" -eq 0 ] && return 0 - # collect all targets - local targets=() - for f in "${files[@]}" ; do - while IFS='' read -r line ; do - targets+=("$line") - done < <(grep -oE '^[a-zA-Z0-9_-]+:([^=]|$)' "$f" | cut -d':' -f1) - done + # collect all targets + local targets=() + for f in "${files[@]}" ; do + while IFS='' read -r line ; do + targets+=("$line") + done < <(grep -oE '^[a-zA-Z0-9_-]+:([^=]|$)' "$f" | cut -d':' -f1) + done - [ "${#targets[@]}" -eq 0 ] && return 0 + [ "${#targets[@]}" -eq 0 ] && return 0 - # use the targets for completion - while IFS='' read -r line ; do - COMPREPLY+=("$line") - done < <(compgen -W "$(tr ' ' '\n' <<<"${targets[@]}" | sort -u)" -- "${COMP_WORDS[COMP_CWORD]}") + # use the targets for completion + while IFS='' read -r line ; do + COMPREPLY+=("$line") + done < <(compgen -W "$(tr ' ' '\n' <<<"${targets[@]}" | sort -u)" -- "${COMP_WORDS[COMP_CWORD]}") - return 0 -} + return 0 + } -complete -o nospace -F _makecomplete make -complete -o nospace -F _makecomplete gnumake + complete -o nospace -F __makefile_completions make + complete -o nospace -F __makefile_completions gnumake +fi