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:
| M | main.c | | | 20 | ++++++++++++-------- |
| M | view.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);