Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: PATCH: _ps, _pdf and _pspdf.
- X-seq: zsh-workers 7420
- From: Sven Wischnowsky <wischnow@xxxxxxxxxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxxxxxx
- Subject: Re: PATCH: _ps, _pdf and _pspdf.
- Date: Wed, 11 Aug 1999 15:45:59 +0200 (MET DST)
- In-reply-to: Sven Wischnowsky's message of Wed, 11 Aug 1999 12:54:02 +0200 (MET DST)
- Mailing-list: contact zsh-workers-help@xxxxxxxxxxxxxx; run by ezmlm
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