about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/Zle/compmatch.c66
1 files changed, 48 insertions, 18 deletions
diff --git a/Src/Zle/compmatch.c b/Src/Zle/compmatch.c
index 00072b0ee..f0e5a7c47 100644
--- a/Src/Zle/compmatch.c
+++ b/Src/Zle/compmatch.c
@@ -1767,7 +1767,7 @@ join_clines(Cline o, Cline n)
 		    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 @@ join_clines(Cline o, Cline n)
 		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 @@ join_clines(Cline o, Cline n)
 		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 @@ join_clines(Cline o, Cline n)
 		    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 @@ join_clines(Cline o, Cline n)
 			}
 			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;
+			}
 		    }
 		}
 	    }