Autocomplete in make based on possible targetszsh autocomplete directoryCustom bash autocomplete for git breaks other git autocomplete featuresUnable to autocomplete ONLY when typing a make commandBash autocomplete with vim commandpmount hangs on BASH autocompleteCan I change how zsh autocomplete works?How do certain commands change the tabbed autocomplete criteria?bash custom tab completion with wildcardsDefine paths zsh autocomplete usesMake Bash autocomplete guess the closest approximation

How can I use the arrow sign in my bash prompt?

Best way to store options for panels

Bash method for viewing beginning and end of file

How do I define a right arrow with bar in LaTeX?

Is exact Kanji stroke length important?

Can criminal fraud exist without damages?

How to verify if g is a generator for p?

Implement the Thanos sorting algorithm

What's the purpose of "true" in bash "if sudo true; then"

What is difference between behavior and behaviour

If a character can use a +X magic weapon as a spellcasting focus, does it add the bonus to spell attacks or spell save DCs?

Can I convert a rim brake wheel to a disc brake wheel?

What would happen if the UK refused to take part in EU Parliamentary elections?

Minimal reference content

How to be diplomatic in refusing to write code that breaches the privacy of our users

quarter to five p.m

Have I saved too much for retirement so far?

Why does John Bercow say “unlock” after reading out the results of a vote?

Where in the Bible does the greeting ("Dominus Vobiscum") used at Mass come from?

What is the intuitive meaning of having a linear relationship between the logs of two variables?

Is there any reason not to eat food that's been dropped on the surface of the moon?

Cynical novel that describes an America ruled by the media, arms manufacturers, and ethnic figureheads

Opposite of a diet

Should my PhD thesis be submitted under my legal name?



Autocomplete in make based on possible targets


zsh autocomplete directoryCustom bash autocomplete for git breaks other git autocomplete featuresUnable to autocomplete ONLY when typing a make commandBash autocomplete with vim commandpmount hangs on BASH autocompleteCan I change how zsh autocomplete works?How do certain commands change the tabbed autocomplete criteria?bash custom tab completion with wildcardsDefine paths zsh autocomplete usesMake Bash autocomplete guess the closest approximation













6















The Makefile is:



%.pdf: %.tex
rubber -d $<


If there is a doc.tex in the directory, then make doc.pdf builds doc.pdf. The problem is that when I type make, the autocompletion gives nothing: it doesn't even allow to autocomplete to make doc.tex. What can be done about it?










share|improve this question














bumped to the homepage by Community yesterday


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.















  • Completion is handled by bash-completion, not by bash, nor by make. bash-completion needs a list of valid targets to show you. I don't think it's possible to convince make to produce such a list when you're using wildcard rules.

    – Satō Katsura
    Oct 26 '16 at 7:01






  • 1





    Even zsh's completion isn't that smart.

    – Gilles
    Oct 27 '16 at 22:49











  • Possible duplicate: stackoverflow.com/q/516305/21348

    – asalamon74
    Aug 11 '17 at 13:55















6















The Makefile is:



%.pdf: %.tex
rubber -d $<


If there is a doc.tex in the directory, then make doc.pdf builds doc.pdf. The problem is that when I type make, the autocompletion gives nothing: it doesn't even allow to autocomplete to make doc.tex. What can be done about it?










share|improve this question














bumped to the homepage by Community yesterday


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.















  • Completion is handled by bash-completion, not by bash, nor by make. bash-completion needs a list of valid targets to show you. I don't think it's possible to convince make to produce such a list when you're using wildcard rules.

    – Satō Katsura
    Oct 26 '16 at 7:01






  • 1





    Even zsh's completion isn't that smart.

    – Gilles
    Oct 27 '16 at 22:49











  • Possible duplicate: stackoverflow.com/q/516305/21348

    – asalamon74
    Aug 11 '17 at 13:55













6












6








6


1






The Makefile is:



%.pdf: %.tex
rubber -d $<


If there is a doc.tex in the directory, then make doc.pdf builds doc.pdf. The problem is that when I type make, the autocompletion gives nothing: it doesn't even allow to autocomplete to make doc.tex. What can be done about it?










share|improve this question














The Makefile is:



%.pdf: %.tex
rubber -d $<


If there is a doc.tex in the directory, then make doc.pdf builds doc.pdf. The problem is that when I type make, the autocompletion gives nothing: it doesn't even allow to autocomplete to make doc.tex. What can be done about it?







bash make autocomplete






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Oct 26 '16 at 6:43









VelkanVelkan

236210




236210





bumped to the homepage by Community yesterday


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.







bumped to the homepage by Community yesterday


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.














  • Completion is handled by bash-completion, not by bash, nor by make. bash-completion needs a list of valid targets to show you. I don't think it's possible to convince make to produce such a list when you're using wildcard rules.

    – Satō Katsura
    Oct 26 '16 at 7:01






  • 1





    Even zsh's completion isn't that smart.

    – Gilles
    Oct 27 '16 at 22:49











  • Possible duplicate: stackoverflow.com/q/516305/21348

    – asalamon74
    Aug 11 '17 at 13:55

















  • Completion is handled by bash-completion, not by bash, nor by make. bash-completion needs a list of valid targets to show you. I don't think it's possible to convince make to produce such a list when you're using wildcard rules.

    – Satō Katsura
    Oct 26 '16 at 7:01






  • 1





    Even zsh's completion isn't that smart.

    – Gilles
    Oct 27 '16 at 22:49











  • Possible duplicate: stackoverflow.com/q/516305/21348

    – asalamon74
    Aug 11 '17 at 13:55
















Completion is handled by bash-completion, not by bash, nor by make. bash-completion needs a list of valid targets to show you. I don't think it's possible to convince make to produce such a list when you're using wildcard rules.

– Satō Katsura
Oct 26 '16 at 7:01





Completion is handled by bash-completion, not by bash, nor by make. bash-completion needs a list of valid targets to show you. I don't think it's possible to convince make to produce such a list when you're using wildcard rules.

– Satō Katsura
Oct 26 '16 at 7:01




1




1





Even zsh's completion isn't that smart.

– Gilles
Oct 27 '16 at 22:49





Even zsh's completion isn't that smart.

– Gilles
Oct 27 '16 at 22:49













Possible duplicate: stackoverflow.com/q/516305/21348

– asalamon74
Aug 11 '17 at 13:55





Possible duplicate: stackoverflow.com/q/516305/21348

– asalamon74
Aug 11 '17 at 13:55










1 Answer
1






active

oldest

votes


















0














The bash-completion package doesn't do this, it does some acrobatics to handle both command line options and extract a list of Makefile targets, but it does not try to generate matches by applying wildcards or otherwise handling any pattern rules.



It can be done however, here's a simple version with a few caveats.



function _mkcache() 
gawk '/^# *Make data base/,/^# *Finished Make data base/
if (/^# Not a target/) getline; next
## handle "target: ..."
if (match($0,/^([^.#% ][^:%=]+) *:($' > ".$_file:-Makefile.targets"


function _bc_make()
local ctok=$COMP_WORDS[COMP_CWORD] # curr token
local ptok=$COMP_WORDS[COMP_CWORD-1] # prev token
local -a mkrule maybe
local try rr lhs rhs rdir pat makefile=Makefile

## check we're not doing any make options
[[ $ctok:0:1 != "-" && ! $ptok =~ ^-[fCIjloW] ]] && try="$rdir$rhs/%/$ctok*"

maybe=( $(compgen -G "$try") ) # try must be quoted

## maybe[] is an array of filenames from expanded prereq globs
(( $#maybe[*] )) &&

[[ "$rhs" =~ % ]] &&
## promote rhs glob to a regex: % -> (.*)
rhs="$rhs/./\."
pat="$rdir$rhs/%/(.*)"

## use regex to extract stem from RHS, sub "%" on LHS
for nn in "$maybe[@]"; do
[[ $nn =~ $pat ]] &&
COMPREPLY+=( "$lhs/%/$BASH_REMATCH[1]" )

done

done
return

COMPREPLY=() #default

complete -F _bc_make $MAKE:-make


There are two parts, a function _mkcache extracts all the rules and targets from a Makefile and caches these. It also does a bit of processing so the rules are simplified to a single "target : pre-req" form in that cache.



Then, a completion function _bc_make takes the token you attempt completion on and tries to match against targets, and uses the pattern rules to expand a glob based on the pre-requisites and the word for completion. If one or more matches are found, it builds a list of targets based on the pattern rules.



GNU make is assumed. It should correctly handle:



  • targets and pattern rules (though not all of them, see below)

  • new and old form .c.o%.o : %.c

  • paths in prereqs (e.g RCS/)

  • with or without all default rules (add -r to make if preferred)

Caveats, and not supported:



  • intermediate or chained dependencies, it's not as smart as make


  • VPATH or vpath

  • .SUFFIXES

  • make -C dir

  • "archive(member)" targets, explicit or implicit


  • make options expansion

  • pathological junk in the environment that can cause Makefile parsing problems (TERMCAP for example)

  • Makefiles named other than Makefile

Somme of the above can be added relatively simply, others like the archive handling are not so simple.






share|improve this answer
























    Your Answer








    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "106"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f318992%2fautocomplete-in-make-based-on-possible-targets%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    The bash-completion package doesn't do this, it does some acrobatics to handle both command line options and extract a list of Makefile targets, but it does not try to generate matches by applying wildcards or otherwise handling any pattern rules.



    It can be done however, here's a simple version with a few caveats.



    function _mkcache() 
    gawk '/^# *Make data base/,/^# *Finished Make data base/
    if (/^# Not a target/) getline; next
    ## handle "target: ..."
    if (match($0,/^([^.#% ][^:%=]+) *:($' > ".$_file:-Makefile.targets"


    function _bc_make()
    local ctok=$COMP_WORDS[COMP_CWORD] # curr token
    local ptok=$COMP_WORDS[COMP_CWORD-1] # prev token
    local -a mkrule maybe
    local try rr lhs rhs rdir pat makefile=Makefile

    ## check we're not doing any make options
    [[ $ctok:0:1 != "-" && ! $ptok =~ ^-[fCIjloW] ]] && try="$rdir$rhs/%/$ctok*"

    maybe=( $(compgen -G "$try") ) # try must be quoted

    ## maybe[] is an array of filenames from expanded prereq globs
    (( $#maybe[*] )) &&

    [[ "$rhs" =~ % ]] &&
    ## promote rhs glob to a regex: % -> (.*)
    rhs="$rhs/./\."
    pat="$rdir$rhs/%/(.*)"

    ## use regex to extract stem from RHS, sub "%" on LHS
    for nn in "$maybe[@]"; do
    [[ $nn =~ $pat ]] &&
    COMPREPLY+=( "$lhs/%/$BASH_REMATCH[1]" )

    done

    done
    return

    COMPREPLY=() #default

    complete -F _bc_make $MAKE:-make


    There are two parts, a function _mkcache extracts all the rules and targets from a Makefile and caches these. It also does a bit of processing so the rules are simplified to a single "target : pre-req" form in that cache.



    Then, a completion function _bc_make takes the token you attempt completion on and tries to match against targets, and uses the pattern rules to expand a glob based on the pre-requisites and the word for completion. If one or more matches are found, it builds a list of targets based on the pattern rules.



    GNU make is assumed. It should correctly handle:



    • targets and pattern rules (though not all of them, see below)

    • new and old form .c.o%.o : %.c

    • paths in prereqs (e.g RCS/)

    • with or without all default rules (add -r to make if preferred)

    Caveats, and not supported:



    • intermediate or chained dependencies, it's not as smart as make


    • VPATH or vpath

    • .SUFFIXES

    • make -C dir

    • "archive(member)" targets, explicit or implicit


    • make options expansion

    • pathological junk in the environment that can cause Makefile parsing problems (TERMCAP for example)

    • Makefiles named other than Makefile

    Somme of the above can be added relatively simply, others like the archive handling are not so simple.






    share|improve this answer





























      0














      The bash-completion package doesn't do this, it does some acrobatics to handle both command line options and extract a list of Makefile targets, but it does not try to generate matches by applying wildcards or otherwise handling any pattern rules.



      It can be done however, here's a simple version with a few caveats.



      function _mkcache() 
      gawk '/^# *Make data base/,/^# *Finished Make data base/
      if (/^# Not a target/) getline; next
      ## handle "target: ..."
      if (match($0,/^([^.#% ][^:%=]+) *:($' > ".$_file:-Makefile.targets"


      function _bc_make()
      local ctok=$COMP_WORDS[COMP_CWORD] # curr token
      local ptok=$COMP_WORDS[COMP_CWORD-1] # prev token
      local -a mkrule maybe
      local try rr lhs rhs rdir pat makefile=Makefile

      ## check we're not doing any make options
      [[ $ctok:0:1 != "-" && ! $ptok =~ ^-[fCIjloW] ]] && try="$rdir$rhs/%/$ctok*"

      maybe=( $(compgen -G "$try") ) # try must be quoted

      ## maybe[] is an array of filenames from expanded prereq globs
      (( $#maybe[*] )) &&

      [[ "$rhs" =~ % ]] &&
      ## promote rhs glob to a regex: % -> (.*)
      rhs="$rhs/./\."
      pat="$rdir$rhs/%/(.*)"

      ## use regex to extract stem from RHS, sub "%" on LHS
      for nn in "$maybe[@]"; do
      [[ $nn =~ $pat ]] &&
      COMPREPLY+=( "$lhs/%/$BASH_REMATCH[1]" )

      done

      done
      return

      COMPREPLY=() #default

      complete -F _bc_make $MAKE:-make


      There are two parts, a function _mkcache extracts all the rules and targets from a Makefile and caches these. It also does a bit of processing so the rules are simplified to a single "target : pre-req" form in that cache.



      Then, a completion function _bc_make takes the token you attempt completion on and tries to match against targets, and uses the pattern rules to expand a glob based on the pre-requisites and the word for completion. If one or more matches are found, it builds a list of targets based on the pattern rules.



      GNU make is assumed. It should correctly handle:



      • targets and pattern rules (though not all of them, see below)

      • new and old form .c.o%.o : %.c

      • paths in prereqs (e.g RCS/)

      • with or without all default rules (add -r to make if preferred)

      Caveats, and not supported:



      • intermediate or chained dependencies, it's not as smart as make


      • VPATH or vpath

      • .SUFFIXES

      • make -C dir

      • "archive(member)" targets, explicit or implicit


      • make options expansion

      • pathological junk in the environment that can cause Makefile parsing problems (TERMCAP for example)

      • Makefiles named other than Makefile

      Somme of the above can be added relatively simply, others like the archive handling are not so simple.






      share|improve this answer



























        0












        0








        0







        The bash-completion package doesn't do this, it does some acrobatics to handle both command line options and extract a list of Makefile targets, but it does not try to generate matches by applying wildcards or otherwise handling any pattern rules.



        It can be done however, here's a simple version with a few caveats.



        function _mkcache() 
        gawk '/^# *Make data base/,/^# *Finished Make data base/
        if (/^# Not a target/) getline; next
        ## handle "target: ..."
        if (match($0,/^([^.#% ][^:%=]+) *:($' > ".$_file:-Makefile.targets"


        function _bc_make()
        local ctok=$COMP_WORDS[COMP_CWORD] # curr token
        local ptok=$COMP_WORDS[COMP_CWORD-1] # prev token
        local -a mkrule maybe
        local try rr lhs rhs rdir pat makefile=Makefile

        ## check we're not doing any make options
        [[ $ctok:0:1 != "-" && ! $ptok =~ ^-[fCIjloW] ]] && try="$rdir$rhs/%/$ctok*"

        maybe=( $(compgen -G "$try") ) # try must be quoted

        ## maybe[] is an array of filenames from expanded prereq globs
        (( $#maybe[*] )) &&

        [[ "$rhs" =~ % ]] &&
        ## promote rhs glob to a regex: % -> (.*)
        rhs="$rhs/./\."
        pat="$rdir$rhs/%/(.*)"

        ## use regex to extract stem from RHS, sub "%" on LHS
        for nn in "$maybe[@]"; do
        [[ $nn =~ $pat ]] &&
        COMPREPLY+=( "$lhs/%/$BASH_REMATCH[1]" )

        done

        done
        return

        COMPREPLY=() #default

        complete -F _bc_make $MAKE:-make


        There are two parts, a function _mkcache extracts all the rules and targets from a Makefile and caches these. It also does a bit of processing so the rules are simplified to a single "target : pre-req" form in that cache.



        Then, a completion function _bc_make takes the token you attempt completion on and tries to match against targets, and uses the pattern rules to expand a glob based on the pre-requisites and the word for completion. If one or more matches are found, it builds a list of targets based on the pattern rules.



        GNU make is assumed. It should correctly handle:



        • targets and pattern rules (though not all of them, see below)

        • new and old form .c.o%.o : %.c

        • paths in prereqs (e.g RCS/)

        • with or without all default rules (add -r to make if preferred)

        Caveats, and not supported:



        • intermediate or chained dependencies, it's not as smart as make


        • VPATH or vpath

        • .SUFFIXES

        • make -C dir

        • "archive(member)" targets, explicit or implicit


        • make options expansion

        • pathological junk in the environment that can cause Makefile parsing problems (TERMCAP for example)

        • Makefiles named other than Makefile

        Somme of the above can be added relatively simply, others like the archive handling are not so simple.






        share|improve this answer















        The bash-completion package doesn't do this, it does some acrobatics to handle both command line options and extract a list of Makefile targets, but it does not try to generate matches by applying wildcards or otherwise handling any pattern rules.



        It can be done however, here's a simple version with a few caveats.



        function _mkcache() 
        gawk '/^# *Make data base/,/^# *Finished Make data base/
        if (/^# Not a target/) getline; next
        ## handle "target: ..."
        if (match($0,/^([^.#% ][^:%=]+) *:($' > ".$_file:-Makefile.targets"


        function _bc_make()
        local ctok=$COMP_WORDS[COMP_CWORD] # curr token
        local ptok=$COMP_WORDS[COMP_CWORD-1] # prev token
        local -a mkrule maybe
        local try rr lhs rhs rdir pat makefile=Makefile

        ## check we're not doing any make options
        [[ $ctok:0:1 != "-" && ! $ptok =~ ^-[fCIjloW] ]] && try="$rdir$rhs/%/$ctok*"

        maybe=( $(compgen -G "$try") ) # try must be quoted

        ## maybe[] is an array of filenames from expanded prereq globs
        (( $#maybe[*] )) &&

        [[ "$rhs" =~ % ]] &&
        ## promote rhs glob to a regex: % -> (.*)
        rhs="$rhs/./\."
        pat="$rdir$rhs/%/(.*)"

        ## use regex to extract stem from RHS, sub "%" on LHS
        for nn in "$maybe[@]"; do
        [[ $nn =~ $pat ]] &&
        COMPREPLY+=( "$lhs/%/$BASH_REMATCH[1]" )

        done

        done
        return

        COMPREPLY=() #default

        complete -F _bc_make $MAKE:-make


        There are two parts, a function _mkcache extracts all the rules and targets from a Makefile and caches these. It also does a bit of processing so the rules are simplified to a single "target : pre-req" form in that cache.



        Then, a completion function _bc_make takes the token you attempt completion on and tries to match against targets, and uses the pattern rules to expand a glob based on the pre-requisites and the word for completion. If one or more matches are found, it builds a list of targets based on the pattern rules.



        GNU make is assumed. It should correctly handle:



        • targets and pattern rules (though not all of them, see below)

        • new and old form .c.o%.o : %.c

        • paths in prereqs (e.g RCS/)

        • with or without all default rules (add -r to make if preferred)

        Caveats, and not supported:



        • intermediate or chained dependencies, it's not as smart as make


        • VPATH or vpath

        • .SUFFIXES

        • make -C dir

        • "archive(member)" targets, explicit or implicit


        • make options expansion

        • pathological junk in the environment that can cause Makefile parsing problems (TERMCAP for example)

        • Makefiles named other than Makefile

        Somme of the above can be added relatively simply, others like the archive handling are not so simple.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Aug 9 '18 at 12:35

























        answered Mar 9 '18 at 18:09









        mr.spuraticmr.spuratic

        7,0411128




        7,0411128



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Unix & Linux Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f318992%2fautocomplete-in-make-based-on-possible-targets%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            -autocomplete, bash, make

            Popular posts from this blog

            Creating 100m^2 grid automatically using QGIS?Creating grid constrained within polygon in QGIS?Createing polygon layer from point data using QGIS?Creating vector grid using QGIS?Creating grid polygons from coordinates using R or PythonCreating grid from spatio temporal point data?Creating fields in attributes table using other layers using QGISCreate .shp vector grid in QGISQGIS Creating 4km point grid within polygonsCreate a vector grid over a raster layerVector Grid Creates just one grid

            Nikolai Prilezhaev Bibliography References External links Navigation menuEarly Russian Organic Chemists and Their Legacy092774english translationRussian Biography

            Why is this plane circling around the Lucknow airport every day?Why do aircraft on Flight Radar 24 jump around randomly sometimes?What airport has this walkway over a taxiway?How does Chicago O'Hare's tower sequence aircraft at peak capacity?Which airport is featured in this Delta commercial?After a crash, for how long is the airport closed?Can a passenger plane stand still in the air, or hover at a fixed location above a ground?What are those trucks towing around, and why?What is this airport outside of Cairo, Egypt?Which US airport has the lowest circling MDH?What is this airport video?