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
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
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.
add a comment |
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
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 bybash-completion, not bybash, nor bymake.bash-completionneeds a list of valid targets to show you. I don't think it's possible to convincemaketo 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
add a comment |
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
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
bash make autocomplete
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 bybash-completion, not bybash, nor bymake.bash-completionneeds a list of valid targets to show you. I don't think it's possible to convincemaketo 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
add a comment |
Completion is handled bybash-completion, not bybash, nor bymake.bash-completionneeds a list of valid targets to show you. I don't think it's possible to convincemaketo 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
add a comment |
1 Answer
1
active
oldest
votes
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
-rtomakeif preferred)
Caveats, and not supported:
- intermediate or chained dependencies, it's not as smart as
make VPATHorvpath.SUFFIXESmake -C dir- "archive(member)" targets, explicit or implicit
makeoptions expansion- pathological junk in the environment that can cause Makefile parsing problems (
TERMCAPfor example) - Makefiles named other than
Makefile
Somme of the above can be added relatively simply, others like the archive handling are not so simple.
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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
-rtomakeif preferred)
Caveats, and not supported:
- intermediate or chained dependencies, it's not as smart as
make VPATHorvpath.SUFFIXESmake -C dir- "archive(member)" targets, explicit or implicit
makeoptions expansion- pathological junk in the environment that can cause Makefile parsing problems (
TERMCAPfor example) - Makefiles named other than
Makefile
Somme of the above can be added relatively simply, others like the archive handling are not so simple.
add a comment |
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
-rtomakeif preferred)
Caveats, and not supported:
- intermediate or chained dependencies, it's not as smart as
make VPATHorvpath.SUFFIXESmake -C dir- "archive(member)" targets, explicit or implicit
makeoptions expansion- pathological junk in the environment that can cause Makefile parsing problems (
TERMCAPfor example) - Makefiles named other than
Makefile
Somme of the above can be added relatively simply, others like the archive handling are not so simple.
add a comment |
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
-rtomakeif preferred)
Caveats, and not supported:
- intermediate or chained dependencies, it's not as smart as
make VPATHorvpath.SUFFIXESmake -C dir- "archive(member)" targets, explicit or implicit
makeoptions expansion- pathological junk in the environment that can cause Makefile parsing problems (
TERMCAPfor example) - Makefiles named other than
Makefile
Somme of the above can be added relatively simply, others like the archive handling are not so simple.
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
-rtomakeif preferred)
Caveats, and not supported:
- intermediate or chained dependencies, it's not as smart as
make VPATHorvpath.SUFFIXESmake -C dir- "archive(member)" targets, explicit or implicit
makeoptions expansion- pathological junk in the environment that can cause Makefile parsing problems (
TERMCAPfor example) - Makefiles named other than
Makefile
Somme of the above can be added relatively simply, others like the archive handling are not so simple.
edited Aug 9 '18 at 12:35
answered Mar 9 '18 at 18:09
mr.spuraticmr.spuratic
7,0411128
7,0411128
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
Completion is handled by
bash-completion, not bybash, nor bymake.bash-completionneeds a list of valid targets to show you. I don't think it's possible to convincemaketo 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