zsh-users
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-users@zsh.org
Subject: Re: ordering of file-patterns completions
Date: Wed, 06 Nov 2013 20:17:45 -0800	[thread overview]
Message-ID: <131106201745.ZM20201@torch.brasslantern.com> (raw)
In-Reply-To: <527AE8BF.6090706@gmail.com>

On Nov 6,  6:11pm, John wrote:
}
} > doesn't quite generalize if there may be options (words starting with
} > a hyphen) between the command name and the first file.  If that is the
} > case, you'll need to do some pre-processing of $words before calling
} > _arguments to determine which position to reference instead of [2].
} 
} Yeah, unfortunately I do.  I was using _arguments to process those, and 
} then zstyle to deal with the files.  But I'm not quite understanding how 
} to do what you're describing to pre-process them instead of using 
} _arguments.

How complicated this needs to be depends on what might appear in the
words preceding the first file.

If there's nothing but options, for example, then you can probably do:

  local first_file=$(( ${words[(I)-*]} + 1 ))

which says to start from the end of the array and look backward to
find the index of the first word that DOES start with a hyphen, and
then add one to it.  Or, if there might be file names that start with
hyphen, then:

  local first_file=$(( ${${words[2,-1]}[(i)[^-]*]} + 1 ))

which says "in the array formed by the second through last elements of
the words array, report the index of the first element that does not
begin with a hyphen" and then add one to compensate for starting at 2.

If there are options that might take arguments, so some of the words
before the first file might not begin with hyphen, then you'll have to
try something else; perhaps:

  local -a opts
  set -- $words[2,-1]
  zparseopts -a opts ...
  local first_file=$(( $#opts + 2 ))

where "..." is a description of the options.  Yeah, this kinda sucks
because you have to describe the same options to both zparseopts and
_arguments.  In any case, once you're done computing first_file:

  _arguments $stuff_describing_options \
    '1:The first file:_files -g "XXX.*"' \
    '*:All other files:_files -g "*.${words[first_file]:x}"'


  reply	other threads:[~2013-11-07  4:18 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-06 15:24 John
2013-11-06 16:03 ` Bart Schaefer
2013-11-07  1:11   ` John
2013-11-07  4:17     ` Bart Schaefer [this message]
2013-11-07  6:30       ` John
2013-11-07 15:06         ` Bart Schaefer

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=131106201745.ZM20201@torch.brasslantern.com \
    --to=schaefer@brasslantern.com \
    --cc=zsh-users@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).