]> git.neil.brown.name Git - edlib.git/commitdiff
Introduce PointDup command
authorNeilBrown <neil@brown.name>
Wed, 25 Nov 2015 07:58:05 +0000 (18:58 +1100)
committerNeilBrown <neil@brown.name>
Wed, 25 Nov 2015 07:58:05 +0000 (18:58 +1100)
This make it possible to get a dup of point without
explicitly finding the point. Makes it more indirect.

You this in 'search' to avoid hunting up the tree.

Signed-off-by: NeilBrown <neil@brown.name>
core-doc.c
emacs-search.c

index c5a9a3261f5a99d105b7e469e0e45bd3185720d8..2e5869f74b270ac31eb6af1ec3fe868aec66c014 100644 (file)
@@ -166,6 +166,15 @@ DEF_CMD(doc_handle)
                        point_free(ci->home->point);
                return 1;
        }
+
+       if (strcmp(ci->key, "PointDup") == 0) {
+               struct point *pt = NULL;
+               if (ci->home->point)
+                       point_dup(ci->home->point, &pt);
+               ci->mark = &pt->m;
+               return 1;
+       }
+
        return key_lookup(d->map, ci);
 }
 
index 505e03f0b7d22a035e009d5ff322c79f7fde92ad..4079819f3489a9f188a63f14a0a15c7116325b73 100644 (file)
@@ -233,15 +233,19 @@ DEF_CMD(emacs_search)
        if (key_handle_focus(&ci2) == 0)
                return 0;
        esi = malloc(sizeof(*esi));
-       while (ci2.focus && ! ci2.focus->point)
-               ci2.focus = ci2.focus->parent;
-       if (!ci2.focus) {
+       esi->target = ci2.focus;
+       memset(&ci2, 0, sizeof(ci2));
+       ci2.key = "PointDup";
+       ci2.focus = esi->target;
+       key_handle_focus(&ci2);
+       if (!ci2.mark) {
                free(esi);
-               return 0;
+               return -1;
        }
-       esi->target = ci2.focus;
-       point_dup(esi->target->point, &esi->end);
-       esi->start = mark_dup(&esi->end->m, 1);
+       esi->end = container_of(ci2.mark, struct point, m);
+       esi->end->owner = &esi->end;
+
+       esi->start = mark_dup(ci2.mark, 1);
        esi->s = NULL;
        esi->matched = 0;
        esi->search = ci->focus;