aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--text-objects.c6
-rw-r--r--text-objects.h2
-rw-r--r--vis.c2
3 files changed, 9 insertions, 1 deletions
diff --git a/text-objects.c b/text-objects.c
index d33132c..0d22ca4 100644
--- 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
index aec84b8..068bafa 100644
--- 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
index b385135..29dec97 100644
--- 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)