From b70c02c4aed66aa2320fa52075639b2244842ddc Mon Sep 17 00:00:00 2001 From: cornfeedhobo Date: Fri, 21 Feb 2020 12:16:57 -0600 Subject: [PATCH] enhance makefile completion to support multiple files and gnumake --- completion/available/makefile.completion.bash | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/completion/available/makefile.completion.bash b/completion/available/makefile.completion.bash index c2a833ac..9f70958a 100644 --- a/completion/available/makefile.completion.bash +++ b/completion/available/makefile.completion.bash @@ -1,3 +1,24 @@ -# Add completion for Makefile -# see http://stackoverflow.com/a/38415982/1472048 -complete -W "\`grep -oE '^[a-zA-Z0-9_-]+:([^=]|$)' Makefile | sed 's/[^a-zA-Z0-9_-]*$//'\`" make +#!/usr/bin/env bash +# Bash completion for Makefile + +# Loosely adapted from http://stackoverflow.com/a/38415982/1472048 + +_makecomplete() { + # https://www.gnu.org/software/make/manual/html_node/Makefile-Names.html + local files=( $(find . -maxdepth 1 -regextype posix-extended -regex '.*(GNU)?[Mm]akefile$' -printf '%f ') ) + + # collect all targets + local targets='' + for f in ${files[@]} ; do + for t in $(grep -oE '^[a-zA-Z0-9_-]+:([^=]|$)' $f | cut -d':' -f1) ; do + targets+="$t\n" + done + done + + # flatten the array for completion + COMPREPLY=($(compgen -W "$(echo -e "$targets" | head -c -1 | sort -u)" -- ${COMP_WORDS[COMP_CWORD]})) + return 0 +} + +complete -o nospace -F _makecomplete make +complete -o nospace -F _makecomplete gnumake