vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit 121945bb6097c2363d6ab54cb4d38b064ef34acf
parent 3181ac4bdf46d25421de3c6fa6d8c8f443b440eb
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Sat,  4 Feb 2017 18:25:45 +0100

view: do not let new cursors automatically become primary

We currently have the invariant that the primary cursor is always
placed within the visisble viewport.

Previously view_cursors_new would automatically make the new cursor
primary. This in turn causes the viewport to be adjusted triggering
lots of unnecessary redraws. As a result commands creating many new
selections might become unbearably slow.

Instead the caller has to explicitly make the new cursor primary.

Diffstat:
Mmain.c | 20++++++++++++--------
Mview.c | 1-
2 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/main.c b/main.c @@ -1321,14 +1321,15 @@ static const char *cursors_new(Vis *vis, const char *keys, const Arg *arg) { view_line_up(cursor); size_t newpos = view_cursors_pos(cursor); view_cursors_to(cursor, oldpos); - if (!view_cursors_new(view, newpos)) { - if (arg->i == -1) { - cursor = view_cursors_prev(cursor); - } else if (arg->i == +1) { - cursor = view_cursors_next(cursor); - } - view_cursors_primary_set(cursor); + Cursor *cursor_new = view_cursors_new(view, newpos); + if (!cursor_new) { + if (arg->i == -1) + cursor_new = view_cursors_prev(cursor); + else if (arg->i == +1) + cursor_new = view_cursors_next(cursor); } + if (cursor_new) + view_cursors_primary_set(cursor_new); } vis_count_set(vis, VIS_COUNT_UNKNOWN); return keys; @@ -1446,6 +1447,7 @@ static const char *cursors_select_next(Vis *vis, const char *keys, const Arg *ar size_t pos = text_char_prev(txt, word.end); if ((cursor = view_cursors_new(view, pos))) { view_cursors_selection_set(cursor, &word); + view_cursors_primary_set(cursor); goto out; } } @@ -1453,8 +1455,10 @@ static const char *cursors_select_next(Vis *vis, const char *keys, const Arg *ar sel = view_cursors_selection_get(view_cursors(view)); word = text_object_word_find_prev(txt, sel.start, buf); size_t pos = text_char_prev(txt, word.end); - if ((cursor = view_cursors_new(view, pos))) + if ((cursor = view_cursors_new(view, pos))) { view_cursors_selection_set(cursor, &word); + view_cursors_primary_set(cursor); + } out: free(buf); diff --git a/view.c b/view.c @@ -981,7 +981,6 @@ static Cursor *cursors_new(View *view, size_t pos, bool force) { } else { view->cursors = c; } - view->cursor = c; view->cursor_count++; view_cursors_dispose(view->cursor_dead); view_cursors_to(c, pos);