From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from euclid.skiles.gatech.edu (list@euclid.skiles.gatech.edu [130.207.146.50]) by melb.werple.net.au (8.7.5/8.7.3/2) with ESMTP id LAA15099 for ; Wed, 10 Jul 1996 11:21:40 +1000 (EST) Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id VAA01940; Tue, 9 Jul 1996 21:12:23 -0400 (EDT) Resent-Date: Tue, 9 Jul 1996 21:12:23 -0400 (EDT) From: Zoltan Hidvegi Message-Id: <199607100100.DAA01540@hzoli.ppp.cs.elte.hu> Subject: Menu completion fix To: zsh-workers@math.gatech.edu (Zsh hacking and development) Date: Wed, 10 Jul 1996 03:00:49 +0200 (MET DST) X-Mailer: ELM [version 2.4ME+ PL17 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Resent-Message-ID: <"6X7Og.0.EU.oDmun"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/1595 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu If one tries menu completion for example after ~/foo the tilde will be quoted in the newly insered word. The patch also change prefizes/suffizes to prefixes/suffixes. Or is prefizes a correct plural form of prefix? I know that some nouns have irregular plural like matrix -> matrices but I did not know that that prefix/suffix is also irregular. Zoltan *** Src/zle_tricky.c 1996/07/09 17:07:40 2.59 --- Src/zle_tricky.c 1996/07/10 00:46:56 *************** *** 2381,2390 **** /* Compute line prefix/suffix. */ ! sav = s[offs]; ! s[offs] = '\0'; ! p = quotename(s, NULL, NULL, NULL); ! if (strcmp(p, s) && !strpfx(p, qword)) { int l1, l2; backdel(l1 = cs - wb); --- 2381,2392 ---- /* Compute line prefix/suffix. */ ! lpl = offs + 1; ! lpre = zalloc(lpl + 1); ! memcpy(lpre, s, lpl); ! lpre[lpl] = '\0'; ! p = quotename(lpre, NULL, NULL, NULL); ! if (strcmp(p, lpre) && !strpfx(p, qword)) { int l1, l2; backdel(l1 = cs - wb); *************** *** 2392,2402 **** inststrlen(p, 1, l2 = strlen(p)); we += l2 - l1; } ! lpre = ztrdup(s); ! s[offs] = sav; ! if (s[offs] && ! (p = quotename(s + offs, NULL, NULL, NULL)) && ! (strcmp(p, s + offs) && !strsfx(p, qword))) { int l1, l2; foredel(l1 = strlen(s + offs)); --- 2394,2403 ---- inststrlen(p, 1, l2 = strlen(p)); we += l2 - l1; } ! lsuf = ztrdup(s + offs); ! lsl = strlen(lsuf); ! if (lsl && (p = quotename(lsuf, NULL, NULL, NULL)) && ! (strcmp(p, lsuf) && !strsfx(p, qword))) { int l1, l2; foredel(l1 = strlen(s + offs)); *************** *** 2404,2414 **** inststrlen(p, 0, l2 = strlen(p)); we += l2 - l1; } - lsuf = ztrdup(s + offs); /* First check for ~.../... */ if (ic == Tilde) { ! for (p = lpre + strlen(lpre); p > lpre; p--) if (*p == '/') break; --- 2405,2414 ---- inststrlen(p, 0, l2 = strlen(p)); we += l2 - l1; } /* First check for ~.../... */ if (ic == Tilde) { ! for (p = lpre + lpl; p > lpre; p--) if (*p == '/') break; *************** *** 2475,2483 **** untokenize(lpre); untokenize(lsuf); - lpl = strlen(lpre); - lsl = strlen(lsuf); - /* Handle completion of files specially (of course). */ if ((cc->mask & (CC_FILES | CC_COMMPATH)) || cc->glob) { --- 2475,2480 ---- *************** *** 2946,2954 **** makearray(matches); PERMALLOC { amatches = arrdup(amatches); ! /* And quote the prefizes/suffize. */ ! quotepresuf(&lpre); ! quotepresuf(&lsuf); quotepresuf(&fpre); quotepresuf(&fsuf); quotepresuf(&ppre); --- 2943,2961 ---- makearray(matches); PERMALLOC { amatches = arrdup(amatches); ! /* And quote the prefixes/suffixes. */ ! if (hasspecial(s)) { ! zfree(lpre, lpl); ! zfree(lsuf, lsl); ! lpre = zalloc(lpl + 1); ! memcpy(lpre, s, lpl); ! lpre[lpl] = '\0'; ! lsuf = ztrdup(s + offs); ! quotepresuf(&lpre); ! quotepresuf(&lsuf); ! untokenize(lpre); ! untokenize(lsuf); ! } quotepresuf(&fpre); quotepresuf(&fsuf); quotepresuf(&ppre); *************** *** 3515,3521 **** nlpl = lpre ? niceztrlen(lpre) : 0; nlsl = lsuf ? niceztrlen(lsuf) : 0; ! /* Calculate the lengths of the prefizes/suffizes we have to ignore during printing. */ off = ispattern && ppre && *ppre && !(haswhat & (HAS_MISC | HAS_PATHPAT)) ? strlen(ppre) : 0; --- 3522,3528 ---- nlpl = lpre ? niceztrlen(lpre) : 0; nlsl = lsuf ? niceztrlen(lsuf) : 0; ! /* Calculate the lengths of the prefixes/suffixes we have to ignore during printing. */ off = ispattern && ppre && *ppre && !(haswhat & (HAS_MISC | HAS_PATHPAT)) ? strlen(ppre) : 0; *** Src/utils.c 1996/07/09 17:05:37 2.42 --- Src/utils.c 1996/07/10 00:05:07 *************** *** 3142,3169 **** return l; } /* Unmetafy and output a string, quoted if it contains special characters. */ /**/ int quotedzputs(char const *s, FILE *stream) { - char const *p; int inquote = 0, c; /* check for empty string */ if(!*s) return fputs("''", stream); ! /* check for special characters in the string */ ! for (p = s; *p; p++) ! if (ispecial(*p == Meta ? *++p ^ 32 : *p)) ! goto hasspecial; ! ! /* no special characters at all */ ! return zputs(s, stream); - hasspecial: if (isset(RCQUOTES)) { /* use rc-style quotes-within-quotes for the whole string */ if(fputc('\'', stream) < 0) --- 3142,3174 ---- return l; } + /* check for special characters in the string */ + + /**/ + int + hasspecial(char const *s) + { + for (; *s; s++) + if (ispecial(*s == Meta ? *++s ^ 32 : *s)) + return 1; + return 0; + } + /* Unmetafy and output a string, quoted if it contains special characters. */ /**/ int quotedzputs(char const *s, FILE *stream) { int inquote = 0, c; /* check for empty string */ if(!*s) return fputs("''", stream); ! if (!hasspecial(s)) ! return zputs(s, stream); if (isset(RCQUOTES)) { /* use rc-style quotes-within-quotes for the whole string */ if(fputc('\'', stream) < 0)