vis

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

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

commit 26e47a4414ede37adc2cb4a122441e1527b2db4f
parent c8f82c7e0511c33d0a6abb3a7b2f4a64a446d4dd
Author: Evan Gates <evan.gates@gmail.com>
Date:   Fri, 25 Sep 2020 11:31:16 -0700

vis: refactor selections_match_next

A lot of code from selections_match_next was duplicated in
selections_match_next_literal.  Use the new text_object_find_next/prev
functions to combine the two match_next functions into one.

Diffstat:
Mmain.c | 43++++++++-----------------------------------
1 file changed, 8 insertions(+), 35 deletions(-)

diff --git a/main.c b/main.c @@ -1337,37 +1337,6 @@ static const Selection *selection_new_primary(View *view, Filerange *r) { return s; } -static const char *selections_match_next_literal(Vis *vis, const char *keys, const Arg *arg) { - Text *txt = vis_text(vis); - View *view = vis_view(vis); - Selection *s = view_selections_primary_get(view); - Filerange sel = view_selections_get(s); - size_t len = text_range_size(&sel); - if (!len) - return keys; - - char *buf = text_bytes_alloc0(txt, sel.start, len); - if (!buf) - return keys; - - size_t start = text_find_next(txt, sel.end, buf); - Filerange match = text_range_new(start, start+len); - if (start != sel.end && selection_new_primary(view, &match)) - goto out; - - sel = view_selections_get(view_selections(view)); - start = text_find_prev(txt, sel.start, buf); - if (start == sel.start) - goto out; - - match = text_range_new(start, start+len); - selection_new_primary(view, &match); - -out: - free(buf); - return keys; -} - static const char *selections_match_next(Vis *vis, const char *keys, const Arg *arg) { Text *txt = vis_text(vis); View *view = vis_view(vis); @@ -1383,19 +1352,23 @@ static const char *selections_match_next(Vis *vis, const char *keys, const Arg * match_word = text_range_equal(&sel, &word); } - if (!match_word) - return selections_match_next_literal(vis, keys, arg); + Filerange (*find_next)(Text *, size_t, const char *) = text_object_word_find_next; + Filerange (*find_prev)(Text *, size_t, const char *) = text_object_word_find_prev; + if (!match_word) { + find_next = text_object_find_next; + find_prev = text_object_find_prev; + } char *buf = text_bytes_alloc0(txt, sel.start, text_range_size(&sel)); if (!buf) return keys; - Filerange word = text_object_word_find_next(txt, sel.end, buf); + Filerange word = find_next(txt, sel.end, buf); if (text_range_valid(&word) && selection_new_primary(view, &word)) goto out; sel = view_selections_get(view_selections(view)); - word = text_object_word_find_prev(txt, sel.start, buf); + word = find_prev(txt, sel.start, buf); if (!text_range_valid(&word)) goto out; selection_new_primary(view, &word);