From 145ed8407fdec46a514e366bb531ecf4c916b3ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Fri, 28 Oct 2016 10:34:45 +0200 Subject: 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. --- vis-operators.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) (limited to 'vis-operators.c') diff --git a/vis-operators.c b/vis-operators.c index c96ebbb..3ce7689 100644 --- 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); -- cgit v1.2.3