From: Oliver Kiddle <okiddle@yahoo.co.uk>
To: Zsh workers <zsh-workers@zsh.org>
Subject: PATCH: following -C option in make completion
Date: Wed, 06 Nov 2019 22:51:09 +0100 [thread overview]
Message-ID: <2024-1573077069.922525@CD2K.zG8N.q383> (raw)
In-Reply-To: <2024-1573077069.922525.ref@CD2K.zG8N.q383>
In the make completion, there's some very old logic for picking out the
argument to -C. _arguments makes this rather easier if we just look in
$opt_args and has the advantage that we can handle -Cdir and --directory
forms (not just -C dir).
This patch also uses the computed $basedir value for our view of the GNU
make $(CURDIR) macro so it will handle include files referenced relative
to $(CURDIR).
Previously $basedir was forced into absolute form which I don't think
gains us anything - _files -W doesn't care. Neither does finding files
to include. But perhaps this breaks things for some form or another.
I'm also not sure what the (q) modifier achieved. I've used
${(Q)~opt_args... so it'll expand usernames and remove a level of
quoting. opt_args also does some extra quoting for colons which could
also be removed. We could do with some sort of safe-eval for where
completion functions make use of bits of the command line - expanding
variables and named directories is useful but command-substitutions not
so.
Oliver
diff --git a/Completion/Unix/Command/_make b/Completion/Unix/Command/_make
index 3dcf479c3..06971f07a 100644
--- a/Completion/Unix/Command/_make
+++ b/Completion/Unix/Command/_make
@@ -118,35 +118,9 @@ _make-parseMakefile () {
done
}
-_make-findBasedir () {
- local file index basedir
- basedir=$PWD
- for (( index=0; index < $#@; index++ ))
- do
- if [[ $@[index] == -C ]]
- then
- file=${~@[index+1]} 2>/dev/null
- if [[ -z $file ]]
- then
- # make returns with an error if an empty arg is given
- # even if the concatenated path is a valid directory
- return
- elif [[ $file == /* ]]
- then
- # Absolute path, replace base directory
- basedir=$file
- else
- # Relative, concatenate path
- basedir=$basedir/$file
- fi
- fi
- done
- print -- $basedir
-}
-
_make() {
- local prev="$words[CURRENT-1]" file expl tmp is_gnu incl match
+ local prev="$words[CURRENT-1]" file expl tmp is_gnu incl match basedir
local context state state_descr line
local -a option_specs
local -A VARIABLES VAR_ARGS opt_args
@@ -214,15 +188,18 @@ _make() {
_arguments -s $option_specs \
'*:make target:->target' && ret=0
+ basedir=${(Q)~opt_args[-C]:-${opt_args[--directory]}}
+ VAR_ARGS[CURDIR]="${basedir:=$PWD}"
+
case $state in
(dir)
_description directories expl "$state_descr"
- _files "$expl[@]" -W ${(q)$(_make-findBasedir ${words[1,CURRENT-1]})} -/ && ret=0
+ _files "$expl[@]" -W $basedir -/ && ret=0
;;
(file)
_description files expl "$state_descr"
- _files "$expl[@]" -W ${(q)$(_make-findBasedir $words)} && ret=0
+ _files "$expl[@]" -W $basedir && ret=0
;;
(debug)
@@ -239,11 +216,9 @@ _make() {
file=${(v)opt_args[(I)(-f|--file|--makefile)]}
if [[ -n $file ]]
then
- [[ $file == [^/]* ]] && file=${(q)$(_make-findBasedir $words)}/$file
+ [[ $file == [^/]* ]] && file=$basedir/$file
[[ -r $file ]] || file=
else
- local basedir
- basedir=${$(_make-findBasedir $words)}
if [[ $is_gnu == gnu && -r $basedir/GNUmakefile ]]
then
file=$basedir/GNUmakefile
@@ -287,7 +262,7 @@ _make() {
_alternative \
'targets:make target:compadd -Q -a TARGETS' \
'variables:make variable:compadd -S = -F keys -k VARIABLES' \
- '*:file:_files' && ret=0
+ '*:file:_files -W $basedir' && ret=0
fi
esac
next parent reply other threads:[~2019-11-06 21:51 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <2024-1573077069.922525.ref@CD2K.zG8N.q383>
2019-11-06 21:51 ` Oliver Kiddle [this message]
2019-12-22 4:31 ` Daniel Shahaf
2020-01-02 18:00 ` Oliver Kiddle
2020-01-03 19:51 ` Daniel Shahaf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2024-1573077069.922525@CD2K.zG8N.q383 \
--to=okiddle@yahoo.co.uk \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).