[Bash-completion-commits] [SCM] bash-completion branch, master, updated. 2.0-34-gb28d710

Igor Murzov e-mail at date.by
Wed Sep 5 21:33:45 UTC 2012


The following commit has been merged in the master branch:
commit b28d7108d3677c61bd01c51ccee8bb1cf9e3bfba
Author: Tristan Wibberley <tristan.wibberley at gmail.com>
Date:   Mon Aug 27 14:17:28 2012 +0100

    make: convert make completion to use smarter parser

diff --git a/completions/make b/completions/make
index aa19b24..eac0ac4 100644
--- a/completions/make
+++ b/completions/make
@@ -1,11 +1,66 @@
 # bash completion for GNU make                             -*- shell-script -*-
 
+function _make_target_extract_script()
+{
+    local prefix=$(printf "%s\n" "$1" | sed 's/[][\.*^$(){}?+|/]/\\&/g')
+
+    cat <<EOF
+    /^# Make data base/,/^# Files/d             # skip until files section
+    /^# Not a target/,/^$/        d             # skip not target blocks
+    /^${prefix}/,/^$/!            d             # skip anything user dont want
+
+    # The stuff above here describes lines that are not
+    #  explicit targets or not targets other than special ones
+    # The stuff below here decides whether an explicit target
+    #  should be output.
+
+    /^# File is an intermediate prerequisite/ {
+      s/^.*$//;x                                # unhold target
+      d                                         # delete line
+    }
+
+    /^$/ {                                      # end of target block
+      x                                         # unhold target
+      s/^(${prefix}[^:/]*\/).*:.*$/\1/p         # write targets for subdirs
+      s/:.*$/ /p                                # write complete targets
+      d                                         # hide any bugs
+    }
+
+    /^[^#\t:%]+:/ {         # found target block
+
+      /^\.PHONY:/                 d             # special target
+      /^\.SUFFIXES:/              d             # special target
+      /^\.DEFAULT:/               d             # special target
+      /^\.PRECIOUS:/              d             # special target
+      /^\.INTERMEDIATE:/          d             # special target
+      /^\.SECONDARY:/             d             # special target
+      /^\.SECONDEXPANSION:/       d             # special target
+      /^\.DELETE_ON_ERROR:/       d             # special target
+      /^\.IGNORE:/                d             # special target
+      /^\.LOW_RESOLUTION_TIME:/   d             # special target
+      /^\.SILENT:/                d             # special target
+      /^\.EXPORT_ALL_VARIABLES:/  d             # special target
+      /^\.NOTPARALLEL:/           d             # special target
+      /^\.ONESHELL:/              d             # special target
+      /^\.POSIX:/                 d             # special target
+      /^\.NOEXPORT:/              d             # special target
+      /^\.MAKE:/                  d             # special target
+
+      /^[^a-zA-Z0-9]/             d             # convention for hidden tgt
+
+      h                                         # hold target
+      d                                         # delete line
+    }
+
+EOF
+}
+
 _make()
 {
     local cur prev words cword split
     _init_completion -s || return
 
-    local file makef makef_dir="." makef_inc i
+    local file makef makef_dir=( "-C" "." ) makef_inc i
 
     case $prev in
         -f|--file|--makefile|-o|--old-file|--assume-old|-W|--what-if|\
@@ -49,7 +104,7 @@ _make()
         for (( i=0; i < ${#words[@]}; i++ )); do
             if [[ ${words[i]} == -@(C|-directory) ]]; then
                 # eval for tilde expansion
-                eval makef_dir=${words[i+1]}
+                eval makef_dir=( -C "${words[i+1]}" )
                 break
             fi
         done
@@ -59,18 +114,14 @@ _make()
         for (( i=0; i < ${#words[@]}; i++ )); do
             if [[ ${words[i]} == -@(f|-?(make)file) ]]; then
                 # eval for tilde expansion
-                eval makef=${words[i+1]}
+                eval makef=( -f "${words[i+1]}" )
                 break
             fi
         done
 
-        [[ -n $makef ]] && makef="-f ${makef}"
-        [[ -n $makef_dir ]] && makef_dir="-C ${makef_dir}"
-
-        COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
-            awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
-            {split($1,A,/ /);for(i in A)print A[i]}' )" \
-            -- "$cur" ) )
+        COMPREPLY=( $( compgen -W "$( LC_ALL=C \
+            make -npq "${makef[@]}" "${makef_dir[@]}" .DEFAULT 2>/dev/null | \
+            sed -n -r -f <(_make_target_extract_script "$cur") )" -- "$cur" ) )
 
     fi
 } &&

-- 
bash-completion



More information about the Bash-completion-commits mailing list