vis

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

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

commit 81cbb5830920075b1a157a00d1aa9746d8f0f7da
parent 5e886e69673b913fd12cf7b82e0f1d27326247ac
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Fri, 28 Oct 2016 10:34:45 +0200

vis: tweak join behavior

We only remove leading but not trailing white space of the lines
to be joined. Not completely sure whether that is an improvement,
but it matches vim behavior.

Do not insert a space when joining empty lines.

Diffstat:
Mvis-operators.c | 24+++++++++---------------
1 file changed, 9 insertions(+), 15 deletions(-)

diff --git a/vis-operators.c b/vis-operators.c @@ -191,10 +191,6 @@ static size_t op_join(Vis *vis, Text *txt, OperatorContext *c) { size_t line_prev_prev = text_line_prev(txt, line_prev); if (line_prev_prev >= c->range.start) pos = line_prev; - } else { - size_t start = text_line_finish(txt, c->range.start); - if (start < c->range.start) - c->range.start = start; } size_t len = c->arg->s ? strlen(c->arg->s) : 0; @@ -202,18 +198,16 @@ static size_t op_join(Vis *vis, Text *txt, OperatorContext *c) { do { prev_pos = pos; size_t end = text_line_start(txt, pos); - size_t prev = text_line_prev(txt, end); - pos = text_line_finish(txt, prev); - if (pos != prev) - pos = text_char_next(txt, pos); - if (pos >= c->range.start && end > pos) { - text_delete(txt, pos, end - pos); - text_insert(txt, pos, c->arg->s, len); - if (!mark) - mark = text_mark_set(txt, pos); - } else { + pos = text_line_prev(txt, end); + if (pos < c->range.start || end <= pos) break; - } + text_delete(txt, pos, end - pos); + char prev, next; + if (text_byte_get(txt, pos-1, &prev) && !isspace((unsigned char)prev) && + text_byte_get(txt, pos, &next) && next != '\r' && next != '\n') + text_insert(txt, pos, c->arg->s, len); + if (!mark) + mark = text_mark_set(txt, pos); } while (pos != prev_pos); size_t newpos = text_mark_get(txt, mark);