vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit 8299bb8f6e5bc69ccbd30f4da0e63c615f2f295a parent e6c860d0af6fe0750d83ab40e227242d21ff5511 Author: Marc André Tanner <mat@brain-dump.org> Date: Tue, 28 Jul 2015 17:00:20 +0200 text-object: introduce utility function text_range_is_linewise Diffstat:
| M | text-objects.c | | | 6 | ++++++ |
| M | text-objects.h | | | 2 | ++ |
| M | vis.c | | | 2 | +- |
3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/text-objects.c b/text-objects.c @@ -304,3 +304,9 @@ Filerange text_range_linewise(Text *txt, Filerange *rin) { rout.end = text_line_next(txt, rin->end); return rout; } + +bool text_range_is_linewise(Text *txt, Filerange *r) { + return text_range_valid(r) && + r->start == text_line_begin(txt, r->start) && + r->end == text_line_begin(txt, r->end); +} diff --git a/text-objects.h b/text-objects.h @@ -37,5 +37,7 @@ Filerange text_object_backtick(Text*, size_t pos); /* extend a range to cover whole lines */ Filerange text_range_linewise(Text*, Filerange*); +/* test whether a given range covers whole lines */ +bool text_range_is_linewise(Text*, Filerange*); #endif diff --git a/vis.c b/vis.c @@ -601,7 +601,7 @@ static size_t op_join(OperatorContext *c) { Text *txt = vis->win->file->text; size_t pos = text_line_begin(txt, c->range.end), prev_pos; /* if selection is linewise, skip last line break */ - if (c->range.start == text_line_begin(txt, c->range.start) && pos == c->range.end) { + if (text_range_is_linewise(txt, &c->range)) { size_t line_prev = text_line_prev(txt, pos); size_t line_prev_prev = text_line_prev(txt, line_prev); if (line_prev_prev >= c->range.start)