[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00035] Re: escaping a !



 しらいです。

In Message-Id <86n0rd3z6i.wl@archon.local.idaemons.org>
        "Akinori MUSHA" <knu@iDaemons.org>さんwrites:
>  補完結果が正しく解釈されるのであればどれでも納得できます。
> 
>  仰る通り 3 がいいんじゃないでしょうか。

 という訳で patch を作成してみました。他にも幾つかいじって
しまってますが、今回の指摘箇所は直っていると思います。
 [FDclone-users:00020] に対する patch にしてありますので、
FD-2.01b に上記 mail の patch をあててから下記 patch をあて
て下さい。

---- Cut Here ----
diff -u old/input.c ./input.c
--- old/input.c	Wed Aug 21 14:19:15 2002
+++ ./input.c	Wed Aug 21 14:08:27 2002
@@ -852,52 +852,78 @@
 	dupl = malloc2(ins * 2 + 1);
 	insertchar(s, cx, len, plen, max, linemax, vlen(strins, ins));
 	insshift(s, cx, len, ins);
+	for (i = 0; i < ins; i++) s[cx + i] = ' ';
+	len += ins;
 	for (i = j = 0; i < ins; i++, j++) {
 		if (isctl(strins[i])) {
-			if (len + ins + j - i >= max)
+			if (len + j - i >= max)
 				dupl[j] = s[cx + j] = '?';
 			else {
+				insertchar(s, cx, len, plen, max, linemax, 1);
+				insshift(s, cx + j, len, 1);
 				dupl[j] = '^';
 				s[cx + j] = QUOTE;
-				dupl[++j] = (strins[i] + '@') & 0x7f;
+				j++;
+				dupl[j] = (strins[i] + '@') & 0x7f;
 				s[cx + j] = strins[i];
 			}
 		}
 #ifdef	CODEEUC
 		else if (isekana(strins, i)) {
-			if (len + ins + j - i >= max)
+			if (len + j - i >= max)
 				dupl[j] = s[cx + j] = '?';
 			else {
 				dupl[j] = s[cx + j] = strins[i];
-				dupl[j + 1] = s[cx + j + 1] = strins[++i];
 				j++;
+				dupl[j] = s[cx + j] = strins[++i];
 			}
 		}
 #endif
 		else if (iskanji1(strins, i)) {
-			if (len + ins + j - i >= max)
+			if (len + j - i >= max)
 				dupl[j] = s[cx + j] = '?';
 			else {
 				dupl[j] = s[cx + j] = strins[i];
-				dupl[j + 1] = s[cx + j + 1] = strins[++i];
 				j++;
+				dupl[j] = s[cx + j] = strins[++i];
 			}
 		}
 #if	MSDOS && defined (_NOORIGSHELL)
-		else if (strchr(DQ_METACHAR, strins[i])) {
+		else if (strchr(DQ_METACHAR, strins[i])
 #else
-		else if (quote == '"' && strchr(DQ_METACHAR, strins[i])) {
+		else if ((quote == '\'' && strins[i] == '\'')
+		|| (quote == '"' && strins[i] == '!')) {
+			f = 3;
+			if (!strins[i + 1]) f--;
+			if (len + j - i + f > max)
+				dupl[j] = s[cx + j] = '?';
+			else {
+				insertchar(s, cx, len, plen, max, linemax, f);
+				insshift(s, cx + j, len, f);
+				dupl[j] = s[cx + j] = quote;
+				j++;
+				dupl[j] = s[cx + j] = PMETA;
+				j++;
+				dupl[j] = s[cx + j] = strins[i];
+				j++;
+				dupl[j] = s[cx + j] = quote;
+			}
+		}
+		else if ((quote == '"' && strchr(DQ_METACHAR, strins[i]))
 #endif
-			if (len + ins + j - i >= max)
+		|| (!quote && strchr(METACHAR, strins[i]))) {
+			if (len + j - i >= max)
 				dupl[j] = s[cx + j] = '?';
 			else {
+				insertchar(s, cx, len, plen, max, linemax, 1);
+				insshift(s, cx + j, len, 1);
 #if	MSDOS && defined (_NOORIGSHELL)
-				dupl[j] = s[cx + j] =
+				dupl[j] = s[cx + j] = strins[i];
 #else
 				dupl[j] = s[cx + j] = PMETA;
 #endif
-				dupl[j + 1] = s[cx + j + 1] = strins[i];
 				j++;
+				dupl[j] = s[cx + j] = strins[i];
 			}
 		}
 		else dupl[j] = s[cx + j] = strins[i];
@@ -1235,6 +1261,7 @@
 					continue;
 				}
 				if (!isnmeta(s, i, '\0', cx)) continue;
+				if (strchr(DQ_METACHAR, s[i + 1])) continue;
 				setcursor(vlen(s, i), plen, max, linemax);
 				deletechar(s, i, len, plen, max, linemax, 1);
 				delshift(s, i, len--, 1);
@@ -1254,15 +1281,12 @@
 	}
 
 	cp2 = cp1 + (int)strlen(cp1) - ins;
-	if (fix == _SC_) {
-		ins--;
-		if (!hasmeta) quote = '\0';
-	}
+	if (fix == _SC_) ins--;
 	i = insertstr(s, cx, len, plen, max, linemax, cp2, ins, quote);
 	l += i;
 	if (fix && (len += i) < max) {
 		cx += i;
-		if (quote && len + 1 < max) {
+		if (quote && len + 1 < max && (fix != _SC_ || hasmeta)) {
 			insertchar(s, cx, len, plen, max, linemax, 1);
 			insshift(s, cx, len++, 1);
 			l++;
---- Cut Here ----

                                               しらい たかし