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

PATCH: partial word completion



This could fail terribly with a common suffix and with empty parts.

Bye
 Sven

Index: Src/Zle/compmatch.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/compmatch.c,v
retrieving revision 1.4
diff -u -r1.4 compmatch.c
--- Src/Zle/compmatch.c	2000/04/07 09:16:37	1.4
+++ Src/Zle/compmatch.c	2000/04/17 07:44:01
@@ -1767,7 +1767,7 @@
 		    free_cline(o);
 		    x = o;
 		    o = tn;
-		    if (po && cmp_anchors(x, po, 0)) {
+		    if (po && po->prefix && cmp_anchors(x, po, 0)) {
 			po->flags |= CLF_MISS;
 			po->max += diff;
 		    } else {
@@ -1784,7 +1784,7 @@
 		if (tn && cmp_anchors(o, tn, 0)) {
 		    diff = sub_join(o, n, tn, 0);
 
-		    if (po && cmp_anchors(n, pn, 0)) {
+		    if (po && po->prefix && cmp_anchors(n, pn, 0)) {
 			po->flags |= CLF_MISS;
 			po->max += diff;
 		    } else {
@@ -1850,7 +1850,7 @@
 		if (tn) {
 		    diff = sub_join(o, n, tn, 0);
 
-		    if (po && cmp_anchors(n, pn, 0)) {
+		    if (po && po->prefix && cmp_anchors(n, pn, 0)) {
 			po->flags |= CLF_MISS;
 			po->max += diff;
 		    } else {
@@ -1864,19 +1864,21 @@
 		    n = n->next;
 		    continue;
 		} else {
-		    for (t = o; (tn = t->next) && !cmp_anchors(n, tn, 1);
-			 t = tn);
+		    Cline to;
 
-		    if (tn) {
-			diff = sub_join(n, o, tn, 1);
+		    for (t = o; (to = t->next) && !cmp_anchors(n, to, 1);
+			 t = to);
 
+		    if (to) {
+			diff = sub_join(n, o, to, 1);
+
 			if (po)
-			    po->next = tn;
+			    po->next = to;
 			else
-			    oo = tn;
+			    oo = to;
 			x = o;
-			o = tn;
-			if (po && cmp_anchors(x, po, 0)) {
+			o = to;
+			if (po && po->prefix && cmp_anchors(x, po, 0)) {
 			    po->flags |= CLF_MISS;
 			    po->max += diff;
 			} else {
@@ -1885,14 +1887,42 @@
 			}
 			continue;
 		    } else {
-			if (o->flags & CLF_SUF)
-			    break;
+			Cline tt = NULL;
 
-			o->word = o->line = o->orig = NULL;
-			o->wlen = 0;
-			free_cline(o->next);
-			o->next = NULL;
-			o->flags |= CLF_MISS;
+			for (t = n; (tn = t->next); t = tn) {
+			    for (tt = o;
+				 (to = tt->next) &&
+				     !cmp_anchors(tn, to, 1); tt = to);
+			    if (tt)
+				break;
+			}
+			if (tt) {
+			    diff = sub_join(n, o, to, 1);
+
+			    if (po)
+				po->next = to;
+			    else
+				oo = to;
+			    x = o;
+			    o = to;
+			    if (po && po->prefix && cmp_anchors(x, po, 0)) {
+				po->flags |= CLF_MISS;
+				po->max += diff;
+			    } else {
+				o->flags |= CLF_MISS;
+				o->max += diff;
+			    }
+			    continue;
+			} else {
+			    if (o->flags & CLF_SUF)
+				break;
+
+			    o->word = o->line = o->orig = NULL;
+			    o->wlen = 0;
+			    free_cline(o->next);
+			    o->next = NULL;
+			    o->flags |= CLF_MISS;
+			}
 		    }
 		}
 	    }

--
Sven Wischnowsky                         wischnow@xxxxxxxxxxxxxxxxxxxxxxx



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