Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: PATCH: _ps, _pdf and _pspdf.



I wrote:

> This is a first simple solution. Now I'm thinking aabout chaging the
> uses of _compskip so that one can say `do not try any other completion
> function' (like we have it now), but can also say `use a completion
> function defined for the command itself, but don't use -default-'.
> Then we can give some of these commands their own functions, too.

This does that. There is also a hunk in zle_tricky.c: seems I forgot
to reset the group to `default' when compgen was called without a
-[JV] option.

The change to _compskip isn't really used yet -- I found it easier to
stuff everything into _pbm instead of adding loads of functions
containing only a compadd for a couple of options.

Bye
 Sven

diff -u os/Zle/zle_tricky.c Src/Zle/zle_tricky.c
--- os/Zle/zle_tricky.c	Mon Aug  9 10:41:03 1999
+++ Src/Zle/zle_tricky.c	Wed Aug 11 15:13:34 1999
@@ -5338,6 +5338,10 @@
 	    offs = lip + lp;
 	    cc->refc++;
 	    ccont = 0;
+	    if (!cc->ylist && !cc->gname) {
+		endcmgroup(NULL);
+		begcmgroup("default", 0);
+	    }
 	    makecomplistor(cc, str, lincmd, lip, 0);
 	    offs = ooffs;
 	    isuf = oisuf;
diff -u od/Zsh/compsys.yo Doc/Zsh/compsys.yo
--- od/Zsh/compsys.yo	Mon Aug  9 10:41:11 1999
+++ Doc/Zsh/compsys.yo	Wed Aug 11 15:39:48 1999
@@ -334,8 +334,12 @@
 item(tt(-first-))(
 for adding completions before any other other completion functions are
 tried (similar to the `tt(-T)' flag of tt(compctl)); if this
-function sets the tt(_compskip) parameter to any value, the completion
-system will not call any other function to generate matches.
+function sets the tt(_compskip) parameter to `tt(all)', no other
+completion functions will be called, if it is set to a string
+containing `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.
 )
 item(tt(-default-))(
 for generating completions when no special completion function is used 
@@ -684,8 +688,9 @@
 function.
 
 When calling a function defined for a pattern, this function also
-checks if the parameter tt(_compskip) is set. If it was set by the
-function called, no further completion functions are called. With this 
+checks if the parameter tt(_compskip) is set and uses the value in the 
+same way it is used after calling the completion function for the
+tt(-first-) context. With this 
 one can write a pattern completion function that keeps other functions 
 from being tried simply by setting this parameter to any value.
 )
diff -u -r oc/Base/_first Completion/Base/_first
--- oc/Base/_first	Wed Aug 11 11:58:00 1999
+++ Completion/Base/_first	Wed Aug 11 13:09:14 1999
@@ -55,7 +55,7 @@
 #           # on menu-completion and make sure that no other
 #           # completion function is called by setting _compskip.
 #           compstate[insert]=menu
-#           _compskip=1
+#           _compskip=all
 #           return
 #         fi
 #         (( i++ ))
diff -u -r oc/Builtins/_zftp Completion/Builtins/_zftp
--- oc/Builtins/_zftp	Wed Aug 11 11:58:03 1999
+++ Completion/Builtins/_zftp	Wed Aug 11 13:09:33 1999
@@ -1,7 +1,7 @@
 #compdef -p zf*
 
 # Don't try any more completion after this.
-_compskip=1
+_compskip=all
 
 # Completion for zftp builtin and zf* functions.  The functions
 # zfcd_match and zfget_match (used for old-style completion)
diff -u -r oc/Core/_complete Completion/Core/_complete
--- oc/Core/_complete	Wed Aug 11 11:58:04 1999
+++ Completion/Core/_complete	Wed Aug 11 13:11:18 1999
@@ -16,13 +16,11 @@
 fi
 
 # An entry for `-first-' is the replacement for `compctl -T'
-# Completion functions may set `_compskip' to any value to make the 
-# main loops stop calling other completion functions.
 
 comp="$_comps[-first-]"
 if [[ ! -z "$comp" ]]; then
   "$comp"
-  if (( $+_compskip )); then
+  if [[ "$_compskip" = all ]]; then
     unset _compskip
     (( compstate[nmatches] ))
     return
@@ -55,8 +53,16 @@
 
   # If not, we use default completion, if any.
 
-  [[ -z "$comp" ]] && comp="$_comps[-default-]"
+  if [[ -z "$comp" ]]; then
+    if [[ "$_compskip" = *default* ]]; then
+      unset _compskip
+      return 1
+    fi
+    comp="$_comps[-default-]"
+  fi
   [[ -z "$comp" ]] || "$comp"
 fi
+
+unset _compskip
 
 (( compstate[nmatches] ))
diff -u -r oc/Core/_main_complete Completion/Core/_main_complete
--- oc/Core/_main_complete	Wed Aug 11 11:58:04 1999
+++ Completion/Core/_main_complete	Wed Aug 11 13:44:53 1999
@@ -42,7 +42,7 @@
 # state than the global one for which you are completing.
 
 
-local comp ret=1
+local comp ret=1 _compskip
 
 setopt localoptions nullglob rcexpandparam
 unsetopt markdirs globsubst shwordsplit nounset ksharrays
@@ -79,5 +79,7 @@
 _lastcomp[isuffix]="$ISUFFIX"
 _lastcomp[qiprefix]="$QIPREFIX"
 _lastcomp[qisuffix]="$QISUFFIX"
+
+unset _compskip
 
 return ret
diff -u -r oc/Core/_normal Completion/Core/_normal
--- oc/Core/_normal	Wed Aug 11 11:58:05 1999
+++ Completion/Core/_normal	Wed Aug 11 13:06:33 1999
@@ -29,17 +29,19 @@
 
 # See if there are any matching pattern completions.
 
-for i in "$_patcomps[@]"; do
-  pat="${i% *}"
-  val="${i#* }"
-  if [[ "$cmd1" == $~pat || "$cmd2" == $~pat ]]; then
-    "$val" && ret=0
-    if (( $+_compskip )); then
-      unset _compskip
-      return ret
+if [[ "$_compskip" != *patterns* ]]; then
+  for i in "$_patcomps[@]"; do
+    pat="${i% *}"
+    val="${i#* }"
+    if [[ "$cmd1" == $~pat || "$cmd2" == $~pat ]]; then
+      "$val" && ret=0
+      if [[ "$_compskip" = *patterns* || "$_compskip" = all ]]; then
+        unset _compskip
+        return ret
+      fi
     fi
-  fi
-done
+  done
+fi
 
 # Now look up the two names in the normal completion array.
 
@@ -54,9 +56,15 @@
 # And generate the matches, probably using default completion.
 
 if [[ -z "$comp" ]]; then
+  if [[ "$_compskip" = *default* ]]; then
+    unset _compskip
+    return 1
+  fi
   name=-default-
   comp="$_comps[-default-]"
 fi
 [[ -z "$comp" ]] || "$comp" && ret=0
+
+unset _compskip
 
 return ret
diff -u -r oc/User/_colors Completion/User/_colors
--- oc/User/_colors	Wed Aug 11 15:42:15 1999
+++ Completion/User/_colors	Wed Aug 11 15:35:03 1999
@@ -0,0 +1,24 @@
+#autoload
+
+if (( ! $+_color_cache )); then
+  local file
+
+  # Cache of color names doesn't exist yet, create it.
+
+  if [[ -f /usr/lib/X11/rgb.txt ]]; then
+    file=/usr/lib/X11/rgb.txt
+  elif [[ -f /usr/local/lib/X11/rgb.txt ]]; then
+    file=/usr/local/lib/X11/rgb.txt
+  fi
+
+  if [[ -n "$file" ]]; then
+    _color_cache=( "${(@)${(@f)$(< $file)}[2,-1]##*		}" )
+  else
+
+    # Stupid default value.
+
+    _color_cache=(white black gray red blue green)
+  fi
+fi
+
+compadd - "$_color_cache[@]"
diff -u -r oc/User/_pbm Completion/User/_pbm
--- oc/User/_pbm	Wed Aug 11 15:42:04 1999
+++ Completion/User/_pbm	Wed Aug 11 15:34:04 1999
@@ -1,8 +1,147 @@
 #compdef -p p[bgpn]m*
 
-local pat
+local pat opts ret=1
 
-_compskip=1
+# No other completion functions, please.
+
+_compskip=all
+
+if (( ! $+_pbm_options )); then
+
+  # Most of the stuff is done by table lookup in these arrays.
+
+  typeset -gA _pbm_options _pbm_arg_options
+
+  # Options with arguments, per command.
+
+  _pbm_arg_options=(
+    pbmreduce 'value'
+    pbmtext 'font:_files:-g:*.(#i)pbm'
+    pbmtolj 'resolution'
+    pbmtolps 'dpi'
+    pbmtomacp 'l r t b'
+    pgmcrater 'number height ysize width xsize gamma'
+    pgmkernel 'weight'
+    pgmnorm 'bpercent bvalue wpercent wvalue'
+    pgmoil 'n'
+    pgmtexture 'd'
+    pgmtopbm 'value'
+    pgmtoppm 'map:_files:-g:*.(#i)ppm'
+    ppmbrighten 's v'
+    ppmdither 'dim red green blue'
+    ppmforge 'dimension hour inclination tilt mesh power glaciers ice saturation seed stars xsize width ysize height'
+    ppmnorm 'bpercent bvalue wpercent wvalue'
+    ppmquant 'map:_files:-g:*.(#i)ppm'
+    ppmtoacad 'background aspect'
+    ppmtoicr 'windowname expand display'
+    ppmtomitsu 'sharpness:compadd:1:2:3:4 enlarge:compadd:1:2:3 media:compadd:A:A4:AS:A4S copy:compadd:1:2:3:4:5:6:7:8:9'
+    ppmtopj 'gamma xpos ypos back:compadd:dark:lite render:compadd:none:snap:bw:dither:diffuse:monodither:monodiffuse:clusterdither:monoclusterdither'
+    ppmtopjxl 'gamma xshift yshift xsize width xscale ysize height yscale'
+    ppmtouil 'name'
+    ppmtoxpm 'name'
+    pnmalias 'fgcolor:_colors bgcolor:_colors weight'
+    pnmcomp 'xoff yoff alpha:_files:-g:*.(#i)pgm'
+    pnmhistmap 'max'
+    pnmindex 'size across colors'
+    pnmmargin 'color:_colors'
+    pnmscale 'xsize width ysize height xscale yscale xysize'
+    pnmtoddif 'resolution'
+    pnmtofits 'min max'
+    pnmtops 'scale dpi width height'
+    pnmtosgi 'imagename'
+    pnmtotiff 'predictor rowsperstrip'
+    pnmtoxwd 'pseudodepth'
+  )
+
+  # Options without arguments.
+
+  _pbm_options=(
+    pbmclean 'connect'
+    pbmmake 'white black gray'
+    pbmmask 'expand'
+    pbmreduce 'floyd fs threshold'
+    pbmtoepsi 'bbonly'
+    pgmenhance '1 2 3 4 5 6 7 8 9'
+    pgmramp 'lr tb rectangle ellipse'
+    pgmtopbm 'floyd fs threshold dither8 d8 cluster3 c3 cluster4 c4 cluster8 c8'
+    ppmbrighten 'n'
+    ppmdist 'intensity frequency'
+    ppmforge 'clouds night'
+    ppmpat 'gingham2 g2 gingham3 g3 madras tartan poles squig camo anticamo'
+    ppmquant 'floyd fs'
+    ppmqvga 'd q v'
+    ppmtoacad 'dxb poly white 8'
+    ppmtobmp 'os2 windows'
+    ppmtogif 'interlace'
+    ppmtoicr 'rle'
+    ppmtoilbm 'hamif'
+    ppmtomap 'sort square'
+    ppmtomitsu 'dpi300 tiny'
+    ppmtopj 'rle center'
+    ppmtopjxl 'nopack presentation dark diffuse cluster dither'
+    ppmtosixel 'raw margin'
+    ppmtotga 'mono cmap rgb norle'
+    pnmalias 'bonly fonly balias falias'
+    pnmarith 'add subtract multiply'
+    pnmcat 'white black leftright lr topbottom tb jtop jbottom jleft jright'
+    pnmcomp 'invert'
+    pnmcrop 'white black'
+    pnmflip 'leftright lr topbottom tb transpose xy rotate90 r90 ccw rotate270 r270 cw rotate180 r180'
+    pnmhistmap 'black white verbose'
+    pnmindex 'black'
+    pnmmargin 'white black'
+    pnmpad 'white black'
+    pnmpaste 'replace or and xor'
+    pnmrotate 'noantialias'
+    pnmshear 'noantialias'
+    pnmtops 'turn noturn rle runlength'
+    pnmtorast 'standard rle'
+    pnmtosgi 'verbatim rle'
+    pnmtotiff 'none packbits lzw g3 g4 2d fill msb2lsb lsb2msb'
+    pnmtoxwd 'directcolor'
+  )
+fi
+
+opts=( $=_pbm_arg_options[$words[1]] )
+if (( $#opts )); then
+
+  # This Command has options with arguments. The options are already in
+  # `opts'. Now we see if we are after one of these options on the line.
+
+  local after="$opts[(I)${words[CURRENT-1][2,-1]}(|:*)]"
+
+  if (( after )); then
+
+    # We are. If the string contains a colon, anything after it is a 
+    # colon-separated list of words. We just execute this list of words
+    # as a command with its arguments.
+
+    if [[ "$after" = *:* ]]; then
+      after="${${opts[after]#*:}//:/ }"
+      [[ -z "$after" ]] || $=after 
+    fi
+    return
+  fi
+
+  # Otherwise we just add the option names.
+
+  compadd -J options - -${^=opts%%:*}
+fi
+
+# And the names of the options without arguments.
+
+opts=( $=_pbm_options[$words[1]] )
+(( $#opts )) && compadd -J options - -${^=opts}
+
+# A small special case here: the first argument of `ppmmake' is a
+# color. More of these could be added.
+
+if [[ "$words[1]" = ppmmake && CURRENT -eq 2 ]]; then
+  _colors
+  return
+fi
+
+# Generate the filenames.
 
 if [[ "$words[1]" = pnm* ]]; then
   pat='*.(#i)p[bgp]m'
@@ -10,4 +149,4 @@
   pat="*.(#i)${words[1][1,3]}"
 fi
 
-_path_files -g "$pat" || _files -g '*.(#i)p[bgp]m'
+_path_files -J files -g "$pat" || _files -J files -g '*.(#i)p[bgp]m'
diff -u -r oc/User/_x_options Completion/User/_x_options
--- oc/User/_x_options	Wed Aug 11 11:58:08 1999
+++ Completion/User/_x_options	Wed Aug 11 13:10:21 1999
@@ -3,7 +3,7 @@
 # A simple pattern completion, just as an example.
 
 if [ "$words[CURRENT-1]" = "-display" ]; then
-  _compskip=''
+  _compskip=all
   _hosts -S :0
 else
   compadd -P- -J options - display name xrm

--
Sven Wischnowsky                         wischnow@xxxxxxxxxxxxxxxxxxxxxxx



Messages sorted by: Reverse Date, Date, Thread, Author