vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit d9cd78ebbc5cd96247f85377c444e10886a756c5 parent b1d3c0631b8bbbc5e942d9721d951fc512534152 Author: Marc André Tanner <mat@brain-dump.org> Date: Tue, 13 Jun 2017 14:20:30 +0200 view: introduce view_selections_normalize Dispose all invalid and merge all overlapping selections. Diffstat:
| M | view.c | | | 22 | ++++++++++++++++++++++ |
| M | view.h | | | 2 | ++ |
2 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/view.c b/view.c @@ -1250,6 +1250,28 @@ bool view_selections_restore(Selection *s) { return true; } +void view_selections_normalize(View *view) { + Selection *prev = NULL; + Filerange range_prev = text_range_empty(); + for (Selection *s = view->selections, *next; s; s = next) { + next = s->next; + Filerange range = view_selections_get(s); + if (!text_range_valid(&range)) { + view_selections_dispose(s); + } else if (prev && text_range_overlap(&range_prev, &range)) { + range_prev = text_range_union(&range_prev, &range); + view_selections_dispose(s); + } else { + if (prev) + view_selections_set(prev, &range_prev); + range_prev = range; + prev = s; + } + } + if (prev) + view_selections_set(prev, &range_prev); +} + Text *view_text(View *view) { return view->text; } diff --git a/view.h b/view.h @@ -137,6 +137,8 @@ bool view_selections_dispose_force(Selection*); Selection *view_selection_disposed(View*); /** Dispose all but the primary selection. */ void view_selections_dispose_all(View*); +/** Dispose all invalid and merge all overlapping selections. */ +void view_selections_normalize(View*); /** * @} * @defgroup view_navigate