zsh-workers
 help / color / mirror / code / Atom feed
* Re: PATCH: completion
@ 1999-10-26 13:17 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-10-26 13:17 UTC (permalink / raw)
  To: zsh-workers


Oliver Kiddle wrote:

> [ ... ] The errors I was getting from the C compiler were roughly as follows:
> 
>         /bin/cc -qlanglvl=ansi  -s  -o computil.so
> -bI:../../Src/Zle/compctl.exp
> ort -bI:../../Src/Zle/zle.export -bI:../../Src/zsh.export  -emodentry
> computil..
> o  ../../Src/modentry..o -lcurses -lm -lc 
> 0706-317 ERROR: Unresolved or undefined symbols detected:
>                  Symbols in error (followed by references) are
>                  dumped to the load map.
>                  The -bloadmap:<filename> option will create a load map.
> incompfunc
> compwords
> compcurrent
> .ignore_suffix
> compprefix
> compsuffix
> .restrict_range
> .ignore_prefix
> .set_list_array
> .get_user_var
>
> [ ... ]

Aha. So it would mostly be a matter of cut'n'paste to stuff all the
symbols needed into those files (removing the dots, which seem to be
the prefix AIX puts before functions(?)). And maybe we could even do
some makefile magic to generate them automatically.

The `hasexport' seems to trigger only the `EXPIMP_' stuff in the makefiles.

Bye
 Sven


--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* PATCH: completion
@ 2000-02-21  9:50 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 2000-02-21  9:50 UTC (permalink / raw)
  To: zsh-workers


Just two small optimisations (there was a (...) instead of a {...} in
_approximate, ouch!) and some more work on the docs.


Bye
 Sven

diff -ru ../z.old/Completion/Builtins/_popd Completion/Builtins/_popd
--- ../z.old/Completion/Builtins/_popd	Mon Feb 21 10:31:03 2000
+++ Completion/Builtins/_popd	Mon Feb 21 10:46:43 2000
@@ -9,10 +9,10 @@
 
 local expl list lines revlines disp
 
-_wanted -V directory-stack expl 'directory stack' || return 1
-
 ! zstyle -T ":completion:${curcontext}:directory-stack" prefix-needed ||
     [[ $PREFIX = [-+]* ]] || return 1
+
+_wanted -V directory-stack expl 'directory stack' || return 1
 
 if zstyle -T ":completion:${curcontext}:directory-stack" verbose; then
   # get the list of directories with their canonical number
diff -ru ../z.old/Completion/Core/_approximate Completion/Core/_approximate
--- ../z.old/Completion/Core/_approximate	Mon Feb 21 10:31:06 2000
+++ Completion/Core/_approximate	Mon Feb 21 10:46:43 2000
@@ -23,7 +23,7 @@
 # Get the number of errors to accept.
 
 if [[ "$cfgacc" = *numeric* && ${NUMERIC:-1} -ne 1 ]]; then
-  # Stop if we also have a `!'.
+  # A numeric argument may mean that we should not try correction.
 
   [[ "$cfgacc" = *not-numeric* ]] && return 1
 
@@ -40,9 +40,9 @@
 
 _tags corrections original
 
-# Otherwise temporarily define functions to use instead of
-# the builtins that add matches. This is used to be able
-# to stick the `(#a...)' into the right place (after an
+# Otherwise temporarily define a function to use instead of
+# the builtin that adds matches. This is used to be able
+# to stick the `(#a...)' in the right place (after an
 # ignored prefix).
 
 compadd() {
@@ -72,8 +72,8 @@
        [[ "${#compstate[unambiguous]}" -ge "${#:-$PREFIX$SUFFIX}" ]]; then
       compstate[pattern_insert]=unambiguous
     elif _requested original &&
-         ( [[ compstate[nmatches] -gt 1 ]] ||
-           zstyle -t ":completion:${curcontext}:" original ); then
+         { [[ compstate[nmatches] -gt 1 ]] ||
+           zstyle -t ":completion:${curcontext}:" original }; then
       local expl
 
       _description -V original expl original
diff -ru ../z.old/Doc/Zsh/compsys.yo Doc/Zsh/compsys.yo
--- ../z.old/Doc/Zsh/compsys.yo	Mon Feb 21 10:30:49 2000
+++ Doc/Zsh/compsys.yo	Mon Feb 21 10:46:44 2000
@@ -12,12 +12,6 @@
 completion behaviour and which may be bound to keystrokes, are referred to
 as `widgets'.
 
-Note also, that it is possible to use old completion definitions using 
-the tt(compctl) builtin command together with the functions for the
-new completion system. To enable this, the tt(_default) function from
-the tt(Base) directory of the distribution should be copied and
-modified as described in that file.
-
 startmenu()
 menu(Initialization)
 menu(Completion System Configuration)
@@ -66,11 +60,7 @@
 After initialization all the builtin completion widgets such as
 tt(expand-or-complete) will be redefined to use the new completion system.
 Should you need to, you can still bind keys to the old functions by putting
-a `tt(.)' in front, e.g. `tt(.expand-or-complete)'. Note that this
-means that the tt(zsh/complist) module has to be loaded before the
-completion system is initialized (i.e. the tt(compinit) function is
-called) to make sure that the tt(menu-select) widget defined by it
-will be redefined, too.
+a `tt(.)' in front, e.g. `tt(.expand-or-complete)'.
 
 subsect(Use of compinit)
 findex(compinit)
@@ -85,7 +75,10 @@
 (`tt(autoload -U compinit)' is recommended).  When run, it will define a
 few utility functions, arrange for all the necessary shell functions to be
 autoloaded, and will then re-bind all keys that do completion to use the
-new system.
+new system. Note that this means that the tt(zsh/complist) module has
+to be loaded before the completion system is initialized (i.e. the
+tt(compinit) function is called) to make sure that the tt(menu-select)
+widget defined by it will be redefined, too.
 
 To speed up the running of tt(compinit), it can be made to produce a dumped
 configuration which will be read in on future invocations; this is the
@@ -207,7 +200,7 @@
 
 subsect(Functions)
 
-The tt(compinit) file defines the following functions, which may
+The tt(compinit) file defines the following function, which may
 also be called directly by the user.
 
 findex(compdef)
@@ -275,7 +268,14 @@
 command when completing an argument, and possibily also
 the name of an option when completing an argument to that option.
 
-The context names always consists of the following fields, separated
+For the context a name consisting of multiple fields is built. This
+name is then used to look up styles that can be used to configure the
+completion system. Since it is not possible to build the whole context 
+name in advance, completion function may modify some of the fields and 
+hence the context name used for lookup may vary during the same call
+to the completion system.
+
+The context name always consists of the following fields, separated
 by colons:
 
 startitem()
@@ -305,11 +305,11 @@
 The var(context) or var(command). This is either one of the special
 context names such as tt(-condition-) as explained for the
 tt(_complete) completer below, or the name of the command we are
-completing arguments for. Commands that have sub-commands usually
-modify this field to contain the name of the command followed by a
-minus sign and the sub-command (e.g. the completion function for the
-tt(cvs) command sets this field to striings such as tt(cvs-add) when
-completing for the tt(add) sub-command).
+completing arguments for. Completion functions for commands that have
+sub-commands usually modify this field to contain the name of the
+command followed by a minus sign and the sub-command (e.g. the
+completion function for the tt(cvs) command sets this field to strings
+such as tt(cvs-add) when completing for the tt(add) sub-command).
 )
 item()(
 The var(argument), describing which argument we are
@@ -319,18 +319,18 @@
 var(n)'th argument of the option var(opt).
 )
 item()(
-The var(tag). Tags are used for two purposes: completion functions use 
-them to describe the types of matches they can generate for a certain
-context and they use them to simplify the definition of styles that
-are tested.
+The var(tag). Tags are used for two purposes:  to describe the types
+of matches a completion function can generate for a certain context
+and to simplify the definition of styles that are tested.
 )
 enditem()
 
-As an example, leaving out the var(tag) for the moment, the context name
+As an example, the context name
 `tt(:completion::complete:dvips:-o-1:files)' says that normal
 completion was attempted on an argument of the tt(dvips)
-command. More precisely: completion was attempted on the first
-argument after the tt(-o) option.
+command (more precisely: completion was attempted on the first
+argument after the tt(-o) option) and the completion function will
+generate filenames for this context.
 
 In many of the possible contexts the completion system can generate
 matches, often multiple types of matches.  These types are represented as
@@ -353,7 +353,7 @@
 for a particular context.
 
 Completion behaviour can be modified by various other
-`styles' defined with the tt(zstyle) builtin command
+styles defined with the tt(zstyle) builtin command
 (see
 ifzman(zmanref(zshmodules))\
 ifnzman(noderef(The zsh/zutil Module))).
@@ -390,9 +390,9 @@
 example(zstyle ':completion:*:*:kill:*' verbose no)
 
 Furthermore, if one wanted to see the command lines for processes but not the
-job texts one could use the fact that the tag name is appended to the
-context name when styles are looked up.  As the function for the tt(kill)
-builtin command uses the tags tt(jobs) and tt(processes), we have:
+job texts one could use the fact that the context name contains the tag name
+when styles are looked up.  As the function for the tt(kill)
+builtin command uses the tags tt(jobs) and tt(processes), we can use:
 
 example(zstyle ':completion:*:*:kill:*:jobs' verbose no)
 
@@ -710,9 +710,9 @@
 completion, completion and correction for incremental completion and
 only completion for prediction one could use:
 
-example(zstyle ':completion:::::' completer _complete _correct _approximate
-zstyle ':completion:incremental::::' completer _complete _correct
-zstyle ':completion:predict::::' completer _complete)
+example(zstyle ':completion:*' completer _complete _correct _approximate
+zstyle ':completion:incremental:*' completer _complete _correct
+zstyle ':completion:predict:*' completer _complete)
 
 The default value for this style is tt(_complete), i.e. normally only
 completion will be done.
@@ -799,7 +799,7 @@
 directly, tt(_path_files) with the tags mentioned above. If it is set
 for these tags, the value is taken as a list of glob-patterns that
 should be used to select filenames when completing for the tag. Note
-that with tt(_files), calling completion function may specify that
+that with tt(_files), calling completion functions may specify that
 all files are to be completed. Normally this would make tt(_files) use 
 only the tt(all-files) tag, but if this style is set for any of the
 other two tags (tt(globbed-files) and tt(directories)), these tags
@@ -832,7 +832,7 @@
 format strings for different types of matches.
 
 Note also that some completer functions define additional
-`tt(%)'-sequences. These are described for the completer function that 
+`tt(%)'-sequences. These are described for the completer functions that 
 make use of them.
 
 For the tt(messages) tag, this defines a string used by some
@@ -844,7 +844,7 @@
 descriptions for the matches that were expected.
 
 Here and in all other cases where the completion system uses `tt(%)'
-sequences, the `tt(%)' may be followed by field with specifications as 
+sequences, the `tt(%)' may be followed by field width specifications as 
 described for the tt(zformat) builtin command from the tt(zutil)
 module, see
 ifzman(zmanref(zshmodules))\
@@ -899,7 +899,7 @@
 external commands appear in this order when completing in command
 position one would set:
 
-example(zstyle ':completion:*:*:-command-' group-order builtins functions commands)
+example(zstyle ':completion:*:*:-command-:*' group-order builtins functions commands)
 )
 item(tt(groups))(
 A style holding the names of the groups that should be completed. If
@@ -958,8 +958,8 @@
 be completed if there are no other possible completions.
 )
 item(tt(ignored-patterns))(
-This style is used with the tags used when adding matches and gives a
-number of patterns. All matches that are matched by any of these
+This style is used with the tags used when adding matches and defines a
+couple of patterns. All matches that are matched by any of these
 patterns will be ignored as long as there are other matches not
 matched by any of the patterns.  It is a more configurable version
 of the shell parameter tt($fignore).
@@ -1119,8 +1119,8 @@
 case-insensitive matching first, correction if that doesn't generate
 any matches and partial-word completion if that doesn't yield any
 matches either. In such a case one can give the tt(_complete)
-completer more than once in the tt(completer) style and give different
-match specification to them, as in:
+completer more than once in the tt(completer) style and define different
+match specifications for them, as in:
 
 example(zstyle ':completion:*' completer _complete _correct _complete
 zstyle ':completion:*:complete-1:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}'
@@ -1161,7 +1161,7 @@
 numeric argument is given, correcting completion will not be
 performed.
 
-The default value for this style contains tt(2) and tt(numeric).
+The default value for this style is `tt(2 numeric)'.
 )
 item(tt(menu))(
 This style is tested for the tt(default) tag and the tags used when
@@ -1175,7 +1175,7 @@
 other means (e.g. by setting the tt(MENU_COMPLETE) option) and the
 value for one of the tags used is `false' (i.e. tt(no), tt(false),
 tt(0), or tt(off)), then menucompletion will em(not) be started for
-this completions. Note that the values defined for normal tags
+this completion. Note that the values defined for normal tags
 override the value set for the tt(default) tag.
 
 Either instead of or in addition to one of the values above, the value
@@ -1184,11 +1184,10 @@
 (as defined by the tt(zsh/computil) module) will be started. Without the
 optional number, it will be started unconditionally and with a number
 it will be started only if at least that many matches are generated
-(if the values for more than one tag defines such a number, the
+(if the values for more than one tag define such a number, the
 smallest one is taken). Starting menuselection can explicitly be
 turned off by defining a value containing the string
-tt(no-select). Note that all this only works if the tt(complist)
-module is explicitly loaded by the user, though.
+tt(no-select).
 
 This is also used by the tt(_oldlist) completer. Here it controls how menu
 completion behaves when a completion has already been inserted and the
@@ -1217,7 +1216,8 @@
 item(tt(original))(
 This is used by the tt(_approximate), tt(_correct) and tt(_match)
 completers. The first two use it to decide if the original string should
-be added as one possible completion. Normally, this is done only if there
+be added as one possible completion. Normally, this is done only if
+there are
 at least  two possible corrections, but if this style is set to `true', it
 will always be added. Note that these completers use this style after
 setting the completer field in the context name to
@@ -1235,7 +1235,7 @@
 A style containing an override for the default package set
 for that context.  For example,
 
-example(zstyle :completion:*:complete:dpkg:--status-1: packageset avail)
+example(zstyle ':completion:*:complete:dpkg:--status-1:' packageset avail)
 
 will cause available packages, rather than only installed packages,
 to be completed for `dpkg --status'.
@@ -1370,10 +1370,8 @@
 
 For example,
 
-example(
-  zstyle ':completion:*:complete:gunzip:*' tag-order \ 
-    'globbed-files directories' all-files
-)
+example(zstyle ':completion:*:complete:gunzip:*' tag-order \ 
+    'globbed-files directories' all-files)
 
 specifies that, when completing arguments of the command tt(gunzip),
 files generated by patterns (in this case, those ending in tt(.gz)) and
@@ -1397,7 +1395,7 @@
 If no style has been defined for a context, the strings tt(arguments
 values), tt(options), tt(globbed-files), tt(directories) and
 tt(all-files) plus all tags offered by the completion function will be 
-used.
+used to provide a sensible default behavior.
 )
 item(tt(use-compctl))(
 If this style is set to a string not equal to tt(false), tt(0),
@@ -1412,7 +1410,7 @@
 tt(compctl) to the new completion system and may disappear in the
 future.
 
-Note also, that the definitions from tt(compctl) will only be used if
+Note also that the definitions from tt(compctl) will only be used if
 there is no special completion function for the command completion is
 done upon.
 )
@@ -1431,9 +1429,9 @@
 
 If set for the tt(my-accounts) tag, this is used for commands such as
 tt(rlogin) and tt(ssh). I.e. the style should contain the names of the 
-user's own accounts. With the tt(other-accounts) this is used for
+user's own accounts. With the tt(other-accounts) tag this is used for
 commands such as tt(talk) and tt(finger) and should contain other
-people's accounts. Finally, this may also used by some commands with
+people's accounts. Finally, this may also be used by some commands with
 the tt(accounts) tag.
 )
 item(tt(verbose))(
@@ -1467,10 +1465,10 @@
 tt(completer) style. For example, to use normal completion and
 correction if that doesn't generate any matches:
 
-example(zstyle ':completion:::::' completer _complete _correct)
+example(zstyle ':completion:*' completer _complete _correct)
 
-after calling tt(compinit). The default value for this style set up
-in tt(compinit) is `tt(_complete)', i.e. normally only ordinary
+after calling tt(compinit). The default value for this style 
+is `tt(_complete)', i.e. normally only ordinary
 completion is tried. The tt(_main_complete) function uses the return
 value of the completer functions to decide if other completers should be
 called. If the return value is zero, no other completers are tried and the
@@ -1539,7 +1537,7 @@
 tried; if this
 function sets the tt(_compskip) parameter to tt(all), no other
 completion functions will be called, if it is set to a string
-containing the string tt(patterns), no pattern completion functions
+containing the substring tt(patterns), no pattern completion functions
 will be called, and if it is set to a string containing tt(default)
 the function for the `tt(-default-)' context will not be called, but
 functions defined for commands will.
@@ -1579,7 +1577,7 @@
 presented to the user. The intended use of this completer function is to
 try after the normal tt(_complete) completer by setting:
 
-example(zstyle ':completion:::::' completer _complete _approximate)
+example(zstyle ':completion:*' completer _complete _approximate)
 
 This will give correcting completion if and only if
 normal completion doesn't yield any possible completions. When
@@ -1594,17 +1592,17 @@
 respectively.
 
 Like all completers tt(_approximate) uses its name without the
-undersccore as the top-level context name. Once it has started trying
-to generate matches, it will add another context name component
-containing the number of errors accepted in this attempt. So on the
-first try the context name starts with `tt(:approximate:1)', on the
-second try with `tt(:approximate:2)', and so on.
+undersccore in the var(completer) field of the context name. Once it
+has started trying to generate matches, it will append a minus sign
+and the number of errors accepted in this attempt to its name. So on the
+first try the field contains `tt(approximate-1)', on the
+second try `tt(approximate-2)', and so on.
 )
 findex(_correct)
 item(tt(_correct))(
 Generate corrections (but not completions) for the current word; this is
 similar to spell-checking.  This calls tt(_approximate) but uses a
-different top-level context name.
+different var(completer) field in the context name.
 
 For example, with:
 
@@ -1672,6 +1670,11 @@
 contain the sequence `tt(%o)' which will be replaced by the original
 string from the line.
 
+Which kind of expansion is tried is controlled by the tt(substitute)
+nad tt(glob) styles. Note that neither of these has a default value so 
+that they have to be set to make tt(_expand) generate any expansions
+at all.
+
 In a different mode selected by the tt(completions) style, all
 em(completions) generated for the string on the line are inserted.
 )
@@ -1704,7 +1707,7 @@
 try to generate matches. If this style is unset, the completers
 currently used by the whole completion are used -- except, of course,
 the tt(_prefix) completer itself. Also, if this completer appears more
-than once in the list of completers to use only those completers not
+than once in the list of completers only those completers not
 already tried by the last invocation of tt(_prefix) will be
 called. The completer field used to look up styles contains the string 
 `tt(prefix-)var(n)', where `var(n)' is the number of the call to
@@ -1712,17 +1715,17 @@
 
 For example, consider this global tt(completer) style:
 
-example(zstyle ':completion:::::' completer _complete _prefix _correct _prefix)
+example(zstyle ':completion:*' completer _complete _prefix _correct _prefix)
 
 This makes the tt(_prefix) completer try normal completion with the
 suffix ignored. If that doesn't generate any matches and neither does
 the call to the tt(_correct) completer after it, then tt(_prefix) will 
 be called a second time and will now only try correction with the
 suffix ignored. If you want to use tt(_prefix) as the last resort and
-want it to try only normal completion, you need to do:
+want it to try only normal completion, you need to call:
 
-example(zstyle ':completion:::::' completer _complete ... _prefix
-zstyle ':completion::prefix-1:::' completer _complete)
+example(zstyle ':completion:*' completer _complete ... _prefix
+zstyle ':completion::prefix-1:*' completer _complete)
 
 The tt(add-space) style is used, too. If it is set to `true' then
 tt(_prefix) will insert a space between the matches generated (if any) 
@@ -1786,14 +1789,15 @@
 findex(_correct_word) (^Xc)
 item(tt(_correct_word) (^Xc))(
 Performs correction of the current argument using the usual contextual
-completions as possible choices. This uses the top-level context name
-`tt(:correct-word)' and then calls the tt(_correct) completer.
+completions as possible choices. This stores the string
+`tt(correct-word)' in the var(function) field of the context name and
+then calls the tt(_correct) completer.
 )
 findex(_expand_word (^Xe))
 item(tt(_expand_word (^Xe)))(
 Performs expansion on the current word:  equivalent to the standard
 tt(expand-word) command, but using the tt(_expand) completer. Before
-calling it, the top-level context name is set to `tt(:expand-word)'.
+calling it, the var(function) field is set to `tt(expand-word)'.
 )
 findex(_history_complete_word) (\e/)
 item(tt(_history_complete_word) (\e/))(
@@ -1833,7 +1837,8 @@
 )
 findex(_complete_help (^Xh))
 item(tt(_complete_help (^Xh)))(
-This widget displays information about the context names and tags used 
+This widget displays information about the context names, including
+the tags, and the completion functions used 
 when completing at the current cursor position.
 )
 enditem()

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-10-28  8:12 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-10-28  8:12 UTC (permalink / raw)
  To: zsh-workers


I wrote:

> That's why I also suggested splitting them into pairs: `functions' and 
> `disabledfunctions' (or `disfunctions' or something like that).

This patch does that, so there is now `disfunctions', etc. Even if
it may turn out that this isn't the final solution, it is a lot
cleaner than the mess I did before.

This also removes the `zle' prefix from `zlekeymaps' and `zlewidgets'.


Bye
 Sven

diff -u -r oldsrc/Modules/parameter.c Src/Modules/parameter.c
--- oldsrc/Modules/parameter.c	Wed Oct 27 20:31:04 1999
+++ Src/Modules/parameter.c	Wed Oct 27 22:11:52 1999
@@ -331,17 +331,13 @@
 
 /**/
 static void
-setfunction(char *name, char *val)
+setfunction(char *name, char *val, int dis)
 {
     char *value = dupstring(val);
     Shfunc shf;
     List list;
-    int sn, dis = 0;
+    int sn;
 
-    if (strpfx("<disabled> ", val)) {
-	strcpy(val, val + 11);
-	dis = DISABLED;
-    }
     val = metafy(val, strlen(val), META_REALLOC);
 
     HEAPALLOC {
@@ -377,7 +373,14 @@
 static void
 setpmfunction(Param pm, char *value)
 {
-    setfunction(pm->nam, value);
+    setfunction(pm->nam, value, 0);
+}
+
+/**/
+static void
+setpmdisfunction(Param pm, char *value)
+{
+    setfunction(pm->nam, value, DISABLED);
 }
 
 /**/
@@ -392,7 +395,7 @@
 
 /**/
 static void
-setpmfunctions(Param pm, HashTable ht)
+setfunctions(Param pm, HashTable ht, int dis)
 {
     int i;
     HashNode hn;
@@ -409,14 +412,28 @@
 	    v.arr = NULL;
 	    v.pm = (Param) hn;
 
-	    setfunction(hn->nam, ztrdup(getstrvalue(&v)));
+	    setfunction(hn->nam, ztrdup(getstrvalue(&v)), dis);
 	}
     deleteparamtable(ht);
 }
 
 /**/
+static void
+setpmfunctions(Param pm, HashTable ht)
+{
+    setfunctions(pm, ht, 0);
+}
+
+/**/
+static void
+setpmdisfunctions(Param pm, HashTable ht)
+{
+    setfunctions(pm, ht, DISABLED);
+}
+
+/**/
 static HashNode
-getpmfunction(HashTable ht, char *name)
+getfunction(HashTable ht, char *name, int dis)
 {
     Shfunc shf;
     Param pm = NULL;
@@ -425,7 +442,7 @@
 	pm = (Param) zhalloc(sizeof(struct param));
 	pm->nam = dupstring(name);
 	pm->flags = PM_SCALAR;
-	pm->sets.cfn = setpmfunction;
+	pm->sets.cfn = (dis ? setpmdisfunction : setpmfunction);
 	pm->gets.cfn = strgetfn;
 	pm->unsetfn = unsetpmfunction;
 	pm->ct = 0;
@@ -434,7 +451,8 @@
 	pm->old = NULL;
 	pm->level = 0;
 
-	if ((shf = (Shfunc) shfunctab->getnode2(shfunctab, name))) {
+	if ((shf = (Shfunc) shfunctab->getnode2(shfunctab, name)) &&
+	    (dis ? (shf->flags & DISABLED) : !(shf->flags & DISABLED))) {
 	    if (shf->flags & PM_UNDEFINED) {
 		pm->u.str = dyncat("builtin autoload -X",
 				   ((shf->flags & PM_UNALIASED) ?
@@ -444,8 +462,7 @@
 		char *t = getpermtext((void *) dupstruct((void *)
 							 shf->funcdef)), *h;
 
-		h = ((shf->flags & DISABLED) ?
-		     dyncat("<disabled> ", t) : dupstring(t));
+		h = dupstring(t);
 		zsfree(t);
 		unmetafy(h, NULL);
 
@@ -461,15 +478,29 @@
 }
 
 /**/
+static HashNode
+getpmfunction(HashTable ht, char *name)
+{
+    return getfunction(ht, name, 0);
+}
+
+/**/
+static HashNode
+getpmdisfunction(HashTable ht, char *name)
+{
+    return getfunction(ht, name, DISABLED);
+}
+
+/**/
 static void
-scanpmfunctions(HashTable ht, ScanFunc func, int flags)
+scanfunctions(HashTable ht, ScanFunc func, int flags, int dis)
 {
     struct param pm;
     int i;
     HashNode hn;
 
     pm.flags = PM_SCALAR;
-    pm.sets.cfn = setpmcommand;
+    pm.sets.cfn = (dis ? setpmdisfunction : setpmfunction);
     pm.gets.cfn = strgetfn;
     pm.unsetfn = unsetpmcommand;
     pm.ct = 0;
@@ -480,7 +511,7 @@
 
     for (i = 0; i < shfunctab->hsize; i++)
 	for (hn = shfunctab->nodes[i]; hn; hn = hn->next) {
-	    if (!(hn->flags & DISABLED)) {
+	    if (dis ? (hn->flags & DISABLED) : !(hn->flags & DISABLED)) {
 		pm.nam = hn->nam;
 		if (func != scancountparams) {
 		    if (((Shfunc) hn)->flags & PM_UNDEFINED) {
@@ -494,9 +525,7 @@
 			char *t = getpermtext((void *)
 					      dupstruct((void *) ((Shfunc) hn)->funcdef));
 
-			pm.u.str = ((hn->flags & DISABLED) ?
-				    dyncat("<disabled> ", t) :
-				    dupstring(t));
+			pm.u.str = dupstring(t);
 			unmetafy(pm.u.str, NULL);
 			zsfree(t);
 		    }
@@ -506,11 +535,25 @@
 	}
 }
 
+/**/
+static void
+scanpmfunctions(HashTable ht, ScanFunc func, int flags)
+{
+    scanfunctions(ht, func, flags, 0);
+}
+
+/**/
+static void
+scanpmdisfunctions(HashTable ht, ScanFunc func, int flags)
+{
+    scanfunctions(ht, func, flags, DISABLED);
+}
+
 /* Functions for the builtins special parameter. */
 
 /**/
 static HashNode
-getpmbuiltin(HashTable ht, char *name)
+getbuiltin(HashTable ht, char *name, int dis)
 {
     Param pm = NULL;
     Builtin bn;
@@ -527,12 +570,12 @@
 	pm->ename = NULL;
 	pm->old = NULL;
 	pm->level = 0;
-	if ((bn = (Builtin) builtintab->getnode2(builtintab, name))) {
+	if ((bn = (Builtin) builtintab->getnode2(builtintab, name)) &&
+	    (dis ? (bn->flags & DISABLED) : !(bn->flags & DISABLED))) {
 	    char *t = ((bn->handlerfunc || (bn->flags & BINF_PREFIX)) ?
 		       "defined" : "undefined");
 
-	    pm->u.str = ((bn->flags & DISABLED) ?
-			 dyncat("<disabled> ", t) : dupstring(t));
+	    pm->u.str = dupstring(t);
 	} else {
 	    pm->u.str = dupstring("");
 	    pm->flags |= PM_UNSET;
@@ -543,8 +586,22 @@
 }
 
 /**/
+static HashNode
+getpmbuiltin(HashTable ht, char *name)
+{
+    return getbuiltin(ht, name, 0);
+}
+
+/**/
+static HashNode
+getpmdisbuiltin(HashTable ht, char *name)
+{
+    return getbuiltin(ht, name, DISABLED);
+}
+
+/**/
 static void
-scanpmbuiltins(HashTable ht, ScanFunc func, int flags)
+scanbuiltins(HashTable ht, ScanFunc func, int flags, int dis)
 {
     struct param pm;
     int i;
@@ -562,78 +619,67 @@
 
     for (i = 0; i < builtintab->hsize; i++)
 	for (hn = builtintab->nodes[i]; hn; hn = hn->next) {
-	    pm.nam = hn->nam;
-	    if (func != scancountparams) {
-		char *t = ((((Builtin) hn)->handlerfunc ||
-			    (hn->flags & BINF_PREFIX)) ?
-			   "defined" : "undefined");
+	    if (dis ? (hn->flags & DISABLED) : !(hn->flags & DISABLED)) {
+		pm.nam = hn->nam;
+		if (func != scancountparams) {
+		    char *t = ((((Builtin) hn)->handlerfunc ||
+				(hn->flags & BINF_PREFIX)) ?
+			       "defined" : "undefined");
 
-		pm.u.str = ((((Builtin) hn)->flags & DISABLED) ?
-			    dyncat("<disabled> ", t) : dupstring(t));
+		    pm.u.str = dupstring(t);
+		}
+		func((HashNode) &pm, flags);
 	    }
-	    func((HashNode) &pm, flags);
 	}
 }
 
-/* Functions for the reswords special parameter. */
-
 /**/
-static HashNode
-getpmresword(HashTable ht, char *name)
+static void
+scanpmbuiltins(HashTable ht, ScanFunc func, int flags)
 {
-    Param pm = NULL;
-    HashNode hn;
-
-    HEAPALLOC {
-	pm = (Param) zhalloc(sizeof(struct param));
-	pm->nam = dupstring(name);
-	pm->flags = PM_SCALAR | PM_READONLY;
-	pm->sets.cfn = NULL;
-	pm->gets.cfn = strgetfn;
-	pm->unsetfn = NULL;
-	pm->ct = 0;
-	pm->env = NULL;
-	pm->ename = NULL;
-	pm->old = NULL;
-	pm->level = 0;
-	if ((hn = reswdtab->getnode2(reswdtab, name)))
-	    pm->u.str = dupstring((hn->flags & DISABLED) ?
-				  "<disabled>" : "<enabled>");
-	else {
-	    pm->u.str = dupstring("");
-	    pm->flags |= PM_UNSET;
-	}
-    } LASTALLOC;
-
-    return (HashNode) pm;
+    scanbuiltins(ht, func, flags, 0);
 }
 
 /**/
 static void
-scanpmreswords(HashTable ht, ScanFunc func, int flags)
+scanpmdisbuiltins(HashTable ht, ScanFunc func, int flags)
+{
+    scanbuiltins(ht, func, flags, DISABLED);
+}
+
+/* Functions for the reswords special parameter. */
+
+/**/
+static char **
+getreswords(int dis)
 {
-    struct param pm;
     int i;
     HashNode hn;
+    char **ret, **p;
 
-    pm.flags = PM_SCALAR | PM_READONLY;
-    pm.sets.cfn = NULL;
-    pm.gets.cfn = strgetfn;
-    pm.unsetfn = NULL;
-    pm.ct = 0;
-    pm.env = NULL;
-    pm.ename = NULL;
-    pm.old = NULL;
-    pm.level = 0;
+    p = ret = (char **) zhalloc((reswdtab->ct + 1) * sizeof(char *));
 
     for (i = 0; i < reswdtab->hsize; i++)
-	for (hn = reswdtab->nodes[i]; hn; hn = hn->next) {
-	    pm.nam = hn->nam;
-	    if (func != scancountparams)
-		pm.u.str = dupstring((hn->flags & DISABLED) ?
-				     "<disabled>" : "<enabled>");
-	    func((HashNode) &pm, flags);
-	}
+	for (hn = reswdtab->nodes[i]; hn; hn = hn->next)
+	    if (dis ? (hn->flags & DISABLED) : !(hn->flags & DISABLED))
+		*p++ = dupstring(hn->nam);
+    *p = NULL;
+
+    return ret;
+}
+
+/**/
+static char **
+reswordsgetfn(Param pm)
+{
+    return getreswords(0);
+}
+
+/**/
+static char **
+disreswordsgetfn(Param pm)
+{
+    return getreswords(DISABLED);
 }
 
 /* Functions for the options special parameter. */
@@ -925,6 +971,7 @@
 
 /* Functions for the dirstack special parameter. */
 
+/**/
 static void
 dirssetfn(Param pm, char **x)
 {
@@ -940,6 +987,7 @@
 	freearray(x);
 }
 
+/**/
 static char **
 dirsgetfn(Param pm)
 {
@@ -1019,6 +1067,7 @@
 
 /* Function for the historywords special parameter. */
 
+/**/
 static char **
 histwgetfn(Param pm)
 {
@@ -1050,6 +1099,7 @@
 
 /* Functions for the jobtexts special parameter. */
 
+/**/
 static char *
 pmjobtext(int job)
 {
@@ -1137,6 +1187,7 @@
 
 /* Functions for the jobstates special parameter. */
 
+/**/
 static char *
 pmjobstate(int job)
 {
@@ -1437,33 +1488,49 @@
 
 /**/
 static void
-setpmralias(Param pm, char *value)
+setralias(Param pm, char *value, int dis)
 {
-    int dis = 0;
-
-    if (strpfx("<disabled> ", value)) {
-	strcpy(value, value + 11);
-	dis = DISABLED;
-    }
     aliastab->addnode(aliastab, ztrdup(pm->nam), createaliasnode(value, dis));
 }
 
 /**/
 static void
-setpmgalias(Param pm, char *value)
+setpmralias(Param pm, char *value)
 {
-    int dis = 0;
+    setralias(pm, value, 0);
+}
 
-    if (strpfx("<disabled> ", value)) {
-	strcpy(value, value + 11);
-	dis = DISABLED;
-    }
+/**/
+static void
+setpmdisralias(Param pm, char *value)
+{
+    setralias(pm, value, DISABLED);
+}
+
+/**/
+static void
+setgalias(Param pm, char *value, int dis)
+{
     aliastab->addnode(aliastab, ztrdup(pm->nam),
 		      createaliasnode(value, dis | ALIAS_GLOBAL));
 }
 
 /**/
 static void
+setpmgalias(Param pm, char *value)
+{
+    setgalias(pm, value, 0);
+}
+
+/**/
+static void
+setpmdisgalias(Param pm, char *value)
+{
+    setgalias(pm, value, DISABLED);
+}
+
+/**/
+static void
 unsetpmalias(Param pm, int exp)
 {
     HashNode hd = aliastab->removenode(aliastab, pm->nam);
@@ -1474,7 +1541,7 @@
 
 /**/
 static void
-setpmaliases(Param pm, HashTable ht, int global)
+setaliases(Param pm, HashTable ht, int global, int dis)
 {
     int i;
     HashNode hn, next, hd;
@@ -1504,7 +1571,8 @@
 	    if ((val = getstrvalue(&v)))
 		aliastab->addnode(aliastab, ztrdup(hn->nam),
 				  createaliasnode(ztrdup(val),
-						  (global ? ALIAS_GLOBAL : 0)));
+						  (global ? ALIAS_GLOBAL : 0) |
+						  (dis ? DISABLED : 0)));
 	}
     deleteparamtable(ht);
 }
@@ -1513,19 +1581,33 @@
 static void
 setpmraliases(Param pm, HashTable ht)
 {
-    setpmaliases(pm, ht, 0);
+    setaliases(pm, ht, 0, 0);
+}
+
+/**/
+static void
+setpmdisraliases(Param pm, HashTable ht)
+{
+    setaliases(pm, ht, 0, DISABLED);
 }
 
 /**/
 static void
 setpmgaliases(Param pm, HashTable ht)
 {
-    setpmaliases(pm, ht, 1);
+    setaliases(pm, ht, 1, 0);
+}
+
+/**/
+static void
+setpmdisgaliases(Param pm, HashTable ht)
+{
+    setaliases(pm, ht, 1, DISABLED);
 }
 
 /**/
 static HashNode
-getpmalias(HashTable ht, char *name, int global)
+getalias(HashTable ht, char *name, int global, int dis)
 {
     Param pm = NULL;
     Alias al;
@@ -1534,7 +1616,8 @@
 	pm = (Param) zhalloc(sizeof(struct param));
 	pm->nam = dupstring(name);
 	pm->flags = PM_SCALAR;
-	pm->sets.cfn = (global ? setpmgalias : setpmralias);
+	pm->sets.cfn = (global ? (dis ? setpmdisgalias : setpmgalias) :
+			(dis ? setpmdisralias : setpmralias));
 	pm->gets.cfn = strgetfn;
 	pm->unsetfn = unsetpmalias;
 	pm->ct = 0;
@@ -1544,10 +1627,9 @@
 	pm->level = 0;
 	if ((al = (Alias) aliastab->getnode2(aliastab, name)) &&
 	    ((global && (al->flags & ALIAS_GLOBAL)) ||
-	     (!global && !(al->flags & ALIAS_GLOBAL))))
-	    pm->u.str = ((al->flags & DISABLED) ?
-			 dyncat("<disabled> ", al->text) :
-			 dupstring(al->text));
+	     (!global && !(al->flags & ALIAS_GLOBAL))) &&
+	    (dis ? (al->flags & DISABLED) : !(al->flags & DISABLED)))
+	    pm->u.str = dupstring(al->text);
 	else {
 	    pm->u.str = dupstring("");
 	    pm->flags |= PM_UNSET;
@@ -1561,19 +1643,33 @@
 static HashNode
 getpmralias(HashTable ht, char *name)
 {
-    return getpmalias(ht, name, 0);
+    return getalias(ht, name, 0, 0);
+}
+
+/**/
+static HashNode
+getpmdisralias(HashTable ht, char *name)
+{
+    return getalias(ht, name, 0, 0);
 }
 
 /**/
 static HashNode
 getpmgalias(HashTable ht, char *name)
 {
-    return getpmalias(ht, name, 1);
+    return getalias(ht, name, 1, 0);
+}
+
+/**/
+static HashNode
+getpmdisgalias(HashTable ht, char *name)
+{
+    return getalias(ht, name, 1, DISABLED);
 }
 
 /**/
 static void
-scanpmaliases(HashTable ht, ScanFunc func, int flags, int global)
+scanaliases(HashTable ht, ScanFunc func, int flags, int global, int dis)
 {
     struct param pm;
     int i;
@@ -1581,7 +1677,8 @@
     Alias al;
 
     pm.flags = PM_SCALAR;
-    pm.sets.cfn = (global ? setpmgalias : setpmralias);
+    pm.sets.cfn = (global ? (dis ? setpmdisgalias : setpmgalias) :
+		   (dis ? setpmdisralias : setpmralias));
     pm.gets.cfn = strgetfn;
     pm.unsetfn = unsetpmalias;
     pm.ct = 0;
@@ -1592,13 +1689,12 @@
 
     for (i = 0; i < aliastab->hsize; i++)
 	for (hn = aliastab->nodes[i]; hn; hn = hn->next) {
-	    if ((global && ((al = (Alias) hn)->flags & ALIAS_GLOBAL)) ||
-		(!global && !((al = (Alias) hn)->flags & ALIAS_GLOBAL))) {
+	    if (((global && ((al = (Alias) hn)->flags & ALIAS_GLOBAL)) ||
+		 (!global && !((al = (Alias) hn)->flags & ALIAS_GLOBAL))) &&
+		(dis ? (al->flags & DISABLED) : !(al->flags & DISABLED))) {
 		pm.nam = hn->nam;
 		if (func != scancountparams)
-		    pm.u.str = ((hn->flags & DISABLED) ?
-				dyncat("<disabled> ", al->text) :
-				dupstring(al->text));
+		    pm.u.str = dupstring(al->text);
 		func((HashNode) &pm, flags);
 	    }
 	}
@@ -1608,14 +1704,28 @@
 static void
 scanpmraliases(HashTable ht, ScanFunc func, int flags)
 {
-    scanpmaliases(ht, func, flags, 0);
+    scanaliases(ht, func, flags, 0, 0);
+}
+
+/**/
+static void
+scanpmdisraliases(HashTable ht, ScanFunc func, int flags)
+{
+    scanaliases(ht, func, flags, 0, DISABLED);
 }
 
 /**/
 static void
 scanpmgaliases(HashTable ht, ScanFunc func, int flags)
 {
-    scanpmaliases(ht, func, flags, 1);
+    scanaliases(ht, func, flags, 1, 0);
+}
+
+/**/
+static void
+scanpmdisgaliases(HashTable ht, ScanFunc func, int flags)
+{
+    scanpmaliases(ht, func, flags, 1, DISABLED);
 }
 
 /* Table for defined parameters. */
@@ -1642,25 +1752,34 @@
     { "functions", 0,
       getpmfunction, scanpmfunctions, setpmfunctions,
       NULL, NULL, stdunsetfn, NULL },
+    { "disfunctions", 0,
+      getpmdisfunction, scanpmdisfunctions, setpmdisfunctions,
+      NULL, NULL, stdunsetfn, NULL },
     { "builtins", PM_READONLY,
       getpmbuiltin, scanpmbuiltins, hashsetfn,
       NULL, NULL, stdunsetfn, NULL },
-    { "reswords", PM_READONLY,
-      getpmresword, scanpmreswords, hashsetfn,
+    { "disbuiltins", PM_READONLY,
+      getpmdisbuiltin, scanpmdisbuiltins, hashsetfn,
       NULL, NULL, stdunsetfn, NULL },
+    { "reswords", PM_ARRAY|PM_SPECIAL|PM_READONLY,
+      NULL, NULL, NULL,
+      arrsetfn, reswordsgetfn, stdunsetfn, NULL },
+    { "disreswords", PM_ARRAY|PM_SPECIAL|PM_READONLY,
+      NULL, NULL, NULL,
+      arrsetfn, disreswordsgetfn, stdunsetfn, NULL },
     { "options", 0,
       getpmoption, scanpmoptions, setpmoptions,
       NULL, NULL, stdunsetfn, NULL },
     { "modules", PM_READONLY,
       getpmmodule, scanpmmodules, hashsetfn,
       NULL, NULL, stdunsetfn, NULL },
-    { "dirstack", PM_ARRAY|PM_HIDE|PM_SPECIAL|PM_REMOVABLE,
+    { "dirstack", PM_ARRAY|PM_SPECIAL|PM_REMOVABLE,
       NULL, NULL, NULL,
       dirssetfn, dirsgetfn, stdunsetfn, NULL },
     { "history", PM_READONLY,
       getpmhistory, scanpmhistory, hashsetfn,
       NULL, NULL, stdunsetfn, NULL },
-    { "historywords", PM_ARRAY|PM_HIDE|PM_SPECIAL|PM_READONLY,
+    { "historywords", PM_ARRAY|PM_SPECIAL|PM_READONLY,
       NULL, NULL, NULL,
       arrsetfn, histwgetfn, stdunsetfn, NULL },
     { "jobtexts", PM_READONLY,
@@ -1681,6 +1800,12 @@
     { "galiases", 0,
       getpmgalias, scanpmgaliases, setpmgaliases,
       NULL, NULL, stdunsetfn, NULL },
+    { "disraliases", 0,
+      getpmdisralias, scanpmdisraliases, setpmdisraliases,
+      NULL, NULL, stdunsetfn, NULL },
+    { "disgaliases", 0,
+      getpmdisgalias, scanpmdisgaliases, setpmdisgaliases,
+      NULL, NULL, stdunsetfn, NULL },
     { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
 };
 
@@ -1715,7 +1840,7 @@
 	    if (def->hsetfn)
 		def->pm->sets.hfn = def->hsetfn;
 	} else {
-	    if (!(def->pm = createparam(def->name, def->flags)))
+	    if (!(def->pm = createparam(def->name, def->flags | PM_HIDE)))
 		return 1;
 	    def->pm->sets.afn = def->setfn;
 	    def->pm->gets.afn = def->getfn;
diff -u -r oldsrc/Modules/parameter.mdd Src/Modules/parameter.mdd
--- oldsrc/Modules/parameter.mdd	Wed Oct 27 20:31:04 1999
+++ Src/Modules/parameter.mdd	Wed Oct 27 21:31:22 1999
@@ -1,3 +1,3 @@
-autoparams="parameters commands functions builtins reswords options modules dirstack history historywords jobtexts jobstates nameddirs userdirs raliases galiases"
+autoparams="parameters commands functions disfunctions builtins disbuiltins reswords disreswords options modules dirstack history historywords jobtexts jobstates nameddirs userdirs raliases disraliases galiases disgaliases"
 
 objects="parameter.o"
diff -u -r oldsrc/Zle/zleparameter.c Src/Zle/zleparameter.c
--- oldsrc/Zle/zleparameter.c	Wed Oct 27 21:31:53 1999
+++ Src/Zle/zleparameter.c	Wed Oct 27 21:32:14 1999
@@ -185,10 +185,10 @@
 };
 
 static struct pardef partab[] = {
-    { "zlewidgets", PM_READONLY,
+    { "widgets", PM_READONLY,
       getpmwidgets, scanpmwidgets, hashsetfn,
       NULL, NULL, stdunsetfn, NULL },
-    { "zlekeymaps", PM_ARRAY|PM_HIDE|PM_SPECIAL|PM_READONLY,
+    { "keymaps", PM_ARRAY|PM_HIDE|PM_SPECIAL|PM_READONLY,
       NULL, NULL, NULL,
       arrsetfn, keymapsgetfn, stdunsetfn, NULL },
     { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
diff -u -r oldsrc/Zle/zleparameter.mdd Src/Zle/zleparameter.mdd
--- oldsrc/Zle/zleparameter.mdd	Wed Oct 27 21:31:53 1999
+++ Src/Zle/zleparameter.mdd	Wed Oct 27 21:32:25 1999
@@ -1,5 +1,5 @@
 moddeps="zle"
 
-autoparams="zlewidgets zlekeymaps"
+autoparams="widgets keymaps"
 
 objects="zleparameter.o"
diff -u -r oldcompletion/Base/_command_names Completion/Base/_command_names
--- oldcompletion/Base/_command_names	Tue Oct 26 20:35:59 1999
+++ Completion/Base/_command_names	Wed Oct 27 21:25:00 1999
@@ -24,13 +24,13 @@
 
 if [[ -z "$ext" ]]; then
   _description expl 'builtin command'
-  compadd "$expl[@]" "$@" - "${(k@)builtins[(R)^?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)builtins}" && ret=0
   _description expl 'shell function'
-  compadd "$expl[@]" "$@" - "${(k@)functions[(R)^?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)functions}" && ret=0
   _description expl 'alias'
-  compadd "$expl[@]" "$@" - "${(k@)raliases[(R)^?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)raliases}" && ret=0
   _description expl 'reserved word'
-  compadd "$expl[@]" "$@" - "${(k@)reswords[(R)^?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)reswords}" && ret=0
 fi
 
 if [[ nm -eq compstate[nmatches] ]]; then
diff -u -r oldcompletion/Base/_equal Completion/Base/_equal
--- oldcompletion/Base/_equal	Tue Oct 26 20:35:59 1999
+++ Completion/Base/_equal	Wed Oct 27 21:25:10 1999
@@ -3,6 +3,6 @@
 local expl
 
 _description expl alias
-compadd "$@" "$expl[@]" - "${(@k)aliases[(R)^?disabled*]}"
+compadd "$@" "$expl[@]" - "${(@k)aliases}"
 _description expl command
 compadd "$@" "$expl[@]" - "${(k@)commands}"
diff -u -r oldcompletion/Builtins/_aliases Completion/Builtins/_aliases
--- oldcompletion/Builtins/_aliases	Tue Oct 26 20:35:59 1999
+++ Completion/Builtins/_aliases	Wed Oct 27 21:25:26 1999
@@ -3,6 +3,6 @@
 local expl
 
 _description expl 'regular alias'
-compadd "$expl[@]" - "${(@k)raliases[(R)^?disabled*]}"
+compadd "$expl[@]" - "${(@k)raliases}"
 _description expl 'global alias'
-compadd "$expl[@]" - "${(@k)galiases[(R)^?disabled*]}"
+compadd "$expl[@]" - "${(@k)galiases}"
diff -u -r oldcompletion/Builtins/_bindkey Completion/Builtins/_bindkey
--- oldcompletion/Builtins/_bindkey	Tue Oct 26 20:35:59 1999
+++ Completion/Builtins/_bindkey	Wed Oct 27 21:33:40 1999
@@ -11,8 +11,8 @@
 
 if [[ "$words[2]" = -*[DAN]* || "$words[CURRENT-1]" = -*M ]]; then
   _description expl keymap
-  compadd "$expl[@]" - "$zlekeymaps[@]"
+  compadd "$expl[@]" - "$keymaps[@]"
 else
   _description expl widget
-  compadd "$expl[@]" -M 'r:|-=* r:|=*' - "${(@k)zlewidgets}"
+  compadd "$expl[@]" -M 'r:|-=* r:|=*' - "${(@k)widgets}"
 fi
diff -u -r oldcompletion/Builtins/_builtin Completion/Builtins/_builtin
--- oldcompletion/Builtins/_builtin	Tue Oct 26 20:35:59 1999
+++ Completion/Builtins/_builtin	Wed Oct 27 21:25:36 1999
@@ -8,5 +8,5 @@
   local expl
 
   _description expl 'builtin command'
-  compadd "$expl[@]" "$@" - "${(k@)builtins[(R)^?disabled*]}"
+  compadd "$expl[@]" "$@" - "${(k@)builtins}"
 fi
diff -u -r oldcompletion/Builtins/_disable Completion/Builtins/_disable
--- oldcompletion/Builtins/_disable	Tue Oct 26 20:35:59 1999
+++ Completion/Builtins/_disable	Wed Oct 27 21:25:55 1999
@@ -4,19 +4,19 @@
 
 if [[ "$prev" = -*a* ]]; then
   _description expl alias
-  compadd "$expl[@]" "$@" - "${(k@)aliases[(R)^?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)aliases}" && ret=0
 fi
 if [[ "$prev" = -*f* ]]; then
   _description expl 'shell function'
-  compadd "$expl[@]" "$@" - "${(k@)functions[(R)^?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)functions}" && ret=0
 fi
 if [[ "$prev" = -*r* ]]; then
   _description expl 'reserved word'
-  compadd "$expl[@]" "$@" - "${(k@)reswords[(R)^?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)reswords}" && ret=0
 fi
 if [[ "$prev" != -* ]]; then
   _description expl 'builtin command'
-  compadd "$expl[@]" "$@" - "${(k@)builtins[(R)^?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)builtins}" && ret=0
 fi
 
 return ret
diff -u -r oldcompletion/Builtins/_enable Completion/Builtins/_enable
--- oldcompletion/Builtins/_enable	Tue Oct 26 20:35:59 1999
+++ Completion/Builtins/_enable	Wed Oct 27 21:26:18 1999
@@ -4,19 +4,19 @@
 
 if [[ "$prev" = -*a* ]]; then
   _description expl alias
-  compadd "$expl[@]" "$@" - "${(k@)aliases[(R)?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)disaliases}" && ret=0
 fi
 if [[ "$prev" = -*f* ]]; then
   _description expl 'shell function'
-  compadd "$expl[@]" "$@" - "${(k@)functions[(R)?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)disfunctions}" && ret=0
 fi
 if [[ "$prev" = -*r* ]]; then
   _description expl 'reserved word'
-  compadd "$expl[@]" "$@" - "${(k@)reswords[(R)?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)disreswords}" && ret=0
 fi
 if [[ "$prev" != -* ]]; then
   _description expl 'builtin command'
-  compadd "$expl[@]" "$@" - "${(k@)builtins[(R)?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)disbuiltins}" && ret=0
 fi
 
 return ret
diff -u -r oldcompletion/Builtins/_functions Completion/Builtins/_functions
--- oldcompletion/Builtins/_functions	Tue Oct 26 20:35:59 1999
+++ Completion/Builtins/_functions	Wed Oct 27 21:26:28 1999
@@ -3,4 +3,4 @@
 local expl
 
 _description expl 'shell function'
-compadd "$expl[@]" "$@" - "${(k@)functions[(R)^?disabled*]}"
+compadd "$expl[@]" "$@" - "${(k@)functions}"
diff -u -r oldcompletion/Builtins/_unhash Completion/Builtins/_unhash
--- oldcompletion/Builtins/_unhash	Tue Oct 26 20:35:59 1999
+++ Completion/Builtins/_unhash	Wed Oct 27 21:27:03 1999
@@ -8,11 +8,11 @@
 fi
 if [[ "$fl" = -*a* ]]; then
   _description expl alias
-  compadd "$expl[@]" - "${(@k)aliases}" && ret=0
+  compadd "$expl[@]" - "${(@k)aliases}" "${(@k)disaliases}" && ret=0
 fi
 if [[ "$fl" = -*f* ]]; then
   _description expl 'shell function'
-  compadd "$expl[@]" - "${(@k)functions}" && ret=0
+  compadd "$expl[@]" - "${(@k)functions}" "${(@k)disfunctions}" && ret=0
 fi
 if [[ "$fl" != -* ]]; then
   _command_names -e && ret=0
diff -u -r oldcompletion/Builtins/_which Completion/Builtins/_which
--- oldcompletion/Builtins/_which	Tue Oct 26 20:35:59 1999
+++ Completion/Builtins/_which	Wed Oct 27 21:27:26 1999
@@ -5,10 +5,10 @@
 _description expl 'external command'
 compadd "$expl[@]" "$@" - "${(k@)commands}" && ret=0
 _description expl 'builtin command'
-compadd "$expl[@]" "$@" - "${(k@)builtins[(R)^?disabled*]}" && ret=0
+compadd "$expl[@]" "$@" - "${(k@)builtins}" && ret=0
 _description expl 'shell function'
-compadd "$expl[@]" "$@" - "${(k@)functions[(R)^?disabled*]}" && ret=0
+compadd "$expl[@]" "$@" - "${(k@)functions}" && ret=0
 _description expl 'alias'
-compadd "$expl[@]" "$@" - "${(k@)raliases[(R)^?disabled*]}" && ret=0
+compadd "$expl[@]" "$@" - "${(k@)raliases}" && ret=0
 _description expl 'reserved word'
-compadd "$expl[@]" "$@" - "${(k@)reswords[(R)^?disabled*]}" && ret=0
+compadd "$expl[@]" "$@" - "${(k@)reswords}" && ret=0
diff -u -r oldcompletion/Builtins/_zle Completion/Builtins/_zle
--- oldcompletion/Builtins/_zle	Tue Oct 26 20:35:59 1999
+++ Completion/Builtins/_zle	Wed Oct 27 21:33:20 1999
@@ -4,8 +4,8 @@
 
 if [[ "$words[2]" = -N && CURRENT -eq 3 ]]; then
   _description expl 'widget shell function'
-  compadd "$expl[@]" "$@" - "${(k@)functions[(R)^?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)functions}" && ret=0
 else
   _description expl widget
-  compadd "$expl[@]" - "${(@k)zlewidgets}"
+  compadd "$expl[@]" - "${(@k)widgets}"
 fi
diff -u -r oldcompletion/Builtins/_zmodload Completion/Builtins/_zmodload
--- oldcompletion/Builtins/_zmodload	Tue Oct 26 20:35:59 1999
+++ Completion/Builtins/_zmodload	Wed Oct 27 21:27:57 1999
@@ -4,7 +4,7 @@
 
 if [[ "$fl" = -*(a*u|u*a)* || "$fl" = -*a* && CURRENT -ge 4 ]]; then
   _description expl 'builtin command'
-  compadd "$expl[@]" "$@" - "${(k@)builtins[(R)^?disabled*]}" && ret=0
+  compadd "$expl[@]" "$@" - "${(k@)builtins}" && ret=0
 elif [[ "$fl" = -*u* ]]; then
   _description expl module
   compadd "$expl[@]" - "${(@k)modules}"
diff -u olddoc/Zsh/mod_parameter.yo Doc/Zsh/mod_parameter.yo
--- olddoc/Zsh/mod_parameter.yo	Tue Oct 26 20:35:53 1999
+++ Doc/Zsh/mod_parameter.yo	Wed Oct 27 22:08:27 1999
@@ -27,35 +27,51 @@
 )
 vindex(functions)
 item(tt(functions))(
-This association maps function names to their definitions. Setting a
-key in it is like defining a function with the name given by the key
-and the body given by the value. Unsetting a key removes the
-definition for the function named by the key.
+This association maps names of enabled functions to their
+definitions. Setting a key in it is like defining a function with the
+name given by the key and the body given by the value. Unsetting a key
+removes the definition for the function named by the key.
+)
+vindex(disfunctions)
+item(tt(disfunctions))(
+Like tt(functions) but for disabled functions.
 )
 vindex(builtins)
 item(tt(builtins))(
 This association gives information about the builtin commands
-currently known. The keys are the names of the builtin commands and
+currently enabled. The keys are the names of the builtin commands and
 the values are either `tt(undefined)' for builtin commands that will
 automatically be loaded from a module if invoked or `tt(defined)' for
-builtin commands that are already loaded. Also, the string
-`tt(<disabled> )' will be prepended to the value if the builtin
-command is currently disabled.
+builtin commands that are already loaded.
+)
+vindex(disbuiltins)
+item(tt(disbuiltins))(
+Like tt(builtins) but for disabled builtin commands.
 )
 vindex(reswords)
 item(tt(reswords))(
-This association maps the reserved words to one of `tt(<enabled>)' or
-`tt(<disabled>)' for enabled and disabled reserved words, respectively.
+This array contains the enabled reserved words.
+)
+vindex(disreswords)
+item(tt(disreswords))(
+Like tt(reswords) but for disabled reserved words.
 )
 vindex(raliases)
 item(tt(raliases))(
-This maps the names of the regular aliases currently defined to their
-expansions. For disabled aliases the string `tt(<disabled>)' is
-prepended to their value.
+This maps the names of the regular aliases currently enabled to their
+expansions.
+)
+vindex(disraliases)
+item(tt(disraliases))(
+Like tt(raliases) but for disabled regular aliases.
 )
 vindex(galiases)
 item(tt(galiases))(
 Like tt(raliases), but for global aliases.
+)
+vindex(disgaliases)
+item(tt(disgaliases))(
+Like tt(galiases) but for disabled global aliases.
 )
 vindex(parameters)
 item(tt(parameters))(
diff -u olddoc/Zsh/mod_zleparameter.yo Doc/Zsh/mod_zleparameter.yo
--- olddoc/Zsh/mod_zleparameter.yo	Tue Oct 26 20:35:54 1999
+++ Doc/Zsh/mod_zleparameter.yo	Wed Oct 27 22:08:50 1999
@@ -8,12 +8,12 @@
 ).
 
 startitem()
-vindex(zlekeymaps)
-item(tt(zlekeymaps))(
+vindex(keymaps)
+item(tt(keymaps))(
 This array contains the names of the keymaps currently defined.
 )
-vindex(zlewidgets)
-item(tt(zlewidgets))(
+vindex(widgets)
+item(tt(widgets))(
 This associative array contains one entry per widget defined. The name 
 of the widget is the key and the value gives information about the
 widget. It is either the string `tt(builtin)' for builtin widgets, a

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-10-28  6:58 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-10-28  6:58 UTC (permalink / raw)
  To: zsh-workers


Bart Schaefer wrote:

> On Oct 27, 10:42am, Sven Wischnowsky wrote:
> } Subject: Re: PATCH: completion
> }
> } No, the output of `functions' isn't changed (of course).
> 
> Oh, I thought you said it was.  You meant the value of $functions, then?
> That's not so bad, but you could still get unexpected effects.

Yep, I have to start putting `$'s before parameter names...

> } Right. Hadn't thought about that either. But in a fully static shell,
> } wouldn't it a bit surprising when, for example, parameters just appear 
> } because they are used (because they were `autoloaded')?
> 
> That's what I meant about "require some changes to the way zmodload and
> static modules work."  Basically, I want the modules linked in, but not
> initialized until an actual "zmodload" is attempted on them.  This is
> not the same as the current auto-autoloading.

I almost thought so. What I was worrying about is exactly these auto-
autoloaded modules (and we where talking about those). People who
don't want to use the new completion stuff probably don't want to see
the parameters from the modules either. But to get the same behavior
in dynamic and static shells we have to make them available without an 
extra call to `zmodload'.
But still, we could try to make `zmodload module' and `zmodload -u module'
work in static shells, making them show and hide the stuff the module
offers. Auto-autoloaded modules would then start up in the `show' state.

Bye
 Sven


--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-10-27  7:14 Sven Wischnowsky
@ 1999-10-27 21:26 ` Tanaka Akira
  0 siblings, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-10-27 21:26 UTC (permalink / raw)
  To: zsh-workers

In article <199910270714.JAA14919@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> The only difference between your and my version (with respect to that
> patch) is that your zle.mdd is doubled (i.e. the file contains two
> versions of what should be in it). The upper one is the right one, so
> just delete everything from the second `hasexport=1' till the end.

I see.  Now I can compile zsh successfully.  Thanks.
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-10-27  8:42 Sven Wischnowsky
@ 1999-10-27 16:39 ` Bart Schaefer
  0 siblings, 0 replies; 45+ messages in thread
From: Bart Schaefer @ 1999-10-27 16:39 UTC (permalink / raw)
  To: Sven Wischnowsky, zsh-workers

On Oct 27, 10:42am, Sven Wischnowsky wrote:
} Subject: Re: PATCH: completion
}
} No, the output of `functions' isn't changed (of course).

Oh, I thought you said it was.  You meant the value of $functions, then?
That's not so bad, but you could still get unexpected effects.

} > } If you load the parameter module in your `.zshrc', you'll notice that
} > } `compinit' now loads `parameter' and `zleparameter'. Without `compgen' 
} > } we need it in too many places to get away without it.  And now the same 
} > } question as for the `computil' module: should we make them be
} > } automatically autoloaded (and linked in for static shells)
} > 
} > Yes!  If the stock set of completion functions are useless without them,
} > they have to be linked into static shells.  However, it would be nice if
} > they weren't actually "loaded" in the zmodload sense until they were
} > needed, even in a static shell.  That's going to require some changes to
} > the way zmodload and static modules work.
} 
} Right. Hadn't thought about that either. But in a fully static shell,
} wouldn't it a bit surprising when, for example, parameters just appear 
} because they are used (because they were `autoloaded')?

That's what I meant about "require some changes to the way zmodload and
static modules work."  Basically, I want the modules linked in, but not
initialized until an actual "zmodload" is attempted on them.  This is
not the same as the current auto-autoloading.

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-10-27  8:42 Sven Wischnowsky
  1999-10-27 16:39 ` Bart Schaefer
  0 siblings, 1 reply; 45+ messages in thread
From: Sven Wischnowsky @ 1999-10-27  8:42 UTC (permalink / raw)
  To: zsh-workers


Bart Schaefer wrote:

> ...
> 
> Which also means "compiled in to static builds".  Did you try a static
> build?  I guess I'll find out soon enough.

I tried it with a fully dynamic shell and a dynamic-enabled shell but
with `complete' linked in and then once with `compctl' loaded
dynamically and once with `compctl' linked in.

> ...
> 
> } - Since this was asked by Bart: yes, I made `functions' show disabled
> }   functions, too. I think this is right because `functions' should
> }   show the contents of the functions hash table.
> 
> I don't think I agree with this.  The purpose of "functions" is not just
> to dump the hash table; it's for user information.  If a function has
> been disabled for some reason, it shouldn't be shown:  "disable" is among
> other things a sysadmin tool for concealing things that certain users
> should not see.
> 
> Which, incidentally, makes me think of something I hadn't before:  If a
> sysadmin wanted to prevent users from changing the completion setup in
> the old system, he could simply "disable compctl" in /etc/zshenv.  Now,
> there's no way to lock in a fixed set of completion functions.
> 
> Do we need to be able to mark functions read-only, as can be done with
> parameters?

Interesting, hadn't thought about that...

> ...
> 
> }   However, the way they 
> }   are currently represented (with the `<disabled>' prefix) is not nice 
> }   and I'd like to hear if anyone can think of something better.
> 
> "Not nice" doesn't even begin to cover it:  `eval "$(functions myfunc)"'
> might read from a file named "disabled" and write it to "myfunc"!

No, the output of `functions' isn't changed (of course).

> }   Maybe we should just add a `disabled' parameter containing all
> }   disabled functions, aliases, etc.
> 
> Can't do that without disambiguating somehow -- you could have an alias,
> a function and a command all named "foo" all of which are disabled.
> However, this is probably the best way to go.

That's why I also suggested splitting them into pairs: `functions' and 
`disabledfunctions' (or `disfunctions' or something like that).

I already came to the conclusion that this is probably the way to
go. It will also make some completion functions simpler.

> } - For the `userdirs' parameter I move the fast YP/NIS code into
> }   `hashtable.c' (where the fill-table-function used `getpwent()').
> 
> There was already too much stuff in hashtable.c, IMO ... it'd be nice
> to have one file that is the hash table implementation, and one or more
> others that create each of the hash table instances.

Right. It irritated me a lot when I found such code in that file.

> ...
> 
> I don't think it's "too late," but I don't have a strong opinion either
> way on whether to add a prefix.  Given that they're all now "hidden" by
> default, so that they won't conflict with locals declared in e.g. ksh
> functions, I don't think it's as big a deal, and the consistency with
> e.g. $signals (for which it _is_ too late) is nice.
> 
> On the other hand, reducing collisions is probably a good thing too.

;-) Don't go to the elves for advice...

> } If you load the parameter module in your `.zshrc', you'll notice that
> } `compinit' now loads `parameter' and `zleparameter'. Without `compgen' 
> } we need it in too many places to get away without it.  And now the same 
> } question as for the `computil' module: should we make them be
> } automatically autoloaded (and linked in for static shells)
> 
> Yes!  If the stock set of completion functions are useless without them,
> they have to be linked into static shells.  However, it would be nice if
> they weren't actually "loaded" in the zmodload sense until they were
> needed, even in a static shell.  That's going to require some changes to
> the way zmodload and static modules work.

Right. Hadn't thought about that either. But in a fully static shell,
wouldn't it a bit surprising when, for example, parameters just appear 
because they are used (because they were `autoloaded')?


Anyway, the patch at least makes the parameter modules autoloaded.

Bye
 Sven

diff -u oldsrc/xmods.conf Src/xmods.conf
--- oldsrc/xmods.conf	Wed Oct 27 10:38:17 1999
+++ Src/xmods.conf	Wed Oct 27 10:39:01 1999
@@ -5,3 +5,5 @@
 sched
 complist
 computil
+parameter
+zleparameter
diff -u oldcompletion/Core/compinit Completion/Core/compinit
--- oldcompletion/Core/compinit	Tue Oct 26 13:12:03 1999
+++ Completion/Core/compinit	Wed Oct 27 10:39:37 1999
@@ -78,10 +78,6 @@
   fi
 done
 
-# We need the parameter modules.
-
-zmodload -i parameter zleparameter
-
 # The associative array containing the definitions for the commands.
 # Definitions for patterns will be stored in the normal arrays `_patcomps'
 # and `_postpatcomps'.
diff -u olddoc/Zsh/compsys.yo Doc/Zsh/compsys.yo
--- olddoc/Zsh/compsys.yo	Tue Oct 26 13:11:30 1999
+++ Doc/Zsh/compsys.yo	Wed Oct 27 10:42:03 1999
@@ -23,10 +23,6 @@
 ifnzman(noderef(Matching Control))
 for further details.
 
-Also note that this completion system requires the tt(parameter) and
-tt(zleparameter) modules to be linked into the shell or to be
-dynamically loadable.
-
 startmenu()
 menu(Initialization)
 menu(Control Functions)

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-10-27  7:14 Sven Wischnowsky
  1999-10-27 21:26 ` Tanaka Akira
  0 siblings, 1 reply; 45+ messages in thread
From: Sven Wischnowsky @ 1999-10-27  7:14 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> In article <199910261103.NAA13365@beta.informatik.hu-berlin.de>,
>   Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:
> 
> > Ok. I hope, you can apply this patch (11836 lines, 319899 bytes, 97
> > files touched). Sorry, but I don't know how I can split that into
> > independent parts...
> 
> Maybe, the patch for Src/Zle/Makefile.in is forgotten.

No, I didn't change it.

> ...
> 
> Also, the patch has some line shifting with zle_tricky.c. So I suspect
> my version has some problems.

The only difference between your and my version (with respect to that
patch) is that your zle.mdd is doubled (i.e. the file contains two
versions of what should be in it). The upper one is the right one, so
just delete everything from the second `hasexport=1' till the end.

Also, whenever new modules appear, you have to `make prep; make' and
at least I have to do `touch Makefile' (in the Src directory) before
that to get everything working.

Bye
 Sven


--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-10-26 17:22 ` Tanaka Akira
@ 1999-10-26 17:32   ` Tanaka Akira
  0 siblings, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-10-26 17:32 UTC (permalink / raw)
  To: zsh-workers

In article <rsqbt9mghpg.fsf@crane.jaist.ac.jp>,
  Tanaka Akira <akr@jaist.ac.jp> writes:

> http://www.ldl.jaist.ac.jp/~public_html/junk/zsh-broken.tar.gz.

Sorry. Of course, the correct URL is
http://www.ldl.jaist.ac.jp/~akr/junk/zsh-broken.tar.gz
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-10-26 11:03 Sven Wischnowsky
  1999-10-26 17:17 ` Bart Schaefer
@ 1999-10-26 17:22 ` Tanaka Akira
  1999-10-26 17:32   ` Tanaka Akira
  1 sibling, 1 reply; 45+ messages in thread
From: Tanaka Akira @ 1999-10-26 17:22 UTC (permalink / raw)
  To: zsh-workers

In article <199910261103.NAA13365@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> Ok. I hope, you can apply this patch (11836 lines, 319899 bytes, 97
> files touched). Sorry, but I don't know how I can split that into
> independent parts...

Maybe, the patch for Src/Zle/Makefile.in is forgotten.

Z(2):akr@is27e1u11% make
gmake[1]: Entering directory `/space/akr/zsh/zsh-main-trunc/Src'
gmake[2]: Entering directory `/space/akr/zsh/zsh-main-trunc/Src'
gmake[3]: Entering directory `/space/akr/zsh/zsh-main-trunc/Src/Builtins'
gmake[3]: Leaving directory `/space/akr/zsh/zsh-main-trunc/Src/Builtins'
gmake[3]: Entering directory `/space/akr/zsh/zsh-main-trunc/Src/Modules'
gmake[3]: Leaving directory `/space/akr/zsh/zsh-main-trunc/Src/Modules'
gmake[3]: Entering directory `/space/akr/zsh/zsh-main-trunc/Src/Zle'
Makefile:817: warning: overriding commands for target `zle_things.h'
Makefile:758: warning: ignoring old commands for target `zle_things.h'
Makefile:828: warning: overriding commands for target `zle_widget.h'
Makefile:769: warning: ignoring old commands for target `zle_widget.h'
Makefile:839: warning: overriding commands for target `thingies.list'
Makefile:780: warning: ignoring old commands for target `thingies.list'
Makefile:858: warning: overriding commands for target `widgets.list'
Makefile:799: warning: ignoring old commands for target `widgets.list'
Makefile:873: warning: overriding commands for target `clean.zle'
Makefile:814: warning: ignoring old commands for target `clean.zle'
gmake[4]: Entering directory `/space/akr/zsh/zsh-main-trunc'
gmake[4]: *** No rule to make target `comp1.mdh'.  Stop.
gmake[4]: Leaving directory `/space/akr/zsh/zsh-main-trunc'
gmake[3]: *** [../..//comp1.mdh] Error 2
gmake[3]: Leaving directory `/space/akr/zsh/zsh-main-trunc/Src/Zle'
gmake[2]: *** [headers] Error 1
gmake[2]: Leaving directory `/space/akr/zsh/zsh-main-trunc/Src'
gmake[1]: *** [headers] Error 2
gmake[1]: Leaving directory `/space/akr/zsh/zsh-main-trunc/Src'
gmake: *** [all] Error 1
Z(2):akr@is27e1u11% 

Also, the patch has some line shifting with zle_tricky.c. So I suspect
my version has some problems.

I stored my latest patched bart-7 to
http://www.ldl.jaist.ac.jp/~public_html/junk/zsh-broken.tar.gz.

Would you compare it to your version?

# It is just `cvs export'ed version. So it has no `configure', etc.
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-10-26 11:03 Sven Wischnowsky
@ 1999-10-26 17:17 ` Bart Schaefer
  1999-10-26 17:22 ` Tanaka Akira
  1 sibling, 0 replies; 45+ messages in thread
From: Bart Schaefer @ 1999-10-26 17:17 UTC (permalink / raw)
  To: Sven Wischnowsky, zsh-workers

On Oct 26,  1:03pm, Sven Wischnowsky wrote:
} Subject: PATCH: completion
}
} The code only needed by compctl is moved into the `compctl'
} module. The new completion stuff has its own module `complete'

Sounds good.

} the `comp1' module became almost empty so I just removed it entirely 
} and made `complete' depend on `zle'

Fine, I think.

} `complete' implements the basic stuff for completion, I made
} `compctl' depend on it

Also fine.

} Note also that I made the `complete' and `compctl' module be
} automatically autoloaded

Which also means "compiled in to static builds".  Did you try a static
build?  I guess I'll find out soon enough.

} Fine, the next thing was to remove `compgen'. This is `replaced' (made, 
} hopefully, superfluous) by adding more special parameters to the
} `parameter' module. Some of them are probably not nice or should be
} done in a completely different way. Please be so kind to look at them

Will do.

} - Since this was asked by Bart: yes, I made `functions' show disabled
}   functions, too. I think this is right because `functions' should
}   show the contents of the functions hash table.

I don't think I agree with this.  The purpose of "functions" is not just
to dump the hash table; it's for user information.  If a function has
been disabled for some reason, it shouldn't be shown:  "disable" is among
other things a sysadmin tool for concealing things that certain users
should not see.

Which, incidentally, makes me think of something I hadn't before:  If a
sysadmin wanted to prevent users from changing the completion setup in
the old system, he could simply "disable compctl" in /etc/zshenv.  Now,
there's no way to lock in a fixed set of completion functions.

Do we need to be able to mark functions read-only, as can be done with
parameters?

Anyway, it's the job of "disable -f" (with no args) to list the disabled
functions, so that if you "disable disable" there's no way to see them at
all.  Probably "disable +f foo" should list foo if it's disabled; right
now it tries to disable the builtins "+f" and "foo".

}   However, the way they 
}   are currently represented (with the `<disabled>' prefix) is not nice 
}   and I'd like to hear if anyone can think of something better.

"Not nice" doesn't even begin to cover it:  `eval "$(functions myfunc)"'
might read from a file named "disabled" and write it to "myfunc"!

}   Maybe we should just add a `disabled' parameter containing all
}   disabled functions, aliases, etc.

Can't do that without disambiguating somehow -- you could have an alias,
a function and a command all named "foo" all of which are disabled.
However, this is probably the best way to go.

} - For the `userdirs' parameter I move the fast YP/NIS code into
}   `hashtable.c' (where the fill-table-function used `getpwent()').

There was already too much stuff in hashtable.c, IMO ... it'd be nice
to have one file that is the hash table implementation, and one or more
others that create each of the hash table instances.

} - The `nameddirs' parameter is probably a bit weird, because it
}   doesn't look at parameters. So if you have `foo=/tmp', `~foo' will
}   work, but there is no `$nameddirs[foo]' entry. On the other hand,
}   this may be the right thing (and `unhash' does the same).

Yes, I think this is the right thing.  If the completion function wants
to include variables as well, it can search for them itself.  The special
param shouldn't make it appear that things have been added to the namedir
table before they really have.

} - `historywords' reports all words from the history.

Good golly.  That sounds like a great way to eat a lot of memory ...

} To access the zle widgets and keymap names I added the `zleparameter'
} module.

Sounds OK.

} You'll note that both parameters defined by `zleparameter' have the
} `zle' prefix. The difference to `parameter' is intentional to make
} sure that I will some day change either of them. So, for the last
} time, I'll ask: should we rename all parameters from the `parameter'
} module to `z*'? More precisely: is anyone against that change? Is it
} too late?

I don't think it's "too late," but I don't have a strong opinion either
way on whether to add a prefix.  Given that they're all now "hidden" by
default, so that they won't conflict with locals declared in e.g. ksh
functions, I don't think it's as big a deal, and the consistency with
e.g. $signals (for which it _is_ too late) is nice.

On the other hand, reducing collisions is probably a good thing too.
 
} If you load the parameter module in your `.zshrc', you'll notice that
} `compinit' now loads `parameter' and `zleparameter'. Without `compgen' 
} we need it in too many places to get away without it.  And now the same 
} question as for the `computil' module: should we make them be
} automatically autoloaded (and linked in for static shells)

Yes!  If the stock set of completion functions are useless without them,
they have to be linked into static shells.  However, it would be nice if
they weren't actually "loaded" in the zmodload sense until they were
needed, even in a static shell.  That's going to require some changes to
the way zmodload and static modules work.

More when I get a chance to apply this (which may not be until next week).

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-10-26 13:01 Oliver Kiddle
@ 1999-10-26 13:35 ` Zefram
  0 siblings, 0 replies; 45+ messages in thread
From: Zefram @ 1999-10-26 13:35 UTC (permalink / raw)
  To: Oliver Kiddle; +Cc: zsh-workers

Oliver Kiddle wrote:
>Note that all the .o files have two dots (e.g. modentry..o) when
>building on
>AIX. This is probably a mistake somewhere but it has always compiled
>happily so
>I've never bothered.

This should probably be documented in the development guide or somewhere.

In the very first dynamic linking patches, all objects were ".o",
as usual.  However, objects need to be compiled with different options
when they're in a module than from when they're linked into the main
executable.  After changing the list of compiled-in modules, it was
necessary to remove all the objects.  So we changed it so that objects
to be linked into modules got the suffix "..o", so that both lots of
object files could coexist, and even when you don't need both lots to
exist at once it avoids a lot of potential confusion.

The module install directory was changed from $prefix/lib/zsh
to $prefix/lib/zsh/$ZSH_VERSION at the same time, for similar
confusion-avoidance reasons (plus coexistence of multiple installed zsh
versions).  Ever since then, I've been glad that we got that right from
the start.  I hate to think, if we hadn't done these two things, how many
support queries we'd be answering where it turned out that people had got
the wrong objects linked together.  (This is all related to the principle
of least surprise; I'm going to dub it the "principle of least support".)

-zefram


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-10-26 13:01 Oliver Kiddle
  1999-10-26 13:35 ` Zefram
  0 siblings, 1 reply; 45+ messages in thread
From: Oliver Kiddle @ 1999-10-26 13:01 UTC (permalink / raw)
  To: Zsh workers

Sven wrote:
> Then one question for the AIX users: I still don't know what the
> `*.export' files are for and what exactly has to go into them, so I
> haven't tried to build or change them. Btw. the `comp1.mdd' contained
> `hasexport=1' which, I think, may have to do with that, but I couldn't 
> find any documentation for it. I have added it to `complete.mdd'
> anyway.

My understanding is that the export files list symbols which are to be
resolved
at runtime instead of link-time. It seems to use this to link, for
example
computil.so with symbols from compctl.so where on other systems, it
would look
in compctl.so to get them.

When the next pws/bart release arrives, I'll sort out the .export files
if
necessary and send a patch. The following might help explain what the
files are:

The errors I was getting from the C compiler were roughly as follows:

        /bin/cc -qlanglvl=ansi  -s  -o computil.so
-bI:../../Src/Zle/compctl.exp
ort -bI:../../Src/Zle/zle.export -bI:../../Src/zsh.export  -emodentry
computil..
o  ../../Src/modentry..o -lcurses -lm -lc 
0706-317 ERROR: Unresolved or undefined symbols detected:
                 Symbols in error (followed by references) are
                 dumped to the load map.
                 The -bloadmap:<filename> option will create a load map.
incompfunc
compwords
compcurrent
.ignore_suffix
compprefix
compsuffix
.restrict_range
.ignore_prefix
.set_list_array
.get_user_var
make: 1254-004 The error code from the last command is 8.

Note that all the .o files have two dots (e.g. modentry..o) when
building on
AIX. This is probably a mistake somewhere but it has always compiled
happily so
I've never bothered.

I've cut out the relevant parts of the ld man page here. I can send you
the
whole thing if you want.

  Imports lists identify which external symbols are to be resolved
  during run time, instead of being resolved during the linkage ed-
  itor  process.   The import list generally identifies the execut-
  able object file  that contains the definition of the import sym-
  bol, so the loader can find  and resolve that symbol at run time.
  The information needed to resolve import  references  is found in
  one of two places:
  
  *     The loader section of shared object files
  
  *     Files whose first record begins with the #! (pound sign and
  exclamation point) that contain a list of external symbols. These
  files are called import lists.
  
  Export lists identify external symbols that are to be made avail-
  able for another executable object file to import.  The file for-
  mat of an export list is the same as the file format of an import
  list.
----
  -bOption      Sets binder (ld) special control and processing options.
  See the following section on  binder options.  This flag can be
  repeated.
----
  import:FileID or I(the uppercase letter i):FileID     The binder im-
  ports the external symbols specified in the FileID variable.
  There is no default import file.


^ permalink raw reply	[flat|nested] 45+ messages in thread

* PATCH: completion
@ 1999-10-26 11:03 Sven Wischnowsky
  1999-10-26 17:17 ` Bart Schaefer
  1999-10-26 17:22 ` Tanaka Akira
  0 siblings, 2 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-10-26 11:03 UTC (permalink / raw)
  To: zsh-workers


Whew, probably the largest patch I ever sent... (but it's mostly
moving code around).


Basically, this tries to make the completion widget system the default 
way to complete things. Many changes, but reading it may still be
worth it (really!):

The code only needed by compctl is moved into the `compctl'
module. The new completion stuff has its own module `complete'
(suggestions for a better name?). While moving things here and there 
the `comp1' module became almost empty so I just removed it entirely 
and made `complete' depend on `zle' (with completion widgets there
isn't really any way to make them work without zle). And since
`complete' implements the basic stuff for completion, I made
`compctl' depend on it. There is still some work to be done, because 
some of the code from `zle_tricky.c' can be moved to the new
`complete' module, but not everything and it isn't that easy to find 
out what exactly can be moved. So I'll wait a bit until the dust has 
settled down before working on that. We might also want to look if
there is a neater way to invoke completion widgets now that they are 
the standard way for completion (this will also allow us to avoid
making some more variables and functions extern).
On the user side, this means that one shouldn't use `compctl -M' to
set global match specs any more because that loads the otherwise
unneeded `compctl' module. Use `compmatchers=(...)' instead (look
better anyway, I think).
I have played quite a bit with new and old style completion both
with dynamically loaded and linked-in modules, but of course there
are so many possible things that I can't really be sure I found all
problems (althoough since I haven't really changed code for this it
shouldn't be too bad).
Note also that I made the `complete' and `compctl' module be
automatically autoloaded. And that you should `rm Zle/comp1*' before
trying to compile the beast after this patch.

You'll also notice that I moved the `compcall' builtin into the
`compctl' module (of course). That's certainly the right thing, unless 
we remove it altogether, which I would like to do. Also, I already
removed the `compctl -i' flag. Because I'm not sure if that still
worked correctly and I think if someone uses the new completion stuff
(s)he shouldn't use `compctl' any more.

There is still some work to be done in the manual: at least the
section about matching control should be moved somewhere else. Into
`compwid.yo', I think.

Then one question for the AIX users: I still don't know what the
`*.export' files are for and what exactly has to go into them, so I
haven't tried to build or change them. Btw. the `comp1.mdd' contained
`hasexport=1' which, I think, may have to do with that, but I couldn't 
find any documentation for it. I have added it to `complete.mdd'
anyway.

Fine, the next thing was to remove `compgen'. This is `replaced' (made, 
hopefully, superfluous) by adding more special parameters to the
`parameter' module. Some of them are probably not nice or should be
done in a completely different way. Please be so kind to look at them
and tell us if you have suggestions for improving this. I think of it
only as the first implementation on which the final version will some
day be based. Just some comments:

- Since this was asked by Bart: yes, I made `functions' show disabled
  functions, too. I think this is right because `functions' should
  show the contents of the functions hash table. However, the way they 
  are currently represented (with the `<disabled>' prefix) is not nice 
  and I'd like to hear if anyone can think of something better.
  Maybe we should just add a `disabled' parameter containing all
  disabled functions, aliases, etc. Or maybe we should split some of
  the parameters into pairs, e.g. `functions' and `disabledfunctions'
  (probably with a shorter name).
- Most of the new parameters are currently read-only. For some it
  might be interesting to change that some day.
- For the `userdirs' parameter I move the fast YP/NIS code into
  `hashtable.c' (where the fill-table-function used `getpwent()').
  This required a slight change in the code for NIS+, which I don't
  have, so I couldn't test it. Please, someone who has access to a
  NIS+ server test this. A simple `$userdirs[<user>]' for some
  existing `<user>' should be enough. The question is if the value
  reported is ok (i.e. the user's home directory).
- The `nameddirs' parameter is probably a bit weird, because it
  doesn't look at parameters. So if you have `foo=/tmp', `~foo' will
  work, but there is no `$nameddirs[foo]' entry. On the other hand,
  this may be the right thing (and `unhash' does the same).
- `historywords' reports all words from the history. The code for
  `compctl' automatically removed some of them, so if you want the
  exact `compctl' behaviour you have to use something like
  "${historywords:#['\"\$]*}".

To access the zle widgets and keymap names I added the `zleparameter'
module. I was thinking about something similar to what Bart suggested
in 8420, and I still think it would be nice to have, so you may think
of this as an interims solution. A more generic way will need some
more thinking and discussion, though, so don't hold your breath.

You'll note that both parameters defined by `zleparameter' have the
`zle' prefix. The difference to `parameter' is intentional to make
sure that I will some day change either of them. So, for the last
time, I'll ask: should we rename all parameters from the `parameter'
module to `z*'? More precisely: is anyone agains that change? Is it
too late? If we don't change `parameter', I'll change `zleparameter',
removing the `zle' prefix.

If you load the parameter module in your `.zshrc', you'll notice that
`compinit' now loads `parameter' and `zleparameter'. Without `compgen' 
we need it in too many places to get away without it. And now the same 
question as for the `computil' module: should we make them be
automatically autoloaded (and linked in for static shells) or should
we add some magic to `compinit' to make sure they are available and
otherwise exit with an error?

And while changing all those completion functions I also changed
`_main_complete' to finally setopt extendedglob. This is needed in
several new functions now and was a source of several bugs before, so
I hope noone complains about this. However if you see any really good
reason to not make this, tell us.

Also, you'll still find uses of `$(...)' in the completion
functions. some of them could be removed if we add more special
parameters to the `parameter' module. E.g. we could make the limits be 
accessible from there. Opinions? Other suggestions?

I have not (yet) added convenience functions for the things that were
previously done with `compgen'. Well, I added one, `_job' (`_jobs' was 
already used, maybe we'll clean up all those filenames before the next 
official release), which could probably do with some more work, making 
it use some config keys or something like that.

Also, `_read_comp' isn't as convenient as before, because you can't
give it `compgen' options any more. I just changed that to make it use 
`compadd'.

Finally, I also included the fix for:

> When a completion is attempt after "A='", compstate[context] become
> "command".

The problem was that with such a single quote (err, I mean that there
is only /one/ quote character), the lexer reports a lex error and in
that case the code in zle_tricky.c just took the thing as a normal
string, not checking if it probably was a parameter assignment.


Ok. I hope, you can apply this patch (11836 lines, 319899 bytes, 97
files touched). Sorry, but I don't know how I can split that into
independent parts...

Bye
 Sven

begin 600 patch-complete.gz
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
@RVNF<@<*&:T63'A@:]MS@%09A]L)EO\ON@/08IOA!`!K
`
end

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-30  9:30 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-30  9:30 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> Hm. _arguments called from _cvs should not complete options after
> non-option arguments.

... because `_cvs' uses `*::...'. Right.

Bye
 Sven

diff -u oc/Base/_arguments Completion/Base/_arguments
--- oc/Base/_arguments	Mon Aug 30 10:58:52 1999
+++ Completion/Base/_arguments	Mon Aug 30 11:29:55 1999
@@ -499,6 +499,7 @@
 	line=( "$line[@]" "$ws[1]" )
 	[[ -n "$inopt" ]] && nargbeg=$(( beg - 1 ))
 	inopt=''
+        [[ -z "$args[nth]" && "$rest" = \*::* ]] && break
 	(( nth++ ))
       fi
     fi

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-27  8:29 ` Tanaka Akira
@ 1999-08-28  6:01   ` Tanaka Akira
  0 siblings, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-28  6:01 UTC (permalink / raw)
  To: zsh-workers

In article <rsqiu6162zd.fsf@crane.jaist.ac.jp>,
  Tanaka Akira <akr@jaist.ac.jp> writes:

> Also, I modified cvs completion functions.

I modified _cvs_history_x to show explanations.
Then I found another _arguments problem.

Z(2):akr@is27e1u11% ./Src/zsh -f
is27e1u11% bindkey -e; fpath=($PWD/Completion/*(/)); autoload -U compinit; compinit -D; compdef _tst tst
compconf message_format='%d'
compconf description_format='%d'
is27e1u11% compconf group_matches=yes
is27e1u11% compconf message_format='%d'
is27e1u11% compconf description_format='%d'

is27e1u11% cvs history -x
add               editors           logout            unedit
admin             export            rdiff             update
annotate          history           release           watch
checkout          import            remove            watchers
commit            init              rtag              
diff              log               status            
edit              login             tag               
option
--allow-root=     -H                -e                -s
--help            -Q                -f                -t
--help-commands   -T                -l                -v
--help-options    -a                -n                -w
--help-synonyms   -b                -q                -z
--version         -d                -r                

is27e1u11% cvs history -e <TAB>
is27e1u11% cvs history -e vi 

is27e1u11% cvs history -e<TAB>
is27e1u11% cvs history -evi 

Hm. _arguments called from _cvs should not complete options after
non-option arguments.

Index: Completion/Cvs/_cvs_history_x
===================================================================
RCS file: /projects/zsh/zsh/Completion/Cvs/_cvs_history_x,v
retrieving revision 1.1.1.1
diff -u -F^( -r1.1.1.1 _cvs_history_x
--- _cvs_history_x	1999/08/26 11:08:18	1.1.1.1
+++ _cvs_history_x	1999/08/28 05:50:39
@@ -2,4 +2,16 @@
 
 compset -P '*'
 # It should describe meaning.
-compadd F O E T C G U W A M R
+compadd "$@" -y '(
+F\ --\ release
+O\ --\ checkout
+E\ --\ export
+T\ --\ rtag
+C\ --\ merge\ collision-detected
+G\ --\ merge\ succeed
+U\ --\ working\ file\ was\ copied
+W\ --\ working\ file\ was\ deleted
+A\ --\ A\ file\ was\ added
+M\ --\ A\ file\ was\ modified
+R\ --\ A\ file\ was\ removed
+)' F O E T C G U W A M R
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-27  7:03 Sven Wischnowsky
@ 1999-08-27  8:29 ` Tanaka Akira
  1999-08-28  6:01   ` Tanaka Akira
  0 siblings, 1 reply; 45+ messages in thread
From: Tanaka Akira @ 1999-08-27  8:29 UTC (permalink / raw)
  To: zsh-workers

In article <199908270703.JAA16459@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> Or -- in case something else went wrong -- just use the version of
> `_arguments' I currently have...

Hm. It has small problems about caching with short options.

Also, I modified cvs completion functions.

Index: Completion/Base/_arguments
===================================================================
RCS file: /projects/zsh/zsh/Completion/Base/_arguments,v
retrieving revision 1.1.1.15
diff -u -F^( -r1.1.1.15 _arguments
--- _arguments	1999/08/27 07:09:33	1.1.1.15
+++ _arguments	1999/08/27 08:21:07
@@ -123,7 +123,7 @@
   done
 
   if [[ -n "$_args_cache_single" ]]; then
-    _args_cache_soptseq="${(@j::)${(@M)${(@k)opts[(R)]}:#[-+]?}#[-+]}"
+    _args_cache_soptseq="${(@j::)${(@M)${(@k)_args_cache_opts[(R)]}:#[-+]?}#[-+]}"
     if [[ -n "$_args_cache_soptseq" ]]; then
       _args_cache_soptseq="[$_args_cache_soptseq]#"
       _args_cache_soptseq1="$_args_cache_soptseq#"
@@ -131,7 +131,7 @@
       _args_cache_soptseq=''
       _args_cache_soptseq1=''
     fi
-    _args_cache_sopts="${(@j::)${(@M)${(@k)opts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)dopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)odopts}:#[-+]?}#[-+]}"
+    _args_cache_sopts="${(@j::)${(@M)${(@k)_args_cache_opts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)_args_cache_dopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)_args_cache_odopts}:#[-+]?}#[-+]}"
   else
     _args_cache_soptseq=''
     _args_cache_soptseq1=''
Index: Completion/Cvs/_cvs
===================================================================
RCS file: /projects/zsh/zsh/Completion/Cvs/_cvs,v
retrieving revision 1.1.1.1
diff -u -F^( -r1.1.1.1 _cvs
--- _cvs	1999/08/26 11:08:17	1.1.1.1
+++ _cvs	1999/08/27 08:21:08
@@ -10,5 +10,5 @@
   '-d+:cvsroot:_cvs_root' \
   '-e+:editor:_cvs_editor' \
   '-s+:user variable:_cvs_user_variable' \
-  '-z:gzip level:_cvs_gzip_level' \
+  '-z+:gzip level:_cvs_gzip_level' \
   '*::cvs command:_cvs_command'
Index: Completion/Cvs/_cvs_command
===================================================================
RCS file: /projects/zsh/zsh/Completion/Cvs/_cvs_command,v
retrieving revision 1.1.1.2
diff -u -F^( -r1.1.1.2 _cvs_command
--- _cvs_command	1999/08/26 12:23:55	1.1.1.2
+++ _cvs_command	1999/08/27 08:21:08
@@ -1,40 +1,43 @@
 #autoload
 
 typeset -A cmds
-cmds=(add "ad new"            admin "adm rcs"         annotate ann
-      checkout "co get"       commit "ci com"         diff "di dif"
-      edit ""                 editors ""              export "exp ex"
-      history "hi his"        import "im imp"         init ""
-      log "lo rlog"           login "logon lgn"       logout ""
-      rdiff patch             release "re rel"        remove "rm delete"
-      status "st stat"        rtag "rt rfreeze"       tag "ta freeze"
-      unedit ""               update "up upd"         watch ""
+cmds=(add " ad new "          admin " adm rcs "       annotate " ann "
+      checkout " co get "     commit " ci com "       diff " di dif "
+      edit ""                 editors ""              export " exp ex "
+      history " hi his "      import " im imp "       init ""
+      log " lo rlog "         login " logon lgn "     logout ""
+      rdiff " patch pa "      release " re rel "      remove " rm delete "
+      status " st stat "      rtag " rt rfreeze "     tag " ta freeze "
+      unedit ""               update " up upd "       watch ""
       watchers "")
 
 if (( CURRENT == 1 )); then
   compadd ${(k)cmds} || compadd ${(kv)=cmds}
 else
-  case "$words[1]" in
-    add|ad|new) _cvs_add;;
-    admin|adm|rcs) _cvs_admin;;
-    annotate|ann) _cvs_annotate;;
-    checkout|co|get) _cvs_checkout;;
-    commit|ci|com) _cvs_commit;;
-    diff|di|dif) _cvs_diff;;
+  case "${${(k)cmds[(R)* $words[1] *]}:-$words[1]}" in
+    add) _cvs_add;;
+    admin) _cvs_admin;;
+    annotate) _cvs_annotate;;
+    checkout) _cvs_checkout;;
+    commit) _cvs_commit;;
+    diff) _cvs_diff;;
     edit) _cvs_edit;;
     editors) _cvs_editors;;
-    export|exp|ex) _cvs_export;;
-    history|hi|his) _cvs_history;;
-    import|im|imp) _cvs_import;;
+    export) _cvs_export;;
+    history) _cvs_history;;
+    import) _cvs_import;;
     init) _cvs_init;;
-    login|logon|lgn|logout) _cvs_login;;
-    rdiff|patch|pa) _cvs_rdiff;;
-    release|re|rel) _cvs_release;;
-    remove|rm|delete) _cvs_remove;;
-    status|st|stat) _cvs_status;;
-    tag|ta|freeze) _cvs_tag;;
+    log) _cvs_log;;
+    login) _cvs_login;;
+    logout) _cvs_logout;;
+    rdiff) _cvs_rdiff;;
+    release) _cvs_release;;
+    remove) _cvs_remove;;
+    status) _cvs_status;;
+    rtag) _cvs_rtag;;
+    tag) _cvs_tag;;
     unedit) _cvs_unedit;;
-    update|up|upd) _cvs_update;;
+    update) _cvs_update;;
     watch) _cvs_watch;;
     watchers) _cvs_watchers;;
     *) _message "unknown cvs command: $words[1]";;
diff -Paur Completion/Cvs/_cvs_logout Completion/Cvs+/_cvs_logout
--- Completion/Cvs/_cvs_logout	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs/_cvs_logout	Fri Aug 27 17:08:54 1999
@@ -0,0 +1,3 @@
+#autoload
+
+false
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-27  7:03 Sven Wischnowsky
  1999-08-27  8:29 ` Tanaka Akira
  0 siblings, 1 reply; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-27  7:03 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> In article <199908261220.OAA15915@beta.informatik.hu-berlin.de>,
>   Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:
> 
> > @@ -236,7 +240,11 @@
> > -          inopt=yes
> > +	  if [[ -n "$def" ]]; then
> > +            inopt=yes
> > +	  else
> > +            inopt=''
> > +	  fi
> 
> In article <199908261352.PAA16045@beta.informatik.hu-berlin.de>,
>   Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:
> 
> > -          inopt=yes
> > +	  inopt=yes
> 
> These two hunks cause conflicts.  So I couldn't update _arguments to
> latest.

I have no idea how this happened, sorry.

We could either try this patchlet:

--- oc/Base/_arguments	Fri Aug 27 08:58:50 1999
+++ Completion/Base/_arguments	Fri Aug 27 08:59:00 1999
@@ -236,11 +236,7 @@
 	  def="$opts[$tmp]"
 	  optbeg="$beg"
 	  argbeg="$beg"
-	  if [[ -n "$def" ]]; then
-            inopt=yes
-	  else
-            inopt=''
-	  fi
+          inopt=yes
 	  uns="${ws[1][2,-1]}"
 	  opt=''
 	fi

Or -- in case something else went wrong -- just use the version of
`_arguments' I currently have...

Bye
 Sven

#autoload

# Complete the arguments of the current command according to the
# descriptions given as arguments to this function.

setopt localoptions extendedglob

local long args rest ws cur nth def nm expl descr action opt arg tmp
local single uns ret=1 soptseq soptseq1 sopts prefix line
local beg optbeg argbeg nargbeg inopt fromrest

# Associative arrays used to collect information about the options.

typeset -A opts dopts odopts
typeset -A oneshot

# Fill the cache if we were called with different arguments.

if [[ "$*" != "$_args_cache_descr" ]]; then
  _args_cache_descr="$*"

  unset _args_cache_{opts,dopts,odopts,oneshot}
  typeset -gA _args_cache_{opts,dopts,odopts,oneshot}

  unset _args_cache_{long,single,rest,args,sopts,soptseq,soptseq1}

  # See if we are using single-letter options.

  if [[ "$1" = -s ]]; then
    shift
    _args_cache_single=yes
  fi

  # See if we support long options, too.

  nth=$argv[(I)--]
  if (( nth )); then
    _args_cache_long=( "${(@)argv[nth+1,-1]}" )
    _args_cache_long_nth=$(( nth - 1 ))
  else
    _args_cache_long=()
  fi

  # Now parse the arguments...

  args=()
  nth=1
  while (( $# )); do

    # This describes a one-shot option.

    if [[ "$1" = [-+]* ]]; then
      if [[ "$1" = *:* ]]; then

        # If the option name ends in a `-', the first argument comes
        # directly after the option, if it ends in a `+', the first
        # argument *may* come directly after the option, otherwise it
        # is in the next word.

        if [[ "$1" = [^:]##-:* ]]; then
  	  tmp="${${1%%:*}[1,-2]}"
          _args_cache_dopts[$tmp]="${1#*:}"
        elif [[ "$1" = [^:]##+:* ]]; then
  	  tmp="${${1%%:*}[1,-2]}"
          _args_cache_odopts[$tmp]="${1#*:}"
        else
          tmp="${1%%:*}"
          _args_cache_opts[$tmp]="${1#*:}"
        fi
      else
        tmp="$1"
        _args_cache_opts[$tmp]=''
      fi
      _args_cache_oneshot[$tmp]=yes
    elif [[ "$1" = \*[-+]* ]]; then

      # The same for options that may appear more than once.

      if [[ "$1" = *:* ]]; then
        if [[ "$1" = [^:]##-:* ]]; then
          tmp="${${1[2,-1]%%:*}[1,-2]}"
          _args_cache_dopts[$tmp]="${1#*:}"
        elif [[ "$1" = [^:]##+:* ]]; then
          tmp="${${1[2,-1]%%:*}[1,-2]}"
          _args_cache_odopts[$tmp]="${1#*:}"
        else
          tmp="${1[2,-1]%%:*}"
          _args_cache_opts[$tmp]="${1#*:}"
        fi
      else
        tmp="${1[2,-1]}"
        _args_cache_opts[$tmp]=''
      fi
      unset "_args_cache_oneshot[$tmp]"
    elif [[ "$1" = \*::* ]]; then

      # This is `*:...', describing `all other arguments', with argument 
      # range restriction.

      if [[ "$1" = \*:::* ]]; then
        _args_cache_rest="*${1[3,-1]}"
      else
        _args_cache_rest="$1"
      fi
    elif [[ "$1" = \*:* ]]; then

      # This is `*:...', describing `all other arguments'.

      _args_cache_rest="${1[3,-1]}"
    elif [[ "$1" = :* ]]; then

      # This is `:...', describing `the next argument'.

      _args_cache_args[nth++]="${1#*:}"
    else

      # And this is `n:...', describing the `n'th argument.

      _args_cache_args[${1%%:*}]="${1#*:}"
      nth=$(( ${1%%:*} + 1 ))
    fi
    shift
  done

  if [[ -n "$_args_cache_single" ]]; then
    _args_cache_soptseq="${(@j::)${(@M)${(@k)opts[(R)]}:#[-+]?}#[-+]}"
    if [[ -n "$_args_cache_soptseq" ]]; then
      _args_cache_soptseq="[$_args_cache_soptseq]#"
      _args_cache_soptseq1="$_args_cache_soptseq#"
    else
      _args_cache_soptseq=''
      _args_cache_soptseq1=''
    fi
    _args_cache_sopts="${(@j::)${(@M)${(@k)opts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)dopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)odopts}:#[-+]?}#[-+]}"
  else
    _args_cache_soptseq=''
    _args_cache_soptseq1=''
    _args_cache_sopts=''
  fi
fi

soptseq="$_args_cache_soptseq"
soptseq1="$_args_cache_soptseq1"
sopts="$_args_cache_sopts"
args=( "$_args_cache_args[@]" )
rest="$_args_cache_rest"
opts=( "${(@kv)_args_cache_opts}" )
dopts=( "${(@kv)_args_cache_dopts}" )
odopts=( "${(@kv)_args_cache_odopts}" )
oneshot=( "${(@kv)_args_cache_oneshot}" )
single="$_args_cache_single"
long=( "$_args_cache_long[@]" )

argv=( "${(@)argv[1,_args_cache_long_nth]}" )

# Parse the command line...

ws=( "${(@)words[2,-1]}" )
cur=$(( CURRENT-2 ))
nth=1
line=( "$words[1]" )
beg=2
argbeg=1
optbeg=1
nargbeg=1

# ...until the current word is reached.

while [[ cur -gt 0 ]]; do

  # `def' holds the description for the option we are currently after.
  # Check if the next argument for the option is optional.

  if [[ "$def" = :* ]]; then
    opt=yes
  else
    opt=''
  fi
  arg=''

  # See if we are after an option getting n arguments ended by something
  # that matches the current word.

  if [[ "$def" = \**[^\\]:* && "$ws[1]" = ${~${(M)def#*[^\\]:}[2,-2]} ]]; then
    def=''
    shift 1 ws
    (( cur-- ))
    (( beg++ ))
    continue
  fi

  # Remove one description/action pair from `def' if that isn't empty.

  if [[ -n "$def" && "$def" != \** ]]; then
    if [[ "$def" = ?*[^\\]:*[^\\]:* ]]; then
      def="${def#?*[^\\]:*[^\\]:}"
      argbeg="$beg"
    else
      def=''
    fi
  elif [[ -z "$def" ]]; then

    # If it is empty, and the word starts with `--' and we should
    # complete long options, just ignore this word, otherwise make sure
    # we test for options below and handle normal arguments.

    if [[ $#long -eq 0 || "$ws[1]" != --* ]]; then
      opt=yes
      arg=yes
    else
      def=''
    fi
  fi

  if [[ -n "$opt" ]]; then

    # `opt' was set above if we have to test if the word is an option.
    # We first test for the simple options -- those without arguments or
    # those whose arguments have to be given as separate words.

    if (( $+opts[$ws[1]] )); then

      # Options that may only be given once are removed from the
      # associative array so that we don't offer them again.

      def="$opts[$ws[1]]"
      optbeg="$beg"
      argbeg="$beg"
      inopt=yes
      [[ -n "$oneshot[$ws[1]]" ]] && unset "opts[$ws[1]]"
    else
      uns=''
      if [[ -n "$sopts" && "$ws[1]" = [-+]${~soptseq}[$sopts] ]]; then
	tmp="${ws[1][1]}${ws[1][-1]}"
	if (( $+opts[$tmp] )); then
	  def="$opts[$tmp]"
	  optbeg="$beg"
	  argbeg="$beg"
          inopt=yes
	  uns="${ws[1][2,-1]}"
	  opt=''
	fi
      fi

      # If the word is none of the simple options, test for those
      # whose first argument has to or may come directly after the
      # option. This is done in two loops looking very much alike.

      if [[ -n "$opt" && $#dopts -ne 0 ]]; then

	# First we get the option names.

	tmp=( "${(@k)dopts}" )

	# Then we loop over them and see if the current word begins
	# with one of the option names.

	while (( $#tmp )); do
          if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
	    if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
	      uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
	      break;
	    fi
	  elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
            break
	  fi
	  shift 1 tmp
	done

	if (( $#tmp )); then

	  # It does. So use the description for it, but only from
	  # the second argument on, because we are searching the
	  # description for the next command line argument.

	  opt=''
	  def="$dopts[$tmp[1]]"
	  optbeg="$beg"
	  argbeg="$beg"
	  inopt=yes
	  [[ -n "$oneshot[$tmp[1]]" ]] && unset "dopts[$tmp[1]]"
	  if [[ "$def" = [^*]*[^\\]:*[^\\]:* ]]; then
            def="${def#?*[^\\]:*[^\\]:}"
          else
            def=''
	  fi
        fi
      fi
      if [[ -n "$opt" && $#odopts -ne 0 ]]; then
	tmp=( "${(@k)odopts}" )
	while (( $#tmp )); do
          if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
	    if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
	      uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
	      break;
	    fi
	  elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
	    break
	  fi
	  shift 1 tmp
	done

	if (( $#tmp )); then
	  opt=''
	  def="$odopts[$tmp[1]]"
	  optbeg="$beg"
	  argbeg="$beg"
	  inopt=yes
	  [[ -n "$oneshot[$tmp[1]]" ]] && unset "odopts[$tmp[1]]"

	  # For options whose first argument *may* come after the
	  # option, we skip over the first description only if there
	  # is something after the option name on the line.

	  if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) ||
                ( -n "$sopts" && ( ( $tmp[1] = [-+]? && "$ws[1]" != "${tmp[1][1]}"${~soptseq}"${tmp[1][2]}" ) ||
		  		   ( $tmp[1] != [-+]? && "$ws[1]" != "$tmp[1]" ) ) ) ]]; then
	    if [[ "$def" = [^*]*[^\\]:*[^\\]:* ]]; then
              def="${def#?*[^\\]:*[^\\]:}"
	      optbeg="$beg"
	      argbeg="$beg"
            else
              def=''
            fi
	  fi
        fi
      fi

      [[ -n "$sopts" && -n "$opt" && "$ws[1]" = [-+]${~soptseq} ]] && \
          uns="${ws[1][2,-1]}"

      if [[ -n "$uns" ]]; then
	uns="${(j::)${(@k)oneshot[(I)${ws[1][1]}[$uns]]#[-+]}}"
	tmp=(
	  "opts[${(@)^opts[(I)${ws[1][1]}[$uns]]}]"
	  "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]"
	  "odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]"
	)
	(( $#tmp )) && unset "$tmp[@]"
      fi

      # If we didn't find a matching option description and we were
      # told to use normal argument descriptions, just increase
      # our counter `nth'.

      if [[ -n "$opt" && -n "$arg" ]]; then
        def=''
	line=( "$line[@]" "$ws[1]" )
	[[ -n "$inopt" ]] && nargbeg=$(( beg - 1 ))
	inopt=''
	(( nth++ ))
      fi
    fi
  fi

  shift 1 ws
  (( cur-- ))
  (( beg++ ))
done

[[ -n "$inopt" ]] && nargbeg=$(( beg - 1 ))

# Now generate the matches.

if [[ $#long -ne 0 && "$PREFIX" = --* ]]; then

  # If the current words starts with `--' and we should use long
  # options, just call...

  _long_options "$long[@]"

else

  nm="$compstate[nmatches]"

  if [[ -z "$def" || "$def" = :* ]]; then
      local pre="$PREFIX"

      uns=''

    # We either don't have a description for an argument of an option
    # or we have a description for a optional argument.

    if [[ -z "$def" ]]; then

      # If we have none at all, use the one for this argument position.

      def="$args[nth]"
      if [[ -z "$def" ]]; then
        def="$rest"
	optbeg="$nargbeg"
	argbeg="$nargbeg"
	fromrest=yes
      fi
    fi

    # In any case, we have to complete option names here, but we may
    # be in a string that starts with an option name and continues with
    # the first argument, test that (again, two loops).

    opt=yes
    if (( $#dopts )); then

      # Get the option names.

      tmp=( "${(@k)dopts}" )
      prefix="$PREFIX"
      while (( $#tmp )); do
        if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
          def="$dopts[$tmp[1]]"
	  opt=''
	  uns="${prefix[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
	  break
        elif compset -P "$tmp[1]"; then

	  # The current string starts with the option name, so ignore
	  # that and complete the rest of the string.

	  def="$dopts[$tmp[1]]"
	  opt=''
	  break
        fi
	shift 1 tmp
      done
    fi
    if [[ -n "$opt" && $#odopts -ne 0 ]]; then
      tmp=( "${(@k)odopts}" )
      prefix="$PREFIX"
      while (( $#tmp )); do
        if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
          def="$odopts[$tmp[1]]"
	  opt=''
	  uns="${prefix[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
	  break
        elif compset -P "$tmp[1]"; then
	  def="$odopts[$tmp[1]]"
	  opt=''
	  break
        fi
	shift 1 tmp
      done
    fi

    [[ -n "$sopts" && -n "$opt" && "$PREFIX" = [-+]${~soptseq}[$sopts] ]] && \
        uns="${PREFIX[2,-1]}"

    if [[ -n "$uns" ]]; then
      uns="${(j::)${(@k)oneshot[(I)${ws[1][1]}[$uns]]#[-+]}}"
      tmp=(
	"opts[${(@)^opts[(I)${pre[1]}[$uns]]}]"
	"dopts[${(@)^dopts[(I)${pre[1]}[$uns]]}]"
	"odopts[${(@)^odopts[(I)${pre[1]}[$uns]]}]"
      )
      (( $#tmp )) && unset "$tmp[@]"
    fi

    if [[ -n "$opt" && ( "$def" != \** ||
                         ( -n "$fromrest" && CURRENT -eq argbeg+1 ) ) ]]; then

      # We aren't in an argument directly after a option name, so
      # all option names are possible matches.

      if [[ "$compconfig[option_prefix]" != *(short|all)* ||
            "$PREFIX" = [-+]* ]]; then
        _description expl option
	if [[ -n "$sopts" && -n "$PREFIX" && "$PREFIX" = [-+]${~soptseq}[$sopts] ]]; then
	  if [[ "$PREFIX" = [-+]${~soptseq1} ]]; then
	    compadd "$expl[@]" -Q \
                    -y "( ${(j: :)${(@M)${(@k)opts}:#[-+]?}} ${(j: :)${(@M)${(@k)dopts}:#[-+]?}} ${(j: :)${(@M)${(@k)odopts}:#[-+]?}} )" - \
                    "${PREFIX}${(@k)^opts[(I)${PREFIX[1]}?]#?}" \
		    "${PREFIX}${(@k)^dopts[(I)${PREFIX[1]}?]#?}" \
		    "${PREFIX}${(@k)^odopts[(I)${PREFIX[1]}?]#?}" && ret=0
	  else
	    # The last option takes an argument in next word.
	    compadd "$expl[@]" -Q - "${PREFIX}" && ret=0
	  fi
	else
          compadd "$expl[@]" -Q - "${(@k)opts}" "${(@k)odopts}" && ret=0
	  compadd "$expl[@]" -QS '' - "${(@k)dopts}" && ret=0
        fi
      fi
      [[ $#long -ne 0 &&
         ( "$compconfig[option_prefix]" != *(long|all)* ||
           "$PREFIX" = --* ) ]] && \
	  _long_options "$long[@]" && ret=0
    fi
  fi

  # Now add the matches from the description, if any.

  if [[ -n "$def" ]]; then

    # Ignore the leading colon or `*...' describing optional arguments.

    if [[ "$def" = :* ]]; then
      def="$def[2,-1]"
    elif [[ "$def" = \** ]]; then
      tmp="${${(M)def#*[^\\]:}[2,-2]}"
      def="${def#*[^\\]:}"

      if [[ "$def" = :* ]]; then
        if [[ "$def" = ::* ]]; then
          def="$def[3,-1]"
	  beg=$argbeg
	else
	  def="$def[2,-1]"
	  beg=$optbeg
	fi

	[[ beg -ge $#words ]] && beg=$(( $#words - 1 ))

	shift beg words
	(( CURRENT -= beg ))

	if [[ -n "$tmp" ]]; then
          tmp="$words[(ib:CURRENT:)${~tmp}]"
	  [[ tmp -le $#words ]] && words=( "${(@)words[1,tmp-1]}" )
	fi
      fi
    fi

    # Get the description and the action.

    descr="${${${(M)def#*[^\\]:}[1,-2]}//\\\\:/:}"
    if [[ "$def" = *[^\\]:*[^\\]:* ]]; then
      action="${${${(M)${def#*[^\\]:}#*[^\\]:}[1,-2]}//\\\\:/:}"
    else
      action="${${def#*[^\\]:}//\\\\:/:}"
    fi

    _description expl "$descr"

    if [[ -z "$action" ]]; then

      # An empty action means that we should just display a message.
      _message "$descr"
      return ret
    elif [[ "$action" = \(*\) ]]; then

      # Anything inside `(...)' is added directly.

      compadd "$expl[@]" - ${=action[2,-2]}
    elif [[ "$action" = \{*\} ]]; then

      # A string in braces is evaluated.

      eval "$action[2,-2]"

    elif [[ "$action" = \ * ]]; then

      # If the action starts with a space, we just call it.

      ${(e)=~action}
    else

      # Otherwise we call it with the description-arguments built above.

      action=( $=action )
      ${(e)action[1]} "$expl[@]" ${(e)~action[2,-1]}
    fi
  fi

  # Set the return value.

  [[ nm -ne "$compstate[nmatches]" ]]
fi

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-26 12:20 Sven Wischnowsky
  1999-08-26 13:17 ` Tanaka Akira
@ 1999-08-26 17:56 ` Tanaka Akira
  1 sibling, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-26 17:56 UTC (permalink / raw)
  To: zsh-workers

In article <199908261220.OAA15915@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> @@ -236,7 +240,11 @@
>  	  def="$opts[$tmp]"
>  	  optbeg="$beg"
>  	  argbeg="$beg"
> -          inopt=yes
> +	  if [[ -n "$def" ]]; then
> +            inopt=yes
> +	  else
> +            inopt=''
> +	  fi
>  	  uns="${ws[1][2,-1]}"
>  	  opt=''
>  	fi

In article <199908261352.PAA16045@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> @@ -236,7 +236,7 @@
>  	  def="$opts[$tmp]"
>  	  optbeg="$beg"
>  	  argbeg="$beg"
> -          inopt=yes
> +	  inopt=yes
>  	  uns="${ws[1][2,-1]}"
>  	  opt=''
>  	fi

These two hunks cause conflicts.  So I couldn't update _arguments to
latest.
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-26 13:52 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-26 13:52 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> Hm. `cvs -e vi <TAB>' works now. Thanks.
> But common options are too disabled.
> 
> Z(2):akr@is27e1u11% ./Src/zsh -f
> is27e1u11% bindkey -e; fpath=($PWD/Completion/*(/)); autoload -U compinit; compinit -D; compdef _tst tst
> is27e1u11% compconf group_matches=yes
> is27e1u11% compconf message_format='%d'
> is27e1u11% compconf description_format='%d'
> is27e1u11% cvs <TAB>
> add        commit     export     log        release    tag        watchers
> admin      diff       history    login      remove     unedit     
> annotate   edit       import     logout     rtag       update     
> checkout   editors    init       rdiff      status     watch      
> 
> In this case, the cursor is on first non-option argument *or* option
> argument.  So, _arguments should complete options addition to call
> _cvs_command, I suppose.
> 
> Or, should _cvs be changed to
> "_arguments ... ':cvs command:_cvs_commands' '*::cvs command arguments:_cvs_args'" ?

I /think/ we should help users and add some special casing to allow
options in the first rest-arguments position.

> is27e1u11% cvs -evi <TAB>
> unknown cvs command: -evi
> 
> Hm.

Should work now (this functions has already become more complicated
than `_path_files' -- makes me reluctant to merge it with
`_long_options', although that would be a good thing).

Bye
 Sven

--- oc/Base/_arguments	Thu Aug 26 14:06:15 1999
+++ Completion/Base/_arguments	Thu Aug 26 15:48:01 1999
@@ -7,7 +7,7 @@
 
 local long args rest ws cur nth def nm expl descr action opt arg tmp
 local single uns ret=1 soptseq soptseq1 sopts prefix line
-local beg optbeg argbeg nargbeg inopt
+local beg optbeg argbeg nargbeg inopt fromrest
 
 # Associative arrays used to collect information about the options.
 
@@ -236,7 +236,7 @@
 	  def="$opts[$tmp]"
 	  optbeg="$beg"
 	  argbeg="$beg"
-          inopt=yes
+	  inopt=yes
 	  uns="${ws[1][2,-1]}"
 	  opt=''
 	fi
@@ -277,10 +277,10 @@
 	  def="$dopts[$tmp[1]]"
 	  optbeg="$beg"
 	  argbeg="$beg"
+	  inopt=yes
 	  [[ -n "$oneshot[$tmp[1]]" ]] && unset "dopts[$tmp[1]]"
 	  if [[ "$def" = [^*]*[^\\]:*[^\\]:* ]]; then
             def="${def#?*[^\\]:*[^\\]:}"
-            inopt=yes
           else
             def=''
 	  fi
@@ -305,6 +305,7 @@
 	  def="$odopts[$tmp[1]]"
 	  optbeg="$beg"
 	  argbeg="$beg"
+	  inopt=yes
 	  [[ -n "$oneshot[$tmp[1]]" ]] && unset "odopts[$tmp[1]]"
 
 	  # For options whose first argument *may* come after the
@@ -318,7 +319,6 @@
               def="${def#?*[^\\]:*[^\\]:}"
 	      optbeg="$beg"
 	      argbeg="$beg"
-              inopt=yes
             else
               def=''
             fi
@@ -358,7 +358,7 @@
   (( beg++ ))
 done
 
-[[ -n "$inopt" ]] && nargbeg="$beg"
+[[ -n "$inopt" ]] && nargbeg=$(( beg - 1 ))
 
 # Now generate the matches.
 
@@ -390,6 +390,7 @@
         def="$rest"
 	optbeg="$nargbeg"
 	argbeg="$nargbeg"
+	fromrest=yes
       fi
     fi
 
@@ -453,7 +454,8 @@
       (( $#tmp )) && unset "$tmp[@]"
     fi
 
-    if [[ -n "$opt" ]]; then
+    if [[ -n "$opt" && ( "$def" != \** ||
+                         ( -n "$fromrest" && CURRENT -eq argbeg+1 ) ) ]]; then
 
       # We aren't in an argument directly after a option name, so
       # all option names are possible matches.

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-26 12:20 Sven Wischnowsky
@ 1999-08-26 13:17 ` Tanaka Akira
  1999-08-26 17:56 ` Tanaka Akira
  1 sibling, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-26 13:17 UTC (permalink / raw)
  To: zsh-workers

In article <199908261220.OAA15915@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> Should be fixed by this patch. 

Hm. `cvs -e vi <TAB>' works now. Thanks.
But common options are too disabled.

Z(2):akr@is27e1u11% ./Src/zsh -f
is27e1u11% bindkey -e; fpath=($PWD/Completion/*(/)); autoload -U compinit; compinit -D; compdef _tst tst
is27e1u11% compconf group_matches=yes
is27e1u11% compconf message_format='%d'
is27e1u11% compconf description_format='%d'
is27e1u11% cvs <TAB>
add        commit     export     log        release    tag        watchers
admin      diff       history    login      remove     unedit     
annotate   edit       import     logout     rtag       update     
checkout   editors    init       rdiff      status     watch      

In this case, the cursor is on first non-option argument *or* option
argument.  So, _arguments should complete options addition to call
_cvs_command, I suppose.

Or, should _cvs be changed to
"_arguments ... ':cvs command:_cvs_commands' '*::cvs command arguments:_cvs_args'" ?

is27e1u11% cvs -evi <TAB>
unknown cvs command: -evi

Hm.
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-26 12:20 Sven Wischnowsky
  1999-08-26 13:17 ` Tanaka Akira
  1999-08-26 17:56 ` Tanaka Akira
  0 siblings, 2 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-26 12:20 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

>
> ...
>
> cvs common options such as --version are completed addition to options
> for cvs diff.
>
> ...
>
> is27e1u11% cvs -e vi  
> unknown cvs command: -e
> option
> --allow-root=     -H                -f                -t
> --help            -Q                -l                -v
> --help-commands   -T                -n                -w
> --help-options    -a                -q                -x
> --help-synonyms   -b                -r                -z
> --version         -d                -s                
> 
> _arguments does not cutoff words in this case. Hm.

Should be fixed by this patch. I also changed the `commands'
parameter's name to `cmds' -- until we find the final solution (hope
that's ok for you).

And then I forgot all those `*'s in `_find'... ahem. I'm so ashamed.

Bye
 Sven

diff -u -r oc/Base/_arguments Completion/Base/_arguments
--- oc/Base/_arguments	Thu Aug 26 14:06:15 1999
+++ Completion/Base/_arguments	Thu Aug 26 14:02:46 1999
@@ -226,7 +226,11 @@
       def="$opts[$ws[1]]"
       optbeg="$beg"
       argbeg="$beg"
-      inopt=yes
+      if [[ -n "$def" ]]; then
+        inopt=yes
+      else
+        inopt=''
+      fi
       [[ -n "$oneshot[$ws[1]]" ]] && unset "opts[$ws[1]]"
     else
       uns=''
@@ -236,7 +240,11 @@
 	  def="$opts[$tmp]"
 	  optbeg="$beg"
 	  argbeg="$beg"
-          inopt=yes
+	  if [[ -n "$def" ]]; then
+            inopt=yes
+	  else
+            inopt=''
+	  fi
 	  uns="${ws[1][2,-1]}"
 	  opt=''
 	fi
@@ -283,6 +291,7 @@
             inopt=yes
           else
             def=''
+	    inopt=''
 	  fi
         fi
       fi
@@ -318,11 +327,15 @@
               def="${def#?*[^\\]:*[^\\]:}"
 	      optbeg="$beg"
 	      argbeg="$beg"
-              inopt=yes
             else
               def=''
             fi
 	  fi
+          if [[ -n "$def" ]]; then
+	    inopt=yes
+          else
+	    inopt=''
+	  fi
         fi
       fi
 
@@ -453,7 +466,7 @@
       (( $#tmp )) && unset "$tmp[@]"
     fi
 
-    if [[ -n "$opt" ]]; then
+    if [[ -n "$opt" && "$def" != \** ]]; then
 
       # We aren't in an argument directly after a option name, so
       # all option names are possible matches.
diff -u -r oc/Cvs/_cvs_command Completion/Cvs/_cvs_command
--- oc/Cvs/_cvs_command	Thu Aug 26 14:06:17 1999
+++ Completion/Cvs/_cvs_command	Thu Aug 26 14:04:46 1999
@@ -1,18 +1,18 @@
 #autoload
 
-typeset -A commands
-commands=(add "ad new"            admin "adm rcs"         annotate ann
-	  checkout "co get"       commit "ci com"         diff "di dif"
-	  edit ""                 editors ""              export "exp ex"
-	  history "hi his"        import "im imp"         init ""
-	  log "lo rlog"           login "logon lgn"       logout ""
-	  rdiff patch             release "re rel"        remove "rm delete"
-	  status "st stat"        rtag "rt rfreeze"       tag "ta freeze"
-	  unedit ""               update "up upd"         watch ""
-	  watchers "")
+typeset -A cmds
+cmds=(add "ad new"            admin "adm rcs"         annotate ann
+      checkout "co get"       commit "ci com"         diff "di dif"
+      edit ""                 editors ""              export "exp ex"
+      history "hi his"        import "im imp"         init ""
+      log "lo rlog"           login "logon lgn"       logout ""
+      rdiff patch             release "re rel"        remove "rm delete"
+      status "st stat"        rtag "rt rfreeze"       tag "ta freeze"
+      unedit ""               update "up upd"         watch ""
+      watchers "")
 
 if (( CURRENT == 1 )); then
-  compadd ${(k)commands} || compadd ${(kv)=commands}
+  compadd ${(k)cmds} || compadd ${(kv)=cmds}
 else
   case "$words[1]" in
     add|ad|new) _cvs_add;;
diff -u -r oc/User/_find Completion/User/_find
--- oc/User/_find	Thu Aug 26 11:29:02 1999
+++ Completion/User/_find	Thu Aug 26 13:41:51 1999
@@ -1,59 +1,59 @@
 #compdef find
 
 _arguments \
-  '-daystart' \
-  '-depth' \
-  '-follow' \
-  '-help' \
-  '-maxdepth:maximum search depth:' \
-  '-mindepth:minimum search depth:' \
-  '-mount' \
-  '-noleaf' \
-  '-version' \
-  '-xdev' \
-  '-amin:access time (minutes):' \
-  '-cmin:inode change time (minutes):' \
-  '-mmin:modification time (minutes):' \
-  '-atime:access time (days):' \
-  '-ctime:inode change time (days):' \
-  '-mtime:modification time (days):' \
-  '-anewer:file to compare (access time):_files' \
-  '-cnewer:file to compare (inode change time):_files' \
-  '-newer:file to compare (modification time):_files' \
-  '-used:access after inode change (days):' \
-  '-empty' \
-  '-false' \
-  '-fstype:filesystem type:(ufs 4.2 4.3 nfs tmp mfs S51K S52K)' \
-  '-gid:numeric group ID:' \
-  '-group:group:_groups' \
-  '-uid:numeric user ID:' \
-  '-user:user:_users' \
-  '-lname:link pattern to search:' \
-  '-ilname:link pattern to search (case insensitive):' \
-  '-name:name pattern to search:' \
-  '-iname:name pattern to search (case insensitive):' \
-  '-path:path pattern to search:' \
-  '-ipath:path pattern to search (case insensitive):' \
-  '-regex:regular expression to search:' \
-  '-iregex:regular expression to search (case insensitive):' \
-  '-inum:inode number:' \
-  '-links:number of links:' \
-  '-nouser' \
-  '-nogroup' \
-  '-perm:file permission bits:' \
-  '-size:file size:' \
-  '-true' \
-  '-type:file type:(b c d p f l s)' \
-  '-xtype:file type:(b c d p f l s)' \
-  '-exec:program: _command_names -e:*\;::program arguments: _normal' \
-  '-ok:program: _command_names -e:*\;::program arguments: _normal' \
-  '-fls:output file:_files' \
-  '-fprint:output file:_files' \
-  '-fprint0:output file:_files' \
-  '-fprintf:output file:_files:output format:' \
-  '-print' \
-  '-print0' \
-  '-printf:output format:' \
-  '-prune' \
-  '-ls' \
+  '*-daystart' \
+  '*-depth' \
+  '*-follow' \
+  '*-help' \
+  '*-maxdepth:maximum search depth:' \
+  '*-mindepth:minimum search depth:' \
+  '*-mount' \
+  '*-noleaf' \
+  '*-version' \
+  '*-xdev' \
+  '*-amin:access time (minutes):' \
+  '*-cmin:inode change time (minutes):' \
+  '*-mmin:modification time (minutes):' \
+  '*-atime:access time (days):' \
+  '*-ctime:inode change time (days):' \
+  '*-mtime:modification time (days):' \
+  '*-anewer:file to compare (access time):_files' \
+  '*-cnewer:file to compare (inode change time):_files' \
+  '*-newer:file to compare (modification time):_files' \
+  '*-used:access after inode change (days):' \
+  '*-empty' \
+  '*-false' \
+  '*-fstype:filesystem type:(ufs 4.2 4.3 nfs tmp mfs S51K S52K)' \
+  '*-gid:numeric group ID:' \
+  '*-group:group:_groups' \
+  '*-uid:numeric user ID:' \
+  '*-user:user:_users' \
+  '*-lname:link pattern to search:' \
+  '*-ilname:link pattern to search (case insensitive):' \
+  '*-name:name pattern to search:' \
+  '*-iname:name pattern to search (case insensitive):' \
+  '*-path:path pattern to search:' \
+  '*-ipath:path pattern to search (case insensitive):' \
+  '*-regex:regular expression to search:' \
+  '*-iregex:regular expression to search (case insensitive):' \
+  '*-inum:inode number:' \
+  '*-links:number of links:' \
+  '*-nouser' \
+  '*-nogroup' \
+  '*-perm:file permission bits:' \
+  '*-size:file size:' \
+  '*-true' \
+  '*-type:file type:(b c d p f l s)' \
+  '*-xtype:file type:(b c d p f l s)' \
+  '*-exec:program: _command_names -e:*\;::program arguments: _normal' \
+  '*-ok:program: _command_names -e:*\;::program arguments: _normal' \
+  '*-fls:output file:_files' \
+  '*-fprint:output file:_files' \
+  '*-fprint0:output file:_files' \
+  '*-fprintf:output file:_files:output format:' \
+  '*-print' \
+  '*-print0' \
+  '*-printf:output format:' \
+  '*-prune' \
+  '*-ls' \
   '*:directory:_files -/'

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-25  8:24 Sven Wischnowsky
@ 1999-08-26 10:54 ` Tanaka Akira
  0 siblings, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-26 10:54 UTC (permalink / raw)
  To: zsh-workers

In article <199908250824.KAA10555@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> The syntax is, of course: `*::descr:action'.

I made new cvs completion functions using the syntax.
But it does not work well.

Z(2):akr@is27e1u11% ./Src/zsh -f
is27e1u11% bindkey -e; fpath=($PWD/Completion/*(/)); autoload -U compinit; compinit -D; compdef _tst tst
is27e1u11% compconf group_matches=yes
is27e1u11% compconf message_format='%d'
is27e1u11% compconf description_format='%d'
is27e1u11% cvs diff <TAB>
Completion/       Etc/              Src/              
Config/           Functions/        StartupFiles/     
Doc/              Misc/             Util/             
option
--allow-root=     -7                -T                -n
--help            -8                -U                -p
--help-commands   -9                -W                -q
--help-options    -B                -a                -r
--help-synonyms   -C                -b                -s
--version         -D                -c                -t
-0                -F                -d                -u
-1                -H                -e                -v
-2                -I                -f                -w
-3                -L                -h                -x
-4                -N                -i                -z
-5                -Q                -k                
-6                -R                -l                

cvs common options such as --version are completed addition to options
for cvs diff. This behavious is reproducible as follows:

is27e1u11% _tst () { _arguments '-x' '*::mesg:_tst2' }
is27e1u11% _tst2 () { compadd "$@" aaa }
is27e1u11% tst x x <TAB>
option
-x    
mesg
aaa   

is27e1u11% cvs -e vi  
unknown cvs command: -e
option
--allow-root=     -H                -f                -t
--help            -Q                -l                -v
--help-commands   -T                -n                -w
--help-options    -a                -q                -x
--help-synonyms   -b                -r                -z
--version         -d                -s                

_arguments does not cutoff words in this case. Hm.

Index: Completion/Base/_arguments
===================================================================
RCS file: /projects/zsh/zsh/Completion/Base/_arguments,v
retrieving revision 1.1.1.12
diff -u -F^( -r1.1.1.12 _arguments
--- _arguments	1999/08/26 10:07:28	1.1.1.12
+++ _arguments	1999/08/26 10:32:26
@@ -331,9 +331,12 @@
 
       if [[ -n "$uns" ]]; then
 	uns="${(j::)${(@k)oneshot[(I)${ws[1][1]}[$uns]]#[-+]}}"
-	unset "opts[${(@)^opts[(I)${ws[1][1]}[$uns]]}]" \
-	      "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]" \
-	      "odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]"
+	tmp=(
+	  "opts[${(@)^opts[(I)${ws[1][1]}[$uns]]}]"
+	  "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]"
+	  "odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]"
+	)
+	(( $#tmp )) && unset "$tmp[@]"
       fi
 
       # If we didn't find a matching option description and we were
@@ -442,9 +445,12 @@
 
     if [[ -n "$uns" ]]; then
       uns="${(j::)${(@k)oneshot[(I)${ws[1][1]}[$uns]]#[-+]}}"
-      unset "opts[${(@)^opts[(I)${pre[1]}[$uns]]}]" \
-	    "dopts[${(@)^dopts[(I)${pre[1]}[$uns]]}]" \
-	    "odopts[${(@)^odopts[(I)${pre[1]}[$uns]]}]"
+      tmp=(
+	"opts[${(@)^opts[(I)${pre[1]}[$uns]]}]"
+	"dopts[${(@)^dopts[(I)${pre[1]}[$uns]]}]"
+	"odopts[${(@)^odopts[(I)${pre[1]}[$uns]]}]"
+      )
+      (( $#tmp )) && unset "$tmp[@]"
     fi
 
     if [[ -n "$opt" ]]; then
@@ -458,7 +464,7 @@
 	if [[ -n "$sopts" && -n "$PREFIX" && "$PREFIX" = [-+]${~soptseq}[$sopts] ]]; then
 	  if [[ "$PREFIX" = [-+]${~soptseq1} ]]; then
 	    compadd "$expl[@]" -Q \
-                    -y "( ${(k)opts} ${(k)dopts} ${(k)odopts} )" - \
+                    -y "( ${(j: :)${(@M)${(@k)opts}:#[-+]?}} ${(j: :)${(@M)${(@k)dopts}:#[-+]?}} ${(j: :)${(@M)${(@k)odopts}:#[-+]?}} )" - \
                     "${PREFIX}${(@k)^opts[(I)${PREFIX[1]}?]#?}" \
 		    "${PREFIX}${(@k)^dopts[(I)${PREFIX[1]}?]#?}" \
 		    "${PREFIX}${(@k)^odopts[(I)${PREFIX[1]}?]#?}" && ret=0
diff -Naur Completion/Cvs/_cvs Completion/Cvs+/_cvs
--- Completion/Cvs/_cvs	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs	Thu Aug 26 19:27:22 1999
@@ -0,0 +1,14 @@
+#compdef cvs
+
+# "+Qqrwtnlvb:T:e:d:Hfz:s:xa"
+_arguments -s \
+  -{a,f,H,l,n,Q,q,r,t,v,w,x} \
+  '--version' '--help' '--help-commands' '--help-synonyms' '--help-options' \
+  '--allow-root=-:rootdir:_files -/' \
+  '-b+:bindir:_cvs_bindir' \
+  '-T+:temporary directory:_cvs_tempdir' \
+  '-d+:cvsroot:_cvs_root' \
+  '-e+:editor:_cvs_editor' \
+  '-s+:user variable:_cvs_user_variable' \
+  '-z:gzip level:_cvs_gzip_level' \
+  '*::cvs command:_cvs_command'
diff -Naur Completion/Cvs/_cvs_D Completion/Cvs+/_cvs_D
--- Completion/Cvs/_cvs_D	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_D	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+compadd "$@" today yesterday week\ ago month\ ago
diff -Naur Completion/Cvs/_cvs_add Completion/Cvs+/_cvs_add
--- Completion/Cvs/_cvs_add	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_add	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,7 @@
+#autoload
+
+# "+k:m:"
+_arguments -s \
+  '-k+:keyword substitution:_cvs_k' \
+  '-m+:message:_cvs_m' \
+  '*:file:_cvs_files_unmaintained' \
diff -Naur Completion/Cvs/_cvs_admin Completion/Cvs+/_cvs_admin
--- Completion/Cvs/_cvs_admin	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_admin	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,21 @@
+#autoload
+
+# "+ib::c:a:A:e:l::u::LUn:N:m:o:s:t::IqxV:k:"
+_arguments -s \
+  -{i,L,U,I,q,x} \
+  '-b-:default branch:(1.1.1)' \
+  '-c+:comment leader (not used):' \
+  '-a+:login names (not work with CVS):' \
+  '-A+:access list to append (not work with CVS):' \
+  '-e+:access list to erase (not work with CVS):' \
+  '-l-:revision to lock:' \
+  '-u-:revision to unlock:' \
+  '-n+:symbolic-name[\:revision]:' \
+  '-N+:symbolic-name[\:revision]:' \
+  '-m+:revision\:msg:' \
+  '-o+:range to delete:' \
+  '-s+:state[\:revision]:' \
+  '-t-:descriptive text:_cvs_admin_t' \
+  '-V+:version (obsolete):' \
+  '-k+:keyword substitution:_cvs_k' \
+  '*:file:_cvs_files'
diff -Naur Completion/Cvs/_cvs_admin_t Completion/Cvs+/_cvs_admin_t
--- Completion/Cvs/_cvs_admin_t	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_admin_t	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,7 @@
+#autoload
+
+if compset -P -; then
+  _message 'descriptive text'
+else
+  _files "$@"
+fi
diff -Naur Completion/Cvs/_cvs_annotate Completion/Cvs+/_cvs_annotate
--- Completion/Cvs/_cvs_annotate	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_annotate	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,8 @@
+#autoload
+
+# "+lr:D:fR"
+_arguments -s \
+  -{l,f,R} \
+  '-r+:tag:_cvs_revisions' \
+  '-D+:date:_cvs_D' \
+  '*:file:_cvs_files'
diff -Naur Completion/Cvs/_cvs_bindir Completion/Cvs+/_cvs_bindir
--- Completion/Cvs/_cvs_bindir	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_bindir	Thu Aug 26 19:20:37 1999
@@ -0,0 +1,3 @@
+#autoload
+
+compadd "$@" /usr/local/bin || _files "$@" -/
diff -Naur Completion/Cvs/_cvs_checkout Completion/Cvs+/_cvs_checkout
--- Completion/Cvs/_cvs_checkout	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_checkout	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,11 @@
+#autoload
+
+# "+ANnk:d:flRpQqcsr:D:j:P"
+_arguments -s \
+  -{A,N,n,f,l,R,q,c,s,P} \
+  '-k+:keyword substitution:_cvs_k' \
+  '-d+:directory:_files -/' \
+  '-r+:tag:_cvs_revisions' \
+  '-D+:date:_cvs_D' \
+  '-j+:tag:_cvs_revisions' \
+  '*:module:_cvs_modules'
diff -Naur Completion/Cvs/_cvs_command Completion/Cvs+/_cvs_command
--- Completion/Cvs/_cvs_command	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_command	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,42 @@
+#autoload
+
+typeset -A commands
+commands=(add "ad new"            admin "adm rcs"         annotate ann
+	  checkout "co get"       commit "ci com"         diff "di dif"
+	  edit ""                 editors ""              export "exp ex"
+	  history "hi his"        import "im imp"         init ""
+	  log "lo rlog"           login "logon lgn"       logout ""
+	  rdiff patch             release "re rel"        remove "rm delete"
+	  status "st stat"        rtag "rt rfreeze"       tag "ta freeze"
+	  unedit ""               update "up upd"         watch ""
+	  watchers "")
+
+if (( CURRENT == 1 )); then
+  compadd ${(k)commands} || compadd ${(kv)=commands}
+else
+  case "$words[1]" in
+    add|ad|new) _cvs_add;;
+    admin|adm|rcs) _cvs_admin;;
+    annotate|ann) _cvs_annotate;;
+    checkout|co|get) _cvs_checkout;;
+    commit|ci|com) _cvs_commit;;
+    diff|di|dif) _cvs_diff;;
+    edit) _cvs_edit;;
+    editors) _cvs_editors;;
+    export|exp|ex) _cvs_export;;
+    history|hi|his) _cvs_history;;
+    import|im|imp) _cvs_import;;
+    init) _cvs_init;;
+    login|logon|lgn|logout) _cvs_login;;
+    rdiff|patch|pa) _cvs_rdiff;;
+    release|re|rel) _cvs_release;;
+    remove|rm|delete) _cvs_remove;;
+    status|st|stat) _cvs_status;;
+    tag|ta|freeze) _cvs_tag;;
+    unedit) _cvs_unedit;;
+    update|up|upd) _cvs_update;;
+    watch) _cvs_watch;;
+    watchers) _cvs_watchers;;
+    *) _message "unknown cvs command: $words[1]";;
+  esac
+fi
diff -Naur Completion/Cvs/_cvs_commit Completion/Cvs+/_cvs_commit
--- Completion/Cvs/_cvs_commit	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_commit	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,9 @@
+#autoload
+
+# "+nlRm:fF:r:"
+_arguments -s \
+  -{n,l,R,f} \
+  '-m+:message:_cvs_m' \
+  '-F+:log message file:_files' \
+  '-r+:tag:_cvs_revisions' \
+  '*:file:_cvs_files_modified'
diff -Naur Completion/Cvs/_cvs_diff Completion/Cvs+/_cvs_diff
--- Completion/Cvs/_cvs_diff	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_diff	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,15 @@
+#autoload
+
+# "+abcdefhilnpstuw0123456789BHNRC:D:F:I:L:U:V:W:k:r:"
+_arguments -s \
+  -{a,b,c,d,e,f,h,i,l,n,p,s,t,u,w,0,1,2,3,4,5,6,7,8,9,B,H,N,R} \
+  '-C:lines:' \
+  '-D+:date:_cvs_D' \
+  '-F+:regex:' \
+  '-I+:regex:' \
+  '*-L+:label:' \
+  '-U:lines:' \
+  '-W:columns:' \
+  '-k+:keyword substitution:_cvs_k' \
+  '-r+:tag:_cvs_revisions' \
+  '*:file:_cvs_diff_arg'
diff -Naur Completion/Cvs/_cvs_diff_arg Completion/Cvs+/_cvs_diff_arg
--- Completion/Cvs/_cvs_diff_arg	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_diff_arg	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_cvs_files_modified || _cvs_files
diff -Naur Completion/Cvs/_cvs_directories Completion/Cvs+/_cvs_directories
--- Completion/Cvs/_cvs_directories	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_directories	Thu Aug 26 19:30:18 1999
@@ -0,0 +1,8 @@
+#autoload
+
+if [[ -d ${pref}CVS ]]; then
+  _cvs_setup_direntries
+  (( $#entries )) && compgen "$@" -g "${(j:|:)${(@)entries:q}}"
+else
+  _files "$@"
+fi
diff -Naur Completion/Cvs/_cvs_edit Completion/Cvs+/_cvs_edit
--- Completion/Cvs/_cvs_edit	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_edit	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,7 @@
+#autoload
+
+# "+lRa:"
+_arguments -s \
+  -{l,R} \
+  '-a+:action:(edit unedit commit all none)'
+  '*:file:_cvs_files'
diff -Naur Completion/Cvs/_cvs_editor Completion/Cvs+/_cvs_editor
--- Completion/Cvs/_cvs_editor	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_editor	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+compadd "$@" vi
diff -Naur Completion/Cvs/_cvs_editors Completion/Cvs+/_cvs_editors
--- Completion/Cvs/_cvs_editors	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_editors	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,6 @@
+#autoload
+
+# "+lR"
+_arguments -s \
+  -{l,R} \
+  '*:file:_cvs_files'
diff -Naur Completion/Cvs/_cvs_export Completion/Cvs+/_cvs_export
--- Completion/Cvs/_cvs_export	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_export	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,10 @@
+#autoload
+
+# "+Nnk:d:flRQqr:D:"
+_arguments -s \
+  -{N,n,f,l,R,Q,q} \
+  '-k+:keyword substitution:_cvs_k' \
+  '-d+:directory:_files -/' \
+  '-r+:tag:_cvs_revisions' \
+  '-D+:date:_cvs_D' \
+  '*:module:_cvs_modules'
diff -Naur Completion/Cvs/_cvs_extract_directory_entries Completion/Cvs+/_cvs_extract_directory_entries
--- Completion/Cvs/_cvs_extract_directory_entries	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_extract_directory_entries	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+entries=($entries ${${${(M)rawentries:#D/*}#D/}%%/*})
diff -Naur Completion/Cvs/_cvs_extract_file_entries Completion/Cvs+/_cvs_extract_file_entries
--- Completion/Cvs/_cvs_extract_file_entries	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_extract_file_entries	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+entries=($entries ${${${(M)rawentries:#/*}#/}%%/*})
diff -Naur Completion/Cvs/_cvs_extract_modifiedfile_entries Completion/Cvs+/_cvs_extract_modifiedfile_entries
--- Completion/Cvs/_cvs_extract_modifiedfile_entries	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_extract_modifiedfile_entries	Thu Aug 26 19:30:32 1999
@@ -0,0 +1,13 @@
+#autoload
+
+if [[ -n "$compconfig[_cvs_disable_stat]" ]] ||
+  ! { zmodload -e stat || zmodload stat }; then
+  _cvs_extract_file_entries
+  return
+fi
+
+local ents pats
+ents=(${${${${(M)rawentries:#/*}#/}/\\/[^\\/]#\\///}%/[^/]#/[^/]#})
+pats=(${${${(f)"$(LANG=C builtin stat -gn +mtime -F '%a %b %e %T %Y' ${pref}*(D))"}##*/}/ //})
+eval 'ents=(${ents:#('${(j:|:)${(@)pats:q}}')})'
+entries=($entries ${ents%%/*})
diff -Naur Completion/Cvs/_cvs_files Completion/Cvs+/_cvs_files
--- Completion/Cvs/_cvs_files	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_files	Thu Aug 26 19:30:43 1999
@@ -0,0 +1,10 @@
+#autoload
+
+local qpref pref entries
+_cvs_setup_prefix
+if [[ -d ${pref}CVS ]]; then
+  _cvs_setup_allentries
+  (( $#entries )) && compgen "$@" -g "${(j:|:)${(@)entries:q}}"
+else
+  _files "$@"
+fi
diff -Naur Completion/Cvs/_cvs_files_modified Completion/Cvs+/_cvs_files_modified
--- Completion/Cvs/_cvs_files_modified	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_files_modified	Thu Aug 26 19:29:54 1999
@@ -0,0 +1,10 @@
+#autoload
+
+local qpref pref entries
+_cvs_setup_prefix
+if [[ -d ${pref}CVS ]]; then
+  _cvs_setup_modentries
+  (( $#entries )) && compgen "$@" -g "${(j:|:)${(@)entries:q}}"
+else
+  _files "$@"
+fi
diff -Naur Completion/Cvs/_cvs_files_removed Completion/Cvs+/_cvs_files_removed
--- Completion/Cvs/_cvs_files_removed	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_files_removed	Thu Aug 26 19:30:53 1999
@@ -0,0 +1,15 @@
+#autoload
+
+local qpref pref entries
+_cvs_setup_prefix
+if [[ -d ${pref}CVS ]]; then
+  _cvs_setup_allentries
+  setopt localoptions unset
+  local omit
+  omit=(${pref}*(D:t))
+  eval 'entries=(${entries:#('${(j:|:)${(@)omit:q}}')})'
+  compadd "$@" -P "$qpref" - ${entries:q} ||
+  _cvs_directories "$@"
+else
+  _files "$@"
+fi
diff -Naur Completion/Cvs/_cvs_files_unmaintained Completion/Cvs+/_cvs_files_unmaintained
--- Completion/Cvs/_cvs_files_unmaintained	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_files_unmaintained	Thu Aug 26 19:31:16 1999
@@ -0,0 +1,26 @@
+#autoload
+
+if (( ! $+_cvs_ignore_default )); then
+  _cvs_ignore_default=(
+    RCS SCCS CVS CVS.adm RCSLOG 'cvslog.*' tags TAGS .make.state .nse_depinfo
+    '*\~' '\#*' '.\#*' ',*' '_$*' '*$' '*.old' '*.bak' '*.BAK' '*.orig' '*.rej'
+    '.del-*' '*.a' '*.olb' '*.o' '*.obj' '*.so' '*.exe' '*.Z' '*.elc' '*.ln'
+    core
+  )
+fi
+
+local qpref pref entries
+_cvs_setup_prefix
+if [[ -d ${pref}CVS ]]; then
+  _cvs_setup_allentries
+  setopt localoptions unset
+  local omit
+  omit=($_cvs_ignore_default ${entries:q} ${=cvsignore})
+  [[ -r ~/.cvsignore ]] && omit=($omit $(<~/.cvsignore))
+  [[ -r ${pref}.cvsignore ]] && omit=($omit $(<${pref}.cvsignore))
+  compgen "$@" -g '*~(*/|)('${(j:|:)omit}')(D)' ||
+  compgen "$@" -g '*~(*/|)('${(j:|:)${(@)entries:q}}')(D)' ||
+  _cvs_directories "$@"
+else
+  _files "$@"
+fi
diff -Naur Completion/Cvs/_cvs_gzip_level Completion/Cvs+/_cvs_gzip_level
--- Completion/Cvs/_cvs_gzip_level	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_gzip_level	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+compadd "$@" 9
diff -Naur Completion/Cvs/_cvs_history Completion/Cvs+/_cvs_history
--- Completion/Cvs/_cvs_history	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_history	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,18 @@
+#autoload
+
+# "+Tacelow?D:b:f:m:n:p:r:t:u:x:X:z:"
+_arguments -s \
+  -{T,a,c,e,l,o,w,\?} \
+  '-D+:date:_cvs_D' \
+  '-b+:string:' \
+  '-f+:arg:' \
+  '-m+:module:_cvs_modules' \
+  '-n+:arg:' \
+  '*-p+:repository:' \
+  '-r+:rev:' \
+  '-t+:tag:' \
+  '-u+:user name:' \
+  '-x+:type:_cvs_history_x' \
+  '-X+:arg:' \
+  '-z+:arg:' \
+  '*:file:_cvs_files'
diff -Naur Completion/Cvs/_cvs_history_x Completion/Cvs+/_cvs_history_x
--- Completion/Cvs/_cvs_history_x	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_history_x	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,5 @@
+#autoload
+
+compset -P '*'
+# It should describe meaning.
+compadd F O E T C G U W A M R
diff -Naur Completion/Cvs/_cvs_import Completion/Cvs+/_cvs_import
--- Completion/Cvs/_cvs_import	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_import	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,13 @@
+#autoload
+
+# "+Qqdb:m:I:k:W:"
+_arguments -s \
+  -{Q,q,d} \
+  '-b+:branch:' \
+  '-m+:message:_cvs_m' \
+  '*-I+:name:_files' \
+  '-k+:keyword substitution:_cvs_k' \
+  '*-W+:spec:' \
+  ':repository:_cvs_modules' \
+  ':vendor tag:' \
+  ':release tag:'
diff -Naur Completion/Cvs/_cvs_init Completion/Cvs+/_cvs_init
--- Completion/Cvs/_cvs_init	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_init	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+false
diff -Naur Completion/Cvs/_cvs_k Completion/Cvs+/_cvs_k
--- Completion/Cvs/_cvs_k	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_k	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+compadd "$@" kv kvl k o b v
diff -Naur Completion/Cvs/_cvs_login Completion/Cvs+/_cvs_login
--- Completion/Cvs/_cvs_login	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_login	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+false
diff -Naur Completion/Cvs/_cvs_m Completion/Cvs+/_cvs_m
--- Completion/Cvs/_cvs_m	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_m	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_message "log message"
diff -Naur Completion/Cvs/_cvs_modules Completion/Cvs+/_cvs_modules
--- Completion/Cvs/_cvs_modules	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_modules	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,12 @@
+#autoload
+
+local root=$CVSROOT
+[[ -f CVS/Root ]] && root=$(<CVS/Root)
+
+if [[ $root = :* || ! -d $root ]]; then
+  _message "module name"
+else
+  compadd - \
+    $root/^CVSROOT(:t) \
+    ${${(M)${(f)"$(<$root/CVSROOT/modules)"}:#[^#]*}%%[ 	]*}
+fi
diff -Naur Completion/Cvs/_cvs_rdiff Completion/Cvs+/_cvs_rdiff
--- Completion/Cvs/_cvs_rdiff	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_rdiff	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,10 @@
+#autoload
+
+# "+V:k:cuftsQqlRD:r:"
+_arguments -s \
+  -{c,u,f,t,s,Q,q,l,R} \
+  '-V+:version:' \
+  '-k+:keyword substitution:_cvs_k' \
+  '*-D+:date:_cvs_D' \
+  '*-r+:tag:_cvs_revisions' \
+  '*:module:_cvs_modules'
diff -Naur Completion/Cvs/_cvs_release Completion/Cvs+/_cvs_release
--- Completion/Cvs/_cvs_release	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_release	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,6 @@
+#autoload
+
+# "+Qdq"
+_arguments -s \
+  -{Q,d,q} \
+  '*:directory:_files -/'
diff -Naur Completion/Cvs/_cvs_remove Completion/Cvs+/_cvs_remove
--- Completion/Cvs/_cvs_remove	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_remove	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,6 @@
+#autoload
+
+# "+flR"
+_arguments -s \
+  -{f,l,R} \
+  '*:file:_cvs_files_removed'
diff -Naur Completion/Cvs/_cvs_revisions Completion/Cvs+/_cvs_revisions
--- Completion/Cvs/_cvs_revisions	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_revisions	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+compadd - ${${${(M)${(f)"$(cvs -q status -vl .)"}:#	*}##[ 	]##}%%[ 	]*}
diff -Naur Completion/Cvs/_cvs_root Completion/Cvs+/_cvs_root
--- Completion/Cvs/_cvs_root	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_root	Thu Aug 26 19:20:37 1999
@@ -0,0 +1,11 @@
+#autoload
+
+if (( ! $+_cvs_roots )); then
+  if [[ -f ~/.cvspass ]]; then
+    _cvs_roots=(${${(f)"$(<~/.cvspass)"}%% *})
+  else
+    _cvs_roots=()
+  fi
+fi
+
+compadd "$@" $_cvs_roots || _files "$@" -/
diff -Naur Completion/Cvs/_cvs_setup_allentries Completion/Cvs+/_cvs_setup_allentries
--- Completion/Cvs/_cvs_setup_allentries	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_setup_allentries	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,9 @@
+#autoload
+
+entries=()
+if [[ -f ${pref}CVS/Entries ]]; then
+  local rawentries
+  rawentries=(${(f)"$(<${pref}CVS/Entries)"})
+  _cvs_extract_file_entries
+  _cvs_extract_directory_entries
+fi
diff -Naur Completion/Cvs/_cvs_setup_direntries Completion/Cvs+/_cvs_setup_direntries
--- Completion/Cvs/_cvs_setup_direntries	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_setup_direntries	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,8 @@
+#autoload
+
+entries=()
+if [[ -f ${pref}CVS/Entries ]]; then
+  local rawentries
+  rawentries=(${(f)"$(<${pref}CVS/Entries)"})
+  _cvs_extract_directory_entries
+fi
diff -Naur Completion/Cvs/_cvs_setup_modentries Completion/Cvs+/_cvs_setup_modentries
--- Completion/Cvs/_cvs_setup_modentries	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_setup_modentries	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,9 @@
+#autoload
+
+entries=()
+if [[ -f ${pref}CVS/Entries ]]; then
+  local rawentries
+  rawentries=(${(f)"$(<${pref}CVS/Entries)"})
+  _cvs_extract_modifiedfile_entries
+  _cvs_extract_directory_entries
+fi
diff -Naur Completion/Cvs/_cvs_setup_prefix Completion/Cvs+/_cvs_setup_prefix
--- Completion/Cvs/_cvs_setup_prefix	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_setup_prefix	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,9 @@
+#autoload
+
+if [[ -prefix */ ]]; then
+  qpref="${PREFIX%/*}/"
+  pref=$~qpref
+else
+  qpref=
+  pref=./
+fi
diff -Naur Completion/Cvs/_cvs_status Completion/Cvs+/_cvs_status
--- Completion/Cvs/_cvs_status	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_status	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,6 @@
+#autoload
+
+# "+vlR"
+_arguments -s \
+  -{v,l,R} \
+  '*:file:_cvs_files'
diff -Naur Completion/Cvs/_cvs_tag Completion/Cvs+/_cvs_tag
--- Completion/Cvs/_cvs_tag	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_tag	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,8 @@
+#autoload
+
+# "+FQqlRcdr:D:bf"
+_arguments -s \
+  -{F,Q,q,l,R,c,d,b,f} \
+  '-r+:tag:_cvs_revisions' \
+  '-D+:date:_cvs_D' \
+  '*:file:_cvs_files'
diff -Naur Completion/Cvs/_cvs_tempdir Completion/Cvs+/_cvs_tempdir
--- Completion/Cvs/_cvs_tempdir	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_tempdir	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,3 @@
+#autoload
+
+compadd "$@" $TMPPREFIX:h $TMPDIR /tmp
diff -Naur Completion/Cvs/_cvs_unedit Completion/Cvs+/_cvs_unedit
--- Completion/Cvs/_cvs_unedit	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_unedit	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,6 @@
+#autoload
+
+# "+lR"
+_arguments -s \
+  -{l,R} \
+  '*:file:_cvs_files'
diff -Naur Completion/Cvs/_cvs_update Completion/Cvs+/_cvs_update
--- Completion/Cvs/_cvs_update	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_update	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,12 @@
+#autoload
+
+# "+ApPflRQqduk:r:D:j:I:W:"
+_arguments -s \
+  -{A,p,P,f,l,R,Q,q,d,u} \
+  '-k+:keyword substitution:_cvs_k' \
+  '-r+:tag:_cvs_revisions' \
+  '-D+:date:_cvs_D' \
+  '-j+:tag:_cvs_revisions' \
+  '*-I+:name:_files' \
+  '*-W+:spec:' \
+  '*:file:_cvs_files'
diff -Naur Completion/Cvs/_cvs_user_variable Completion/Cvs+/_cvs_user_variable
--- Completion/Cvs/_cvs_user_variable	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_user_variable	Thu Aug 26 19:20:37 1999
@@ -0,0 +1,7 @@
+#autoload
+
+if compset -P '*='; then
+  _default
+else
+  _message "variable=value"
+fi
diff -Naur Completion/Cvs/_cvs_watch Completion/Cvs+/_cvs_watch
--- Completion/Cvs/_cvs_watch	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_watch	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,21 @@
+#autoload
+
+if (( CURRENT == 2 )); then
+  compadd on off add remove
+else
+  case "$words[2]" in
+    on|off) # "+lR"
+      _arguments -s \
+	-{l,R} \
+	':watch command:' \
+	':*:file:_cvs_files'
+      ;;
+    add|remove) # "+lRa:"
+      _arguments -s \
+	-{l,R} \
+	'*-a+:action:(edit unedit commit all none)' \
+	':watch command:' \
+	':*:file:_cvs_files'
+      ;;
+  esac
+fi
diff -Naur Completion/Cvs/_cvs_watchers Completion/Cvs+/_cvs_watchers
--- Completion/Cvs/_cvs_watchers	Thu Jan  1 09:00:00 1970
+++ Completion/Cvs+/_cvs_watchers	Thu Aug 26 19:20:38 1999
@@ -0,0 +1,6 @@
+#autoload
+
+# "+lR"
+_arguments -s \
+  -{l,R} \
+  ':*:file:_cvs_files'
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-25 12:57 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-25 12:57 UTC (permalink / raw)
  To: zsh-workers


Peter Stephenson wrote:

> Sven Wischnowsky wrote:
> >     Btw. I didn't change `_cvs' mainly because I use the `parameter'
> >     module and there is a bug with the stuff that `allows' local
> >     special parameters: the associative array `commands' in `_cvs' has 
> >     (obviously) the same name as the one from the `parameter'
> >     module. The new code in typeset_single() has the effect that this
> >     `local' parameter behaves like the one from the module, i.e. if
> >     you can't use the names of special parameters for local parameters 
> >     without having them behave like the global ones. Maybe we have to
> >     wait for Peter here...
> 
> This isn't a bug, local special parameters are supposed to stay special; it
> would have been much easier if they weren't.  At least, I could change it
> but then things like `local PATH=...' (which is now documented) wouldn't
> work.

Yes, I was to hasty to shout `bug', but this irritated me a lot...

Still, this is potentially dangerous if someone writes a module
defining some parameters  and someone else writes a shell function
using the same names -- almost everything can happen.

I think we should either rename all module parameters to `z*', showing 
(and documenting) how such parameters should be named, or we add a way 
to allow shell functions to say that they really want only a normal
local parameter.

Bye
 Sven


--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-25 12:54 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-25 12:54 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> In article <199908241043.MAA09262@beta.informatik.hu-berlin.de>,
>   Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:
> 
> > Hey, that's good, I didn't think about adding such files -- we could
> > use that to replace `_x_options', too (with `_x_arguments', which
> > could probably still be a pattern function).
> 
> Hm. I prefer _xt_arguments instead of _x_arguments because it depends
> Xt and there is another popular library --- GTK --- that replace it.

Sorry, I wasn't clear. I meant that we should replace the existing
`_x_options' with a new `_x_arguments' which adds only a few simple
standard X options (like `-display') and then uses "$@" like your
_xt_arguments' does (it was that trick that got me excited).

> > Now that I've added `Pbmplus', I'd vote for `Completion/X' (and later
> > `Completion/Gnu', etc.). We'll have to move some things around when we 
> > come to the next open release anyway...
> 
> OK.  I use Completion/X.  However existing files such as _xterm are
> not moved now. They should be moved in next interim release.

Of course, yes. (And `_colors' and `_cursors' should be renamed to
`_x_*' and moved there, too.)

Then I tried to make a first step towards a better `_x_font' and found 
a bug in the completion matching code...

Bye
 Sven

diff -u os/Zle/zle_tricky.c Src/Zle/zle_tricky.c
--- os/Zle/zle_tricky.c	Tue Aug 24 11:13:20 1999
+++ Src/Zle/zle_tricky.c	Wed Aug 25 14:25:59 1999
@@ -2297,7 +2297,9 @@
 	    for (mp = ms->matcher; mp; mp = mp->next) {
 		t = 1;
 		if ((lm && lm == mp) ||
-		    ((oll == ll || olw == lw) && test && mp->wlen < 0))
+		    ((oll == ll || olw == lw) &&
+		     (test == 1 || (!mp->left && !mp->right)) &&
+		     mp->wlen < 0))
 		    /* If we were called recursively, don't use `*' patterns
 		     * at the beginning (avoiding infinite recursion). */
 		    continue;
@@ -2359,7 +2361,7 @@
 				savw = tp[-zoff];
 				tp[-zoff] = '\0';
 				t = match_str(l - ll, w - lw,
-					      NULL, NULL, 1, 1);
+					      NULL, NULL, 1, 2);
 				tp[-zoff] = savw;
 			    } else
 				t = match_str(l + llen + moff, tp + moff,
@@ -2410,6 +2412,12 @@
 			    add_match_sub(NULL, NULL, ol, op, ol);
 			    add_match_sub(NULL, NULL, llen + alen,
 					  lp, llen + alen);
+			} else if (sfx) {
+			    add_match_str(NULL, NULL,
+					  map, ct + ol + alen, sfx);
+			    add_match_part(mp, l + aoff, wap, alen,
+					   l + loff, llen, op, ol, ol, sfx);
+			    add_match_sub(NULL, NULL, 0, wmp, ct);
 			} else {
 			    add_match_str(NULL, NULL,
 					  map, ct + ol + alen, sfx);
@@ -2590,10 +2598,10 @@
 	}
 	for (t = matchparts; (tn = t->next); t = tn) {
 	    s = (tn->prefix ? tn->prefix : tn->suffix);
-	    if (t->prefix)
-		t->prefix = s;
-	    else
+	    if (t->suffix)
 		t->suffix = s;
+	    else
+		t->prefix = s;
 	}
 	t->prefix = t->suffix = NULL;
     }
@@ -4924,13 +4932,15 @@
 	int n;
 
 	for (n = 0; m; m = m->next, n++) {
-	    *mp = (Cmlist) zhalloc(sizeof(struct cmlist));
-	    (*mp)->matcher = m->matcher;
-	    (*mp)->next = NULL;
-	    (*mp)->str = dupstring(m->str);
-	    mp = &((*mp)->next);
-	    addlinknode(matchers, m->matcher);
-	    m->matcher->refc++;
+	    if (m->matcher) {
+		*mp = (Cmlist) zhalloc(sizeof(struct cmlist));
+		(*mp)->matcher = m->matcher;
+		(*mp)->next = NULL;
+		(*mp)->str = dupstring(m->str);
+		mp = &((*mp)->next);
+		addlinknode(matchers, m->matcher);
+		m->matcher->refc++;
+	    }
 	}
 	m = mm;
 	compmatcher = 1;
diff -u -r oc/Core/_multi_parts Completion/Core/_multi_parts
--- oc/Core/_multi_parts	Wed Aug 25 10:26:40 1999
+++ Completion/Core/_multi_parts	Wed Aug 25 14:50:48 1999
@@ -84,6 +84,8 @@
     # No exact match, see how many strings match what's on the line.
 
     compadd -O tmp1 - "${(@)matches%%${sep}*}"
+    tmp2=( "$tmp1[@]" )
+    tmp1=( "$tmp2[@]" )
 
     if [[ $#tmp1 -eq 1 ]]; then
 
diff -u -r oc/User/_xterm Completion/User/_xterm
--- oc/User/_xterm	Wed Aug 25 10:26:49 1999
+++ Completion/User/_xterm	Wed Aug 25 10:37:10 1999
@@ -20,8 +20,8 @@
   '-cu' '+cu' \
   '-dc' '+dc' \
   '-e:program: _command_names -e:*::program arguments: _normal' \
-  '-fb:bold font:' \
-  '-fi:icon font:' \
+  '-fb:bold font:_x_font' \
+  '-fi:icon font:_x_font' \
   '-hc:background color for highlighted text:_colors' \
   '-hf' '+hf' \
   '-ie' '+ie' \
diff -u -r oc/X/_x_font Completion/X/_x_font
--- oc/X/_x_font	Wed Aug 25 10:26:50 1999
+++ Completion/X/_x_font	Wed Aug 25 14:51:56 1999
@@ -1,3 +1,14 @@
 #autoload
 
-_message 'font'
+local expl
+
+# This *has* to be improved some day...
+
+if (( ! $+_font_cache )); then
+  typeset -U _font_cache
+
+ _font_cache=( "${(@)^${(@f)$(xlsfonts)}%%--*}--" )
+fi
+
+_description expl font
+compgen -M 'r:|-=* r:|=*' "$expl[@]" "$@" -S '' -k _font_cache
diff -u -r oc/X/_xt_arguments Completion/X/_xt_arguments
--- oc/X/_xt_arguments	Wed Aug 25 10:26:51 1999
+++ Completion/X/_xt_arguments	Wed Aug 25 10:30:31 1999
@@ -24,7 +24,6 @@
   '+rv' '-rv' '-reverse' \
   '+synchronous' '-synchronous' \
   '-background:background color:_colors' \
-  '-background:background color:_colors' \
   '-bd:border color:_colors' \
   '-bg:background color:_colors' \
   '-bordercolor:border color:_colors' \

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-25  8:24 Sven Wischnowsky
  1999-08-26 10:54 ` Tanaka Akira
  0 siblings, 1 reply; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-25  8:24 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> In article <199908231346.PAA03326@beta.informatik.hu-berlin.de>,
>   Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:
> 
> >   '-opt:*::descr:action'                # all args to the option
> 
> Does this require the actual option?

It did. I wanted to allow this for the `rest arguments', too, and then 
forgot to write it (again). Sorry.

The syntax is, of course: `*::descr:action'.


The patch also contains a hunk for `_vars_eq', making it use default
completion after the equal sign.

Bye
 Sven

diff -u od/Zsh/compsys.yo Doc/Zsh/compsys.yo
--- od/Zsh/compsys.yo	Mon Aug 23 15:47:49 1999
+++ Doc/Zsh/compsys.yo	Wed Aug 25 10:19:54 1999
@@ -902,6 +902,11 @@
 This describes how arguments are to be completed for which no
 description with one of the first two forms was given. This also means 
 that any number of arguments can be completed.
+
+If there are two colons before the message (as in
+`tt(*::)var(message)tt(:)var(action)') the tt(words) special array and 
+the tt(CURRENT) special parameter will be restricted to only the
+normal arguments when the var(Action) is executed or evaluated.
 )
 item(var(opt-spec)[var(description) ...])(
 This describes an option and (if at least one var(description) is
diff -u -r oc/Base/_arguments Completion/Base/_arguments
--- oc/Base/_arguments	Tue Aug 24 11:13:33 1999
+++ Completion/Base/_arguments	Wed Aug 25 10:21:05 1999
@@ -7,7 +7,7 @@
 
 local long args rest ws cur nth def nm expl descr action opt arg tmp
 local single uns ret=1 soptseq soptseq1 sopts prefix line
-local beg optbeg argbeg
+local beg optbeg argbeg nargbeg inopt
 
 # Associative arrays used to collect information about the options.
 
@@ -82,6 +82,16 @@
       opts[$tmp]=''
     fi
     unset "oneshot[$tmp]"
+  elif [[ "$1" = \*::* ]]; then
+
+    # This is `*:...', describing `all other arguments', with argument 
+    # range restriction.
+
+    if [[ "$1" = \*:::* ]]; then
+      rest="*${1[3,-1]}"
+    else
+      rest="$1"
+    fi
   elif [[ "$1" = \*:* ]]; then
 
     # This is `*:...', describing `all other arguments'.
@@ -125,8 +135,9 @@
 nth=1
 line=( "$words[1]" )
 beg=2
-argbeg=2
-optbeg=2
+argbeg=1
+optbeg=1
+nargbeg=1
 
 # ...until the current word is reached.
 
@@ -190,6 +201,7 @@
       def="$opts[$ws[1]]"
       optbeg="$beg"
       argbeg="$beg"
+      inopt=yes
       [[ -n "$oneshot[$ws[1]]" ]] && unset "opts[$ws[1]]"
     else
       uns=''
@@ -199,6 +211,7 @@
 	  def="$opts[$tmp]"
 	  optbeg="$beg"
 	  argbeg="$beg"
+          inopt=yes
 	  uns="${ws[1][2,-1]}"
 	  opt=''
 	fi
@@ -242,6 +255,7 @@
 	  [[ -n "$oneshot[$tmp[1]]" ]] && unset "dopts[$tmp[1]]"
 	  if [[ "$def" = [^*]*[^\\]:*[^\\]:* ]]; then
             def="${def#?*[^\\]:*[^\\]:}"
+            inopt=yes
           else
             def=''
 	  fi
@@ -279,6 +293,7 @@
               def="${def#?*[^\\]:*[^\\]:}"
 	      optbeg="$beg"
 	      argbeg="$beg"
+              inopt=yes
             else
               def=''
             fi
@@ -303,6 +318,8 @@
       if [[ -n "$opt" && -n "$arg" ]]; then
         def=''
 	line=( "$line[@]" "$ws[1]" )
+	[[ -n "$inopt" ]] && nargbeg=$(( beg - 1 ))
+	inopt=''
 	(( nth++ ))
       fi
     fi
@@ -313,6 +330,8 @@
   (( beg++ ))
 done
 
+[[ -n "$inopt" ]] && nargbeg="$beg"
+
 # Now generate the matches.
 
 if [[ $#long -ne 0 && "$PREFIX" = --* ]]; then
@@ -339,12 +358,10 @@
       # If we have none at all, use the one for this argument position.
 
       def="$args[nth]"
-      [[ -z "$def" ]] && def="$rest"
-
-      if [[ "$def" = \** ]]; then
-        def="${def#*[^\\]:}"
-	[[ "$def" = :* ]] && def="$def[2,-1]"
-	[[ "$def" = :* ]] && def="$def[2,-1]"
+      if [[ -z "$def" ]]; then
+        def="$rest"
+	optbeg="$nargbeg"
+	argbeg="$nargbeg"
       fi
     fi
 
@@ -456,6 +473,8 @@
 	  def="$def[2,-1]"
 	  beg=$optbeg
 	fi
+
+	[[ beg -ge $#words ]] && beg=$(( $#words - 1 ))
 
 	shift beg words
 	(( CURRENT -= beg ))
diff -u -r oc/Builtins/_vars_eq Completion/Builtins/_vars_eq
--- oc/Builtins/_vars_eq	Tue Aug 24 11:13:35 1999
+++ Completion/Builtins/_vars_eq	Wed Aug 25 09:08:07 1999
@@ -1,3 +1,7 @@
 #compdef declare export integer local readonly typeset
 
-_parameters -q -S '='
+if compset -P '*='; then
+  _default
+else
+  _parameters -q -S '='
+fi

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-24 10:43 Sven Wischnowsky
@ 1999-08-25  1:56 ` Tanaka Akira
  0 siblings, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-25  1:56 UTC (permalink / raw)
  To: zsh-workers

In article <199908241043.MAA09262@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> Hey, that's good, I didn't think about adding such files -- we could
> use that to replace `_x_options', too (with `_x_arguments', which
> could probably still be a pattern function).

Hm. I prefer _xt_arguments instead of _x_arguments because it depends
Xt and there is another popular library --- GTK --- that replace it.

> Now that I've added `Pbmplus', I'd vote for `Completion/X' (and later
> `Completion/Gnu', etc.). We'll have to move some things around when we 
> come to the next open release anyway...

OK.  I use Completion/X.  However existing files such as _xterm are
not moved now. They should be moved in next interim release.

Index: Completion/User/_xterm
===================================================================
RCS file: /projects/zsh/zsh/Completion/User/_xterm,v
retrieving revision 1.1.1.2
diff -u -F^( -r1.1.1.2 _xterm
--- _xterm	1999/08/24 09:18:05	1.1.1.2
+++ _xterm	1999/08/25 01:38:46
@@ -1,6 +1,6 @@
 #compdef xterm
 
-_arguments \
+_xt_arguments \
   '-version' \
   '-help' \
   '-132' \
@@ -16,13 +16,13 @@
   '-cc:character class:' \
   '-cm' '+cm' \
   '-cn' '+cn' \
-  '-cr:text cursor color:_color' \
+  '-cr:text cursor color:_colors' \
   '-cu' '+cu' \
   '-dc' '+dc' \
   '-e:program: _command_names -e:*::program arguments: _normal' \
   '-fb:bold font:' \
   '-fi:icon font:' \
-  '-hc:background color for highlighted text:_color' \
+  '-hc:background color for highlighted text:_colors' \
   '-hf' '+hf' \
   '-ie' '+ie' \
   '-im' '+im' \
@@ -31,7 +31,7 @@
   '-ls' '+ls' \
   '-mb' '+mb' \
   '-mc:multi-click threshold (milliseconds):' \
-  '-ms:pointer cursor color:_color' \
+  '-ms:pointer cursor color:_colors' \
   '-nb:margin bell number:' \
   '-nul' '+nul' \
   '-pc' '+pc' \
@@ -58,15 +58,3 @@
   '-ziconbeep:iconbeep (percent):' \
   '-C' \
   '-S-:pseudo-terminal and file descriptor:' \
-  '-bd:border color:_color' \
-  '-bg:background color:_color' \
-  '-bw:border width:' \
-  '-display:display:_x_display' \
-  '-fg:foreground color:_color' \
-  '-fn:font:' \
-  '-geometry:geometry:' \
-  '-iconic' \
-  '-name:name:' \
-  '-rv' \
-  '-title:title:' \
-  '-xrm:resource:'
diff -Naur Completion/X/_x_borderwidth Completion/X/_x_borderwidth
--- Completion/X/_x_borderwidth	Thu Jan  1 09:00:00 1970
+++ Completion/X/_x_borderwidth	Wed Aug 25 10:27:26 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_message 'border width'
diff -Naur Completion/X/_x_font Completion/X/_x_font
--- Completion/X/_x_font	Thu Jan  1 09:00:00 1970
+++ Completion/X/_x_font	Wed Aug 25 10:27:21 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_message 'font'
diff -Naur Completion/X/_x_geometry Completion/X/_x_geometry
--- Completion/X/_x_geometry	Thu Jan  1 09:00:00 1970
+++ Completion/X/_x_geometry	Wed Aug 25 10:27:42 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_message 'geometry'
diff -Naur Completion/X/_x_locale Completion/X/_x_locale
--- Completion/X/_x_locale	Thu Jan  1 09:00:00 1970
+++ Completion/X/_x_locale	Wed Aug 25 10:29:00 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_message 'locale'
diff -Naur Completion/X/_x_name Completion/X/_x_name
--- Completion/X/_x_name	Thu Jan  1 09:00:00 1970
+++ Completion/X/_x_name	Wed Aug 25 10:28:05 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_message 'name'
diff -Naur Completion/X/_x_resource Completion/X/_x_resource
--- Completion/X/_x_resource	Thu Jan  1 09:00:00 1970
+++ Completion/X/_x_resource	Wed Aug 25 10:29:14 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_message 'resource'
diff -Naur Completion/X/_x_selection_timeout Completion/X/_x_selection_timeout
--- Completion/X/_x_selection_timeout	Thu Jan  1 09:00:00 1970
+++ Completion/X/_x_selection_timeout	Wed Aug 25 10:28:22 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_message 'selection timeout'
diff -Naur Completion/X/_x_title Completion/X/_x_title
--- Completion/X/_x_title	Thu Jan  1 09:00:00 1970
+++ Completion/X/_x_title	Wed Aug 25 10:28:40 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_message 'title'
diff -Naur Completion/X/_xt_arguments Completion/X/_xt_arguments
--- Completion/X/_xt_arguments	Thu Jan  1 09:00:00 1970
+++ Completion/X/_xt_arguments	Wed Aug 25 10:35:00 1999
@@ -0,0 +1,45 @@
+#autoload
+
+# How to convert XrmOptionDescRec:
+
+# XrmOptionDescRec optionDescList[] = {
+#   ...
+#   {option, specifier, argKind, value},
+#   ...
+# };
+
+#  argKind		argument for _xt_arguments
+#  XrmoptionNoArg	option
+#  XrmoptionIsArg	option
+#  XrmoptionStickyArg	option-:message:action
+#  XrmoptionSepArg	option:message:action
+#  XrmoptionResArg	option:message:_x_resource
+#  XrmoptionSkipArg	option:message:action
+#  XrmoptionSkipLine	option:*::message:action
+#  XrmoptionSkipNArgs	option:message[1]:action[1]:...:message[value]:action[value]
+
+# cf. XrmParseCommand(3X11), X11R6.4/xc/lib/Xt/Initialize.c, X(5)
+
+_arguments \
+  '+rv' '-rv' '-reverse' \
+  '+synchronous' '-synchronous' \
+  '-background:background color:_colors' \
+  '-background:background color:_colors' \
+  '-bd:border color:_colors' \
+  '-bg:background color:_colors' \
+  '-bordercolor:border color:_colors' \
+  '-borderwidth:border width:_x_borderwidth' \
+  '-bw:border width:_x_borderwidth' \
+  '-display:display:_x_display' \
+  '-fg:foreground color:_colors' \
+  '-fn:font:_x_font' \
+  '-foreground:foreground color:_colors' \
+  '-geometry:geometry:_x_geometry' \
+  '-iconic' \
+  '-name:name:_x_name' \
+  '-selectionTimeout:selection timeout (milliseconds):_x_selection_timeout' \
+  '-title:title:_x_title' \
+  '-xnllanguage:locale:_x_locale' \
+  '-xrm:resource:_x_resource' \
+  '-xtsessionID:session ID:_xt_session_id' \
+  "$@"
diff -Naur Completion/X/_xt_session_id Completion/X/_xt_session_id
--- Completion/X/_xt_session_id	Thu Jan  1 09:00:00 1970
+++ Completion/X/_xt_session_id	Wed Aug 25 10:29:28 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_message 'session ID'
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-23 13:46 Sven Wischnowsky
  1999-08-23 16:16 ` Tanaka Akira
@ 1999-08-24 15:56 ` Tanaka Akira
  1 sibling, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-24 15:56 UTC (permalink / raw)
  To: zsh-workers

In article <199908231346.PAA03326@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

>   '-opt:*::descr:action'                # all args to the option

Does this require the actual option?

I tried to use this for first non-option argument. But it does not work.

Z(2):akr@is27e1u11% ./Src/zsh -f
is27e1u11% bindkey -e; fpath=($PWD/Completion/*(/)); autoload -U compinit; compinit -D; compdef _tst tst
is27e1u11% compconf group_matches=yes
is27e1u11% compconf message_format='%d'
is27e1u11% compconf description_format='%d'
is27e1u11% _tst () { _arguments '-x' ':*::mesg:_tst2' }
is27e1u11% _tst2 () { compadd "$words" }
is27e1u11% tst -x <TAB>

->

is27e1u11% tst -x tst\ -x\  

So, _arguments doesn't cut off words in this case.

I think words should be an empty list (or a singleton list contains
an empty string) in _tst2.

I found this problem with new _cvs implementation.

_cvs () { # "+Qqrwtnlvb:T:e:d:Hfz:s:xa"
  _arguments -s \
    -{a,f,H,l,n,Q,q,r,t,v,w,x} \
    '--version' '--help' '--help-commands' '--help-synonyms' '--help-options' \
    ...
    '-z:gzip level:_cvs_gzip_level' \
    ':*:cvs command:_cvs_command'
}
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-19 10:44 Sven Wischnowsky
  1999-08-19 14:38 ` Tanaka Akira
@ 1999-08-24 13:46 ` Peter Stephenson
  1 sibling, 0 replies; 45+ messages in thread
From: Peter Stephenson @ 1999-08-24 13:46 UTC (permalink / raw)
  To: Zsh hackers list

Sven Wischnowsky wrote:
>     Btw. I didn't change `_cvs' mainly because I use the `parameter'
>     module and there is a bug with the stuff that `allows' local
>     special parameters: the associative array `commands' in `_cvs' has 
>     (obviously) the same name as the one from the `parameter'
>     module. The new code in typeset_single() has the effect that this
>     `local' parameter behaves like the one from the module, i.e. if
>     you can't use the names of special parameters for local parameters 
>     without having them behave like the global ones. Maybe we have to
>     wait for Peter here...

This isn't a bug, local special parameters are supposed to stay special; it
would have been much easier if they weren't.  At least, I could change it
but then things like `local PATH=...' (which is now documented) wouldn't
work.  The variable in cvs ought to be changed anyway, but I'm a million
patches behind with completion and I'm logged in from a PC with only a
third-rate version of telnet.

-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 050 844536
WWW:  http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy




^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-24 10:43 Sven Wischnowsky
  1999-08-25  1:56 ` Tanaka Akira
  0 siblings, 1 reply; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-24 10:43 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> But I feel X toolkit options specs in _xterm is bit redundant.
> I think _xt_arguments such as following is useful.
> 
> # Since XrmParseCommand does not accept short options, it should not
> # use "-s".
> 
> _xt_arguments () {
>   _arguments \
>     '-geometry:geometry:_x_geometry' \
>     '-display:display:_x_display' \
>     ...
>     '-xrm:X resources:' \
>     "$@"
> }

Hey, that's good, I didn't think about adding such files -- we could
use that to replace `_x_options', too (with `_x_arguments', which
could probably still be a pattern function).

> # _gtk_arguments may be also useful.
> 
> Where is a suitable directory to store this?
> 
> Completion/User or Completion/Base (or Completion/X)?

Now that I've added `Pbmplus', I'd vote for `Completion/X' (and later
`Completion/Gnu', etc.). We'll have to move some things around when we 
come to the next open release anyway...

Bye
 Sven


--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-24  9:12 Sven Wischnowsky
@ 1999-08-24 10:04 ` Tanaka Akira
  0 siblings, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-24 10:04 UTC (permalink / raw)
  To: zsh-workers

In article <199908240912.LAA08973@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> This also changes `_x_options' to be a post pattern function (so that
> we don't get those stray X11 options in places where we don't want
> them), and it cleans up the `_compskip' handling.
> It also makes `_command_names' accept the option `-e' to make it
> complete only external commands and executable files -- which is then
> used in `_xterm'.

Thanks. _xterm works well now.

But I feel X toolkit options specs in _xterm is bit redundant.
I think _xt_arguments such as following is useful.

# Since XrmParseCommand does not accept short options, it should not
# use "-s".

_xt_arguments () {
  _arguments \
    '-geometry:geometry:_x_geometry' \
    '-display:display:_x_display' \
    ...
    '-xrm:X resources:' \
    "$@"
}

# _gtk_arguments may be also useful.

Where is a suitable directory to store this?

Completion/User or Completion/Base (or Completion/X)?
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-24  9:12 Sven Wischnowsky
  1999-08-24 10:04 ` Tanaka Akira
  0 siblings, 1 reply; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-24  9:12 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> It uses '-e:*::program: _normal' as the argument to _arguments and
> `xterm -e <TAB>' works well. But `xterm -132 -e <TAB>' does not.
>
> ...
> 
> This is because _arguments does not cut off words correctly, I think.

Right, I overlooked one place...

This also changes `_x_options' to be a post pattern function (so that
we don't get those stray X11 options in places where we don't want
them), and it cleans up the `_compskip' handling.
It also makes `_command_names' accept the option `-e' to make it
complete only external commands and executable files -- which is then
used in `_xterm'.

Bye
 Sven

diff -u -r oc/Base/_arguments Completion/Base/_arguments
--- oc/Base/_arguments	Mon Aug 23 15:48:18 1999
+++ Completion/Base/_arguments	Tue Aug 24 10:31:34 1999
@@ -188,6 +188,8 @@
       # associative array so that we don't offer them again.
 
       def="$opts[$ws[1]]"
+      optbeg="$beg"
+      argbeg="$beg"
       [[ -n "$oneshot[$ws[1]]" ]] && unset "opts[$ws[1]]"
     else
       uns=''
diff -u -r oc/Base/_command_names Completion/Base/_command_names
--- oc/Base/_command_names	Mon Aug 23 11:42:44 1999
+++ Completion/Base/_command_names	Tue Aug 24 11:09:44 1999
@@ -1,21 +1,31 @@
 #compdef -command-
 
-local nm=$compstate[nmatches] ret=1 expl
+# The option `-e' if given as the first argument says that we should
+# complete only external commands and executable files. This and a
+# `-' as the first argument is then removed from the arguments.
 
+local nm=$compstate[nmatches] ret=1 expl type=-c
+
+if [[ "$1" = -e ]]; then
+  type=-m
+  shift
+elif [[ "$1" = - ]]; then
+  shift
+fi
 
 # Complete jobs in implicit fg and bg
-if [[ "$PREFIX[1]" = "%" ]]; then
+if [[ $type = -c && "$PREFIX[1]" = "%" ]]; then
   _description expl job
-  compgen "$expl[@]" -j -P '%'
+  compgen "$expl[@]" "$@" -j -P '%'
   [[ nm -ne compstate[nmatches] ]] && return
 fi
 
 _description expl command
-compgen "$expl[@]" -c && ret=0
+compgen "$expl[@]" "$@" $type && ret=0
 
 if [[ nm -eq compstate[nmatches] ]]; then
   _description expl 'executable file or directory'
-  _path_files "$expl[@]" -/g "*(*)"
+  _path_files "$expl[@]" "$@" -/g "*(*)"
 else
   return ret
 fi
diff -u -r oc/Builtins/_zftp Completion/Builtins/_zftp
--- oc/Builtins/_zftp	Mon Aug 23 11:42:46 1999
+++ Completion/Builtins/_zftp	Tue Aug 24 10:56:09 1999
@@ -62,7 +62,7 @@
 
   *)
     # dunno... try ordinary completion after all.
-    unset _compskip
+    _compskip=''
     return 1
     ;;
 esac
diff -u -r oc/Core/_complete Completion/Core/_complete
--- oc/Core/_complete	Mon Aug 23 11:42:47 1999
+++ Completion/Core/_complete	Tue Aug 24 10:54:34 1999
@@ -21,7 +21,7 @@
 if [[ ! -z "$comp" ]]; then
   "$comp"
   if [[ "$_compskip" = all ]]; then
-    unset _compskip
+    _compskip=''
     (( compstate[nmatches] ))
     return
   fi
@@ -55,7 +55,7 @@
 
   if [[ -z "$comp" ]]; then
     if [[ "$_compskip" = *default* ]]; then
-      unset _compskip
+      _compskip=''
       return 1
     fi
     comp="$_comps[-default-]"
@@ -63,6 +63,6 @@
   [[ -z "$comp" ]] || "$comp"
 fi
 
-unset _compskip
+_compskip=''
 
 (( compstate[nmatches] ))
diff -u -r oc/Core/_main_complete Completion/Core/_main_complete
--- oc/Core/_main_complete	Mon Aug 23 11:42:47 1999
+++ Completion/Core/_main_complete	Tue Aug 24 10:54:09 1999
@@ -98,6 +98,4 @@
 _lastcomp[qiprefix]="$QIPREFIX"
 _lastcomp[qisuffix]="$QISUFFIX"
 
-unset _compskip
-
 return ret
diff -u -r oc/Core/_normal Completion/Core/_normal
--- oc/Core/_normal	Mon Aug 23 11:42:47 1999
+++ Completion/Core/_normal	Tue Aug 24 10:57:05 1999
@@ -1,6 +1,6 @@
 #autoload
 
-local comp command cmd1 cmd2 pat val name i ret=1
+local comp command cmd1 cmd2 pat val name i ret=1 _compskip="$_compskip"
 
 # Completing in command position? If not we set up `cmd1' and `cmd2' as
 # two strings we have to search in the completion definition arrays (e.g.
@@ -38,7 +38,7 @@
       if [[ "$_compskip" = *patterns* ]]; then
         break
       elif [[ "$_compskip" = all ]]; then
-        unset _compskip
+        _compskip=''
         return ret
       fi
     fi
@@ -67,7 +67,7 @@
     comp="$_comps[-default-]"
   fi
 fi
-  
+
 if [[ "$_compskip" != (all|*patterns*) ]]; then
   for i in "$_postpatcomps[@]"; do
     pat="${i% *}"
@@ -78,7 +78,7 @@
       if [[ "$_compskip" = *patterns* ]]; then
 	break
       elif [[ "$_compskip" = all ]]; then
-        unset _compskip
+        _compskip=''
         return ret
       fi
     fi
@@ -88,6 +88,6 @@
 [[ "$name" = -default- && -n "$comp" && "$_compskip" != (all|*default*) ]] &&
   "$comp" && ret=0
 
-unset _compskip
+_compskip=''
 
 return ret
diff -u -r oc/User/_x_display Completion/User/_x_display
--- oc/User/_x_display	Tue Aug 24 10:58:52 1999
+++ Completion/User/_x_display	Tue Aug 24 10:49:48 1999
@@ -0,0 +1,3 @@
+#autoload
+
+_hosts -S ':0 ' -r :
diff -u -r oc/User/_x_options Completion/User/_x_options
--- oc/User/_x_options	Mon Aug 23 11:42:56 1999
+++ Completion/User/_x_options	Tue Aug 24 10:49:55 1999
@@ -1,12 +1,11 @@
-#compdef -p */X11/*
+#compdef -P */X11/*
 
 local expl
 
 # A simple pattern completion, just as an example.
 
 if [ "$words[CURRENT-1]" = "-display" ]; then
-  _compskip=all
-  _hosts -S ':0 ' -r :
+  _x_display
 else
   _description expl option  
   compadd "$expl[@]" - -display -name -xrm
diff -u -r oc/User/_xterm Completion/User/_xterm
--- oc/User/_xterm	Tue Aug 24 10:56:42 1999
+++ Completion/User/_xterm	Tue Aug 24 11:09:59 1999
@@ -19,7 +19,7 @@
   '-cr:text cursor color:_color' \
   '-cu' '+cu' \
   '-dc' '+dc' \
-  '-e:*::program: _normal' \
+  '-e:program: _command_names -e:*::program arguments: _normal' \
   '-fb:bold font:' \
   '-fi:icon font:' \
   '-hc:background color for highlighted text:_color' \
@@ -61,7 +61,7 @@
   '-bd:border color:_color' \
   '-bg:background color:_color' \
   '-bw:border width:' \
-  '-display:display:' \
+  '-display:display:_x_display' \
   '-fg:foreground color:_color' \
   '-fn:font:' \
   '-geometry:geometry:' \

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-23 13:46 Sven Wischnowsky
@ 1999-08-23 16:16 ` Tanaka Akira
  1999-08-24 15:56 ` Tanaka Akira
  1 sibling, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-23 16:16 UTC (permalink / raw)
  To: zsh-workers

In article <199908231346.PAA03326@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> This tries to implement this.

OK. I wrote _xterm.

It uses '-e:*::program: _normal' as the argument to _arguments and
`xterm -e <TAB>' works well. But `xterm -132 -e <TAB>' does not.

Z(2):akr@is27e1u11% ./Src/zsh -f
is27e1u11% bindkey -e; fpath=($PWD/Completion/*(/)); autoload -U compinit; compinit -D; compdef _tst tst
is27e1u11% compconf group_matches=yes
is27e1u11% compconf message_format='%d'
is27e1u11% compconf description_format='%d'
is27e1u11% xterm -132 -e <TAB>_normal: bad option: -e [26]

file
CVS/            Functions/      Src/            config.guess*   configure.in 
ChangeLog       INSTALL         StartupFiles/   config.h        install-sh*
ChangeLog.3.0   META-FAQ        Util/           config.h.in     mkinstalldirs*
Completion/     Makefile        acconfig.h      config.log      stamp-h 
Config/         Makefile.in     aclocal.m4      config.status*  stamp-h.in 
Doc/            Misc/           aczsh.m4        config.sub*     
Etc/            README          config.cache    configure*      

This is because _arguments does not cut off words correctly, I think.

Index: Completion/User/_xterm
===================================================================
RCS file: _xterm
diff -N _xterm
--- /dev/null	Fri Apr 17 15:56:34 1998
+++ Completion/User/_xterm	Mon Aug 23 15:43:48 1999
@@ -0,0 +1,72 @@
+#compdef xterm
+
+_arguments \
+  '-version' \
+  '-help' \
+  '-132' \
+  '-ah' '+ah' \
+  '-ai' '+ai' \
+  '-aw' '+aw' \
+  '-b:inner border size:' \
+  '-bc' '+bc' \
+  '-bcf:time text cursor is off when blinking (milliseconds):' \
+  '-bcn:time text cursor is on when blinking (milliseconds):' \
+  '-bdc' '+bdc' \
+  '-cb' '+cb' \
+  '-cc:character class:' \
+  '-cm' '+cm' \
+  '-cn' '+cn' \
+  '-cr:text cursor color:_color' \
+  '-cu' '+cu' \
+  '-dc' '+dc' \
+  '-e:*::program: _normal' \
+  '-fb:bold font:' \
+  '-fi:icon font:' \
+  '-hc:background color for highlighted text:_color' \
+  '-hf' '+hf' \
+  '-ie' '+ie' \
+  '-im' '+im' \
+  '-j' '+j' \
+  '-leftbar' \
+  '-ls' '+ls' \
+  '-mb' '+mb' \
+  '-mc:multi-click threshold (milliseconds):' \
+  '-ms:pointer cursor color:_color' \
+  '-nb:margin bell number:' \
+  '-nul' '+nul' \
+  '-pc' '+pc' \
+  '-rightbar' \
+  '-rw' '+rw' \
+  '-s' '+s' \
+  '-samename' '+samename' \
+  '-sb' '+sb' \
+  '-sf' '+sf' \
+  '-si' '+si' \
+  '-sk' '+sk' \
+  '-sl:save lines:' \
+  '-sp' '+sp' \
+  '-t' '+t' \
+  '-ti:terminal ID:(vt52 vt100 vt101 vt102 vt220)' \
+  '-tm:terminal setting:' \
+  '-tn:terminal type:' \
+  '-u8' '+u8' \
+  '-ulc' '+ulc' \
+  '-ut' '+ut' \
+  '-vb' '+vb' \
+  '-wc' '+wc' \
+  '-wf' '+wf' \
+  '-ziconbeep:iconbeep (percent):' \
+  '-C' \
+  '-S-:pseudo-terminal and file descriptor:' \
+  '-bd:border color:_color' \
+  '-bg:background color:_color' \
+  '-bw:border width:' \
+  '-display:display:' \
+  '-fg:foreground color:_color' \
+  '-fn:font:' \
+  '-geometry:geometry:' \
+  '-iconic' \
+  '-name:name:' \
+  '-rv' \
+  '-title:title:' \
+  '-xrm:resource:'
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-23 13:46 Sven Wischnowsky
  1999-08-23 16:16 ` Tanaka Akira
  1999-08-24 15:56 ` Tanaka Akira
  0 siblings, 2 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-23 13:46 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> Some options take arguments up to end of command line.
> 
> If _arguments supports this style of options, it is also useful for
> _cvs, I suppose. Because first non-option argument for cvs command
> behaves like that.

This tries to implement this.

The syntax is:

  '-opt:*:descr:action'

Of course there may be other argument descriptions before the
`:*:'. This can also handle multiple arguments ended by a word
matching a pattern: '-opt:*pattern:descr:action'. And one can select
if the `words' and `CURRENT' parameters should be restricted to those
words that are the arguments to the option or to those words covered
by the `:*:' description only. This is done by using two or three
colons as in:

  '-opt:*::descr:action'                # all args to the option
  '-opt:first arg:...:*:::descr:action' # only the words covered by `:*:...'

Once this fully works, `_arguments' will be incredibly powerful... ;-)

There are also fixes for some typos in there...

Bye
 Sven

P.S.: I /think/ it should be possible to implement `_find' using
      `_arguments' now...

diff -u od/Zsh/compsys.yo Doc/Zsh/compsys.yo
--- od/Zsh/compsys.yo	Mon Aug 23 11:42:16 1999
+++ Doc/Zsh/compsys.yo	Mon Aug 23 15:37:18 1999
@@ -836,11 +836,13 @@
 to automatically find out what should be completed as the argument.
 The possible completions for option-arguments can be described with
 the arguments to this function. Each argument contains one description
-of the form <pattern>:<message>:<action>. The message will be printed 
+of the form `tt(<pattern>:<message>:<action>)'. The message will be printed 
 above the possible completion if the `description_format' configuration
 key is set (see above). The actions specify what
 should be done to complete arguments of those options that match 
-the pattern. The action may be a list of words in brackets or in
+the pattern. In both the message and the action a colon can be
+included by preceding it with a backslash. The action may be a list of
+words in brackets or in
 parentheses, separated by spaces. A list in brackets denotes
 possible values for an optional argument, a list in parentheses
 gives words to complete for mandatory arguments. If the action does
@@ -910,6 +912,18 @@
 `tt(:)var(message)tt(:)var(action)' or
 `tt(::)var(message)tt(:)var(action)', where the second form describes
 an optional argument and the first one describes a mandatory argument.
+The last description may also be of the form
+`tt(:*:)var(message)tt(:)var(action)' or
+`tt(:*)var(pattern)tt(:)var(message)tt(:)var(action)'. These describe
+multiple arguments. In the first form all following words on the line
+are to be completed as described by the var(action), in the second
+form all words up to a word matching the given var(pattern) are to be
+completed using the var(action). The `tt(*)' or the var(pattern) may
+also be separated from the var(message) by two or three colons. With
+two colons the tt(words) special array and the tt(CURRENT) special
+parameter are modified to refer only to the words after the option
+(with two colons) or to the words covered by this description (with
+three colons) during the execution or evaluation of the var(action).
 
 In the simplest form the var(opt-spec) is just the option name
 beginning with a minus or a plus sign, such as `tt(-foo)'. In this
@@ -941,8 +955,11 @@
 in the description will be shown above the matches. During the
 evaluation or execution of the action the array `tt(line)' will be set 
 to the command name and normal arguments from the command line,
-i.e. to the words from the command line xcluding all options and their 
+i.e. to the words from the command line excluding all options and their 
 arguments.
+
+To include a colon in the var(message) or the var(action), it has to
+be preceded by a backslash.
 
 Normally the option names are taken as multi-character names and a
 word from the line is considered to contain only one option (or
diff -u -r oc/Base/_arguments Completion/Base/_arguments
--- oc/Base/_arguments	Mon Aug 23 11:42:44 1999
+++ Completion/Base/_arguments	Mon Aug 23 15:39:03 1999
@@ -7,6 +7,7 @@
 
 local long args rest ws cur nth def nm expl descr action opt arg tmp
 local single uns ret=1 soptseq soptseq1 sopts prefix line
+local beg optbeg argbeg
 
 # Associative arrays used to collect information about the options.
 
@@ -122,7 +123,10 @@
 ws=( "${(@)words[2,-1]}" )
 cur=$(( CURRENT-2 ))
 nth=1
-liine=( "$words[1]" )
+line=( "$words[1]" )
+beg=2
+argbeg=2
+optbeg=2
 
 # ...until the current word is reached.
 
@@ -138,15 +142,27 @@
   fi
   arg=''
 
+  # See if we are after an option getting n arguments ended by something
+  # that matches the current word.
+
+  if [[ "$def" = \**[^\\]:* && "$ws[1]" = ${~${(M)def#*[^\\]:}[2,-2]} ]]; then
+    def=''
+    shift 1 ws
+    (( cur-- ))
+    (( beg++ ))
+    continue
+  fi
+
   # Remove one description/action pair from `def' if that isn't empty.
 
-  if [[ -n "$def" ]]; then
-    if [[ "$def" = ?*:*:* ]]; then
-      def="${def#?*:*:}"
+  if [[ -n "$def" && "$def" != \** ]]; then
+    if [[ "$def" = ?*[^\\]:*[^\\]:* ]]; then
+      def="${def#?*[^\\]:*[^\\]:}"
+      argbeg="$beg"
     else
       def=''
     fi
-  else
+  elif [[ -z "$def" ]]; then
 
     # If it is empty, and the word starts with `--' and we should
     # complete long options, just ignore this word, otherwise make sure
@@ -179,6 +195,8 @@
 	tmp="${ws[1][1]}${ws[1][-1]}"
 	if (( $+opts[$tmp] )); then
 	  def="$opts[$tmp]"
+	  optbeg="$beg"
+	  argbeg="$beg"
 	  uns="${ws[1][2,-1]}"
 	  opt=''
 	fi
@@ -217,9 +235,11 @@
 
 	  opt=''
 	  def="$dopts[$tmp[1]]"
+	  optbeg="$beg"
+	  argbeg="$beg"
 	  [[ -n "$oneshot[$tmp[1]]" ]] && unset "dopts[$tmp[1]]"
-	  if [[ "$def" = ?*:*:* ]]; then
-            def="${def#?*:*:}"
+	  if [[ "$def" = [^*]*[^\\]:*[^\\]:* ]]; then
+            def="${def#?*[^\\]:*[^\\]:}"
           else
             def=''
 	  fi
@@ -242,6 +262,8 @@
 	if (( $#tmp )); then
 	  opt=''
 	  def="$odopts[$tmp[1]]"
+	  optbeg="$beg"
+	  argbeg="$beg"
 	  [[ -n "$oneshot[$tmp[1]]" ]] && unset "odopts[$tmp[1]]"
 
 	  # For options whose first argument *may* come after the
@@ -251,8 +273,10 @@
 	  if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) ||
                 ( -n "$sopts" && ( ( $tmp[1] = [-+]? && "$ws[1]" != "${tmp[1][1]}"${~soptseq}"${tmp[1][2]}" ) ||
 		  		   ( $tmp[1] != [-+]? && "$ws[1]" != "$tmp[1]" ) ) ) ]]; then
-	    if [[ "$def" = ?*:*:* ]]; then
-              def="${def#?*:*:}"
+	    if [[ "$def" = [^*]*[^\\]:*[^\\]:* ]]; then
+              def="${def#?*[^\\]:*[^\\]:}"
+	      optbeg="$beg"
+	      argbeg="$beg"
             else
               def=''
             fi
@@ -284,6 +308,7 @@
 
   shift 1 ws
   (( cur-- ))
+  (( beg++ ))
 done
 
 # Now generate the matches.
@@ -313,10 +338,16 @@
 
       def="$args[nth]"
       [[ -z "$def" ]] && def="$rest"
+
+      if [[ "$def" = \** ]]; then
+        def="${def#*[^\\]:}"
+	[[ "$def" = :* ]] && def="$def[2,-1]"
+	[[ "$def" = :* ]] && def="$def[2,-1]"
+      fi
     fi
 
     # In any case, we have to complete option names here, but we may
-    # be in a string that starts with an option names and continues with
+    # be in a string that starts with an option name and continues with
     # the first argument, test that (again, two loops).
 
     opt=yes
@@ -407,14 +438,41 @@
 
   if [[ -n "$def" ]]; then
 
-    # Ignore the leading colon describing optional arguments.
+    # Ignore the leading colon or `*...' describing optional arguments.
+
+    if [[ "$def" = :* ]]; then
+      def="$def[2,-1]"
+    elif [[ "$def" = \** ]]; then
+      tmp="${${(M)def#*[^\\]:}[2,-2]}"
+      def="${def#*[^\\]:}"
+
+      if [[ "$def" = :* ]]; then
+        if [[ "$def" = ::* ]]; then
+          def="$def[3,-1]"
+	  beg=$argbeg
+	else
+	  def="$def[2,-1]"
+	  beg=$optbeg
+	fi
 
-    [[ "$def" = :* ]] && def="$def[2,-1]"
+	shift beg words
+	(( CURRENT -= beg ))
+
+	if [[ -n "$tmp" ]]; then
+          tmp="$words[(ib:CURRENT:)${~tmp}]"
+	  [[ tmp -le $#words ]] && words=( "${(@)words[1,tmp-1]}" )
+	fi
+      fi
+    fi
 
     # Get the description and the action.
 
-    descr="${def%%:*}"
-    action="${${def#*:}%%:*}"
+    descr="${${${(M)def#*[^\\]:}[1,-2]}//\\\\:/:}"
+    if [[ "$def" = *[^\\]:*[^\\]:* ]]; then
+      action="${${${(M)${def#*[^\\]:}#*[^\\]:}[1,-2]}//\\\\:/:}"
+    else
+      action="${${def#*[^\\]:}//\\\\:/:}"
+    fi
 
     _description expl "$descr"
 
@@ -423,7 +481,7 @@
       # An empty action means that we should just display a message.
       _message "$descr"
       return ret
-    elif [[ "$action[1]" = \(*\) ]]; then
+    elif [[ "$action" = \(*\) ]]; then
 
       # Anything inside `(...)' is added directly.
 
diff -u -r oc/Base/_long_options Completion/Base/_long_options
--- oc/Base/_long_options	Mon Aug 23 11:42:44 1999
+++ Completion/Base/_long_options	Mon Aug 23 12:01:58 1999
@@ -141,9 +141,9 @@
     # First, we get the pattern and the action to use and take them
     # from the positional parameters.
 
-    pattern="${1%%:*}"
-    descr="${${1#*:}%%:*}"
-    action="${1#*:*:}"
+    pattern="${${${(M)1#*[^\\]:}[1,-2]}//\\\\:/:}"
+    descr="${${${(M)${1#*[^\\]:}#*[^\\]:}[1,-2]}//\\\\:/:}"
+    action="${${1#*[^\\]:*[^\\]:}//\\\\:/:}"
     shift
 
     # We get all options matching the pattern and take them from the
@@ -257,7 +257,7 @@
 
       _description expl "$descr"
 
-      if [[ "$action[1]" = (\[*\]|\(*\)) ]]; then
+      if [[ "$action" = (\[*\]|\(*\)) ]]; then
         compadd "$expl[@]" - ${=action[2,-2]}
       elif [[ "$action" = \{*\} ]]; then
         eval "$action[2,-2]"

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-23 12:00 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-23 12:00 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> GNU getopt_long supports the style.
> 
> getopt_long(3):
> 
>        The getopt_long() function works like getopt() except that
>        it  also  accepts long options, started out by two dashes.
>        Long option names may be abbreviated if  the  abbreviation
>        is unique or is an exact match for some defined option.  A
>        long option may take a parameter, of the form  --arg=param
>        or --arg param.
> 
> So, many GNU commands accept that.

Urgh. Sorry, didn't know about that. Hrmpf, do we have to make
`_long_options' accept these? Should we join `_arguments' and
`_long_options'? Hm.

> This is because "-a" in compadd arguments. It is the result of
> expansion of "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]" and
> "odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]".

Ah, sorry, I didn't test it with `[(I)...]'. So I think this is a real 
bug, to be fixed in C. I'd like to hear Bart about this, though,
because there was explicit code to turn empty array-subscripts into
non-arrays. Maybe the effect this had on associations subscripted with 
`[(I)...]' and `[(R)...]' was pure oversight, though.

Bye
 Sven

diff -u os/params.c Src/params.c
--- os/params.c	Fri Aug 20 15:18:08 1999
+++ Src/params.c	Mon Aug 23 13:56:27 1999
@@ -940,7 +940,9 @@
 			v->isarr |= SCANPM_MATCHVAL;
 		    if (down)
 			v->isarr |= SCANPM_MATCHMANY;
-		    if ((ta = getvaluearr(v)) && *ta) {
+		    if ((ta = getvaluearr(v)) &&
+			(*ta || ((v->isarr & SCANPM_MATCHMANY) &&
+				 (v->isarr & (SCANPM_MATCHKEY | SCANPM_MATCHVAL))))) {
 			*inv = v->inv;
 			*w = v->b;
 			return 1;
@@ -1117,7 +1119,9 @@
 	    }
 	    if (*s == ']' || *s == Outbrack) {
 		s++;
-		if (v->isarr && a == b)
+		if (v->isarr && a == b && 
+		    (!(v->isarr & SCANPM_MATCHMANY) ||
+		     !(v->isarr & (SCANPM_MATCHKEY | SCANPM_MATCHVAL))))
 		    v->isarr = 0;
 		v->a = a;
 		v->b = b;

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-23  9:32 Sven Wischnowsky
@ 1999-08-23 10:54 ` Tanaka Akira
  0 siblings, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-23 10:54 UTC (permalink / raw)
  To: zsh-workers

In article <199908230932.LAA02718@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> I don't agree here -- do you know of any command that accepts a `--'
> option which gets its argument in the next word? If so, I think that
> command shouldn't do that.

GNU getopt_long supports the style.

getopt_long(3):

       The getopt_long() function works like getopt() except that
       it  also  accepts long options, started out by two dashes.
       Long option names may be abbreviated if  the  abbreviation
       is unique or is an exact match for some defined option.  A
       long option may take a parameter, of the form  --arg=param
       or --arg param.

So, many GNU commands accept that.

> (I think you mean completion functions, the term `completer' refers to 
> those top-level thingies like `_complete'.)

Wow.  Yes.

> No, it shouldn't -- there is one string resulting from the expansion,
> even it is the empty string.

I see.

> What exactly doesn't work with single-letter option because of this?
> (I'm a bit too lazy to search ;-) I guess that this can be avoided by
> adding a ${...:#} somewhere.

Z(2):akr@is27e1u11% Src/zsh -f
is27e1u11% bindkey -e; fpath=($PWD/Completion/*(/)); autoload -U compinit; compinit -D; compdef _tst tst
is27e1u11% compconf group_matches=yes
is27e1u11% compconf message_format='%d'
is27e1u11% compconf description_format='%d'
is27e1u11% _tst () { _arguments -s '-a' '-b' }
is27e1u11% set -x
is27e1u11% tst -a<TAB>
...
+_arguments:370> unset opts[-a] dopts[] odopts[]
...
+_arguments:385> compadd -J option -X option -Q -y ( -b   ) - -ab -a -a
...
option
-b   

It should complete "b" immediately.

This is because "-a" in compadd arguments. It is the result of
expansion of "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]" and
"odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]".

Z(2):akr@is27e1u11% Src/zsh -f
is27e1u11% typeset -A opts
is27e1u11% opts[-a]=
is27e1u11% opts[-b]=
is27e1u11% print -lr - "A${(@)^opts[(I)xx]}B"
AB
is27e1u11% print -lr - "A${${(@)^opts[(I)xx]}:#}B"
AB
is27e1u11% print -lr - "A${(@)${(@)^opts[(I)xx]}:#}B" 
AB
is27e1u11% 

Hm.
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-23  9:32 Sven Wischnowsky
  1999-08-23 10:54 ` Tanaka Akira
  0 siblings, 1 reply; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-23  9:32 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> 1. The help message may not suited for _long_options.
> 
> For example, help message of "patch" contains: 
>   -p NUM  --strip=NUM  Strip NUM leading components from file names.
> 
> The options are not separeted by ",".

I found the same problem with the output of `gprof' over the weekend
and the patch below fixes that problem.

> I avoid this problem by modifying the help message.
> # http://www.ldl.jaist.ac.jp/~akr/junk/patch-2.5.3-cvsaware-19990820.patch
> 
> But, in general, help messages may not able to modify.  Therefore I
> think it is useful that _arguments can handle options started with
> "--".
> 
> # Also, if _arguments supports options started with "--" directly,
> # opt-spec to specify both "--xxx=yyy" and "--xxx yyy" at once may
> # useful.

I don't agree here -- do you know of any command that accepts a `--'
option which gets its argument in the next word? If so, I think that
command shouldn't do that.

> 2. I would like to refer the parsed arguments in completers.
> 
> I think this is useful in many cases.
> For example, if the completer for port of telnet can refer host
> argument, it can complete ports precisely: "nntp" for news servers,
> "smtp" for mail servers, etc.  If the completer for emacs can check
> whether the argument of -f is batch-byte-compile, we can complete only
> *.el.

(I think you mean completion functions, the term `completer' refers to 
those top-level thingies like `_complete'.)

Yes, another one of the things I hacked at the weekend. The patch
makes the non-options from the line available in the `line' array
(there may be a better name) in everything that gets called or
evaluated from `_arguments' (or `_long_options' if that was called
from `_arguments').

> 3. "xterm -e" style.
> 
> Some options take arguments up to end of command line.
> 
> If _arguments supports this style of options, it is also useful for
> _cvs, I suppose. Because first non-option argument for cvs command
> behaves like that.

Yes, again, I thought about this when I wrote `_arguments' but
couldn't think of a syntax and then simply forgot to write it. I think 
I'll send a patch for this some time...

> Also, I found the problem about associative array with rcexpandparam.
> 
> Z(2):akr@is27e1u11% zsh -f
> is27e1u11% typeset -A arr 
> is27e1u11% arr[a]=
> is27e1u11% print -lr - "A${(@)^arr[(I)b]}B"
> AB
> 
> This should be empty.  Because of this problem, completions for
> single-letter option doesn't work well.

No, it shouldn't -- there is one string resulting from the expansion,
even it is the empty string.

What exactly doesn't work with single-letter option because of this?
(I'm a bit too lazy to search ;-) I guess that this can be avoided by
adding a ${...:#} somewhere.


Other things the patch contains:

- a fixlet for `compadd' it didn't skip over arguments of the second
  to nth occurrence of an option that was given more than once
- first attempt for auto-param-slash
- it changes the `Commands/*' files to not contain the `-n' option -- 
  this is made implicit in `compinit' in the same way this is implicit
  for normal `compdef's
- actions in `_arguments' and `_long_options' can be made evaluated
  with the new syntax `{string}'
- `_arguments' lists short options in a better readable form
- it cleans up some functions to make use of helper functions like
  `_hosts' and `_users'
- the file `Util/completion-style-guide' contains the beginnings of a
  style guide for completion functions; for now this is just a simple
  list of things to do or not to do

Bye
 Sven

diff -u os/Zle/compctl.c Src/Zle/compctl.c
--- os/Zle/compctl.c	Fri Aug 20 15:18:19 1999
+++ Src/Zle/compctl.c	Mon Aug 23 10:23:09 1999
@@ -1850,8 +1850,9 @@
 			*sp = p + 1;
 		    p = "" - 1;
 		} else if (argv[1]) {
+		    argv++;
 		    if (!*sp)
-			*sp = *++argv;
+			*sp = *argv;
 		    p = "" - 1;
 		} else {
 		    zerrnam(name, e, NULL, *p);
diff -u od/Zsh/compsys.yo Doc/Zsh/compsys.yo
--- od/Zsh/compsys.yo	Fri Aug 20 15:18:10 1999
+++ Doc/Zsh/compsys.yo	Mon Aug 23 10:23:09 1999
@@ -846,7 +846,7 @@
 gives words to complete for mandatory arguments. If the action does
 not start with a bracket or parentheses, it should be the name of a
 command (probably with arguments) that should be invoked to complete 
-after the equal sign. E.g.:
+after the equal sign or a string in braces that will be evaluated. E.g.:
 
 example(_long_options '*\*'     '(yes no)' \ 
               '*=FILE*' '_files' \ 
@@ -930,14 +930,19 @@
 In each of the cases above, the var(action) says how the possible
 completions should be generated. In cases where only one of a fixed
 set of strings can be completed, these string can directly be given as 
-a list in parentheses, as in `tt(:foo:(foo bar baz))'. If the
-var(action) does not begin with an opening parentheses, it will be
-split into separate words and executed. If the var(action) starts with 
-a space, this list of words will be invoked unchanged, otherwise it
-will be invoked with some extra string placed after the first word
-which can be given as arguments to the tt(compadd) and tt(compgen)
-builtins and which make sure that the var(message) given in the
-description will be shown above the matches.
+a list in parentheses, as in `tt(:foo:(foo bar baz))'. A string in
+braces will be evaluated to generate the matches and if the
+var(action) does not begin with an opening parentheses or brace, it
+will be split into separate words and executed. If the var(action)
+starts with a space, this list of words will be invoked unchanged,
+otherwise it will be invoked with some extra string placed after the
+first word which can be given as arguments to the tt(compadd) and
+tt(compgen) builtins and which make sure that the var(message) given
+in the description will be shown above the matches. During the
+evaluation or execution of the action the array `tt(line)' will be set 
+to the command name and normal arguments from the command line,
+i.e. to the words from the command line xcluding all options and their 
+arguments.
 
 Normally the option names are taken as multi-character names and a
 word from the line is considered to contain only one option (or
diff -u -r oc/Base/_arguments Completion/Base/_arguments
--- oc/Base/_arguments	Mon Aug 23 10:12:47 1999
+++ Completion/Base/_arguments	Mon Aug 23 10:38:49 1999
@@ -6,7 +6,7 @@
 setopt localoptions extendedglob
 
 local long args rest ws cur nth def nm expl descr action opt arg tmp
-local single uns ret=1 soptseq soptseq1 sopts prefix
+local single uns ret=1 soptseq soptseq1 sopts prefix line
 
 # Associative arrays used to collect information about the options.
 
@@ -117,182 +117,185 @@
   sopts=''
 fi
 
-if [[ $#long -ne 0 && "$PREFIX" = --* ]]; then
+# Parse the command line...
 
-   # If the current words starts with `--' and we should use long
-   # options, just call...
+ws=( "${(@)words[2,-1]}" )
+cur=$(( CURRENT-2 ))
+nth=1
+liine=( "$words[1]" )
 
-  _long_options "$long[@]"
-else
+# ...until the current word is reached.
 
-  # Otherwise parse the command line...
+while [[ cur -gt 0 ]]; do
 
-  ws=( "${(@)words[2,-1]}" )
-  cur=$(( CURRENT-2 ))
-  nth=1
+  # `def' holds the description for the option we are currently after.
+  # Check if the next argument for the option is optional.
+
+  if [[ "$def" = :* ]]; then
+    opt=yes
+  else
+    opt=''
+  fi
+  arg=''
 
-  # ...until the current word is reached.
+  # Remove one description/action pair from `def' if that isn't empty.
 
-  while [[ cur -gt 0 ]]; do
+  if [[ -n "$def" ]]; then
+    if [[ "$def" = ?*:*:* ]]; then
+      def="${def#?*:*:}"
+    else
+      def=''
+    fi
+  else
 
-    # `def' holds the description for the option we are currently after.
-    # Check if the next argument for the option is optional.
+    # If it is empty, and the word starts with `--' and we should
+    # complete long options, just ignore this word, otherwise make sure
+    # we test for options below and handle normal arguments.
 
-    if [[ "$def" = :* ]]; then
+    if [[ $#long -eq 0 || "$ws[1]" != --* ]]; then
       opt=yes
+      arg=yes
     else
-      opt=''
+      def=''
     fi
-    arg=''
+  fi
 
-    # Remove one description/action pair from `def' if that isn't empty.
+  if [[ -n "$opt" ]]; then
 
-    if [[ -n "$def" ]]; then
-      if [[ "$def" = ?*:*:* ]]; then
-        def="${def#?*:*:}"
-      else
-        def=''
-      fi
-    else
+    # `opt' was set above if we have to test if the word is an option.
+    # We first test for the simple options -- those without arguments or
+    # those whose arguments have to be given as separate words.
 
-      # If it is empty, and the word starts with `--' and we should
-      # complete long options, just ignore this word, otherwise make sure
-      # we test for options below and handle normal arguments.
-
-      if [[ $#long -eq 0 || "$ws[1]" != --* ]]; then
-        opt=yes
-	arg=yes
-      else
-        def=''
+    if (( $+opts[$ws[1]] )); then
+
+      # Options that may only be given once are removed from the
+      # associative array so that we don't offer them again.
+
+      def="$opts[$ws[1]]"
+      [[ -n "$oneshot[$ws[1]]" ]] && unset "opts[$ws[1]]"
+    else
+      uns=''
+      if [[ -n "$sopts" && "$ws[1]" = [-+]${~soptseq}[$sopts] ]]; then
+	tmp="${ws[1][1]}${ws[1][-1]}"
+	if (( $+opts[$tmp] )); then
+	  def="$opts[$tmp]"
+	  uns="${ws[1][2,-1]}"
+	  opt=''
+	fi
       fi
-    fi
 
-    if [[ -n "$opt" ]]; then
+      # If the word is none of the simple options, test for those
+      # whose first argument has to or may come directly after the
+      # option. This is done in two loops looking very much alike.
 
-      # `opt' was set above if we have to test if the word is an option.
-      # We first test for the simple options -- those without arguments or
-      # those whose arguments have to be given as separate words.
+      if [[ -n "$opt" && $#dopts -ne 0 ]]; then
 
-      if (( $+opts[$ws[1]] )); then
+	# First we get the option names.
 
-        # Options that may only be given once are removed from the
-        # associative array so that we don't offer them again.
+	tmp=( "${(@k)dopts}" )
 
-        def="$opts[$ws[1]]"
-        [[ -n "$oneshot[$ws[1]]" ]] && unset "opts[$ws[1]]"
-      else
-        uns=''
-        if [[ -n "$sopts" && "$ws[1]" = [-+]${~soptseq}[$sopts] ]]; then
-	  tmp="${ws[1][1]}${ws[1][-1]}"
-	  if (( $+opts[$tmp] )); then
-	    def="$opts[$tmp]"
-	    uns="${ws[1][2,-1]}"
-	    opt=''
+	# Then we loop over them and see if the current word begins
+	# with one of the option names.
+
+	while (( $#tmp )); do
+          if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
+	    if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
+	      uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+	      break;
+	    fi
+	  elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
+            break
 	  fi
-        fi
+	  shift 1 tmp
+	done
+
+	if (( $#tmp )); then
 
-        # If the word is none of the simple options, test for those
-        # whose first argument has to or may come directly after the
-        # option. This is done in two loops looking very much alike.
-
-        if [[ -n "$opt" && $#dopts -ne 0 ]]; then
-
-	  # First we get the option names.
-
-	  tmp=( "${(@k)dopts}" )
-
-	  # Then we loop over them and see if the current word begins
-	  # with one of the option names.
-
-	  while (( $#tmp )); do
-            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
-	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
-		break;
-	      fi
-	    elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
-              break
+	  # It does. So use the description for it, but only from
+	  # the second argument on, because we are searching the
+	  # description for the next command line argument.
+
+	  opt=''
+	  def="$dopts[$tmp[1]]"
+	  [[ -n "$oneshot[$tmp[1]]" ]] && unset "dopts[$tmp[1]]"
+	  if [[ "$def" = ?*:*:* ]]; then
+            def="${def#?*:*:}"
+          else
+            def=''
+	  fi
+        fi
+      fi
+      if [[ -n "$opt" && $#odopts -ne 0 ]]; then
+	tmp=( "${(@k)odopts}" )
+	while (( $#tmp )); do
+          if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
+	    if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
+	      uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+	      break;
 	    fi
-	    shift 1 tmp
-	  done
+	  elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
+	    break
+	  fi
+	  shift 1 tmp
+	done
 
-	  if (( $#tmp )); then
+	if (( $#tmp )); then
+	  opt=''
+	  def="$odopts[$tmp[1]]"
+	  [[ -n "$oneshot[$tmp[1]]" ]] && unset "odopts[$tmp[1]]"
 
-	    # It does. So use the description for it, but only from
-	    # the second argument on, because we are searching the
-	    # description for the next command line argument.
-
-	    opt=''
-	    def="$dopts[$tmp[1]]"
-	    [[ -n "$oneshot[$tmp[1]]" ]] && unset "dopts[$tmp[1]]"
+	  # For options whose first argument *may* come after the
+	  # option, we skip over the first description only if there
+	  # is something after the option name on the line.
+
+	  if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) ||
+                ( -n "$sopts" && ( ( $tmp[1] = [-+]? && "$ws[1]" != "${tmp[1][1]}"${~soptseq}"${tmp[1][2]}" ) ||
+		  		   ( $tmp[1] != [-+]? && "$ws[1]" != "$tmp[1]" ) ) ) ]]; then
 	    if [[ "$def" = ?*:*:* ]]; then
               def="${def#?*:*:}"
             else
               def=''
-	    fi
-          fi
+            fi
+	  fi
         fi
-        if [[ -n "$opt" && $#odopts -ne 0 ]]; then
-	  tmp=( "${(@k)odopts}" )
-	  while (( $#tmp )); do
-            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
-	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
-		break;
-	      fi
-	    elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
-	      break
-	    fi
-	    shift 1 tmp
-	  done
+      fi
 
-	  if (( $#tmp )); then
-	    opt=''
-	    def="$odopts[$tmp[1]]"
-	    [[ -n "$oneshot[$tmp[1]]" ]] && unset "odopts[$tmp[1]]"
-
-	    # For options whose first argument *may* come after the
-	    # option, we skip over the first description only if there
-	    # is something after the option name on the line.
-
-	    if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) ||
-                  ( -n "$sopts" && ( ( $tmp[1] = [-+]? && "$ws[1]" != "${tmp[1][1]}"${~soptseq}"${tmp[1][2]}" ) ||
-		  		     ( $tmp[1] != [-+]? && "$ws[1]" != "$tmp[1]" ) ) ) ]]; then
-	      if [[ "$def" = ?*:*:* ]]; then
-                def="${def#?*:*:}"
-              else
-                def=''
-              fi
-	    fi
-          fi
-        fi
+      [[ -n "$sopts" && -n "$opt" && "$ws[1]" = [-+]${~soptseq} ]] && \
+          uns="${ws[1][2,-1]}"
 
-        [[ -n "$sopts" && -n "$opt" && "$ws[1]" = [-+]${~soptseq} ]] && \
-            uns="${ws[1][2,-1]}"
+      if [[ -n "$uns" ]]; then
+	uns="${(j::)${(@k)oneshot[(I)${ws[1][1]}[$uns]]#[-+]}}"
+	unset "opts[${(@)^opts[(I)${ws[1][1]}[$uns]]}]" \
+	      "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]" \
+	      "odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]"
+      fi
 
-	if [[ -n "$uns" ]]; then
-	  uns="${(j::)${(@k)oneshot[(I)${ws[1][1]}[$uns]]#[-+]}}"
-	  unset "opts[${(@)^opts[(I)${ws[1][1]}[$uns]]}]" \
-	        "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]" \
-	        "odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]"
-	fi
+      # If we didn't find a matching option description and we were
+      # told to use normal argument descriptions, just increase
+      # our counter `nth'.
 
-	# If we didn't find a matching option description and we were
-	# told to use normal argument descriptions, just increase
-	# our counter `nth'.
-
-        if [[ -n "$opt" && -n "$arg" ]]; then
-          def=''
-	  (( nth++ ))
-        fi
+      if [[ -n "$opt" && -n "$arg" ]]; then
+        def=''
+	line=( "$line[@]" "$ws[1]" )
+	(( nth++ ))
       fi
     fi
+  fi
 
-    shift 1 ws
-    (( cur-- ))
-  done
+  shift 1 ws
+  (( cur-- ))
+done
+
+# Now generate the matches.
+
+if [[ $#long -ne 0 && "$PREFIX" = --* ]]; then
 
-  # Now generate the matches.
+  # If the current words starts with `--' and we should use long
+  # options, just call...
+
+  _long_options "$long[@]"
+
+else
 
   nm="$compstate[nmatches]"
 
@@ -379,9 +382,11 @@
         _description expl option
 	if [[ -n "$sopts" && -n "$PREFIX" && "$PREFIX" = [-+]${~soptseq}[$sopts] ]]; then
 	  if [[ "$PREFIX" = [-+]${~soptseq1} ]]; then
-	    compadd "$expl[@]" -Q - "${PREFIX}${(@k)^opts[(I)${PREFIX[1]}?]#?}" \
-				    "${PREFIX}${(@k)^dopts[(I)${PREFIX[1]}?]#?}" \
-				    "${PREFIX}${(@k)^odopts[(I)${PREFIX[1]}?]#?}" && ret=0
+	    compadd "$expl[@]" -Q \
+                    -y "( ${(k)opts} ${(k)dopts} ${(k)odopts} )" - \
+                    "${PREFIX}${(@k)^opts[(I)${PREFIX[1]}?]#?}" \
+		    "${PREFIX}${(@k)^dopts[(I)${PREFIX[1]}?]#?}" \
+		    "${PREFIX}${(@k)^odopts[(I)${PREFIX[1]}?]#?}" && ret=0
 	  else
 	    # The last option takes an argument in next word.
 	    compadd "$expl[@]" -Q - "${PREFIX}" && ret=0
@@ -418,11 +423,17 @@
       # An empty action means that we should just display a message.
       _message "$descr"
       return ret
-    elif [[ "$action[1]" = \( ]]; then
+    elif [[ "$action[1]" = \(*\) ]]; then
 
       # Anything inside `(...)' is added directly.
 
       compadd "$expl[@]" - ${=action[2,-2]}
+    elif [[ "$action" = \{*\} ]]; then
+
+      # A string in braces is evaluated.
+
+      eval "$action[2,-2]"
+
     elif [[ "$action" = \ * ]]; then
 
       # If the action starts with a space, we just call it.
diff -u -r oc/Base/_brace_parameter Completion/Base/_brace_parameter
--- oc/Base/_brace_parameter	Mon Aug 23 10:12:47 1999
+++ Completion/Base/_brace_parameter	Mon Aug 23 10:23:10 1999
@@ -2,16 +2,17 @@
 
 setopt localoptions extendedglob
 
-local lp ls n q suf=''
+local lp ls n q
 
 if [[ "$SUFFIX" = *\}* ]]; then
   ISUFFIX="${SUFFIX#*\}}$ISUFFIX"
   SUFFIX="${SUFFIX%%\}*}"
+  suf=()
 elif [[ "$LBUFFER" = *\$\{[^}]#\$\{[^}]#$PREFIX ||
         "$compstate[insert]" = *menu* ]]; then
-  suf='}'
+  suf=(-b '')
 else
-  suf='} '
+  suf=(-b ' ')
 fi
 
 lp="$LBUFFER[1,-${#PREFIX}-1]"
@@ -21,4 +22,4 @@
 
 [[ n -gt 0 ]] && suf=''
 
-_parameters -Qs "${q[1,-n-1]}" -S "$suf" -r '-:?#%+=[/}'
+_parameters "$suf[@]" -Qs "${q[1,-n-1]}" -r '-:?#%+=[/}'
diff -u -r oc/Base/_condition Completion/Base/_condition
--- oc/Base/_condition	Mon Aug 23 10:12:47 1999
+++ Completion/Base/_condition	Mon Aug 23 10:23:10 1999
@@ -7,11 +7,10 @@
 elif [[ "$prev" = -([no]t|ef) ]]; then
   _files
 else
-  local ret=1 expl
+  local ret=1
 
   _files && ret=0
-  _description expl parameter
-  compgen "$expl[@]" -v && ret=0
+  _parameters && ret=0
 
   return ret
 fi
diff -u -r oc/Base/_long_options Completion/Base/_long_options
--- oc/Base/_long_options	Mon Aug 23 10:12:47 1999
+++ Completion/Base/_long_options	Mon Aug 23 10:44:58 1999
@@ -112,8 +112,9 @@
   # those hyphens and anything from the space or comma after the
   # option up to the end. 
 
-  opts=("--${(@)^${(@)${(@M)${(@ps:\n:j:\n:)${(@)${(@M)${(@f)$("$words[1]" --help)}:#[ 	]#-*}//,/
-}}:#[ 	]#--*}#*--}%%[, ]*}")
+  opts=("--${(@)^${(@)${(@)${(@M)${(@ps:\n:j:\n:)${(@)${(@M)${(@f)$("$words[1]" --help 2>&1)//\[--/
+--}:#[ 	]#-*}//,/
+}}:#[ 	]#--*}#*--}%%[, ]*}:#}")
 
   # Now remove all ignored options ...
 
@@ -256,15 +257,15 @@
 
       _description expl "$descr"
 
-      if [[ "$action[1]" = (\[|\() ]]; then
+      if [[ "$action[1]" = (\[*\]|\(*\)) ]]; then
         compadd "$expl[@]" - ${=action[2,-2]}
-      elif (( $#action )); then
-        if [[ "$action" = \ * ]]; then
-          ${(e)=~action}
-        else
-	  action=($=action)
-	  ${(e)action[1]} "$expl[@]" ${(e)~action[2,-1]}
-        fi
+      elif [[ "$action" = \{*\} ]]; then
+        eval "$action[2,-2]"
+      elif [[ "$action" = \ * ]]; then
+        ${(e)=~action}
+      elif [[ -n "$action" ]]; then
+	action=($=action)
+	${(e)action[1]} "$expl[@]" ${(e)~action[2,-1]}
       else
         _message "$descr"
       fi
@@ -308,15 +309,15 @@
 
     _description expl "$partd"
 
-    if (( $#parta )); then
-      if [[ "$parta[1]" = (\[|\() ]]; then
-        compadd "$expl[@]" - ${=parta[2,-2]}
-      elif [[ "$parta" = \ * ]]; then
-        ${(e)=~parta}
-      else
-	action=($=parta)
-	${(e)~parta[1]} "$expl[@]" ${(e)~action[2,-1]}
-      fi
+    if [[ "$parta[1]" = (\[*\]|\(*\)) ]]; then
+      compadd "$expl[@]" - ${=parta[2,-2]}
+    elif [[ "$parta" = \{*\} ]]; then
+      eval "$parta[2,-2]"
+    elif [[ "$parta" = \ * ]]; then
+      ${(e)=~parta}
+    elif [[ -n "$parta" ]]; then
+      action=($=parta)
+      ${(e)~action[1]} "$expl[@]" ${(e)~action[2,-1]}
     else
       compadd -S '' - "$PREFIX"
     fi
@@ -346,8 +347,6 @@
 
 anum=1
 for name in "$_lo_cache_names[@]"; do
-  action="$_lo_cache_actions[anum]"
-
   _description expl option
 
   if [[ "$name" = *_optarg_* ]]; then
diff -u -r oc/Base/_math Completion/Base/_math
--- oc/Base/_math	Mon Aug 23 10:12:47 1999
+++ Completion/Base/_math	Mon Aug 23 10:23:11 1999
@@ -1,7 +1,5 @@
 #compdef -math-
 
-local expl
-
 if [[ "$PREFIX" = *[^a-zA-Z0-9_]* ]]; then
   IPREFIX="$IPREFIX${PREFIX%%[a-zA-Z0-9_]#}"
   PREFIX="${PREFIX##*[^a-zA-Z0-9_]}"
@@ -11,5 +9,4 @@
   SUFFIX="${SUFFIX%%[^a-zA-Z0-9_]*}"
 fi
 
-_description expl parameter
-compgen "$expl[@]" -v
+_parameters
diff -u -r oc/Base/_parameter Completion/Base/_parameter
--- oc/Base/_parameter	Mon Aug 23 10:12:47 1999
+++ Completion/Base/_parameter	Mon Aug 23 10:23:11 1999
@@ -1,7 +1,7 @@
 #compdef -parameter-
 
 if [[ "$compstate[insert]" = *menu* ]]; then
-  _parameters
+  _parameters -s ''
 else
-  _parameters -S ' ' -r '['
+  _parameters -s ' '
 fi
diff -u -r oc/Base/_tilde Completion/Base/_tilde
--- oc/Base/_tilde	Mon Aug 23 10:12:47 1999
+++ Completion/Base/_tilde	Mon Aug 23 10:23:11 1999
@@ -41,7 +41,7 @@
   if (( $# )); then
     d=( "$@" )
   else
-    _description d user
+    _description d 'user or named directory'
   fi
 fi
 
diff -u -r oc/Base/_vars Completion/Base/_vars
--- oc/Base/_vars	Mon Aug 23 10:12:47 1999
+++ Completion/Base/_vars	Mon Aug 23 10:23:11 1999
@@ -20,6 +20,5 @@
     compadd "$expl[@]" $addclose - ${(kP)var}
   fi
 else
-  _description expl parameter
-  compgen "$expl[@]" -v
+  _parameter
 fi
diff -u -r oc/Builtins/_vars_eq Completion/Builtins/_vars_eq
--- oc/Builtins/_vars_eq	Mon Aug 23 10:12:49 1999
+++ Completion/Builtins/_vars_eq	Mon Aug 23 10:23:11 1999
@@ -1,6 +1,3 @@
 #compdef declare export integer local readonly typeset
 
-local expl
-
-_description expl parameter
-compgen "$expl[@]" -v -q -S '='
+_parameters -q -S '='
diff -u -r oc/Builtins/_zftp Completion/Builtins/_zftp
--- oc/Builtins/_zftp	Mon Aug 23 10:12:49 1999
+++ Completion/Builtins/_zftp	Mon Aug 23 10:23:12 1999
@@ -23,47 +23,46 @@
 
 case $subcom in
   *(cd|ls|dir))
-   # complete remote directories; we could be smarter about hiding prefixes
-   zfcd_match $PREFIX $SUFFIX
-   _description expl 'remote directory'
-   (( $#reply )) && compadd "$expl[@]" -S/ -q - $reply
-   ;;
+    # complete remote directories; we could be smarter about hiding prefixes
+    zfcd_match $PREFIX $SUFFIX
+    _description expl 'remote directory'
+    (( $#reply )) && compadd "$expl[@]" -S/ -q - $reply
+    ;;
 
   *(get(|at)|gcp|delete|remote))
-   # complete remote files
-   zfget_match $PREFIX $SUFFIX
-   _description expl 'remote file'
-   (( $#reply )) && compadd "$expl[@]" -F fignore - $reply
-   ;;
+    # complete remote files
+    zfget_match $PREFIX $SUFFIX
+    _description expl 'remote file'
+    (( $#reply )) && compadd "$expl[@]" -F fignore - $reply
+    ;;
 
   *(put(|at)|pcp))
-   # complete local files
-   _files
-   ;;
+    # complete local files
+    _files
+    ;;
 
   *(open|anon|params))
-  # complete hosts:  should do cleverer stuff with user names
-  _description expl host
-  compgen "$expl[@]" -k hosts
-  ;;
+    # complete hosts:  should do cleverer stuff with user names
+    _hosts
+    ;;
 
   *(goto|mark))
-  # complete bookmarks.  First decide if ncftp mode is go.
-  _description expl bookmark
-  if [[ $words[2] = -*n* ]]; then
-    if [[ -f ~/.ncftp/bookmarks ]]; then
-      compadd "$expl[@]" - $(awk -F, 'NR > 2 { print $1 }' ~/.ncftp/bookmarks)
+    # complete bookmarks.  First decide if ncftp mode is go.
+    _description expl bookmark
+    if [[ $words[2] = -*n* ]]; then
+      if [[ -f ~/.ncftp/bookmarks ]]; then
+        compadd "$expl[@]" - $(awk -F, 'NR > 2 { print $1 }' ~/.ncftp/bookmarks)
+      fi
+    else
+      if [[ -f ${ZFTP_BMFILE:=${ZDOTDIR:-$HOME}/.zfbkmarks} ]]; then
+        compadd "$expl[@]" - $(awk '{print $1}' $ZFTP_BMFILE)
+      fi
     fi
-  else
-    if [[ -f ${ZFTP_BMFILE:=${ZDOTDIR:-$HOME}/.zfbkmarks} ]]; then
-      compadd "$expl[@]" - $(awk '{print $1}' $ZFTP_BMFILE)
-    fi
-  fi
-  ;;
+    ;;
 
   *)
-  # dunno... try ordinary completion after all.
-  unset _compskip
-  return 1
-  ;;
+    # dunno... try ordinary completion after all.
+    unset _compskip
+    return 1
+    ;;
 esac
diff -u -r oc/Commands/_correct_filename Completion/Commands/_correct_filename
--- oc/Commands/_correct_filename	Mon Aug 23 10:12:49 1999
+++ Completion/Commands/_correct_filename	Mon Aug 23 10:23:12 1999
@@ -1,4 +1,4 @@
-#compdef -kn complete-word \C-xC
+#compdef -k complete-word \C-xC
 
 # Function to correct a filename.  Can be used as a completion widget,
 # or as a function in its own right, in which case it will print the
diff -u -r oc/Commands/_correct_word Completion/Commands/_correct_word
--- oc/Commands/_correct_word	Mon Aug 23 10:12:49 1999
+++ Completion/Commands/_correct_word	Mon Aug 23 10:23:12 1999
@@ -1,4 +1,4 @@
-#compdef -kn complete-word \C-xc
+#compdef -k complete-word \C-xc
 
 # Simple completion front-end implementing spelling correction.
 # The maximum number of errors is set quite high, and
diff -u -r oc/Commands/_expand_word Completion/Commands/_expand_word
--- oc/Commands/_expand_word	Mon Aug 23 10:12:50 1999
+++ Completion/Commands/_expand_word	Mon Aug 23 10:23:12 1999
@@ -1,4 +1,4 @@
-#compdef -kn complete-word \C-xe
+#compdef -k complete-word \C-xe
 
 # Simple completion front-end implementing expansion.
 #
diff -u -r oc/Commands/_history_complete_word Completion/Commands/_history_complete_word
--- oc/Commands/_history_complete_word	Mon Aug 23 10:12:50 1999
+++ Completion/Commands/_history_complete_word	Mon Aug 23 10:23:12 1999
@@ -1,4 +1,4 @@
-#compdef -kn complete-word \e/
+#compdef -k complete-word \e/
 
 local expl
 
diff -u -r oc/Commands/_most_recent_file Completion/Commands/_most_recent_file
--- oc/Commands/_most_recent_file	Mon Aug 23 10:12:50 1999
+++ Completion/Commands/_most_recent_file	Mon Aug 23 10:23:12 1999
@@ -1,4 +1,4 @@
-#compdef -kn complete-word \C-xm
+#compdef -k complete-word \C-xm
 
 # Complete the most recent file matching the pattern on the line so
 # far: globbing is active, i.e. *.txt will be expanded to the most recent
diff -u -r oc/Commands/_read_comp Completion/Commands/_read_comp
--- oc/Commands/_read_comp	Mon Aug 23 10:12:50 1999
+++ Completion/Commands/_read_comp	Mon Aug 23 10:23:13 1999
@@ -1,4 +1,4 @@
-#compdef -kn complete-word \C-x\C-r
+#compdef -k complete-word \C-x\C-r
 
 # This allows an on-the-fly choice of completions.  On typing the key
 # sequence given above, you will be prompted for a string of arguments.  If
diff -u -r oc/Core/_parameters Completion/Core/_parameters
--- oc/Core/_parameters	Mon Aug 23 10:12:51 1999
+++ Completion/Core/_parameters	Mon Aug 23 11:03:48 1999
@@ -1,16 +1,67 @@
 #autoload
 
 # This should be used to complete parameter names if you need some of the
-# extra options of compadd. It completes only non-local parameters. All
-# arguments are given to compadd.
+# extra options of compadd. It completes only non-local parameters.
+# If the first argument is `-s' or `-b' auto_param_slash will be tested
+# and slashes will be added to parameters containing a directory. `-s' is
+# for parameter expansions without braces and `-b' is for expansions with
+# braces. A `-' as the first argument is ignored and in all cases all
+# other arguments will be given to `compadd'.
 
-local expl
+
+setopt localoptions extendedglob
+
+local pars expl slash suf
+
+if [[ "$1" = -s ]]; then
+  slash=normal
+  suf="$2"
+  shift 2
+elif [[ "$1" = -b ]]; then
+  slash=brace
+  suf="$2"
+  shift 2
+elif [[ "$1" = - ]]; then
+  shift
+fi
 
 _description expl parameter
 
 if zmodload -e parameter; then
   setopt localoptions extendedglob
-  compadd "$expl[@]" "$@" - ${(k)parameters[(R)^*local*]}
+  pars=( ${(k)parameters[(R)^*local*]} )
+else
+  pars=( ${${${(f)"$(typeset +)"}:#*local *}##* } )
+fi
+
+if [[ -n "$slash" && -o autoparamslash ]]; then
+  local i dirs nodirs ret=1
+
+  dirs=()
+  nodirs=()
+  for i in $pars; do
+    if [[ -d "${(P)i}" ]]; then
+      dirs=( $dirs $i )
+    else
+      nodirs=( $nodirs $i )
+    fi
+  done
+
+  if [[ "$slash" = normal ]]; then
+    compadd -S "/${suf%% #}" -r ' [/:' "$expl[@]" "$@" - $dirs && ret=0
+    compadd -S "$suf" -r ' [:' "$expl[@]" "$@" - $nodirs && ret=0
+  elif [[ "$slash" = brace ]]; then
+    compadd -S "}/${suf%% #}" -r '-:?#%+=[/}' "$expl[@]" "$@" - $dirs && ret=0
+    compadd -S "}$suf" -r '-:?#%+=[/}' "$expl[@]" "$@" - $nodirs && ret=0
+  fi
+
+  return ret
 else
-  compadd "$expl[@]" "$@" - ${${${(f)"$(typeset +)"}:#*local *}##* }
+  if [[ "$slash" = normal ]]; then
+    compadd -S "$suf" -r ' [:' "$expl[@]" "$@" - $pars
+  elif [[ "$slash" = brace ]]; then
+    compadd -S "}$suf" -r '-:?#%+=[/}' "$expl[@]" "$@" - $pars
+  else
+    compadd "$expl[@]" "$@" - $pars
+  fi
 fi
diff -u -r oc/Core/compinit Completion/Core/compinit
--- oc/Core/compinit	Mon Aug 23 10:12:51 1999
+++ Completion/Core/compinit	Mon Aug 23 10:23:13 1999
@@ -379,7 +379,7 @@
       case $_i_tag in
       (\#compdef)
 	if [[ $_i_line[1] = -[pPk](n|) ]]; then
-	  compdef ${_i_line[1]}a "${_i_file:t}" "${(@)_i_line[2,-1]}"
+	  compdef ${_i_line[1]}na "${_i_file:t}" "${(@)_i_line[2,-1]}"
 	else
 	  compdef -na "${_i_file:t}" "${_i_line[@]}"
 	fi
diff -u -r oc/User/_chown Completion/User/_chown
--- oc/User/_chown	Mon Aug 23 10:12:58 1999
+++ Completion/User/_chown	Mon Aug 23 10:23:13 1999
@@ -4,14 +4,10 @@
   if [[ $words[1] = chgrp ]] || compset -P '*[:.]'; then
     _groups
   else
-    local expl
-
-    _description expl user
-
     if [[ $OSTYPE = (solaris*|hpux*) ]]; then
-      compgen "$expl[@]" -u -S ':' -q
+      _users -S ':' -q
     else
-      compgen "$expl[@]" -u -S '.' -q
+      _users -S '.' -q
     fi
   fi
 else
diff -u -r oc/User/_dir_list Completion/User/_dir_list
--- oc/User/_dir_list	Mon Aug 23 11:28:33 1999
+++ Completion/User/_dir_list	Mon Aug 23 10:23:14 1999
@@ -0,0 +1,4 @@
+#autoload
+
+compset -P '*:'
+_files -S: -r ': \t\t\-' -/
diff -u -r oc/User/_exec_funcs Completion/User/_exec_funcs
--- oc/User/_exec_funcs	Mon Aug 23 11:28:33 1999
+++ Completion/User/_exec_funcs	Mon Aug 23 10:23:14 1999
@@ -0,0 +1,49 @@
+#autoload
+
+# This should be called from `_arguments' or otherwise the calling
+# function has to set up an array named `line' that contains the
+# name of the executable as its seconf element or it has to supply
+# that name as an argument.
+# One option is recognized: `-p' means that we are completing a pair
+# of names separated by a slash.
+
+local cmd pair expl
+
+if [[ "$1" = -p ]]; then
+  pair=yes
+  shift
+fi
+
+if (( $# )); then
+  cmd="$1"
+elif [[ $#line -gt 1 ]]; then
+  cmd="$line[2]"
+else
+  return 1
+fi
+
+if [[ -n "$cmd" ]]; then
+  if [[ "$cmd" = /* ]]; then
+    tmp="$cmd"
+  else
+    tmp="$PWD/$cmd"
+  fi
+
+  if [[ "$tmp" != "$_es_command" ]]; then
+    _es_command="$tmp"
+    _es_funcs=( "${(@)${(@M)${(@f)$(nm $cmd)}:#[^ ]# [tT] ([^_]|_[^_])*}##* }" )
+  fi
+  
+  if [[ -n "$pair" ]]; then
+    if compset -P '*/'; then
+      _description expl 'call arc to function'
+    else
+      _description expl 'call arc from function'
+    fi
+  else
+    _description expl function
+  fi
+  compadd -M 'r:|_=* r:|=*' - "$_es_funcs[@]"
+else
+  return 1
+fi
diff -u -r oc/User/_find Completion/User/_find
--- oc/User/_find	Mon Aug 23 10:12:58 1999
+++ Completion/User/_find	Mon Aug 23 10:23:14 1999
@@ -27,6 +27,5 @@
 elif [[ "$prev" = -group ]]; then
   _groups
 elif [[ "$prev" = -user ]]; then
-  _description expl user
-  compgen "$expl[@]" -u
+  _users
 fi
diff -u -r oc/User/_gprof Completion/User/_gprof
--- oc/User/_gprof	Mon Aug 23 11:28:33 1999
+++ Completion/User/_gprof	Mon Aug 23 11:29:44 1999
@@ -0,0 +1,12 @@
+#compdef gprof
+
+_arguments -s -{a,b,c,D,h,i,l,L,s,T,v,w,x,y,z} \
+           -{A,C,e,E,f,F,J,n,N,O,p,P,q,Q,Z}:'function name: _exec_funcs' \
+	   '-I:directory:_dir_list' \
+	   '-d-:debug level:' '-k:function names: _exec_funcs -p' \
+	   '-m:minimum execution count:' \
+	   ':executable:_files -g *(*)' \
+	   ':profile file:_files -g gmon.*' \
+	   -- -s '(#--[no-] --)' \
+           '*=name*:function name: _exec_funcs' \
+	   '*=dirs*:directory:_dir_list'
diff -u -r oc/User/_rlogin Completion/User/_rlogin
--- oc/User/_rlogin	Mon Aug 23 10:12:59 1999
+++ Completion/User/_rlogin	Mon Aug 23 10:23:14 1999
@@ -15,5 +15,5 @@
 elif [[ CURRENT -eq 3 ]]; then
   compadd - -l
 else
-  compgen "$expl[@]" -S @ -u
+  _users -S @
 fi
diff -u -r oc/User/_su Completion/User/_su
--- oc/User/_su	Mon Aug 23 10:12:59 1999
+++ Completion/User/_su	Mon Aug 23 10:23:15 1999
@@ -1,13 +1,12 @@
 #compdef su
 
-local shell comp name usr base expl
+local shell comp name usr base
 
 [[ $words[2] != - ]]
 (( base=$?+2 ))
 
 if [[ CURRENT -eq base ]]; then
-  _description expl user
-  compgen "$expl[@]" -u && return
+  _users && return
   usr=root
 elif [[ CURRENT -ge base+1 ]]; then
   usr=$words[base]
diff -u -r oc/User/_tar Completion/User/_tar
--- oc/User/_tar	Mon Aug 23 10:12:59 1999
+++ Completion/User/_tar	Mon Aug 23 10:23:15 1999
@@ -72,7 +72,7 @@
 
   # ...long options after `--'.
 
-  _long_options '--owner*:user:_tilde' \
+  _long_options '--owner*:user:_users' \
                 '*=(PROG|COMMAND)*:program:_command_names' \
 		'*=ARCHIVE*:archive: _tar_archive' \
 		'*=NAME*:file:_files' \
diff -u -r oc/User/_users Completion/User/_users
--- oc/User/_users	Mon Aug 23 11:30:03 1999
+++ Completion/User/_users	Mon Aug 23 10:23:15 1999
@@ -0,0 +1,6 @@
+#autoload
+
+local expl
+
+_description expl user
+compgen "$@" "$expl[@]" -u
--- Util/completion-style-guide.old	Mon Aug 23 11:27:28 1999
+++ Util/completion-style-guide	Mon Aug 23 11:25:15 1999
@@ -0,0 +1,44 @@
+For now this is just a list of things one should or shouldn't do.
+
+1)  Use the functions `_files' and `_path_files' instead of `compgen'
+    with the `-f', `-/', or `-g' options.
+2)  *Never* use `compgen' with the `-s' option. This can always be done 
+    by a call to `compadd' which is faster.
+3)  Using `compgen' with the `-k' option should only be done if a) the
+    array is already existent or b) it is very large (several hundred
+    or thousend elements). In other cases using `compadd' is faster.
+4)  Supply match specifications to `compadd' and `compgen' if there are 
+    sensible ones.
+5)  Use `_description' when adding matches with `compadd' or
+    `compgen'. Use `_message' in places where no matches can be
+    generated. If you want to add different types of matches, add them
+    with multiple calls to `compadd' or `compgen', supplying different
+    descriptions.
+6)  Use helper functions that do option completion for you (like
+    `_arguments' and `_long_options') -- it will make your life much
+    easier.
+7)  Use helper functions like `_users' and `_groups' instead of direct
+    calls to `compgen -u' or some ad hoc mechanisms to generate such
+    information. This ensures that user can change the way these things 
+    will be completed everywhere by just using their own implementations 
+    for these functions.
+8)  Make sure that the return value of your functions is correct: zero
+    if matches where added and non-zero if no matches were found.
+    In some cases you'll need to test the value of `$compstate[nmatches]'
+    for this. This should always be done by first saving the old value
+    (`local nm="$compstate[nmatches]"') and later comparing this with
+    the current value after all matches have been added (e.g. by
+    writing `[[ nmm -ne compstate[nmatches] ]]' at the end of your
+    function). This guarantees that your functions will be re-usable
+    because calling functions may rely on the correct return value.
+9)  In places where different behaviors may be useful, add a
+    configuration key to allow users to select the behavior they
+    prefer. Names for configuration keys should look like `prefix_name',
+    where `prefix' is the (probably abbreviated) name of your function
+    and `name' describes what can be configured.
+    When testing the values of configuration keys, the empty string
+    should result in the same behavior as if the key were unset. This
+    can be achieved by the test `[[ -n "$compconfig[prefix_name]" ]]'.
+10) When writing helper functions that generate matches, the arguments
+    of these should be given unchanged to `compadd' or `compgen' (if
+    they are not used by the helper function itself).

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-21  8:39   ` Tanaka Akira
@ 1999-08-21 17:47     ` Tanaka Akira
  0 siblings, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-21 17:47 UTC (permalink / raw)
  To: zsh-workers

In article <rsqbtc1wmru.fsf@crane.jaist.ac.jp>,
  Tanaka Akira <akr@jaist.ac.jp> writes:

> Oops. I found that already _arguments can handle options started with
> "--" without _long_options.  But also I fount that it is bit
> problematic with -s.

This is more refinement for -s. I reduced {,d,od}mopts to {,d,od}opts
because I thought it's too redundant.

Also, I found the problem about associative array with rcexpandparam.

Z(2):akr@is27e1u11% zsh -f
is27e1u11% typeset -A arr 
is27e1u11% arr[a]=
is27e1u11% print -lr - "A${(@)^arr[(I)b]}B"
AB

This should be empty.  Because of this problem, completions for
single-letter option doesn't work well.

Index: Completion/Base/_arguments
===================================================================
RCS file: /projects/zsh/zsh/Completion/Base/_arguments,v
retrieving revision 1.1.1.6
diff -u -F^( -r1.1.1.6 _arguments
--- _arguments	1999/08/21 08:40:24	1.1.1.6
+++ _arguments	1999/08/21 17:35:59
@@ -6,11 +6,12 @@
 setopt localoptions extendedglob
 
 local long args rest ws cur nth def nm expl descr action opt arg tmp
-local single uns ret=1 soptseq soptseq1 sopts
+local single uns ret=1 soptseq soptseq1 sopts prefix
 
 # Associative arrays used to collect information about the options.
 
-typeset -A opts mopts dopts dmopts odopts odmopts
+typeset -A opts dopts odopts
+typeset -A oneshot
 
 # See if we are using single-letter options.
 
@@ -46,30 +47,40 @@
       # is in the next word.
 
       if [[ "$1" = [^:]##-:* ]]; then
-        dopts[${${1%%:*}[1,-2]}]="${1#*:}"
+	tmp="${${1%%:*}[1,-2]}"
+        dopts[$tmp]="${1#*:}"
       elif [[ "$1" = [^:]##+:* ]]; then
-        odopts[${${1%%:*}[1,-2]}]="${1#*:}"
+	tmp="${${1%%:*}[1,-2]}"
+        odopts[$tmp]="${1#*:}"
       else
-        opts[${1%%:*}]="${1#*:}"
+        tmp="${1%%:*}"
+        opts[$tmp]="${1#*:}"
       fi
     else
-      opts[$1]=''
+      tmp="$1"
+      opts[$tmp]=''
     fi
+    oneshot[$tmp]=yes
   elif [[ "$1" = \*[-+]* ]]; then
 
     # The same for options that may appear more than once.
 
     if [[ "$1" = *:* ]]; then
       if [[ "$1" = [^:]##-:* ]]; then
-        dmopts[${${1[2,-1]%%:*}[1,-2]}]="${1#*:}"
+        tmp="${${1[2,-1]%%:*}[1,-2]}"
+        dopts[$tmp]="${1#*:}"
       elif [[ "$1" = [^:]##+:* ]]; then
-        odmopts[${${1[2,-1]%%:*}[1,-2]}]="${1#*:}"
+        tmp="${${1[2,-1]%%:*}[1,-2]}"
+        odopts[$tmp]="${1#*:}"
       else
-        mopts[${1[2,-1]%%:*}]="${1#*:}"
+        tmp="${1[2,-1]%%:*}"
+        opts[$tmp]="${1#*:}"
       fi
     else
-      mopts[${1[2,-1]}]=''
+      tmp="${1[2,-1]}"
+      opts[$tmp]=''
     fi
+    unset "oneshot[$tmp]"
   elif [[ "$1" = \*:* ]]; then
 
     # This is `*:...', describing `all other arguments'.
@@ -91,7 +102,7 @@
 done
 
 if [[ -n "$single" ]]; then
-  soptseq="${(@j::)${(@M)${(@k)opts[(R)]}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)mopts[(R)]}:#[-+]?}#[-+]}"
+  soptseq="${(@j::)${(@M)${(@k)opts[(R)]}:#[-+]?}#[-+]}"
   if [[ -n "$soptseq" ]]; then
     soptseq="[$soptseq]#"
     soptseq1="$soptseq#"
@@ -99,7 +110,7 @@
     soptseq=''
     soptseq1=''
   fi
-  sopts="${(@j::)${(@M)${(@k)opts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)mopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)dopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)dmopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)odopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)odmopts}:#[-+]?}#[-+]}"
+  sopts="${(@j::)${(@M)${(@k)opts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)dopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)odopts}:#[-+]?}#[-+]}"
 else
   soptseq=''
   soptseq1=''
@@ -168,26 +179,21 @@
         # associative array so that we don't offer them again.
 
         def="$opts[$ws[1]]"
-        unset "opts[$ws[1]]"
-      elif (( $+mopts[$ws[1]] )); then
-        def="$mopts[$ws[1]]"
+        [[ -n "$oneshot[$ws[1]]" ]] && unset "opts[$ws[1]]"
       else
         uns=''
         if [[ -n "$sopts" && "$ws[1]" = [-+]${~soptseq}[$sopts] ]]; then
-	  if (( $+opts[${ws[1][1]}${ws[1][-1]}] )); then
-	    def="$opts[${ws[1][1]}${ws[1][-1]}]"
+	  tmp="${ws[1][1]}${ws[1][-1]}"
+	  if (( $+opts[$tmp] )); then
+	    def="$opts[$tmp]"
 	    uns="${ws[1][2,-1]}"
 	    opt=''
-	  elif (( $+mopts[${ws[1][1]}${ws[1][-1]}] )); then
-	    def="$mopts[${ws[1][1]}${ws[1][-1]}]"
-	    uns="${ws[1][2,-1]}"
-	    opt=''
 	  fi
         fi
 
         # If the word is none of the simple options, test for those
         # whose first argument has to or may come directly after the
-        # option. This is done in four loops looking very much alike.
+        # option. This is done in two loops looking very much alike.
 
         if [[ -n "$opt" && $#dopts -ne 0 ]]; then
 
@@ -218,7 +224,7 @@
 
 	    opt=''
 	    def="$dopts[$tmp[1]]"
-	    unset "dopts[$tmp[1]]"
+	    [[ -n "$oneshot[$tmp[1]]" ]] && unset "dopts[$tmp[1]]"
 	    if [[ "$def" = ?*:*:* ]]; then
               def="${def#?*:*:}"
             else
@@ -226,30 +232,6 @@
 	    fi
           fi
         fi
-	if [[ -n "$opt" && $#dmopts -ne 0 ]]; then
-	  tmp=( "${(@k)dmopts}" )
-	  while (( $#tmp )); do
-            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
-	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
-		break;
-	      fi
-	    elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
-	      break
-	    fi
-	    shift 1 tmp
-	  done
-
-	  if (( $#tmp )); then
-	    opt=''
-	    def="$dmopts[$tmp[1]]"
-	    if [[ "$def" = ?*:*:* ]]; then
-              def="${def#?*:*:}"
-            else
-              def=''
-            fi
-          fi
-	fi
         if [[ -n "$opt" && $#odopts -ne 0 ]]; then
 	  tmp=( "${(@k)odopts}" )
 	  while (( $#tmp )); do
@@ -267,14 +249,15 @@
 	  if (( $#tmp )); then
 	    opt=''
 	    def="$odopts[$tmp[1]]"
-	    unset "odopts[$tmp[1]]"
+	    [[ -n "$oneshot[$tmp[1]]" ]] && unset "odopts[$tmp[1]]"
 
 	    # For options whose first argument *may* come after the
 	    # option, we skip over the first description only if there
 	    # is something after the option name on the line.
 
 	    if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) ||
-                  ( -n "$sopts" && $tmp[1] = [-+]? && "$ws[1]" != ${tmp[1][1]}${~soptseq}${tmp[1][2]} ) ]]; then
+                  ( -n "$sopts" && ( ( $tmp[1] = [-+]? && "$ws[1]" != "${tmp[1][1]}"${~soptseq}"${tmp[1][2]}" ) ||
+		  		     ( $tmp[1] != [-+]? && "$ws[1]" != "$tmp[1]" ) ) ) ]]; then
 	      if [[ "$def" = ?*:*:* ]]; then
                 def="${def#?*:*:}"
               else
@@ -283,41 +266,16 @@
 	    fi
           fi
         fi
-	if [[ -n "$opt" && $#odmopts -ne 0 ]]; then
-	  tmp=( "${(@k)odmopts}" )
-	  while (( $#tmp )); do
-            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
-	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
-		break;
-	      fi
-	    elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
-	      break
-	    fi
-	    shift 1 tmp
-	  done
-
-	  if (( $#tmp )); then
-	    opt=''
-	    def="$odmopts[$tmp[1]]"
-	    if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) ||
-                  ( -n "$sopts" && $tmp[1] = [-+]? && "$ws[1]" != ${tmp[1][1]}${~soptseq}${tmp[1][2]} ) ]]; then
-	      if [[ "$def" = ?*:*:* ]]; then
-                def="${def#?*:*:}"
-              else
-                def=''
-              fi
-            fi
-          fi
-	fi
 
         [[ -n "$sopts" && -n "$opt" && "$ws[1]" = [-+]${~soptseq} ]] && \
             uns="${ws[1][2,-1]}"
 
-        [[ -n "$uns" ]] &&
+	if [[ -n "$uns" ]]; then
+	  uns="${(j::)${(@k)oneshot[(I)${ws[1][1]}[$uns]]#[-+]}}"
 	  unset "opts[${(@)^opts[(I)${ws[1][1]}[$uns]]}]" \
 	        "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]" \
 	        "odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]"
+	fi
 
 	# If we didn't find a matching option description and we were
 	# told to use normal argument descriptions, just increase
@@ -356,7 +314,7 @@
 
     # In any case, we have to complete option names here, but we may
     # be in a string that starts with an option names and continues with
-    # the first argument, test that (again, four loops).
+    # the first argument, test that (again, two loops).
 
     opt=yes
     if (( $#dopts )); then
@@ -364,11 +322,12 @@
       # Get the option names.
 
       tmp=( "${(@k)dopts}" )
+      prefix="$PREFIX"
       while (( $#tmp )); do
         if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
           def="$dopts[$tmp[1]]"
 	  opt=''
-	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+	  uns="${prefix[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
 	  break
         elif compset -P "$tmp[1]"; then
 
@@ -382,29 +341,14 @@
 	shift 1 tmp
       done
     fi
-    if [[ -n "$opt" && $#dmopts -ne 0 ]]; then
-      tmp=( "${(@k)dmopts}" )
-      while (( $#tmp )); do
-        if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
-          def="$dmopts[$tmp[1]]"
-	  opt=''
-	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
-	  break
-        elif compset -P "$tmp[1]"; then
-	  def="$dmopts[$tmp[1]]"
-	  opt=''
-	  break
-        fi
-	shift 1 tmp
-      done
-    fi
     if [[ -n "$opt" && $#odopts -ne 0 ]]; then
       tmp=( "${(@k)odopts}" )
+      prefix="$PREFIX"
       while (( $#tmp )); do
         if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
           def="$odopts[$tmp[1]]"
 	  opt=''
-	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+	  uns="${prefix[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
 	  break
         elif compset -P "$tmp[1]"; then
 	  def="$odopts[$tmp[1]]"
@@ -414,30 +358,16 @@
 	shift 1 tmp
       done
     fi
-    if [[ -n "$opt" && $#odmopts -ne 0 ]]; then
-      tmp=( "${(@k)odmopts}" )
-      while (( $#tmp )); do
-        if [[ -n "$sopts" &&  $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
-          def="$odmopts[$tmp[1]]"
-	  opt=''
-	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
-	  break
-        elif compset -P "$tmp[1]"; then
-	  def="$odmopts[$tmp[1]]"
-	  opt=''
-	  break
-        fi
-	shift 1 tmp
-      done
-    fi
 
-    [[ -n "$sopts" && -n "$opt" && "$PREFIX" = [-+]* ]] && \
+    [[ -n "$sopts" && -n "$opt" && "$PREFIX" = [-+]${~soptseq}[$sopts] ]] && \
         uns="${PREFIX[2,-1]}"
 
-    [[ -n "$uns" ]] &&
-        unset "opts[${(@)^opts[(I)${pre[1]}[$uns]]}]" \
-	      "dopts[${(@)^dopts[(I)${pre[1]}[$uns]]}]" \
-	      "odopts[${(@)^odopts[(I)${pre[1]}[$uns]]}]"
+    if [[ -n "$uns" ]]; then
+      uns="${(j::)${(@k)oneshot[(I)${ws[1][1]}[$uns]]#[-+]}}"
+      unset "opts[${(@)^opts[(I)${pre[1]}[$uns]]}]" \
+	    "dopts[${(@)^dopts[(I)${pre[1]}[$uns]]}]" \
+	    "odopts[${(@)^odopts[(I)${pre[1]}[$uns]]}]"
+    fi
 
     if [[ -n "$opt" ]]; then
 
@@ -447,12 +377,18 @@
       if [[ "$compconfig[option_prefix]" != *(short|all)* ||
             "$PREFIX" = [-+]* ]]; then
         _description expl option
-	if [[ -n "$sopts" && -n "$PREFIX" && -n "$soptseq" && "$PREFIX" = [-+]${~soptseq1} ]]; then
-	  compadd "$expl[@]" -Q - "$PREFIX" && ret=0
+	if [[ -n "$sopts" && -n "$PREFIX" && "$PREFIX" = [-+]${~soptseq}[$sopts] ]]; then
+	  if [[ "$PREFIX" = [-+]${~soptseq1} ]]; then
+	    compadd "$expl[@]" -Q - "${PREFIX}${(@k)^opts[(I)${PREFIX[1]}?]#?}" \
+				    "${PREFIX}${(@k)^dopts[(I)${PREFIX[1]}?]#?}" \
+				    "${PREFIX}${(@k)^odopts[(I)${PREFIX[1]}?]#?}" && ret=0
+	  else
+	    # The last option takes an argument in next word.
+	    compadd "$expl[@]" -Q - "${PREFIX}" && ret=0
+	  fi
 	else
-          compadd "$expl[@]" -Q - "${(@k)opts}" "${(@k)mopts}" \
-				  "${(@k)odopts}" "${(@k)odmopts}" && ret=0
-	  compadd "$expl[@]" -QS '' - "${(@k)dopts}" "${(@k)dmopts}" && ret=0
+          compadd "$expl[@]" -Q - "${(@k)opts}" "${(@k)odopts}" && ret=0
+	  compadd "$expl[@]" -QS '' - "${(@k)dopts}" && ret=0
         fi
       fi
       [[ $#long -ne 0 &&
@@ -503,5 +439,5 @@
 
   # Set the return value.
 
-  [[  nm -ne "$compstate[nmatches]" ]]
+  [[ nm -ne "$compstate[nmatches]" ]]
 fi
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-20 23:22 ` Tanaka Akira
@ 1999-08-21  8:39   ` Tanaka Akira
  1999-08-21 17:47     ` Tanaka Akira
  0 siblings, 1 reply; 45+ messages in thread
From: Tanaka Akira @ 1999-08-21  8:39 UTC (permalink / raw)
  To: zsh-workers

In article <rsq672a11gw.fsf@crane.jaist.ac.jp>,
  Tanaka Akira <akr@jaist.ac.jp> writes:

> But, in general, help messages may not able to modify.  Therefore I
> think it is useful that _arguments can handle options started with
> "--".

Oops. I found that already _arguments can handle options started with
"--" without _long_options.  But also I fount that it is bit
problematic with -s.

Z(2):akr@is27e1u11% ./Src/zsh -f
is27e1u11% bindkey -e ; autoload -U compinit; compinit -D; compdef _tst tst
compconf group_matches=yes
compconf message_format='%d'
compconf description_format='%d'
is27e1u11% compconf group_matches=yes
is27e1u11% compconf message_format='%d'
is27e1u11% compconf description_format='%d'
is27e1u11% _tst () { _arguments -s '-a' '-b' '--xxx=-:descr:(a b c)' '--yyy=-:descr:(z y x)' }
is27e1u11% tst -a<TAB>
option
-a         -a-xxx\=   -a-yyy\=   -ab        

etc.

Index: Completion/Base/_arguments
===================================================================
RCS file: /projects/zsh/zsh/Completion/Base/_arguments,v
retrieving revision 1.1.1.5
diff -u -F^( -r1.1.1.5 _arguments
--- _arguments	1999/08/20 23:24:13	1.1.1.5
+++ _arguments	1999/08/21 08:32:36
@@ -6,7 +6,7 @@
 setopt localoptions extendedglob
 
 local long args rest ws cur nth def nm expl descr action opt arg tmp
-local single uns ret=1
+local single uns ret=1 soptseq soptseq1 sopts
 
 # Associative arrays used to collect information about the options.
 
@@ -90,6 +90,22 @@
   shift
 done
 
+if [[ -n "$single" ]]; then
+  soptseq="${(@j::)${(@M)${(@k)opts[(R)]}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)mopts[(R)]}:#[-+]?}#[-+]}"
+  if [[ -n "$soptseq" ]]; then
+    soptseq="[$soptseq]#"
+    soptseq1="$soptseq#"
+  else
+    soptseq=''
+    soptseq1=''
+  fi
+  sopts="${(@j::)${(@M)${(@k)opts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)mopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)dopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)dmopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)odopts}:#[-+]?}#[-+]}${(@j::)${(@M)${(@k)odmopts}:#[-+]?}#[-+]}"
+else
+  soptseq=''
+  soptseq1=''
+  sopts=''
+fi
+
 if [[ $#long -ne 0 && "$PREFIX" = --* ]]; then
 
    # If the current words starts with `--' and we should use long
@@ -157,19 +173,17 @@
         def="$mopts[$ws[1]]"
       else
         uns=''
-        if [[ -n "$single" && "$ws[1]" = [-+]* ]]; then
-          if [[ ${#${(kj::)opts[(R)?*]#?}} -ne 0 &&
-                "$ws[1]" = ${ws[1][1]}*[${(kj::)opts[(R)?*]#?}] ]]; then
+        if [[ -n "$sopts" && "$ws[1]" = [-+]${~soptseq}[$sopts] ]]; then
+	  if (( $+opts[${ws[1][1]}${ws[1][-1]}] )); then
 	    def="$opts[${ws[1][1]}${ws[1][-1]}]"
 	    uns="${ws[1][2,-1]}"
 	    opt=''
-	  elif [[ ${#${(kj::)mopts[(R)?*]#?}} -ne 0 &&
-                  "$ws[1]" = ${ws[1][1]}*[${(kj::)mopts[(R)?*]#?}] ]]; then
+	  elif (( $+mopts[${ws[1][1]}${ws[1][-1]}] )); then
 	    def="$mopts[${ws[1][1]}${ws[1][-1]}]"
 	    uns="${ws[1][2,-1]}"
 	    opt=''
 	  fi
-         fi
+        fi
 
         # If the word is none of the simple options, test for those
         # whose first argument has to or may come directly after the
@@ -185,8 +199,8 @@
 	  # with one of the option names.
 
 	  while (( $#tmp )); do
-            if [[ -n "$single" ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
 	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
 		break;
 	      fi
@@ -204,7 +218,7 @@
 
 	    opt=''
 	    def="$dopts[$tmp[1]]"
-	    [[ -z "$single" ]] && unset "dopts[$tmp[1]]"
+	    unset "dopts[$tmp[1]]"
 	    if [[ "$def" = ?*:*:* ]]; then
               def="${def#?*:*:}"
             else
@@ -215,8 +229,8 @@
 	if [[ -n "$opt" && $#dmopts -ne 0 ]]; then
 	  tmp=( "${(@k)dmopts}" )
 	  while (( $#tmp )); do
-            if [[ -n "$single" ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
 	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
 		break;
 	      fi
@@ -239,8 +253,8 @@
         if [[ -n "$opt" && $#odopts -ne 0 ]]; then
 	  tmp=( "${(@k)odopts}" )
 	  while (( $#tmp )); do
-            if [[ -n "$single" ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
 	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
 		break;
 	      fi
@@ -253,14 +267,14 @@
 	  if (( $#tmp )); then
 	    opt=''
 	    def="$odopts[$tmp[1]]"
-	    [[ -z "$single" ]] && unset "odopts[$tmp[1]]"
+	    unset "odopts[$tmp[1]]"
 
 	    # For options whose first argument *may* come after the
 	    # option, we skip over the first description only if there
 	    # is something after the option name on the line.
 
-	    if [[ ( -z "$single" && "$ws[1]" != "$tmp[1]" ) ||
-                  ( -n "$single" && "$ws[1]" != *${tmp[1][2]} ) ]]; then
+	    if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) ||
+                  ( -n "$sopts" && $tmp[1] = [-+]? && "$ws[1]" != ${tmp[1][1]}${~soptseq}${tmp[1][2]} ) ]]; then
 	      if [[ "$def" = ?*:*:* ]]; then
                 def="${def#?*:*:}"
               else
@@ -272,8 +286,8 @@
 	if [[ -n "$opt" && $#odmopts -ne 0 ]]; then
 	  tmp=( "${(@k)odmopts}" )
 	  while (( $#tmp )); do
-            if [[ -n "$single" ]]; then
-	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+            if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then
 	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
 		break;
 	      fi
@@ -286,8 +300,8 @@
 	  if (( $#tmp )); then
 	    opt=''
 	    def="$odmopts[$tmp[1]]"
-	    if [[ ( -z "$single" && "$ws[1]" != "$tmp[1]" ) ||
-                  ( -n "$single" && "$ws[1]" != *${tmp[1][2]} ) ]]; then
+	    if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) ||
+                  ( -n "$sopts" && $tmp[1] = [-+]? && "$ws[1]" != ${tmp[1][1]}${~soptseq}${tmp[1][2]} ) ]]; then
 	      if [[ "$def" = ?*:*:* ]]; then
                 def="${def#?*:*:}"
               else
@@ -297,7 +311,7 @@
           fi
 	fi
 
-        [[ -n "$single" && -n "$opt" && "$ws[1]" = [-+]* ]] && \
+        [[ -n "$sopts" && -n "$opt" && "$ws[1]" = [-+]${~soptseq} ]] && \
             uns="${ws[1][2,-1]}"
 
         [[ -n "$uns" ]] &&
@@ -351,7 +365,7 @@
 
       tmp=( "${(@k)dopts}" )
       while (( $#tmp )); do
-        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+        if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
           def="$dopts[$tmp[1]]"
 	  opt=''
 	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
@@ -371,7 +385,7 @@
     if [[ -n "$opt" && $#dmopts -ne 0 ]]; then
       tmp=( "${(@k)dmopts}" )
       while (( $#tmp )); do
-        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+        if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
           def="$dmopts[$tmp[1]]"
 	  opt=''
 	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
@@ -387,7 +401,7 @@
     if [[ -n "$opt" && $#odopts -ne 0 ]]; then
       tmp=( "${(@k)odopts}" )
       while (( $#tmp )); do
-        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+        if [[ -n "$sopts" && $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
           def="$odopts[$tmp[1]]"
 	  opt=''
 	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
@@ -403,7 +417,7 @@
     if [[ -n "$opt" && $#odmopts -ne 0 ]]; then
       tmp=( "${(@k)odmopts}" )
       while (( $#tmp )); do
-        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+        if [[ -n "$sopts" &&  $tmp[1] = [-+]? ]] && compset -P "${tmp[1][1]}${~soptseq}${tmp[1][2]}"; then
           def="$odmopts[$tmp[1]]"
 	  opt=''
 	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
@@ -417,7 +431,7 @@
       done
     fi
 
-    [[ -n "$single" && -n "$opt" && "$PREFIX" = [-+]* ]] && \
+    [[ -n "$sopts" && -n "$opt" && "$PREFIX" = [-+]* ]] && \
         uns="${PREFIX[2,-1]}"
 
     [[ -n "$uns" ]] &&
@@ -433,25 +447,12 @@
       if [[ "$compconfig[option_prefix]" != *(short|all)* ||
             "$PREFIX" = [-+]* ]]; then
         _description expl option
-	if [[ -n "$single" ]]; then
-          if [[ -z "$PREFIX" || "$PREFIX" = ? ]]; then
-	    compadd "$expl[@]" - "${(@k)opts}" "${(@k)mopts}" \
-			         "${(@k)dopts}" "${(@k)dmopts}" \
-			         "${(@k)odopts}" "${(@k)odmopts}" &&
-                ret=0
-	  else
-	    compadd "$expl[@]" - "${PREFIX}${(@k)^opts[(I)${PREFIX[1]}*]#?}" \
-			         "${PREFIX}${(@k)^mopts[(I)${PREFIX[1]}*]#?}" \
-			         "${PREFIX}${(@k)^dopts[(I)${PREFIX[1]}*]#?}" \
-			         "${PREFIX}${(@k)^dmopts[(I)${PREFIX[1]}*]#?}" \
-			         "${PREFIX}${(@k)^odopts[(I)${PREFIX[1]}*]#?}" \
-			         "${PREFIX}${(@k)^odmopts[(I)${PREFIX[1]}*]#?}" &&
-                ret=0
-          fi
+	if [[ -n "$sopts" && -n "$PREFIX" && -n "$soptseq" && "$PREFIX" = [-+]${~soptseq1} ]]; then
+	  compadd "$expl[@]" -Q - "$PREFIX" && ret=0
 	else
-          compadd "$expl[@]" - "${(@k)opts}" "${(@k)mopts}" \
-                               "${(@k)dopts}" "${(@k)dmopts}" \
-			       "${(@k)odopts}" "${(@k)odmopts}" && ret=0
+          compadd "$expl[@]" -Q - "${(@k)opts}" "${(@k)mopts}" \
+				  "${(@k)odopts}" "${(@k)odmopts}" && ret=0
+	  compadd "$expl[@]" -QS '' - "${(@k)dopts}" "${(@k)dmopts}" && ret=0
         fi
       fi
       [[ $#long -ne 0 &&
Index: Completion/User/_patch
===================================================================
RCS file: /projects/zsh/zsh/Completion/User/_patch,v
retrieving revision 1.1.1.1
diff -u -F^( -r1.1.1.1 _patch
--- _patch	1999/08/20 23:55:52	1.1.1.1
+++ _patch	1999/08/21 08:35:32
@@ -12,7 +12,7 @@
   '-b' \
   '-V+:version control style:(simple numbered existing)' \
   '-B+:backup path prefix:' \
-  '-Y+:basename basename prefix:_files' \
+  '-Y+:backup basename prefix:_files' \
   '-z+:backup file suffix:(.bak)' \
   '-g+:NUM:' \
   '-t' '-f' '-s' \
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-20 12:59 Sven Wischnowsky
@ 1999-08-20 23:22 ` Tanaka Akira
  1999-08-21  8:39   ` Tanaka Akira
  0 siblings, 1 reply; 45+ messages in thread
From: Tanaka Akira @ 1999-08-20 23:22 UTC (permalink / raw)
  To: zsh-workers

In article <199908201259.OAA00799@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> Not that easy and some people probably don't like the way option names 
> are completed with this patch, but still...

I tried to use this for "patch" and few problems are found and
fixed. And I thought some about _arguments.

1. The help message may not suited for _long_options.

For example, help message of "patch" contains: 
  -p NUM  --strip=NUM  Strip NUM leading components from file names.

The options are not separeted by ",".

I avoid this problem by modifying the help message.
# http://www.ldl.jaist.ac.jp/~akr/junk/patch-2.5.3-cvsaware-19990820.patch

But, in general, help messages may not able to modify.  Therefore I
think it is useful that _arguments can handle options started with
"--".

# Also, if _arguments supports options started with "--" directly,
# opt-spec to specify both "--xxx=yyy" and "--xxx yyy" at once may
# useful.

2. I would like to refer the parsed arguments in completers.

I think this is useful in many cases.
For example, if the completer for port of telnet can refer host
argument, it can complete ports precisely: "nntp" for news servers,
"smtp" for mail servers, etc.  If the completer for emacs can check
whether the argument of -f is batch-byte-compile, we can complete only
*.el.

3. "xterm -e" style.

Some options take arguments up to end of command line.

If _arguments supports this style of options, it is also useful for
_cvs, I suppose. Because first non-option argument for cvs command
behaves like that.

For example, I would like to describe _cvs as:

_cvs () {
  _arguments -s \
    '-d:cvsroot:...' \
    ... \
    '**:subcommand:_cvs_subcommand'
}

_cvs_subcommand () {
  if [[ CURRENT = 1 ]]; then
    compadd -- add commit diff ...
  else
    case $words[1] in
      add) _arguments -s '-k+:keyword expansion:...' ...;;
      ...
    esac
  fi
}

Index: Completion/Base/_arguments
===================================================================
RCS file: /projects/zsh/zsh/Completion/Base/_arguments,v
retrieving revision 1.1.1.4
diff -u -F^( -r1.1.1.4 _arguments
--- _arguments	1999/08/20 13:29:01	1.1.1.4
+++ _arguments	1999/08/20 22:25:02
@@ -158,12 +158,12 @@
       else
         uns=''
         if [[ -n "$single" && "$ws[1]" = [-+]* ]]; then
-          if [[ $#opts -ne 0 &&
+          if [[ ${#${(kj::)opts[(R)?*]#?}} -ne 0 &&
                 "$ws[1]" = ${ws[1][1]}*[${(kj::)opts[(R)?*]#?}] ]]; then
 	    def="$opts[${ws[1][1]}${ws[1][-1]}]"
 	    uns="${ws[1][2,-1]}"
 	    opt=''
-	  elif [[ $#mopts -ne 0 &&
+	  elif [[ ${#${(kj::)mopts[(R)?*]#?}} -ne 0 &&
                   "$ws[1]" = ${ws[1][1]}*[${(kj::)mopts[(R)?*]#?}] ]]; then
 	    def="$mopts[${ws[1][1]}${ws[1][-1]}]"
 	    uns="${ws[1][2,-1]}"
@@ -457,7 +457,7 @@
       [[ $#long -ne 0 &&
          ( "$compconfig[option_prefix]" != *(long|all)* ||
            "$PREFIX" = --* ) ]] && \
-          _long_options && ret=0
+	  _long_options "$long[@]" && ret=0
     fi
   fi
 
Index: Completion/Base/_long_options
===================================================================
RCS file: /projects/zsh/zsh/Completion/Base/_long_options,v
retrieving revision 1.1.1.7
diff -u -F^( -r1.1.1.7 _long_options
--- _long_options	1999/08/19 14:41:32	1.1.1.7
+++ _long_options	1999/08/20 22:25:02
@@ -135,7 +135,7 @@
 
   set -- "$@" '*=FILE*:file:_files' '*=(DIR|PATH)*:directory:_files -/' '*:unknown:'
 
-  while [[ $# -gt 1 ]]; do
+  while [[ $# -gt 0 ]]; do
 
     # First, we get the pattern and the action to use and take them
     # from the positional parameters.
@@ -265,6 +265,8 @@
 	  action=($=action)
 	  ${(e)action[1]} "$expl[@]" ${(e)~action[2,-1]}
         fi
+      else
+        _message "$descr"
       fi
 
       # We found the option string, return.
Index: Completion/User/_patch
===================================================================
RCS file: _patch
diff -N _patch
--- /dev/null	Fri Apr 17 15:56:34 1998
+++ _patch	Fri Aug 20 22:25:03 1999
@@ -0,0 +1,32 @@
+#compdef patch
+
+_arguments -s \
+  '-p+:number:(0)' \
+  '-F+:lines:' \
+  '-l' '-c' '-e' '-n' '-u' '-N' '-R' \
+  '-i+:patch file:_files' \
+  '-o+:output file:_files' \
+  '-r+:reject file:_files' \
+  '-D+:name:' \
+  '-E' '-Z' '-T' \
+  '-b' \
+  '-V+:version control style:(simple numbered existing)' \
+  '-B+:backup path prefix:' \
+  '-Y+:basename basename prefix:_files' \
+  '-z+:backup file suffix:(.bak)' \
+  '-g+:NUM:' \
+  '-t' '-f' '-s' \
+  '-d+:chdir to:_files -/' \
+  '-v' \
+  ':original file:_files' \
+  ':patch file:_files' \
+  -- \
+  '*=NUM*:number:(0)' \
+  '*=LINES*:lines:' \
+  '*=PATCHFILE*:patch file:_files' \
+  '*=FILE*:file:_files' \
+  '*=NAME*:name:' \
+  '*=WORD*:quoting style:(literal shell shell-always c escape)' \
+  '*=STYLE*:version control style:(simple numbered existing)' \
+  '*=SUFFIX*:backup file suffix:(.bak)' \
+  '*=DIR*:chdir to:_files -/'
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-20 12:59 Sven Wischnowsky
  1999-08-20 23:22 ` Tanaka Akira
  0 siblings, 1 reply; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-20 12:59 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> I feel `_arguments' is very good as basis of that.  Is it easy to
> extend `_arguments' to handle short options?

Not that easy and some people probably don't like the way option names 
are completed with this patch, but still...

I haven't changed `_cvs' (btw., maybe this should be split into
smaller functions and put in its own directory?).

Bye
 Sven

diff -u od/Zsh/compsys.yo Doc/Zsh/compsys.yo
--- od/Zsh/compsys.yo	Fri Aug 20 14:33:55 1999
+++ Doc/Zsh/compsys.yo	Fri Aug 20 14:31:11 1999
@@ -939,12 +939,18 @@
 builtins and which make sure that the var(message) given in the
 description will be shown above the matches.
 
-Finally, this function can be made to automatically call the
+Normally the option names are taken as multi-character names and a
+word from the line is considered to contain only one option (or
+none). By giving the tt(-s) option to this function (as the first
+argument), options are considered to be one-character options and the
+string from the line may contain more than one such option letter.
+
+This function can also be made to automatically call the
 tt(_long_options) function where appropriate by giving it the string
 `tt(--)' as an argument. All arguments after this will be given
 unchanged to the tt(_long_options) function.
 
-This function also uses one configuration key: tt(option_prefix). If
+Finally, this function uses one configuration key: tt(option_prefix). If
 this is set to a string containing `tt(short)' or `tt(all)' as a
 substring, option names beginning with a single minus sign are added
 as possible matches only if the word on the line begins with a minus
diff -u -r oc/Base/_arguments Completion/Base/_arguments
--- oc/Base/_arguments	Fri Aug 20 14:33:55 1999
+++ Completion/Base/_arguments	Fri Aug 20 13:32:59 1999
@@ -5,12 +5,20 @@
 
 setopt localoptions extendedglob
 
-local long args rest ws cur nth def nm expl descr action opt arg tmp ret=1
+local long args rest ws cur nth def nm expl descr action opt arg tmp
+local single uns ret=1
 
 # Associative arrays used to collect information about the options.
 
 typeset -A opts mopts dopts dmopts odopts odmopts
 
+# See if we are using single-letter options.
+
+if [[ "$1" = -s ]]; then
+  shift
+  single=yes
+fi
+
 # See if we support long options, too.
 
 nth=$argv[(I)--]
@@ -141,19 +149,33 @@
       if (( $+opts[$ws[1]] )); then
 
         # Options that may only be given once are removed from the
-        # associative array so that we are not offered them again.
+        # associative array so that we don't offer them again.
 
         def="$opts[$ws[1]]"
         unset "opts[$ws[1]]"
       elif (( $+mopts[$ws[1]] )); then
         def="$mopts[$ws[1]]"
       else
+        uns=''
+        if [[ -n "$single" && "$ws[1]" = [-+]* ]]; then
+          if [[ $#opts -ne 0 &&
+                "$ws[1]" = ${ws[1][1]}*[${(kj::)opts[(R)?*]#?}] ]]; then
+	    def="$opts[${ws[1][1]}${ws[1][-1]}]"
+	    uns="${ws[1][2,-1]}"
+	    opt=''
+	  elif [[ $#mopts -ne 0 &&
+                  "$ws[1]" = ${ws[1][1]}*[${(kj::)mopts[(R)?*]#?}] ]]; then
+	    def="$mopts[${ws[1][1]}${ws[1][-1]}]"
+	    uns="${ws[1][2,-1]}"
+	    opt=''
+	  fi
+         fi
 
         # If the word is none of the simple options, test for those
         # whose first argument has to or may come directly after the
         # option. This is done in four loops looking very much alike.
 
-        if (( $#dopts )); then
+        if [[ -n "$opt" && $#dopts -ne 0 ]]; then
 
 	  # First we get the option names.
 
@@ -163,7 +185,14 @@
 	  # with one of the option names.
 
 	  while (( $#tmp )); do
-	    [[ "$ws[1]" = ${tmp[1]}* ]] && break
+            if [[ -n "$single" ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+		break;
+	      fi
+	    elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
+              break
+	    fi
 	    shift 1 tmp
 	  done
 
@@ -175,7 +204,7 @@
 
 	    opt=''
 	    def="$dopts[$tmp[1]]"
-	    unset "dopts[$tmp[1]]"
+	    [[ -z "$single" ]] && unset "dopts[$tmp[1]]"
 	    if [[ "$def" = ?*:*:* ]]; then
               def="${def#?*:*:}"
             else
@@ -186,7 +215,14 @@
 	if [[ -n "$opt" && $#dmopts -ne 0 ]]; then
 	  tmp=( "${(@k)dmopts}" )
 	  while (( $#tmp )); do
-	    [[ "$ws[1]" = ${tmp[1]}* ]] && break
+            if [[ -n "$single" ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+		break;
+	      fi
+	    elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
+	      break
+	    fi
 	    shift 1 tmp
 	  done
 
@@ -203,20 +239,28 @@
         if [[ -n "$opt" && $#odopts -ne 0 ]]; then
 	  tmp=( "${(@k)odopts}" )
 	  while (( $#tmp )); do
-	    [[ "$ws[1]" = ${tmp[1]}* ]] && break
+            if [[ -n "$single" ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+		break;
+	      fi
+	    elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
+	      break
+	    fi
 	    shift 1 tmp
 	  done
 
 	  if (( $#tmp )); then
 	    opt=''
 	    def="$odopts[$tmp[1]]"
-	    unset "odopts[$tmp[1]]"
+	    [[ -z "$single" ]] && unset "odopts[$tmp[1]]"
 
 	    # For options whose first argument *may* come after the
 	    # option, we skip over the first description only if there
 	    # is something after the option name on the line.
 
-	    if [[ "$ws[1]" != "$tmp[1]" ]]; then
+	    if [[ ( -z "$single" && "$ws[1]" != "$tmp[1]" ) ||
+                  ( -n "$single" && "$ws[1]" != *${tmp[1][2]} ) ]]; then
 	      if [[ "$def" = ?*:*:* ]]; then
                 def="${def#?*:*:}"
               else
@@ -228,14 +272,22 @@
 	if [[ -n "$opt" && $#odmopts -ne 0 ]]; then
 	  tmp=( "${(@k)odmopts}" )
 	  while (( $#tmp )); do
-	    [[ "$ws[1]" = ${tmp[1]}* ]] && break
+            if [[ -n "$single" ]]; then
+	      if [[ "$ws[1]" = ${tmp[1][1]}*${tmp[1][2]}* ]]; then
+	        uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+		break;
+	      fi
+	    elif [[ "$ws[1]" = ${tmp[1]}* ]]; then
+	      break
+	    fi
 	    shift 1 tmp
 	  done
 
 	  if (( $#tmp )); then
 	    opt=''
 	    def="$odmopts[$tmp[1]]"
-	    if [[ "$ws[1]" != "$tmp[1]" ]]; then
+	    if [[ ( -z "$single" && "$ws[1]" != "$tmp[1]" ) ||
+                  ( -n "$single" && "$ws[1]" != *${tmp[1][2]} ) ]]; then
 	      if [[ "$def" = ?*:*:* ]]; then
                 def="${def#?*:*:}"
               else
@@ -245,6 +297,14 @@
           fi
 	fi
 
+        [[ -n "$single" && -n "$opt" && "$ws[1]" = [-+]* ]] && \
+            uns="${ws[1][2,-1]}"
+
+        [[ -n "$uns" ]] &&
+	  unset "opts[${(@)^opts[(I)${ws[1][1]}[$uns]]}]" \
+	        "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]" \
+	        "odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]"
+
 	# If we didn't find a matching option description and we were
 	# told to use normal argument descriptions, just increase
 	# our counter `nth'.
@@ -265,6 +325,9 @@
   nm="$compstate[nmatches]"
 
   if [[ -z "$def" || "$def" = :* ]]; then
+      local pre="$PREFIX"
+
+      uns=''
 
     # We either don't have a description for an argument of an option
     # or we have a description for a optional argument.
@@ -288,7 +351,12 @@
 
       tmp=( "${(@k)dopts}" )
       while (( $#tmp )); do
-        if compset -P "$tmp[1]"; then
+        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+          def="$dopts[$tmp[1]]"
+	  opt=''
+	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+	  break
+        elif compset -P "$tmp[1]"; then
 
 	  # The current string starts with the option name, so ignore
 	  # that and complete the rest of the string.
@@ -303,7 +371,12 @@
     if [[ -n "$opt" && $#dmopts -ne 0 ]]; then
       tmp=( "${(@k)dmopts}" )
       while (( $#tmp )); do
-        if compset -P "$tmp[1]"; then
+        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+          def="$dmopts[$tmp[1]]"
+	  opt=''
+	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+	  break
+        elif compset -P "$tmp[1]"; then
 	  def="$dmopts[$tmp[1]]"
 	  opt=''
 	  break
@@ -314,7 +387,12 @@
     if [[ -n "$opt" && $#odopts -ne 0 ]]; then
       tmp=( "${(@k)odopts}" )
       while (( $#tmp )); do
-        if compset -P "$tmp[1]"; then
+        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+          def="$odopts[$tmp[1]]"
+	  opt=''
+	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+	  break
+        elif compset -P "$tmp[1]"; then
 	  def="$odopts[$tmp[1]]"
 	  opt=''
 	  break
@@ -325,7 +403,12 @@
     if [[ -n "$opt" && $#odmopts -ne 0 ]]; then
       tmp=( "${(@k)odmopts}" )
       while (( $#tmp )); do
-        if compset -P "$tmp[1]"; then
+        if [[ -n "$single" ]] && compset -P "${tmp[1][1]}*${tmp[1][2]}"; then
+          def="$odmopts[$tmp[1]]"
+	  opt=''
+	  uns="${PREFIX[2,-1]%%${tmp[1][2]}*}${tmp[1][2]}"
+	  break
+        elif compset -P "$tmp[1]"; then
 	  def="$odmopts[$tmp[1]]"
 	  opt=''
 	  break
@@ -333,17 +416,43 @@
 	shift 1 tmp
       done
     fi
+
+    [[ -n "$single" && -n "$opt" && "$PREFIX" = [-+]* ]] && \
+        uns="${PREFIX[2,-1]}"
+
+    [[ -n "$uns" ]] &&
+        unset "opts[${(@)^opts[(I)${pre[1]}[$uns]]}]" \
+	      "dopts[${(@)^dopts[(I)${pre[1]}[$uns]]}]" \
+	      "odopts[${(@)^odopts[(I)${pre[1]}[$uns]]}]"
+
     if [[ -n "$opt" ]]; then
 
       # We aren't in an argument directly after a option name, so
       # all option names are possible matches.
 
       if [[ "$compconfig[option_prefix]" != *(short|all)* ||
-            "$PREFIX" = -* ]]; then
+            "$PREFIX" = [-+]* ]]; then
         _description expl option
-        compadd "$expl[@]" - "${(@k)opts}" "${(@k)mopts}" \
-                             "${(@k)dopts}" "${(@k)dmopts}" \
-			     "${(@k)odopts}" "${(@k)odmopts}" && ret=0
+	if [[ -n "$single" ]]; then
+          if [[ -z "$PREFIX" || "$PREFIX" = ? ]]; then
+	    compadd "$expl[@]" - "${(@k)opts}" "${(@k)mopts}" \
+			         "${(@k)dopts}" "${(@k)dmopts}" \
+			         "${(@k)odopts}" "${(@k)odmopts}" &&
+                ret=0
+	  else
+	    compadd "$expl[@]" - "${PREFIX}${(@k)^opts[(I)${PREFIX[1]}*]#?}" \
+			         "${PREFIX}${(@k)^mopts[(I)${PREFIX[1]}*]#?}" \
+			         "${PREFIX}${(@k)^dopts[(I)${PREFIX[1]}*]#?}" \
+			         "${PREFIX}${(@k)^dmopts[(I)${PREFIX[1]}*]#?}" \
+			         "${PREFIX}${(@k)^odopts[(I)${PREFIX[1]}*]#?}" \
+			         "${PREFIX}${(@k)^odmopts[(I)${PREFIX[1]}*]#?}" &&
+                ret=0
+          fi
+	else
+          compadd "$expl[@]" - "${(@k)opts}" "${(@k)mopts}" \
+                               "${(@k)dopts}" "${(@k)dmopts}" \
+			       "${(@k)odopts}" "${(@k)odmopts}" && ret=0
+        fi
       fi
       [[ $#long -ne 0 &&
          ( "$compconfig[option_prefix]" != *(long|all)* ||

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-20  7:42 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-20  7:42 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> But many commands accept both short and long options, there should be
> a completer that handle both.
> 
> I feel `_arguments' is very good as basis of that.  Is it easy to
> extend `_arguments' to handle short options?

Yes, I was thinking about the same. We would still have to tell
`_arguments' about this with some option, because it can currently
handle multi-character options and in the mode that would replace
`_complete_opts' it would have to look at those as option lists
sharing one `-'.

> # If it is available, I'll throw `complete_opts' away.

I think I'll have a look at this...

> > Ok. I don't know if you like this grouping/description stuff, all
> > comments are welcome.
> 
> Is there a way to disable options completion until a user insert `-'
> explicitly?  I like the behaviour since some commands have many
> options and they may bury completions for non-option arguments.

We can easily add this. The patch below makes `_arguments' use the
configuration key `option_prefix'. It can be set to a string
containing `short', `long', or `all' to get short/long option names
only if a `-' or `--' is given on the line (`all' is the same as
`shortlong').

(A question is if we should make other functions use this key,
too. Maybe even remove the `-t' option from `_long_options' and just
let it use this key... Opinions?)

> And, I found some problems.
> 
> is27e1u11% pnmpad -l<TAB>
> 
> ->
> 
> is27e1u11% pnmpad -l- 
> 
> `+' and `-' should not be completed, I think.

Definitely, yes. Maybe sometime I'll learn that extendedglob is not
always available in the completion functions.

> is27e1u11% pnmscale -height <TAB>
> 
> ->
> 
> is27e1u11% pnmscale -height  
> 
> In this case, " " is completed. Is this intended behaviour?

No, it was a result of a last-minute change in `_message'.

> is27e1u11% compconfig[message_format]='%d'
> is27e1u11% compconfig[description_format]='%d'
> is27e1u11% pnmcomp <TAB>
> 
> ->
> 
> is27e1u11% pnmcomp      
> option
> overlay file
> -alpha          Config/         Misc/           config.cache    configure.in 
> -invert         Doc/            README          config.guess*   install-sh*
> -xoff           Etc/            Src/            config.h        mkinstalldirs*
> -yoff           Functions/      StartupFiles/   config.h.in     stamp-h 
> CVS/            INSTALL         Util/           config.log      stamp-h.in 
> ChangeLog       META-FAQ        acconfig.h      config.status*  
> ChangeLog.3.0   Makefile        aclocal.m4      config.sub*     
> Completion/     Makefile.in     aczsh.m4        configure*      
> 
> Although I don't know completion group behaviour well, I feel this
> very strange because options and files are mixed.

Just set `compconf group_matches=yes'. Btw, I forgot to ask if maybe
we should give any of these new config keys default values? This
`group_matches' key may be a good candidate (or we could rename it to
`join_matches' or something like that and reverse it's meaning).

> Also, I found some typos.

Thanks a lot! (It was a rather tedious task, so I expected typos...)

Bye
 Sven

diff -u od/Zsh/compsys.yo Doc/Zsh/compsys.yo
--- od/Zsh/compsys.yo	Fri Aug 20 09:04:03 1999
+++ Doc/Zsh/compsys.yo	Fri Aug 20 09:24:45 1999
@@ -215,7 +215,7 @@
 The fourth form is like the third, but the var(function) will be
 called only if no function for the command itself was found or if one
 was found and it set the tt(_compskip) parameter to a value em(not)
-containing the sub-string `tt(patterns)'.
+containing the substring `tt(patterns)'.
 
 The fifth form defines a widget with the same name as the var(function)
 which will be called for each of the var(key-sequences); this is like the
@@ -943,6 +943,14 @@
 tt(_long_options) function where appropriate by giving it the string
 `tt(--)' as an argument. All arguments after this will be given
 unchanged to the tt(_long_options) function.
+
+This function also uses one configuration key: tt(option_prefix). If
+this is set to a string containing `tt(short)' or `tt(all)' as a
+substring, option names beginning with a single minus sign are added
+as possible matches only if the word on the line begins with a minus
+sign. If the value contains one of the substrings `tt(long)' or
+`tt(all)', option names beginning with two minus signs will be
+added as matches only if the two minus signs are given on the line.
 
 Example:
 
diff -u -r oc/Base/_arguments Completion/Base/_arguments
--- oc/Base/_arguments	Thu Aug 19 16:00:21 1999
+++ Completion/Base/_arguments	Fri Aug 20 09:31:21 1999
@@ -3,7 +3,9 @@
 # Complete the arguments of the current command according to the
 # descriptions given as arguments to this function.
 
-local long args rest ws cur nth def nm expl descr action opt arg tmp
+setopt localoptions extendedglob
+
+local long args rest ws cur nth def nm expl descr action opt arg tmp ret=1
 
 # Associative arrays used to collect information about the options.
 
@@ -336,10 +338,17 @@
       # We aren't in an argument directly after a option name, so
       # all option names are possible matches.
 
-      _description expl option
-      compadd "$expl[@]" - "${(@k)opts}" "${(@k)mopts}" \
-                           "${(@k)dopts}" "${(@k)dmopts}" \
-			   "${(@k)odopts}" "${(@k)odmopts}"
+      if [[ "$compconfig[option_prefix]" != *(short|all)* ||
+            "$PREFIX" = -* ]]; then
+        _description expl option
+        compadd "$expl[@]" - "${(@k)opts}" "${(@k)mopts}" \
+                             "${(@k)dopts}" "${(@k)dmopts}" \
+			     "${(@k)odopts}" "${(@k)odmopts}" && ret=0
+      fi
+      [[ $#long -ne 0 &&
+         ( "$compconfig[option_prefix]" != *(long|all)* ||
+           "$PREFIX" = --* ) ]] && \
+          _long_options && ret=0
     fi
   fi
 
@@ -362,7 +371,7 @@
 
       # An empty action means that we should just display a message.
       _message "$descr"
-      return 1
+      return ret
     elif [[ "$action[1]" = \( ]]; then
 
       # Anything inside `(...)' is added directly.
diff -u -r oc/Core/_message Completion/Core/_message
--- oc/Core/_message	Fri Aug 20 09:04:33 1999
+++ Completion/Core/_message	Fri Aug 20 09:32:21 1999
@@ -14,6 +14,4 @@
     compadd -X "${format//\\%d/$1}" -n ''
   fi
   compstate[force_list]=yes
-else
-  compadd -n ''
 fi

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
  1999-08-19 10:44 Sven Wischnowsky
@ 1999-08-19 14:38 ` Tanaka Akira
  1999-08-24 13:46 ` Peter Stephenson
  1 sibling, 0 replies; 45+ messages in thread
From: Tanaka Akira @ 1999-08-19 14:38 UTC (permalink / raw)
  To: zsh-workers

In article <199908191044.MAA17903@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

>   - I didn't change `_complete_opts' and `_cvs'. But I think the first 
>     one should 1) be renamed (to `_short_options'?) because the
>     `complete' is implicit in all other function names and 2) it
>     should be changed to get its descriptions in the same format as
>     `_arguments' and `_long_options' (and should use `_message' and
>     `_description').

I agree that `complete_opts' is bad name.

But many commands accept both short and long options, there should be
a completer that handle both.

I feel `_arguments' is very good as basis of that.  Is it easy to
extend `_arguments' to handle short options?

# If it is available, I'll throw `complete_opts' away.

> Ok. I don't know if you like this grouping/description stuff, all
> comments are welcome.

Is there a way to disable options completion until a user insert `-'
explicitly?  I like the behaviour since some commands have many
options and they may bury completions for non-option arguments.

And, I found some problems.

Z(2):akr@is27e1u11% Src/zsh -f
is27e1u11% fpath=($PWD/Completion/*(/)); autoload -U compinit; compinit -D; compdef _tst tst
is27e1u11% _tst () { _arguments '-l+:left border:' '-format:paper size:(letter A4)' '*-copy:output file:_files::resolution:(300 600)' ':postscript file:_files -g *.(ps|eps)' '*:page number:' }
is27e1u11% tst -l<TAB>

->

is27e1u11% tst -l+ 
is27e1u11% pnmpad -l<TAB>

->

is27e1u11% pnmpad -l- 


`+' and `-' should not be completed, I think.

is27e1u11% pnmscale -height <TAB>

->

is27e1u11% pnmscale -height  

In this case, " " is completed. Is this intended behaviour?

is27e1u11% compconfig[message_format]='%d'
is27e1u11% compconfig[description_format]='%d'
is27e1u11% pnmcomp <TAB>

->

is27e1u11% pnmcomp      
option
overlay file
-alpha          Config/         Misc/           config.cache    configure.in 
-invert         Doc/            README          config.guess*   install-sh*
-xoff           Etc/            Src/            config.h        mkinstalldirs*
-yoff           Functions/      StartupFiles/   config.h.in     stamp-h 
CVS/            INSTALL         Util/           config.log      stamp-h.in 
ChangeLog       META-FAQ        acconfig.h      config.status*  
ChangeLog.3.0   Makefile        aclocal.m4      config.sub*     
Completion/     Makefile.in     aczsh.m4        configure*      

Although I don't know completion group behaviour well, I feel this
very strange because options and files are mixed.

Also, I found some typos.

Index: Completion/Core/_message
===================================================================
RCS file: /projects/zsh/zsh/Completion/Core/_message,v
retrieving revision 1.1.1.1
diff -u -F^( -r1.1.1.1 _message
--- _message	1999/08/19 11:18:29	1.1.1.1
+++ _message	1999/08/19 13:49:30
@@ -3,7 +3,7 @@
 local format
 
 format="$compconfig[message_format]"
-[[ -z "$format" ]] && "$compconfig[description_format]"
+[[ -z "$format" ]] && format="$compconfig[description_format]"
 
 if [[ -n "$format" ]]; then
   if [[ $compstate[nmatches] -eq 0 ]]; then
Index: Completion/Pbmplus/_pbmtoepsi
===================================================================
RCS file: /projects/zsh/zsh/Completion/Pbmplus/_pbmtoepsi,v
retrieving revision 1.1.1.1
diff -u -F^( -r1.1.1.1 _pbmtoepsi
--- _pbmtoepsi	1999/08/19 11:18:45	1.1.1.1
+++ _pbmtoepsi	1999/08/19 13:49:30
@@ -1,3 +1,3 @@
 #compdef pbmtoepsi
 
-_arguments '--bbonly' ':file: _pbmfile'
+_arguments '-bbonly' ':file: _pbm_file'
Index: Completion/Pbmplus/_pktopbm
===================================================================
RCS file: /projects/zsh/zsh/Completion/Pbmplus/_pktopbm,v
retrieving revision 1.1.1.1
diff -u -F^( -r1.1.1.1 _pktopbm
--- _pktopbm	1999/08/19 11:18:46	1.1.1.1
+++ _pktopbm	1999/08/19 13:49:30
@@ -1,4 +1,4 @@
 #compdef pktopbm
 
-_arguments ':pk file:_file -g *.(#i)pk' '-c:character number:' \
+_arguments ':pk file:_files -g *.(#i)pk' '-c:character number:' \
            '*:file: _pbm_file'
Index: Completion/Pbmplus/_yuvtoppm
===================================================================
RCS file: /projects/zsh/zsh/Completion/Pbmplus/_yuvtoppm,v
retrieving revision 1.1.1.1
diff -u -F^( -r1.1.1.1 _yuvtoppm
--- _yuvtoppm	1999/08/19 11:18:47	1.1.1.1
+++ _yuvtoppm	1999/08/19 13:49:30
@@ -1,3 +1,3 @@
 #compdef yuvtoppm
 
-_arguments ':width:' ':height:' 'image bytes:'
+_arguments ':width:' ':height:' ':image bytes:'
Index: Doc/Zsh/compsys.yo
===================================================================
RCS file: /projects/zsh/zsh/Doc/Zsh/compsys.yo,v
retrieving revision 1.1.1.16
diff -u -F^( -r1.1.1.16 compsys.yo
--- compsys.yo	1999/08/19 11:18:51	1.1.1.16
+++ compsys.yo	1999/08/19 13:49:30
@@ -924,6 +924,7 @@ (with the `tt(-J)' option), but if the o
 separate argument after the option, a plus sign should be used
 instead. Finally, if the option may be given more than once, a star
 (`tt(*)') should be added in front of the var(opt-spec).
+)
 enditem()
 
 In each of the cases above, the var(action) says how the possible

# I made a patch for patch-2.5.3 that add options to make it cvs-diff aware.
# http://www.ldl.jaist.ac.jp/~akr/junk/patch-2.5.3-cvsaware-19990815.patch
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: PATCH: completion
@ 1999-08-19 13:59 Sven Wischnowsky
  0 siblings, 0 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-19 13:59 UTC (permalink / raw)
  To: zsh-workers


Some minor tweaks and fixes... I forgot to give the explanations
string built to compadd in some places and the action string from the
description should be substituted when used (in _long_options and
_arguments).

Bye
 Sven

diff -u -r oc/Base/_arguments Completion/Base/_arguments
--- oc/Base/_arguments	Thu Aug 19 13:24:26 1999
+++ Completion/Base/_arguments	Thu Aug 19 15:57:53 1999
@@ -372,13 +372,13 @@
 
       # If the action starts with a space, we just call it.
 
-      $=action
+      ${(e)=~action}
     else
 
       # Otherwise we call it with the description-arguments built above.
 
       action=( $=action )
-      "$action[1]" "$expl[@]" "${(@)action[2,-1]}"
+      ${(e)action[1]} "$expl[@]" ${(e)~action[2,-1]}
     fi
   fi
 
diff -u -r oc/Base/_long_options Completion/Base/_long_options
--- oc/Base/_long_options	Thu Aug 19 13:24:26 1999
+++ Completion/Base/_long_options	Thu Aug 19 15:57:08 1999
@@ -260,10 +260,10 @@
         compadd "$expl[@]" - ${=action[2,-2]}
       elif (( $#action )); then
         if [[ "$action" = \ * ]]; then
-          $=action
+          ${(e)=~action}
         else
 	  action=($=action)
-	  $action[1] "$expl[@]" $action[2,-1]
+	  ${(e)action[1]} "$expl[@]" ${(e)~action[2,-1]}
         fi
       fi
 
@@ -310,10 +310,10 @@
       if [[ "$parta[1]" = (\[|\() ]]; then
         compadd "$expl[@]" - ${=parta[2,-2]}
       elif [[ "$parta" = \ * ]]; then
-        $=parta
+        ${(e)=~parta}
       else
 	action=($=parta)
-	$action[1] "$expl[@]" $action[2,-1]
+	${(e)~parta[1]} "$expl[@]" ${(e)~action[2,-1]}
       fi
     else
       compadd -S '' - "$PREFIX"
diff -u -r oc/Base/_subscript Completion/Base/_subscript
--- oc/Base/_subscript	Thu Aug 19 13:24:26 1999
+++ Completion/Base/_subscript	Thu Aug 19 15:51:50 1999
@@ -4,8 +4,8 @@
 
 if [[ "$PREFIX" = :* ]]; then
   _description expl 'character class'
-  compadd -p: -S ':]' alnum alpha blank cntrl digit graph lower print punct \
-      space upper xdigit
+  compadd "$expl[@]" -p: -S ':]' alnum alpha blank cntrl digit graph \
+                                 lower print punct space upper xdigit
 elif [[ ${(Pt)${compstate[parameter]}} = assoc* ]]; then
   _description expl 'association key'
   if [[ "$RBUFFER" = \]* ]]; then
diff -u -r oc/Builtins/_zmodload Completion/Builtins/_zmodload
--- oc/Builtins/_zmodload	Thu Aug 19 13:24:30 1999
+++ Completion/Builtins/_zmodload	Thu Aug 19 15:52:17 1999
@@ -7,8 +7,8 @@
   compgen "$expl[@]" -B
 elif [[ "$fl" = -*u* ]]; then
   _description expl module
-  compadd - $(zmodload)
+  compadd "$expl[@]" - $(zmodload)
 else
   _description expl 'module file'
-  compadd - ${^module_path}/*(N:t:r)
+  compadd "$expl[@]" - ${^module_path}/*(N:t:r)
 fi
diff -u -r oc/User/_gdb Completion/User/_gdb
--- oc/User/_gdb	Thu Aug 19 13:24:40 1999
+++ Completion/User/_gdb	Thu Aug 19 15:47:59 1999
@@ -52,6 +52,6 @@
     return ret
   else
     _description expl executable
-    _files -/g '*(*)'
+    _files "$expl[@]" -/g '*(*)'
   fi
 fi

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

* PATCH: completion
@ 1999-08-19 10:44 Sven Wischnowsky
  1999-08-19 14:38 ` Tanaka Akira
  1999-08-24 13:46 ` Peter Stephenson
  0 siblings, 2 replies; 45+ messages in thread
From: Sven Wischnowsky @ 1999-08-19 10:44 UTC (permalink / raw)
  To: zsh-workers


Whew. Here is what I've spent the spare time of the last few days
on...

It all started with me not being really happy about _pbm. Then I
always wanted to make use of match grouping and explanation strings
and then...

The monster patch below does lots of things:

- It adds the directory Completion/Pbmplus with several functions --
  the user/_pbm file should be deleted if you want to use this (and
  you have to make sure that the Pbmplus directory is searched for
  completion functions, of course).
- I still wanted to be able to put the filename completion in a
  generic function without having to give it a extremly long #compdef
  line. But this function should only be called for commands that
  don't have their own completion function.
  So I added the `-P' option to compdef (and the underlying
  mechanisms), which defines post-pattern-functions. I.e. pattern
  functions that will only be called when no special completion
  function for a command was found. However, a completion function can 
  still say that it wants those pattern functions to be tried by
  setting `_compskip' to something not containing the substring
  `patterns' (in other words: `_compskip' is used for those functions, 
  too, in the same way as for normal pattern functions).
- Ok, then I was faced with all these pbm commands that get options
  and some options get arguments, and some even get optional arguments 
  and the commands themselves get arguments. For some of these
  completions can be generated and for some not. To make life easier I 
  wrote the function `Base/_arguments' which gets descriptions of
  options and arguments for the command as its arguments.
  I then made these descriptions contain messages that can be printed
  before the matches generated to say what they are and if no matches
  could be generated, only the message will be printed -- like the
  stuff Bart used in `_cvs'. Since I planned to add this to other
  completion functions, I put the code for it in `Core/_description'
  and `Core/_message'.
  The first one also does the grouping of matches. They use
  configuration keys: `group_matches' if set and non-empty makes
  different types of matches be put into different groups.
  `description_format' gives the string to display above the matches,
  a `%d' in this string is replaced by the explanation offered by the
  completion function. `message_format', if set and non-empty takes
  precedence over `description_format' in `_message'.
- Then I changed `_long_options' so that the arguments are in the same 
  format as for `_arguments' (also containing descriptions).
- Then I went through (almost) all completion functions and made them
  use `_description'. Maybe in some places `_message' should be used
  and maybe in some places `_arguments' could be used...
  There are some problems:
  - I don't know MH, so the descriptions in `_mh' could probably be
    better.
  - I didn't change `_complete_opts' and `_cvs'. But I think the first 
    one should 1) be renamed (to `_short_options'?) because the
    `complete' is implicit in all other function names and 2) it
    should be changed to get its descriptions in the same format as
    `_arguments' and `_long_options' (and should use `_message' and
    `_description').
    Btw. I didn't change `_cvs' mainly because I use the `parameter'
    module and there is a bug with the stuff that `allows' local
    special parameters: the associative array `commands' in `_cvs' has 
    (obviously) the same name as the one from the `parameter'
    module. The new code in typeset_single() has the effect that this
    `local' parameter behaves like the one from the module, i.e. if
    you can't use the names of special parameters for local parameters 
    without having them behave like the global ones. Maybe we have to
    wait for Peter here...

Ok. I don't know if you like this grouping/description stuff, all
comments are welcome.


Bye
 Sven

begin 600 patch-comp.gz
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
:D^!/QX@M`\5O&'YWA1$C$_Y_TH*-UD[(`0`6
`
end

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 45+ messages in thread

end of thread, other threads:[~2000-02-21  9:50 UTC | newest]

Thread overview: 45+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-10-26 13:17 PATCH: completion Sven Wischnowsky
  -- strict thread matches above, loose matches on Subject: below --
2000-02-21  9:50 Sven Wischnowsky
1999-10-28  8:12 Sven Wischnowsky
1999-10-28  6:58 Sven Wischnowsky
1999-10-27  8:42 Sven Wischnowsky
1999-10-27 16:39 ` Bart Schaefer
1999-10-27  7:14 Sven Wischnowsky
1999-10-27 21:26 ` Tanaka Akira
1999-10-26 13:01 Oliver Kiddle
1999-10-26 13:35 ` Zefram
1999-10-26 11:03 Sven Wischnowsky
1999-10-26 17:17 ` Bart Schaefer
1999-10-26 17:22 ` Tanaka Akira
1999-10-26 17:32   ` Tanaka Akira
1999-08-30  9:30 Sven Wischnowsky
1999-08-27  7:03 Sven Wischnowsky
1999-08-27  8:29 ` Tanaka Akira
1999-08-28  6:01   ` Tanaka Akira
1999-08-26 13:52 Sven Wischnowsky
1999-08-26 12:20 Sven Wischnowsky
1999-08-26 13:17 ` Tanaka Akira
1999-08-26 17:56 ` Tanaka Akira
1999-08-25 12:57 Sven Wischnowsky
1999-08-25 12:54 Sven Wischnowsky
1999-08-25  8:24 Sven Wischnowsky
1999-08-26 10:54 ` Tanaka Akira
1999-08-24 10:43 Sven Wischnowsky
1999-08-25  1:56 ` Tanaka Akira
1999-08-24  9:12 Sven Wischnowsky
1999-08-24 10:04 ` Tanaka Akira
1999-08-23 13:46 Sven Wischnowsky
1999-08-23 16:16 ` Tanaka Akira
1999-08-24 15:56 ` Tanaka Akira
1999-08-23 12:00 Sven Wischnowsky
1999-08-23  9:32 Sven Wischnowsky
1999-08-23 10:54 ` Tanaka Akira
1999-08-20 12:59 Sven Wischnowsky
1999-08-20 23:22 ` Tanaka Akira
1999-08-21  8:39   ` Tanaka Akira
1999-08-21 17:47     ` Tanaka Akira
1999-08-20  7:42 Sven Wischnowsky
1999-08-19 13:59 Sven Wischnowsky
1999-08-19 10:44 Sven Wischnowsky
1999-08-19 14:38 ` Tanaka Akira
1999-08-24 13:46 ` Peter Stephenson

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).