diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Zle/compcore.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c index 8356ad5a5..457493150 100644 --- a/Src/Zle/compcore.c +++ b/Src/Zle/compcore.c @@ -1662,8 +1662,26 @@ addmatches(Cadata dat, char **argv) } else lsl = 0; if (dat->aflags & CAF_MATCH) { - int ml; + int ml, gfl = 0; + char *globflag = NULL; + if (comppatmatch && *comppatmatch && + dat->ppre && lpre[0] == '(' && lpre[1] == '#') { + char *p; + + for (p = lpre + 2; *p && *p != ')'; p++); + + if (*p == ')') { + char sav = p[1]; + + p[1] = '\0'; + globflag = dupstring(lpre); + gfl = p - lpre + 1; + p[1] = sav; + + lpre = p + 1; + } + } s = dat->ppre ? dat->ppre : ""; if ((ml = match_str(lpre, s, &bpl, 0, NULL, 0, 0, 1)) >= 0) { if (matchsubs) { @@ -1688,11 +1706,11 @@ addmatches(Cadata dat, char **argv) *argv = NULL; bcp = lpl; } - s = dat->psuf ? dat->psuf : ""; if ((ml = match_str(lsuf, s, &bsl, 0, NULL, 1, 0, 1)) >= 0) { if (matchsubs) { - Cline tmp = get_cline(NULL, 0, NULL, 0, NULL, 0, CLF_SUF); + Cline tmp = get_cline(NULL, 0, NULL, 0, NULL, 0, + CLF_SUF); tmp->suffix = matchsubs; if (matchlastpart) @@ -1715,17 +1733,21 @@ addmatches(Cadata dat, char **argv) } if (comppatmatch && *comppatmatch) { int is = (*comppatmatch == '*'); - char *tmp = (char *) zhalloc(2 + llpl + llsl); + char *tmp = (char *) zhalloc(2 + llpl + llsl + gfl); - strcpy(tmp, lpre); - tmp[llpl] = 'x'; - strcpy(tmp + llpl + is, lsuf); + if (gfl) { + strcpy(tmp, globflag); + strcat(tmp, lpre); + } else + strcpy(tmp, lpre); + tmp[llpl + gfl] = 'x'; + strcpy(tmp + llpl + gfl + is, lsuf); tokenize(tmp); remnulargs(tmp); if (haswilds(tmp)) { if (is) - tmp[llpl] = Star; + tmp[llpl + gfl] = Star; if ((cp = patcompile(tmp, 0, NULL))) haspattern = 1; } |