diff options
Diffstat (limited to 'Src/Zle')
-rw-r--r-- | Src/Zle/compctl.c | 70 | ||||
-rw-r--r-- | Src/Zle/complete.c | 54 | ||||
-rw-r--r-- | Src/Zle/complist.c | 6 | ||||
-rw-r--r-- | Src/Zle/computil.c | 44 | ||||
-rw-r--r-- | Src/Zle/textobjects.c | 7 | ||||
-rw-r--r-- | Src/Zle/zle.h | 2 | ||||
-rw-r--r-- | Src/Zle/zle_thingy.c | 5 | ||||
-rw-r--r-- | Src/Zle/zle_tricky.c | 11 | ||||
-rw-r--r-- | Src/Zle/zle_word.c | 119 |
9 files changed, 164 insertions, 154 deletions
diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c index 5414b8ff6..87d13afc1 100644 --- a/Src/Zle/compctl.c +++ b/Src/Zle/compctl.c @@ -383,7 +383,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl) * cct is a temporary just to hold flags; it never needs freeing. */ struct compctl cct; - char **argv = *av; + char **argv = *av, argv_end[2] = "x"; int ready = 0, hx = 0; /* Handle `compctl + foo ...' specially: turn it into @@ -516,14 +516,14 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl) } if ((*argv)[1]) { p = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "retry specification expected after -%c", **argv); return 1; } else { p = *++argv; - *argv = "" - 1; + *argv = argv_end; } switch (*p) { case '+': @@ -553,25 +553,25 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl) case 'k': if ((*argv)[1]) { cct.keyvar = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "variable name expected after -%c", **argv); return 1; } else { cct.keyvar = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'K': if ((*argv)[1]) { cct.func = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "function name expected after -%c", **argv); return 1; } else { cct.func = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'Y': @@ -582,74 +582,74 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl) expl: if ((*argv)[1]) { cct.explain = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "string expected after -%c", **argv); return 1; } else { cct.explain = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'y': if ((*argv)[1]) { cct.ylist = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "function/variable expected after -%c", **argv); } else { cct.ylist = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'P': if ((*argv)[1]) { cct.prefix = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "string expected after -%c", **argv); return 1; } else { cct.prefix = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'S': if ((*argv)[1]) { cct.suffix = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "string expected after -%c", **argv); return 1; } else { cct.suffix = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'g': if ((*argv)[1]) { cct.glob = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "glob pattern expected after -%c", **argv); return 1; } else { cct.glob = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 's': if ((*argv)[1]) { cct.str = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "command string expected after -%c", **argv); return 1; } else { cct.str = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'l': @@ -658,13 +658,13 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl) return 1; } else if ((*argv)[1]) { cct.subcmd = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "command name expected after -%c", **argv); return 1; } else { cct.subcmd = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'h': @@ -673,49 +673,49 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl) return 1; } else if ((*argv)[1]) { cct.substr = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "command name expected after -%c", **argv); return 1; } else { cct.substr = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'W': if ((*argv)[1]) { cct.withd = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "path expected after -%c", **argv); return 1; } else { cct.withd = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'J': if ((*argv)[1]) { cct.gname = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "group name expected after -%c", **argv); return 1; } else { cct.gname = *++argv; - *argv = "" - 1; + *argv = argv_end; } break; case 'V': if ((*argv)[1]) { cct.gname = (*argv) + 1; - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "group name expected after -%c", **argv); return 1; } else { cct.gname = *++argv; - *argv = "" - 1; + *argv = argv_end; } cct.mask2 |= CC_NOSORT; break; @@ -738,7 +738,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl) cct.mstr = NULL; return 1; } - *argv = "" - 1; + *argv = argv_end; } else if (!argv[1]) { zwarnnam(name, "matching specification expected after -%c", **argv); @@ -751,7 +751,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl) cct.mstr = NULL; return 1; } - *argv = "" - 1; + *argv = argv_end; } break; case 'H': @@ -772,7 +772,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl) cct.hnum = 0; if (*cct.hpat == '*' && !cct.hpat[1]) cct.hpat = ""; - *argv = "" - 1; + *argv = argv_end; break; case 'C': if (cl) { @@ -2176,6 +2176,8 @@ gen_matches_files(int dirs, int execs, int all) if (prpre && *prpre) { pathpref = dupstring(prpre); unmetafy(pathpref, &pathpreflen); + if (pathpreflen > PATH_MAX) + return; /* system needs NULL termination, not provided by unmetafy */ pathpref[pathpreflen] = '\0'; } else { @@ -2218,6 +2220,8 @@ gen_matches_files(int dirs, int execs, int all) * the path buffer by appending the filename. */ ums = dupstring(n); unmetafy(ums, ¨en); + if (umlen + pathpreflen + 1 > PATH_MAX) + continue; memcpy(q, ums, umlen); q[umlen] = '\0'; /* And do the stat. */ @@ -2232,6 +2236,8 @@ gen_matches_files(int dirs, int execs, int all) /* We have to test for a path suffix. */ int o = strlen(p), tt; + if (o + strlen(psuf) > PATH_MAX) + continue; /* Append it to the path buffer. */ strcpy(p + o, psuf); diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c index 68bdf2332..313dcb92f 100644 --- a/Src/Zle/complete.c +++ b/Src/Zle/complete.c @@ -715,11 +715,10 @@ bin_compadd(char *name, char **argv, UNUSED(Options ops), UNUSED(int func)) case 'E': if (p[1]) { dat.dummies = atoi(p + 1); - p = "" - 1; + p += strlen(p+1); } else if (argv[1]) { argv++; dat.dummies = atoi(*argv); - p = "" - 1; } else { zwarnnam(name, "number expected after -%c", *p); zsfree(mstr); @@ -744,13 +743,12 @@ bin_compadd(char *name, char **argv, UNUSED(Options ops), UNUSED(int func)) /* Pasted argument: -Xfoo. */ if (!*sp) *sp = p + 1; - p = "" - 1; + p += strlen(p+1); } else if (argv[1]) { /* Argument in a separate word: -X foo. */ argv++; if (!*sp) *sp = *argv; - p = "" - 1; } else { /* Missing argument: argv[N] == "-X", argv[N+1] == NULL. */ zwarnnam(name, e, *p); @@ -934,19 +932,45 @@ do_comp_vars(int test, int na, char *sa, int nb, char *sb, int mod) } case CVT_PRENUM: case CVT_SUFNUM: - if (!na) - return 1; - if (na > 0 && - (int)strlen(test == CVT_PRENUM ? compprefix : compsuffix) >= na) { - if (mod) { - if (test == CVT_PRENUM) - ignore_prefix(na); - else - ignore_suffix(na); - return 1; - } + if (na < 0) return 0; + if (na > 0 && mod) { +#ifdef MULTIBYTE_SUPPORT + if (isset(MULTIBYTE)) { + if (test == CVT_PRENUM) { + const char *ptr = compprefix; + int len = 1; + int sum = 0; + while (*ptr && na && len) { + wint_t wc; + len = mb_metacharlenconv(ptr, &wc); + ptr += len; + sum += len; + na--; + } + if (na) + return 0; + na = sum; + } else { + char *end = compsuffix + strlen(compsuffix); + char *ptr = end; + while (na-- && ptr > compsuffix) + ptr = backwardmetafiedchar(compsuffix, ptr, NULL); + if (na >= 0) + return 0; + na = end - ptr; + } + } else +#endif + if ((int)strlen(test == CVT_PRENUM ? compprefix : compsuffix) >= na) + return 0; + if (test == CVT_PRENUM) + ignore_prefix(na); + else + ignore_suffix(na); + return 1; } + return 1; case CVT_PREPAT: case CVT_SUFPAT: { diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c index a83daeff9..e768aee5d 100644 --- a/Src/Zle/complist.c +++ b/Src/Zle/complist.c @@ -1097,6 +1097,9 @@ compprintfmt(char *fmt, int n, int dopr, int doesc, int ml, int *stop) if (*p) { int arg = 0, is_fg; + if (idigit(*p)) + arg = zstrtol(p, &p, 10); + len = MB_METACHARLENCONV(p, &cchar); #ifdef MULTIBYTE_SUPPORT if (cchar == WEOF) @@ -1104,9 +1107,6 @@ compprintfmt(char *fmt, int n, int dopr, int doesc, int ml, int *stop) #endif p += len; - if (idigit(*p)) - arg = zstrtol(p, &p, 10); - m = 0; switch (cchar) { case ZWC('%'): diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c index e704f9ffa..4ce8eeee5 100644 --- a/Src/Zle/computil.c +++ b/Src/Zle/computil.c @@ -1222,7 +1222,7 @@ parse_cadef(char *nam, char **args) else if (*p == 'A') { if (p[1]) { nonarg = p + 1; - p = "" - 1; + p += strlen(p+1); } else if (args[1]) nonarg = *++args; else @@ -1230,7 +1230,7 @@ parse_cadef(char *nam, char **args) } else if (*p == 'M') { if (p[1]) { match = p + 1; - p = "" - 1; + p += strlen(p+1); } else if (args[1]) match = *++args; else @@ -1824,7 +1824,7 @@ ca_inactive(Cadef d, char **xor, int cur, int opts) char *x; /* current word could be a prefix of a longer one so only do * exclusions for single-letter options (for option clumping) */ - int single = (cur == compcurrent); + int single = !opts && (cur == compcurrent); for (; (x = (opts ? "-" : *xor)); xor++) { int excludeall = 0; @@ -1933,7 +1933,6 @@ struct castate { int inopt; /* set to current word pos if word is a recognised option */ int inarg; /* in a normal argument */ int nth; /* number of current normal arg */ - int doff; /* length of current option */ int singles; /* argument consists of clumped options */ int oopt; int actopts; /* count of active options */ @@ -1943,6 +1942,7 @@ struct castate { static struct castate ca_laststate; static int ca_parsed = 0, ca_alloced = 0; +static int ca_doff; /* no. of chars of ignored prefix (for clumped options or arg to an option) */ static void freecastate(Castate s) @@ -2033,7 +2033,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first) state.argbeg = state.optbeg = state.nargbeg = state.restbeg = state.actopts = state.nth = state.inopt = state.inarg = state.opt = state.arg = 1; state.argend = argend = arrlen(compwords) - 1; - state.doff = state.singles = state.oopt = 0; + state.singles = state.oopt = 0; state.curpos = compcurrent; state.args = znewlinklist(); state.oargs = (LinkList *) zalloc(d->nopts * sizeof(LinkList)); @@ -2057,7 +2057,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first) line; line = compwords[cur++]) { ddef = adef = NULL; dopt = NULL; - doff = state.singles = arglast = 0; + state.singles = arglast = 0; oline = line; #if 0 @@ -2080,7 +2080,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first) remnulargs(line); untokenize(line); - ca_inactive(d, argxor, cur, 0); + ca_inactive(d, argxor, cur - 1, 0); if ((d->flags & CDF_SEP) && cur != compcurrent && !strcmp(line, "--")) { ca_inactive(d, NULL, cur, 1); continue; @@ -2114,7 +2114,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first) state.opt = 0; state.argbeg = state.optbeg = state.inopt = cur; state.argend = argend; - doff = state.doff = 0; + doff = 0; state.singles = 1; if (!state.oargs[state.curopt->num]) state.oargs[state.curopt->num] = znewlinklist(); @@ -2287,7 +2287,6 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first) memcpy(&ca_laststate, &state, sizeof(state)); ca_laststate.ddef = NULL; ca_laststate.dopt = NULL; - ca_laststate.doff = 0; break; } zaddlinknode(state.args, ztrdup(line)); @@ -2324,7 +2323,6 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first) ca_laststate.ddef = NULL; ca_laststate.dopt = NULL; - ca_laststate.doff = 0; break; } } else if (state.def && state.def->end) @@ -2338,7 +2336,6 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first) memcpy(&ca_laststate, &state, sizeof(state)); ca_laststate.ddef = NULL; ca_laststate.dopt = NULL; - ca_laststate.doff = 0; } else if (cur == compcurrent && !ca_laststate.def) { if ((ca_laststate.def = ddef)) { ca_laststate.singles = state.singles; @@ -2349,7 +2346,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first) ca_laststate.opt = 1; state.curopt->active = 1; } else { - ca_laststate.doff = doff; + ca_doff = doff; ca_laststate.opt = 0; } } else { @@ -2452,11 +2449,16 @@ ca_set_data(LinkList descr, LinkList act, LinkList subc, !strcmp((char *) getdata(anode), arg->action)) break; + /* with an ignored prefix, we're not completing any normal arguments */ + if (single && !arg->opt) + return; + if (!dnode) { addlinknode(descr, arg->descr); addlinknode(act, arg->action); if (!restr) { + if ((restr = (arg->type == CAA_RARGS))) restrict_range(ca_laststate.optbeg, ca_laststate.argend); else if ((restr = (arg->type == CAA_RREST))) @@ -2491,8 +2493,11 @@ ca_set_data(LinkList descr, LinkList act, LinkList subc, * the case above right. */ if (arg->type == CAA_NORMAL && - opt && optdef && optdef->type == CAO_NEXT) + opt && optdef && + (optdef->type == CAO_NEXT || optdef->type == CAO_ODIRECT || + optdef->type == CAO_OEQUAL)) return; + if (single) break; @@ -2521,7 +2526,6 @@ ca_set_data(LinkList descr, LinkList act, LinkList subc, if (!single && opt && (lopt || ca_laststate.oopt)) { opt = NULL; arg = ca_get_arg(ca_laststate.d, ca_laststate.nth); - goto rec; } if (!opt && oopt > 0) { @@ -2590,6 +2594,7 @@ bin_comparguments(char *nam, char **args, UNUSED(Options ops), UNUSED(int func)) multi = !!def->snext; /* if we have sets */ ca_parsed = cap; + ca_doff = 0; while (def) { /* for each set */ use = !ca_parse_line(def, all, multi, first); @@ -2629,23 +2634,20 @@ bin_comparguments(char *nam, char **args, UNUSED(Options ops), UNUSED(int func)) { LinkList descr, act, subc; Caarg arg; - int ign = 0, ret = 1; + int ret = 1; descr = newlinklist(); act = newlinklist(); subc = newlinklist(); + ignore_prefix(ca_doff); while (lstate) { arg = lstate->def; if (arg) { ret = 0; - if (!ign && lstate->doff > 0) { - ign = 1; - ignore_prefix(lstate->doff); - } ca_set_data(descr, act, subc, arg->opt, arg, - lstate->curopt, (lstate->doff > 0)); + lstate->curopt, (ca_doff > 0)); } lstate = lstate->snext; } @@ -2673,7 +2675,7 @@ bin_comparguments(char *nam, char **args, UNUSED(Options ops), UNUSED(int func)) for (; lstate; lstate = lstate->snext) { if (lstate->actopts && - (lstate->opt || (lstate->doff && lstate->def) || + (lstate->opt || lstate->def || (lstate->def && lstate->def->opt && (lstate->def->type == CAA_OPT || (lstate->def->type >= CAA_RARGS && diff --git a/Src/Zle/textobjects.c b/Src/Zle/textobjects.c index bf83906f2..c93777b65 100644 --- a/Src/Zle/textobjects.c +++ b/Src/Zle/textobjects.c @@ -30,13 +30,6 @@ #include "zle.mdh" #include "textobjects.pro" -/* class of character: 0 is whitespace, 1 is word character, 2 is other */ -static int -wordclass(ZLE_CHAR_T x) -{ - return (ZC_iblank(x) ? 0 : ((ZC_ialnum(x) || (ZWC('_') == x)) ? 1 : 2)); -} - static int blankwordclass(ZLE_CHAR_T x) { diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h index 07b310180..8261da92b 100644 --- a/Src/Zle/zle.h +++ b/Src/Zle/zle.h @@ -67,6 +67,7 @@ typedef wint_t ZLE_INT_T; #define ZC_inblank iswspace #define ZC_iupper iswupper #define ZC_iword(x) wcsitype((x), IWORD) +#define ZC_ipunct iswpunct #define ZC_tolower towlower #define ZC_toupper towupper @@ -153,6 +154,7 @@ static inline int ZS_strncmp(ZLE_STRING_T s1, ZLE_STRING_T s2, size_t l) #define ZC_inblank inblank #define ZC_iupper isupper #define ZC_iword iword +#define ZC_ipunct ispunct #define ZC_tolower tulower #define ZC_toupper tuupper diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c index f7e9829c2..5601c1178 100644 --- a/Src/Zle/zle_thingy.c +++ b/Src/Zle/zle_thingy.c @@ -731,6 +731,7 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func)) break; } while (*++(*args)) { + char skip_this_arg[2] = "x"; switch (**args) { case 'n': num = args[0][1] ? args[0]+1 : args[1]; @@ -741,7 +742,7 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func)) return 1; } if (!args[0][1]) - *++args = "" - 1; + *++args = skip_this_arg; saveflag = 1; zmod.mult = atoi(num); zmod.flags |= MOD_MULT; @@ -760,7 +761,7 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func)) return 1; } if (!args[0][1]) - *++args = "" - 1; + *++args = skip_this_arg; keymap_restore = dupstring(curkeymapname); if (selectkeymap(keymap_tmp, 0)) { if (remetafy) diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index 5a9cccb6f..22c381237 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -456,6 +456,7 @@ checkparams(char *p) static int cmphaswilds(char *str) { + char *ptr; if ((*str == Inbrack || *str == Outbrack) && !str[1]) return 0; @@ -465,6 +466,14 @@ cmphaswilds(char *str) if (str[0] == '%' && str[1] ==Quest) str += 2; + /* + * In ~[foo], the square brackets are not wild cards. + * This test matches the master one in filesubstr(). + */ + if (*str == Tilde && str[1] == Inbrack && + (ptr = strchr(str+2, Outbrack))) + str = ptr + 1; + for (; *str;) { if (*str == String || *str == Qstring) { /* A parameter expression. */ @@ -2268,7 +2277,7 @@ doexpansion(char *s, int lst, int olst, int explincmd) int ng = opts[NULLGLOB]; opts[NULLGLOB] = 1; - globlist(vl, 1); + globlist(vl, PREFORK_NO_UNTOK); opts[NULLGLOB] = ng; } if (errflag) diff --git a/Src/Zle/zle_word.c b/Src/Zle/zle_word.c index e4a878eab..89959b20c 100644 --- a/Src/Zle/zle_word.c +++ b/Src/Zle/zle_word.c @@ -64,7 +64,18 @@ forwardword(char **args) return 0; } -#define Z_vialnum(X) (ZC_ialnum(X) || (ZWC('_') == X)) +/* + * class of character (for vi-mode word motion) + * 0: blank, 1: alnum or _, 2: punctuation, 3: the others + */ + +/**/ +int +wordclass(ZLE_CHAR_T x) +{ + return (ZC_iblank(x) ? 0 : ((ZC_ialnum(x) || (ZWC('_') == x)) ? 1 : + ZC_ipunct(x) ? 2 : 3)); +} /**/ int @@ -75,19 +86,16 @@ viforwardword(char **args) if (n < 0) { int ret; zmult = -n; - ret = backwardword(args); + ret = vibackwardword(args); zmult = n; return ret; } while (n--) { int nl; - if (Z_vialnum(zleline[zlecs])) - while (zlecs != zlell && Z_vialnum(zleline[zlecs])) - INCCS(); - else - while (zlecs != zlell && !Z_vialnum(zleline[zlecs]) && - !ZC_inblank(zleline[zlecs])) - INCCS(); + int cc = wordclass(zleline[zlecs]); + while (zlecs != zlell && wordclass(zleline[zlecs]) == cc) { + INCCS(); + } if (wordflag && !n) return 0; nl = (zleline[zlecs] == ZWC('\n')); @@ -160,7 +168,7 @@ viforwardblankwordend(char **args) if (n < 0) { int ret; zmult = -n; - ret = viforwardblankwordend(args); + ret = vibackwardblankwordend(args); zmult = n; return ret; } @@ -208,26 +216,17 @@ viforwardwordend(char **args) zlecs = pos; } if (zlecs != zlell) { + int cc; pos = zlecs; INCPOS(pos); - if (Z_vialnum(zleline[pos])) { - for (;;) { - zlecs = pos; - if (zlecs == zlell) + cc = wordclass(zleline[pos]); + for (;;) { + zlecs = pos; + if (zlecs == zlell) + break; + INCPOS(pos); + if (wordclass(zleline[pos]) != cc) break; - INCPOS(pos); - if (!Z_vialnum(zleline[pos])) - break; - } - } else { - for (;;) { - zlecs = pos; - if (zlecs == zlell) - break; - INCPOS(pos); - if (Z_vialnum(zleline[pos]) || ZC_inblank(zleline[pos])) - break; - } } } } @@ -277,7 +276,7 @@ vibackwardword(char **args) if (n < 0) { int ret; zmult = -n; - ret = backwardword(args); + ret = viforwardword(args); zmult = n; return ret; } @@ -295,24 +294,14 @@ vibackwardword(char **args) } if (zlecs) { int pos = zlecs; - if (Z_vialnum(zleline[pos])) { - for (;;) { - zlecs = pos; - if (zlecs == 0) - break; - DECPOS(pos); - if (!Z_vialnum(zleline[pos])) - break; - } - } else { - for (;;) { - zlecs = pos; - if (zlecs == 0) - break; - DECPOS(pos); - if (Z_vialnum(zleline[pos]) || ZC_inblank(zleline[pos])) - break; - } + int cc = wordclass(zleline[pos]); + for (;;) { + zlecs = pos; + if (zlecs == 0) + break; + DECPOS(pos); + if (wordclass(zleline[pos]) != cc || ZC_inblank(zleline[pos])) + break; } } } @@ -368,17 +357,10 @@ vibackwardwordend(char **args) return ret; } while (n-- && zlecs > 1) { - int start = 0; - if (Z_vialnum(zleline[zlecs])) - start = 1; - else if (!ZC_inblank(zleline[zlecs])) - start = 2; + int cc = wordclass(zleline[zlecs]); DECCS(); while (zlecs) { - int same = (start != 1) && ZC_iblank(zleline[zlecs]); - if (start) - same |= Z_vialnum(zleline[zlecs]); - if (same == (start == 2)) + if (wordclass(zleline[zlecs]) != cc || ZC_iblank(zleline[zlecs])) break; DECCS(); } @@ -494,26 +476,17 @@ vibackwardkillword(UNUSED(char **args)) x = pos; } if (x > lim) { + int cc; int pos = x; DECPOS(pos); - if (Z_vialnum(zleline[pos])) { - for (;;) { - x = pos; - if (x <= lim) - break; - DECPOS(pos); - if (!Z_vialnum(zleline[pos])) - break; - } - } else { - for (;;) { - x = pos; - if (x <= lim) - break; - DECPOS(pos); - if (Z_vialnum(zleline[pos]) || ZC_iblank(zleline[pos])) - break; - } + cc = wordclass(zleline[pos]); + for (;;) { + x = pos; + if (x <= lim) + break; + DECPOS(pos); + if (wordclass(zleline[pos]) != cc) + break; } } } |