From: NeilBrown Date: Thu, 26 Nov 2015 03:50:46 +0000 (+1100) Subject: Improve default move-file X-Git-Tag: lca2016~202 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=1e374ee945ddf7d26ae490a696ad4af3e2efed77;p=edlib.git Improve default move-file Instead of moving one char at a time, just jump to the right end. Signed-off-by: NeilBrown --- diff --git a/core-doc.c b/core-doc.c index d358c3b9..2aa318ed 100644 --- a/core-doc.c +++ b/core-doc.c @@ -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; } diff --git a/core-mark.c b/core-mark.c index 55b35776..82298ac4 100644 --- a/core-mark.c +++ b/core-mark.c @@ -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 1534e095..fc4cd8ae 100644 --- 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);