diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | Completion/Core/_expand | 12 | ||||
-rw-r--r-- | Src/Zle/compcore.c | 31 | ||||
-rw-r--r-- | Src/Zle/compresult.c | 2 |
4 files changed, 40 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog index af223d374..0e8c11cd6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2000-04-25 Sven Wischnowsky <wischnow@informatik.hu-berlin.de> + * 10909: Completion/Core/_expand, Src/Zle/compcore.c, + Src/Zle/compresult.c: report prefix/suffix of parameter expansion + in IPREFIX/ISUFFIX; make _expand use them to be able to expand $foo + * 10908: Completion/Base/.distfiles, Completion/Base/_argument_sets, Completion/Base/_arguments, Completion/Base/_describe, Completion/Builtins/_bindkey, Completion/Builtins/_compdef, diff --git a/Completion/Core/_expand b/Completion/Core/_expand index 2557af884..1a96e654e 100644 --- a/Completion/Core/_expand +++ b/Completion/Core/_expand @@ -11,7 +11,13 @@ setopt localoptions nullglob [[ _matcher_num -gt 1 ]] && return 1 -local exp word="$PREFIX$SUFFIX" sort expr expl subd suf=" " +local exp word sort expr expl subd suf=" " + +if [[ "$funcstack[2]" = _prefix ]]; then + word="$IPREFIX$PREFIX$SUFFIX" +else + word="$IPREFIX$PREFIX$SUFFIX$ISUFFIX" +fi # First, see if we should insert all *completions*. @@ -29,7 +35,7 @@ exp=("$word") # changes quoted spaces, tabs, and newlines into spaces. { zstyle -s ":completion:${curcontext}:" substitute expr || - [[ "$curcontext" = expand-word:* ]] && expr=1 } && + { [[ "$curcontext" = expand-word:* ]] && expr=1 } } && [[ "${(e):-\$[$expr]}" -eq 1 ]] && exp=( "${(e)exp//\\[ ]/ }" ) @@ -43,7 +49,7 @@ subd=("$exp[@]") # Now try globbing. { zstyle -s ":completion:${curcontext}:" glob expr || - [[ "$curcontext" = expand-word:* ]] && expr=1 } && + { [[ "$curcontext" = expand-word:* ]] && expr=1 } } && [[ "${(e):-\$[$expr]}" -eq 1 ]] && exp=( ${~exp} ) diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c index d5dee0dca..0c989c427 100644 --- a/Src/Zle/compcore.c +++ b/Src/Zle/compcore.c @@ -492,6 +492,8 @@ after_complete(Hookdef dummy, Compldat dat) /* This calls the given completion widget function. */ +static int parwb, parwe, paroffs; + /**/ static void callcompfunc(char *s, char *fn) @@ -637,9 +639,24 @@ callcompfunc(char *s, char *fn) compsuffix = ztrdup(ss); } zsfree(compiprefix); - compiprefix = ztrdup(""); zsfree(compisuffix); - compisuffix = ztrdup(""); + if (parwb < 0) { + compiprefix = ztrdup(""); + compisuffix = ztrdup(""); + } else { + int l; + + compiprefix = (char *) zalloc((l = wb - parwb) + 1); + memcpy(compiprefix, line + parwb, l); + compiprefix[l] = '\0'; + compisuffix = (char *) zalloc((l = parwe - we) + 1); + memcpy(compisuffix, line + we, l); + compisuffix[l] = '\0'; + + wb = parwb; + we = parwe; + offs = paroffs; + } zsfree(compqiprefix); compqiprefix = ztrdup(qipre ? qipre : ""); zsfree(compqisuffix); @@ -829,10 +846,16 @@ static int makecomplist(char *s, int incmd, int lst) { char *p; + int owb = wb, owe = we, ooffs = offs; /* Inside $... ? */ - if (compfunc && (p = check_param(s, 0, 0))) + if (compfunc && (p = check_param(s, 0, 0))) { s = p; + parwb = owb; + parwe = owe; + paroffs = ooffs; + } else + parwb = -1; linwhat = inwhat; @@ -1073,7 +1096,7 @@ check_param(char *s, int set, int test) } /* Save the prefix. */ if (compfunc) { - parflags = (br >= 2 ? CMF_PARBR : 0); + parflags = (br >= 2 ? CMF_PARBR | (nest ? CMF_PARNEST : 0) : 0); sav = *b; *b = '\0'; untokenize(parpre = ztrdup(s)); diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c index 87e1f7278..3875987c5 100644 --- a/Src/Zle/compresult.c +++ b/Src/Zle/compresult.c @@ -1030,8 +1030,6 @@ accept_last(void) else if (cs > ll) cs = ll; inststrlen(" ", 1, 1); - if (parpre) - inststr(parpre); minfo.insc = minfo.len = 0; minfo.pos = cs; minfo.we = 1; |