1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-12-28 16:15:02 +01:00

sync up with zsh-workers_7430.

This commit is contained in:
Tanaka Akira 1999-08-13 13:57:54 +00:00
parent bcfde8db00
commit 2d8280a3a7
6 changed files with 136 additions and 54 deletions

View file

@ -5,16 +5,10 @@ if (( ! $+_color_cache )); then
# Cache of color names doesn't exist yet, create it. # Cache of color names doesn't exist yet, create it.
for f in /usr/{,local/,X11R6/,openwin/}lib/X11/rgb.txt file=( /usr/{lib,{{X11R6,openwin},local{,/X11{,R6}}}/lib}/X11/rgb.txt )
do
if [[ -f $f ]]; then
file=$f
break;
fi
done
if [[ -n "$file" ]]; then if (( $#file )); then
_color_cache=( "${(@)${(@f)$(< $file)}[2,-1]##* }" ) _color_cache=( "${(@)${(@f)$(< $file[1])}[2,-1]##* }" )
else else
# Stupid default value. # Stupid default value.
@ -23,4 +17,4 @@ if (( ! $+_color_cache )); then
fi fi
fi fi
compadd - "$_color_cache[@]" compadd -M 'm:{a-z}={A-Z} m:-=\ r:|[ A-Z0-9]=* r:|=*' - "$_color_cache[@]"

15
Completion/User/_cursors Normal file
View file

@ -0,0 +1,15 @@
#autoload
if (( ! $+_cursor_cache )); then
local file
file=( /usr/{include,{{X11R6,openwin},local{,/X11{,R6}}}/include}/X11/cursorfont.h(N) )
if (( $#file )); then
_cursor_cache=( "${(@)${(@)${(M@)${(@f)$(< $file[1])}:#*XC_*}[2,-1]#* XC_}% *}" )
else
_cursor_cache=( X_cursor )
fi
fi
compadd -M 'm:-=_ r:|_=*' - "$_cursor_cache[@]"

View file

@ -1,4 +1,4 @@
#compdef -p p[bgpn]m* #compdef -p (p[bgpn]m*|*top[bgpn]m)
local pat opts ret=1 local pat opts ret=1
@ -51,6 +51,15 @@ if (( ! $+_pbm_options )); then
pnmtosgi 'imagename' pnmtosgi 'imagename'
pnmtotiff 'predictor rowsperstrip' pnmtotiff 'predictor rowsperstrip'
pnmtoxwd 'pseudodepth' pnmtoxwd 'pseudodepth'
asciitopgm 'd'
fitstopgm 'image'
fitstopnm 'image min max'
giftopnm 'image'
macptopbm 'extraskip'
pstopnm 'llx lly urx ury xborder xmax xsize yborder ymax ysize'
rawtopgm 'headerskip rowskip'
rawtoppm 'headerskip rowskip'
sldtoppm 'height ysize lib Lib scale width xsize'
) )
# Options without arguments. # Options without arguments.
@ -99,6 +108,17 @@ if (( ! $+_pbm_options )); then
pnmtosgi 'verbatim rle' pnmtosgi 'verbatim rle'
pnmtotiff 'none packbits lzw g3 g4 2d fill msb2lsb lsb2msb' pnmtotiff 'none packbits lzw g3 g4 2d fill msb2lsb lsb2msb'
pnmtoxwd 'directcolor' pnmtoxwd 'directcolor'
fitstopnm 'noraw scanmax printmax'
g3topbm 'kludge reversebits stretch'
giftopnm 'verbose comments'
picttoppm 'verbose'
pstopnm 'forceplain help landscape portrait nocrop pbm pgm ppm verbose'
rawtoppm 'rgb rbg grb gbr brg bgr interpixel interrow'
sgitopnm 'verbose'
sldtoppm 'adjust dir info verbose'
tgatoppm 'debug'
tifftopnm 'headerdump'
zeisstopnm 'pgm ppm'
) )
fi fi

View file

@ -2,4 +2,9 @@
# A simple pattern completion, just as an example. # A simple pattern completion, just as an example.
compgen -J options -k '(-display -name -xrm)' if [ "$words[CURRENT-1]" = "-display" ]; then
_compskip=all
_hosts -S ':0 ' -r :
else
compadd -J options - -display -name -xrm
fi

15
Completion/User/_xsetroot Normal file
View file

@ -0,0 +1,15 @@
#compdef xsetroot
case "$words[CURRENT-1]" in
-cursor) _files -/g '*.(#i)(xbm|curs(|or))'; return;;
-cursor_name) _cursors; return;;
-bitmap) _files -/g '*.(#i)xbm'; return;;
-([fb]g|solid)) _colors; return;;
esac
if [[ CURRENT -gt 2 && "$words[CURRENT-2]" = -cursor ]]; then
_files -/g '*.(#i)(xbm|curs(|or)|mask)'
else
compadd -M 'm:-=_ r:|_=*' - -help -def -cursor -cursor_name -bitmap -mod -gray -grey \
-fg -bg -rv -solid -name
fi

View file

@ -163,7 +163,7 @@ static int ispattern, haspattern;
* from the whole word we are completing and the second one from that * * from the whole word we are completing and the second one from that *
* part of the word that was identified as a possible filename. */ * part of the word that was identified as a possible filename. */
static Comp patcomp, filecomp; static Patprog patcomp, filecomp;
/* We store the following prefixes/suffixes: * /* We store the following prefixes/suffixes: *
* lpre/lsuf -- what's on the line * * lpre/lsuf -- what's on the line *
@ -728,7 +728,7 @@ check_param(char *s, int set, int test)
if ((*p == String || *p == Qstring) && p[1] != Inpar && p[1] != Inbrack) { if ((*p == String || *p == Qstring) && p[1] != Inpar && p[1] != Inbrack) {
/* This is really a parameter expression (not $(...) or $[...]). */ /* This is really a parameter expression (not $(...) or $[...]). */
char *b = p + 1, *e = b; char *b = p + 1, *e = b;
int n = 0, br = 1; int n = 0, br = 1, nest = 0;
if (*b == Inbrace) { if (*b == Inbrace) {
char *tb = b; char *tb = b;
@ -740,6 +740,10 @@ check_param(char *s, int set, int test)
/* Ignore the possible (...) flags. */ /* Ignore the possible (...) flags. */
b++, br++; b++, br++;
n = skipparens(Inpar, Outpar, &b); n = skipparens(Inpar, Outpar, &b);
for (tb = p - 1; tb > s && *tb != Outbrace && *tb != Inbrace; tb--);
if (tb > s && *tb == Inbrace && (tb[-1] == String || *tb == Qstring))
nest = 1;
} }
/* Ignore the stuff before the parameter name. */ /* Ignore the stuff before the parameter name. */
@ -788,9 +792,11 @@ check_param(char *s, int set, int test)
* global variables. */ * global variables. */
if (set) { if (set) {
if (br >= 2) if (br >= 2) {
mflags |= CMF_PARBR; mflags |= CMF_PARBR;
if (nest)
mflags |= CMF_PARNEST;
}
/* Get the prefix (anything up to the character before the name). */ /* Get the prefix (anything up to the character before the name). */
isuf = dupstring(e); isuf = dupstring(e);
untokenize(isuf); untokenize(isuf);
@ -2288,7 +2294,7 @@ match_str(char *l, char *w, int *bp, int *rwlp, int sfx, int test)
for (mp = NULL, ms = mstack; !mp && ms; ms = ms->next) { for (mp = NULL, ms = mstack; !mp && ms; ms = ms->next) {
for (mp = ms->matcher; mp; mp = mp->next) { for (mp = ms->matcher; mp; mp = mp->next) {
t = 1; t = 1;
if (lm == mp || if ((lm && lm == mp) ||
((oll == ll || olw == lw) && test && mp->wlen < 0)) ((oll == ll || olw == lw) && test && mp->wlen < 0))
/* If we were called recursively, don't use `*' patterns /* If we were called recursively, don't use `*' patterns
* at the beginning (avoiding infinite recursion). */ * at the beginning (avoiding infinite recursion). */
@ -2329,8 +2335,9 @@ match_str(char *l, char *w, int *bp, int *rwlp, int sfx, int test)
continue; continue;
if (ap) { if (ap) {
if (!pattern_match(ap, l + aoff, NULL, NULL) || if (!pattern_match(ap, l + aoff, NULL, NULL) ||
(both && !pattern_match(ap, w + aoff, NULL, NULL))) (both && (!pattern_match(ap, w + aoff, NULL, NULL) ||
continue; !match_parts(l + aoff, w + aoff, alen))))
continue;
} else if (!both || il || iw) } else if (!both || il || iw)
continue; continue;
@ -2340,11 +2347,12 @@ match_str(char *l, char *w, int *bp, int *rwlp, int sfx, int test)
savl = l[-(llen + zoff)]; savl = l[-(llen + zoff)];
l[-(llen + zoff)] = '\0'; l[-(llen + zoff)] = '\0';
} }
for (t = 0, tp = w, ct = 0, ict = lw - alen; for (t = 0, tp = w, ct = 0, ict = lw - alen + 1;
ict; ict;
tp += add, ct++, ict--) { tp += add, ct++, ict--) {
if (both || if (both ||
pattern_match(ap, tp - moff, NULL, NULL)) { (pattern_match(ap, tp - moff, NULL, NULL) &&
match_parts(l + aoff , tp - moff, alen))) {
if (sfx) { if (sfx) {
savw = tp[-zoff]; savw = tp[-zoff];
tp[-zoff] = '\0'; tp[-zoff] = '\0';
@ -2592,6 +2600,24 @@ match_str(char *l, char *w, int *bp, int *rwlp, int sfx, int test)
return iw; return iw;
} }
/* Wrapper for match_str(), only for a certain length and only doing
* the test. */
/**/
static int
match_parts(char *l, char *w, int n)
{
char lsav = l[n], wsav = w[n];
int ret;
l[n] = w[n] = '\0';
ret = match_str(l, w, NULL, NULL, 0, 1);
l[n] = lsav;
w[n] = wsav;
return ret;
}
/* Check if the word w is matched by the strings in pfx and sfx (the prefix /* Check if the word w is matched by the strings in pfx and sfx (the prefix
* and the suffix from the line) or the pattern cp. In clp a cline list for * and the suffix from the line) or the pattern cp. In clp a cline list for
* w is returned. * w is returned.
@ -2603,7 +2629,7 @@ match_str(char *l, char *w, int *bp, int *rwlp, int sfx, int test)
* and the suffix don't match the word w. */ * and the suffix don't match the word w. */
static char * static char *
comp_match(char *pfx, char *sfx, char *w, Comp cp, comp_match(char *pfx, char *sfx, char *w, Patprog cp,
Cline *clp, int qu, int *bpl, int *bsl, int *exact) Cline *clp, int qu, int *bpl, int *bsl, int *exact)
{ {
char *r = NULL; char *r = NULL;
@ -2613,7 +2639,7 @@ comp_match(char *pfx, char *sfx, char *w, Comp cp,
int wl; int wl;
r = w; r = w;
if (!domatch(r, cp, 0)) if (!pattry(cp, r))
return NULL; return NULL;
r = (qu ? quotename(r, NULL) : dupstring(r)); r = (qu ? quotename(r, NULL) : dupstring(r));
@ -2922,7 +2948,7 @@ cmp_anchors(Cline o, Cline n, int join)
return 1; return 1;
} }
/* Didn't work, try to build a string matching both anchors. */ /* Didn't work, try to build a string matching both anchors. */
if (join && !(o->flags & CLF_JOIN) && if (join && !(o->flags & CLF_JOIN) && o->word && n->word &&
(j = join_strs(o->wlen, o->word, n->wlen, n->word))) { (j = join_strs(o->wlen, o->word, n->wlen, n->word))) {
o->flags |= CLF_JOIN; o->flags |= CLF_JOIN;
o->wlen = strlen(j); o->wlen = strlen(j);
@ -3391,6 +3417,10 @@ join_clines(Cline o, Cline n)
(o->flags & (CLF_SUF | CLF_MID)); (o->flags & (CLF_SUF | CLF_MID));
t = tn); t = tn);
if (tn && cmp_anchors(o, tn, 1)) { if (tn && cmp_anchors(o, tn, 1)) {
Cline t;
t = tn->prefix; tn->prefix = n->prefix; n->prefix = t;
t = tn->suffix; tn->suffix = n->suffix; n->suffix = t;
n = tn; n = tn;
continue; continue;
} }
@ -3423,20 +3453,18 @@ join_clines(Cline o, Cline n)
} }
/* Now see if they have matching anchors. If not, cut the list. */ /* Now see if they have matching anchors. If not, cut the list. */
if (!(o->flags & CLF_MID) && !cmp_anchors(o, n, 1)) { if (!(o->flags & CLF_MID) && !cmp_anchors(o, n, 1)) {
#if 0
/* This used to search forward for matching anchors.
* Unfortunately this does the wrong thing if the prefixes
* before the differing anchors match nicely. */
Cline t, tn; Cline t, tn;
for (t = n; (tn = t->next) && !cmp_anchors(o, tn, 1); t = tn); for (t = n; (tn = t->next) && !cmp_anchors(o, tn, 1); t = tn);
if (tn) { if (tn) {
Cline t;
t = tn->prefix; tn->prefix = n->prefix; n->prefix = t;
t = tn->suffix; tn->suffix = n->suffix; n->suffix = t;
n = tn; n = tn;
continue; continue;
} else { } else {
#endif
if (o->flags & CLF_SUF) if (o->flags & CLF_SUF)
break; break;
@ -3445,9 +3473,7 @@ join_clines(Cline o, Cline n)
free_cline(o->next); free_cline(o->next);
o->next = NULL; o->next = NULL;
o->flags |= CLF_MISS; o->flags |= CLF_MISS;
#if 0
} }
#endif
} }
/* Ok, they are equal, now join the sub-lists. */ /* Ok, they are equal, now join the sub-lists. */
if (o->flags & CLF_MID) if (o->flags & CLF_MID)
@ -3747,7 +3773,7 @@ addmatches(Cadata dat, char **argv)
Cmatch cm; Cmatch cm;
struct cmlist mst; struct cmlist mst;
Cmlist oms = mstack; Cmlist oms = mstack;
Comp cp = NULL; Patprog cp = NULL;
LinkList aparl = NULL, oparl = NULL, dparl = NULL; LinkList aparl = NULL, oparl = NULL, dparl = NULL;
if (compquote && (qc = *compquote)) { if (compquote && (qc = *compquote)) {
@ -3838,7 +3864,7 @@ addmatches(Cadata dat, char **argv)
if (haswilds(tmp)) { if (haswilds(tmp)) {
if (is) if (is)
tmp[llpl] = Star; tmp[llpl] = Star;
if ((cp = parsereg(tmp))) if ((cp = patcompile(tmp, 0, NULL)))
haspattern = 1; haspattern = 1;
} }
} }
@ -4341,7 +4367,7 @@ gen_matches_files(int dirs, int execs, int all)
addwhat = execs ? -8 : -5; addwhat = execs ? -8 : -5;
if (filecomp) if (filecomp)
/* If we have a pattern for the filename check, use it. */ /* If we have a pattern for the filename check, use it. */
test = domatch(n, filecomp, 0); test = pattry(filecomp, n);
else { else {
/* Otherwise use the prefix and suffix strings directly. */ /* Otherwise use the prefix and suffix strings directly. */
e = n + strlen(n) - fsl; e = n + strlen(n) - fsl;
@ -5332,6 +5358,10 @@ makecomplistcall(Compctl cc)
offs = lip + lp; offs = lip + lp;
cc->refc++; cc->refc++;
ccont = 0; ccont = 0;
if (!cc->ylist && !cc->gname) {
endcmgroup(NULL);
begcmgroup("default", 0);
}
makecomplistor(cc, str, lincmd, lip, 0); makecomplistor(cc, str, lincmd, lip, 0);
offs = ooffs; offs = ooffs;
isuf = oisuf; isuf = oisuf;
@ -5562,14 +5592,14 @@ static int
makecomplistpc(char *os, int incmd) makecomplistpc(char *os, int incmd)
{ {
Patcomp pc; Patcomp pc;
Comp pat; Patprog pat;
char *s = findcmd(cmdstr, 1); char *s = findcmd(cmdstr, 1);
int ret = 0; int ret = 0;
for (pc = patcomps; pc; pc = pc->next) { for (pc = patcomps; pc; pc = pc->next) {
if ((pat = parsereg(pc->pat)) && if ((pat = patcompile(pc->pat, PAT_STATIC, NULL)) &&
(domatch(cmdstr, pat, 0) || (pattry(pat, cmdstr) ||
(s && domatch(s, pat, 0)))) { (s && pattry(pat, s)))) {
makecomplistcc(pc->cc, os, incmd); makecomplistcc(pc->cc, os, incmd);
ret |= 2; ret |= 2;
if (!(ccont & CC_CCCONT)) if (!(ccont & CC_CCCONT))
@ -5665,7 +5695,7 @@ makecomplistext(Compctl occ, char *os, int incmd)
{ {
Compctl compc; Compctl compc;
Compcond or, cc; Compcond or, cc;
Comp comp; Patprog pprog;
int compadd, m = 0, d = 0, t, tt, i, j, a, b, ins; int compadd, m = 0, d = 0, t, tt, i, j, a, b, ins;
char *sc = NULL, *s, *ss; char *sc = NULL, *s, *ss;
@ -5751,8 +5781,8 @@ makecomplistext(Compctl occ, char *os, int incmd)
if (cc->type == CCT_CURPAT || if (cc->type == CCT_CURPAT ||
cc->type == CCT_WORDPAT) { cc->type == CCT_WORDPAT) {
tokenize(ss = dupstring(cc->u.s.s[i])); tokenize(ss = dupstring(cc->u.s.s[i]));
t = ((comp = parsereg(ss)) && t = ((pprog = patcompile(ss, PAT_STATIC, NULL)) &&
domatch(s, comp, 0)); pattry(pprog, s));
} else } else
t = (!strcmp(s, rembslash(cc->u.s.s[i]))); t = (!strcmp(s, rembslash(cc->u.s.s[i])));
break; break;
@ -5766,8 +5796,8 @@ makecomplistext(Compctl occ, char *os, int incmd)
sc = rembslash(cc->u.l.a[i]); sc = rembslash(cc->u.l.a[i]);
if (cc->type == CCT_RANGESTR ? if (cc->type == CCT_RANGESTR ?
!strncmp(s, sc, strlen(sc)) : !strncmp(s, sc, strlen(sc)) :
((comp = parsereg(sc)) && ((pprog = patcompile(sc, PAT_STATIC, 0)) &&
domatch(s, comp, 0))) { pattry(pprog, s))) {
zsfree(s); zsfree(s);
brange = j + 1; brange = j + 1;
t = 1; t = 1;
@ -5784,8 +5814,8 @@ makecomplistext(Compctl occ, char *os, int incmd)
sc = rembslash(cc->u.l.b[i]); sc = rembslash(cc->u.l.b[i]);
if (cc->type == CCT_RANGESTR ? if (cc->type == CCT_RANGESTR ?
!strncmp(s, sc, strlen(sc)) : !strncmp(s, sc, strlen(sc)) :
((comp = parsereg(sc)) && ((pprog = patcompile(sc, PAT_STATIC, 0)) &&
domatch(s, comp, 0))) { pattry(pprog, s))) {
zsfree(s); zsfree(s);
erange = j - 1; erange = j - 1;
t = clwpos <= erange; t = clwpos <= erange;
@ -6049,7 +6079,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
strcpy(p + rpl + 1, rsuf); strcpy(p + rpl + 1, rsuf);
} else } else
strcpy(p + rpl, rsuf); strcpy(p + rpl, rsuf);
patcomp = parsereg(p); patcomp = patcompile(p, 0, NULL);
haspattern = 1; haspattern = 1;
} }
if (!patcomp) { if (!patcomp) {
@ -6147,7 +6177,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
(!comppatmatch || *comppatmatch == '*')) (!comppatmatch || *comppatmatch == '*'))
p[t2++] = Star; p[t2++] = Star;
strcpy(p + t2, fsuf); strcpy(p + t2, fsuf);
filecomp = parsereg(p); filecomp = patcompile(p, 0, NULL);
} }
if (!filecomp) { if (!filecomp) {
untokenize(fpre); untokenize(fpre);
@ -6566,7 +6596,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
} }
if (cc->hpat) { if (cc->hpat) {
/* We have a pattern to take things from the history. */ /* We have a pattern to take things from the history. */
Comp compc = NULL; Patprog pprogc = NULL;
char *e, *h, hpatsav; char *e, *h, hpatsav;
Histent he; Histent he;
int i = addhistnum(curhist,-1,HIST_FOREIGN), n = cc->hnum; int i = addhistnum(curhist,-1,HIST_FOREIGN), n = cc->hnum;
@ -6576,7 +6606,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
char *thpat = dupstring(cc->hpat); char *thpat = dupstring(cc->hpat);
tokenize(thpat); tokenize(thpat);
compc = parsereg(thpat); pprogc = patcompile(thpat, 0, NULL);
} }
/* n holds the number of history line we have to search. */ /* n holds the number of history line we have to search. */
if (!n) if (!n)
@ -6593,7 +6623,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
/* We now have a word from the history, ignore it * /* We now have a word from the history, ignore it *
* if it begins with a quote or `$'. */ * if it begins with a quote or `$'. */
if (*h != '\'' && *h != '"' && *h != '`' && *h != '$' && if (*h != '\'' && *h != '"' && *h != '`' && *h != '$' &&
(!compc || domatch(h, compc, 0))) (!pprogc || pattry(pprogc, h)))
/* Otherwise add it if it was matched. */ /* Otherwise add it if it was matched. */
addmatch(dupstring(h), NULL); addmatch(dupstring(h), NULL);
if (hpatsav) if (hpatsav)
@ -7728,6 +7758,8 @@ do_single(Cmatch m)
minfo.insc++; minfo.insc++;
if (minfo.we) if (minfo.we)
minfo.end += minfo.insc; minfo.end += minfo.insc;
if (m->flags & CMF_PARNEST)
havesuff = 1;
} }
if ((m->flags & CMF_FILE) || (m->ripre && isset(AUTOPARAMSLASH))) { if ((m->flags & CMF_FILE) || (m->ripre && isset(AUTOPARAMSLASH))) {
/* If we have a filename or we completed a parameter name * /* If we have a filename or we completed a parameter name *
@ -7741,11 +7773,12 @@ do_single(Cmatch m)
t = 1; t = 1;
else { else {
/* Build the path name. */ /* Build the path name. */
if (m->ripre && !*psuf) { if (m->ripre && !*psuf && !(m->flags & CMF_PARNEST)) {
int ne = noerrs; int ne = noerrs;
p = (char *) zhalloc(strlen(m->ripre) + strlen(str) + 1); p = (char *) zhalloc(strlen(m->ripre) + strlen(str) + 2);
sprintf(p, "%s%s", m->ripre, str); sprintf(p, "%s%s%c", m->ripre, str,
((m->flags & CMF_PARBR) ? Outbrace : '\0'));
noerrs = 1; noerrs = 1;
parsestr(p); parsestr(p);
singsub(&p); singsub(&p);