Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: more combining character stuff



More stuff to fix up combining characters, found just by looking
through the code.

I think the remaining job is to think about the function widget
interface.  I'll look at Functions/Zle at some point to see what might
need doing there.

Index: Src/Zle/zle_hist.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_hist.c,v
retrieving revision 1.54
diff -u -r1.54 zle_hist.c
--- Src/Zle/zle_hist.c	1 May 2008 11:33:06 -0000	1.54
+++ Src/Zle/zle_hist.c	4 May 2008 18:16:45 -0000
@@ -247,6 +247,11 @@
 	    if (zlecs > findbol() && invicmdmode())
 		DECCS();
 	}
+#ifdef MULTIBYTE_SUPPORT
+	else
+	    CCRIGHT();
+#endif
+	    
     }
     return n;
 }
@@ -331,6 +336,10 @@
 	    if (zlecs > findbol() && invicmdmode())
 		DECCS();
 	}
+#ifdef MULTIBYTE_SUPPORT
+	else
+	    CCRIGHT();
+#endif
     }
     return n;
 }
Index: Src/Zle/zle_misc.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_misc.c,v
retrieving revision 1.53
diff -u -r1.53 zle_misc.c
--- Src/Zle/zle_misc.c	23 Apr 2008 21:08:34 -0000	1.53
+++ Src/Zle/zle_misc.c	4 May 2008 18:16:47 -0000
@@ -801,10 +801,20 @@
 	for (;;) {
 	    t1 = t0;
 
-	    while (t0 && !ZC_iword(zleline[t0-1]))
-		t0--;
-	    while (t0 && ZC_iword(zleline[t0-1]))
-		t0--;
+	    while (t0) {
+		int prev = t0;
+		DECPOS(prev);
+		if (ZC_iword(zleline[prev]))
+		    break;
+		t0 = prev;
+	    }
+	    while (t0) {
+		int prev = t0;
+		DECPOS(prev);
+		if (!ZC_iword(zleline[prev]))
+		    break;
+		t0 = prev;
+	    }
 
 	    if (!--count)
 		break;
Index: Src/Zle/zle_move.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_move.c,v
retrieving revision 1.16
diff -u -r1.16 zle_move.c
--- Src/Zle/zle_move.c	21 Apr 2008 11:49:58 -0000	1.16
+++ Src/Zle/zle_move.c	4 May 2008 18:16:47 -0000
@@ -307,11 +307,19 @@
 	return ret;
     }
     while (n--) {
+	int pos;
+
 	if (zlecs == 0)
 	    return 0;
-	if (zleline[zlecs - 1] == '\n')
-	    if (!--zlecs)
+	pos = zlecs;
+	DECPOS(pos);
+	if (zleline[pos] == '\n') {
+	    zlecs = pos;
+	    if (!zlecs)
 		return 0;
+	}
+
+	/* works OK with combining chars since '\n' must be on its own */
 	while (zlecs && zleline[zlecs - 1] != '\n')
 	    zlecs--;
     }
@@ -359,11 +367,19 @@
 	return ret;
     }
     while (n) {
+	int pos;
+
 	if (zlecs == 0)
 	    break;
-	if (zleline[zlecs - 1] == '\n')
-	    if (!--zlecs)
+	pos = zlecs;
+	DECPOS(pos);
+	if (zleline[pos] == '\n') {
+	    zlecs = pos;
+	    if (!pos)
 		break;
+	}
+
+	/* works OK with combining chars since '\n' must be on its own */
 	while (zlecs && zleline[zlecs - 1] != '\n')
 	    zlecs--;
 	n--;
@@ -554,12 +570,15 @@
 	oth = '[';
 	break;
     default:
-	zlecs++;
+	INCCS();
 	goto otog;
     }
     ct = 1;
     while (zlecs >= 0 && zlecs < zlell && ct) {
-	zlecs += dir;
+	if (dir < 0)
+	    DECCS();
+	else
+	    INCCS();
 	if (zleline[zlecs] == oth)
 	    ct--;
 	else if (zleline[zlecs] == me)
@@ -634,7 +653,7 @@
 	}
 	zlecs = findeol() + 1;
     }
-    zlecs--;
+    DECCS();
     lastcol = 1<<30;
     return 0;
 }
Index: Src/Zle/zle_vi.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_vi.c,v
retrieving revision 1.21
diff -u -r1.21 zle_vi.c
--- Src/Zle/zle_vi.c	23 Apr 2008 08:43:38 -0000	1.21
+++ Src/Zle/zle_vi.c	4 May 2008 18:16:47 -0000
@@ -262,7 +262,7 @@
 	    zlecs = pos;
 	    return 1;
 	}
-	zlecs--;
+	DECCS();
     } else {
 	while(n++ && zlecs >= 0)
 	    zlecs = findbol() - 1;
@@ -270,7 +270,7 @@
 	    zlecs = pos;
 	    return 1;
 	}
-	zlecs++;
+	INCCS();
     }
     virangeflag = 2;
     return 0;
@@ -281,7 +281,7 @@
 viaddnext(UNUSED(char **args))
 {
     if (zlecs != findeol())
-	zlecs++;
+	INCCS();
     startvitext(1);
     return 0;
 }
@@ -776,7 +776,7 @@
 	    zlecs += buf->len;
 	}
 	if (zlecs)
-	    zlecs--;
+	    DECCS();
     }
     return 0;
 }
@@ -819,20 +819,27 @@
 int
 vijoin(UNUSED(char **args))
 {
-    int x;
+    int x, pos;
 
     startvichange(-1);
     if ((x = findeol()) == zlell)
 	return 1;
     zlecs = x + 1;
-    for (x = 1; zlecs != zlell && ZC_iblank(zleline[zlecs]); zlecs++, x++);
+    pos = zlecs;
+    for (; zlecs != zlell && ZC_iblank(zleline[zlecs]); INCPOS(zlecs))
+	;
+    x = 1 + (zlecs - pos);
     backdel(x, CUT_RAW);
-    if (zlecs && ZC_iblank(zleline[zlecs-1]))
-	zlecs--;
-    else {
-	spaceinline(1);
-	zleline[zlecs] = ZWC(' ');
+    if (zlecs) {
+	int pos = zlecs;
+	DECPOS(pos);
+	if (ZC_iblank(zleline[pos])) {
+	    zlecs = pos;
+	    return 0;
+	}
     }
+    spaceinline(1);
+    zleline[zlecs] = ZWC(' ');
     return 0;
 }
 
@@ -851,10 +858,10 @@
 	    zleline[zlecs] = ZC_toupper(zleline[zlecs]);
 	else if (ZC_iupper(zleline[zlecs]))
 	    zleline[zlecs] = ZC_tolower(zleline[zlecs]);
-	zlecs++;
+	INCCS();
     }
     if (zlecs && zlecs == eol)
-	zlecs--;
+	DECCS();
     return 0;
 }
 
@@ -909,7 +916,7 @@
 	return 1;
     }
     /* delete to end of line */
-    forekill(findeol() - zlecs, 0);
+    forekill(findeol() - zlecs, CUT_RAW);
     return 0;
 }
 
@@ -925,13 +932,17 @@
 	spaceinline(1);
 	zleline[zlecs] = '#';
 	if(zlecs <= viinsbegin)
-	    viinsbegin++;
-	zlecs = oldcs + (zlecs <= oldcs);
+	    INCPOS(viinsbegin);
+	if (zlecs <= oldcs)
+	    INCPOS(oldcs);
+	zlecs = oldcs;
     } else {
 	foredel(1, 0);
 	if (zlecs < viinsbegin)
-	    viinsbegin--;
-	zlecs = oldcs - (zlecs < oldcs);
+	    DECPOS(viinsbegin);
+	if (zlecs < oldcs)
+	    DECPOS(oldcs);
+	zlecs = oldcs;
     }
     return 0;
 }


-- 
Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/



Messages sorted by: Reverse Date, Date, Thread, Author