diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Zle/compcore.c | 4 | ||||
-rw-r--r-- | Src/Zle/complete.c | 42 |
2 files changed, 38 insertions, 8 deletions
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c index 59443a8fa..0c1f13078 100644 --- a/Src/Zle/compcore.c +++ b/Src/Zle/compcore.c @@ -1532,8 +1532,8 @@ set_comp_sep(void) untokenize(ss); compsuffix = ztrdup(ss); } - if ((i = strlen(compprefix)) && - compprefix[i - 1] == '\\' && compprefix[i - 2] != '\\') + if ((i = strlen(compprefix)) > 1 && compprefix[i - 1] == '\\' && + compprefix[i - 2] != '\\' && compprefix[i - 2] != Meta) compprefix[i - 1] = '\0'; tmp = tricat(compqiprefix, compiprefix, multiquote(qp, 1)); diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c index 717be8896..d1f3366e7 100644 --- a/Src/Zle/complete.c +++ b/Src/Zle/complete.c @@ -821,18 +821,32 @@ do_comp_vars(int test, int na, char *sa, int nb, char *sb, int mod) add = -1; } else { p = compprefix + 1; + if (*p == Meta) + p++; add = 1; } - for (; l; l--, p += add) { + for (;;) { sav = *p; *p = '\0'; test = pattry(pp, compprefix); *p = sav; if (test && !--na) break; + if (add > 0) { + if (p == compprefix + l) + return 0; + if (*p == Meta) + p += 2; + else + p++; + } else { + if (p == compprefix) + return 0; + p--; + if (p > compprefix && p[-1] == Meta) + p--; + } } - if (!l) - return 0; if (mod) ignore_prefix(p - compprefix); } else { @@ -847,14 +861,30 @@ do_comp_vars(int test, int na, char *sa, int nb, char *sb, int mod) add = 1; } else { p = compsuffix + l - 1; + if (p > compsuffix && p[-1] == Meta) + p--; add = -1; } - for (; l; l--, p += add) + for (;;) { if (pattry(pp, p) && !--na) break; - if (!l) - return 0; + if (add > 0) { + if (p == compsuffix + l) + return 0; + if (*p == Meta) + p += 2; + else + p++; + } else { + if (p == compsuffix) + return 0; + p--; + if (p > compsuffix && p[-1] == Meta) + p--; + } + } + if (mod) ignore_suffix(ol - (p - compsuffix)); } |