]> git.neil.brown.name Git - edlib.git/commitdiff
Improve default move-file
authorNeilBrown <neil@brown.name>
Thu, 26 Nov 2015 03:50:46 +0000 (14:50 +1100)
committerNeilBrown <neil@brown.name>
Thu, 26 Nov 2015 03:50:46 +0000 (14:50 +1100)
Instead of moving one char at a time, just jump to the right end.

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

index d358c3b9b51256430e11656a988afd8df71b634e..2aa318ede16738843a19669f9e9ee6ac536a270b 100644 (file)
@@ -265,11 +265,11 @@ DEF_CMD(doc_file)
                        ;
                rpt = 0;
        }
-       while (rpt < 0 && ch != WEOF) {
-               while ((ch = mark_prev(d, ci->mark)) != WEOF)
-                       ;
-               rpt = 0;
-       }
+       if (rpt > 0)
+               __mark_reset(d, ci->mark, 0, 1);
+       if (rpt < 0)
+               mark_reset(d, ci->mark);
+
        return 1;
 }
 
index 55b357765f678d1d3afab14a7901e6af39fca688..82298ac42165cede0124fac8e91014f1c18283c1 100644 (file)
@@ -243,21 +243,34 @@ struct mark *mark_dup(struct mark *m, int notype)
        return ret;
 }
 
-void __mark_reset(struct doc *d, struct mark *m, int new)
+void __mark_reset(struct doc *d, struct mark *m, int new, int end)
 {
        struct point *p;
        int i;
        struct cmd_info ci = {0};
+       int seq = 0;
 
        m->rpos = 0;
        if (!new)
                hlist_del(&m->all);
-       hlist_add_head(&m->all, &d->marks);
-       assign_seq(m, 0);
+       if (end) {
+               if (hlist_empty(&d->marks))
+                       hlist_add_head(&m->all, &d->marks);
+               else {
+                       struct mark *last = hlist_first_entry(&d->marks,
+                                                             struct mark, all);
+                       while (last->all.next)
+                               last = hlist_next_entry(last, all);
+                       seq = last->seq;
+                       hlist_add_after(&last->all, &m->all);
+               }
+       } else
+               hlist_add_head(&m->all, &d->marks);
+       assign_seq(m, seq);
 
        ci.key = "doc:set-ref";
        ci.mark = m;
-       ci.numeric = 1; /* start */
+       ci.numeric = !end; /* start */
        ci.focus = d->home;
        key_handle_focus(&ci);
 
@@ -266,19 +279,28 @@ void __mark_reset(struct doc *d, struct mark *m, int new)
        if (m->viewnum != MARK_POINT) {
                if (!new)
                        tlist_del(&m->view);
-               tlist_add(&m->view, GRP_MARK, &d->views[m->viewnum].head);
+               if (end)
+                       tlist_add_tail(&m->view, GRP_MARK, &d->views[m->viewnum].head);
+               else
+                       tlist_add(&m->view, GRP_MARK, &d->views[m->viewnum].head);
                return;
        }
        /* MARK_POINT */
        if (!new)
                tlist_del(&m->view);
-       tlist_add(&m->view, GRP_MARK, &d->points);
+       if (end)
+               tlist_add_tail(&m->view, GRP_MARK, &d->points);
+       else
+               tlist_add(&m->view, GRP_MARK, &d->points);
        p = container_of(m, struct point, m);
        for (i = 0; i < p->size; i++)
                if (d->views[i].notify) {
                        if (!new)
                                tlist_del(&p->lists[i]);
-                       tlist_add(&p->lists[i], GRP_LIST, &d->views[i].head);
+                       if (end)
+                               tlist_add_tail(&p->lists[i], GRP_LIST, &d->views[i].head);
+                       else
+                               tlist_add(&p->lists[i], GRP_LIST, &d->views[i].head);
                } else if (new)
                        INIT_TLIST_HEAD(&p->lists[i], GRP_LIST);
 }
@@ -293,7 +315,7 @@ struct point *point_new(struct doc *d, struct point **owner)
        ret->size = d->nviews;
        ret->owner = owner;
        ret->doc = d;
-       __mark_reset(d, &ret->m, 1);
+       __mark_reset(d, &ret->m, 1, 0);
        if (owner)
                *owner = ret;
        return ret;
@@ -301,13 +323,13 @@ struct point *point_new(struct doc *d, struct point **owner)
 
 void mark_reset(struct doc *d, struct mark *m)
 {
-       __mark_reset(d, m, 0);
+       __mark_reset(d, m, 0, 0);
 }
 
 void point_reset(struct point *p)
 {
        struct doc *d = p->doc;
-       __mark_reset(d, &p->m, 0);
+       __mark_reset(d, &p->m, 0, 0);
 }
 
 struct mark *doc_first_mark(struct doc *d, int view)
@@ -367,7 +389,7 @@ struct mark *doc_new_mark(struct doc *d, int view)
        ret->rpos = 0;
        ret->attrs = NULL;
        ret->viewnum = view;
-       __mark_reset(d, ret, 1);
+       __mark_reset(d, ret, 1, 0);
        return ret;
 }
 
diff --git a/core.h b/core.h
index 1534e095d3e0e35afd78f1711e9257b4225d3bf6..fc4cd8aec85f89dcb5ae32ed359785f903611431 100644 (file)
--- a/core.h
+++ b/core.h
@@ -153,6 +153,7 @@ struct mark *doc_next_mark(struct doc *d, struct mark *m);
 struct mark *doc_prev_mark(struct doc *d, struct mark *m);
 void point_reset(struct point *p);
 void mark_reset(struct doc *d, struct mark *m);
+void __mark_reset(struct doc *d, struct mark *m, int new, int end);
 void mark_forward_over(struct mark *m, struct mark *m2);
 void mark_backward_over(struct mark *m, struct mark *mp);
 void point_notify_change(struct point *p, struct mark *m);