diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-10-28 10:34:45 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-10-28 10:34:45 +0200 |
| commit | 145ed8407fdec46a514e366bb531ecf4c916b3ee (patch) | |
| tree | a428d7f3837d0e8f3231406726038aec1fe9350d /vis-operators.c | |
| parent | 0a724e48a7b7a4e0ece4d2ae4c95a78ac83ed4fe (diff) | |
| download | vis-145ed8407fdec46a514e366bb531ecf4c916b3ee.tar.gz vis-145ed8407fdec46a514e366bb531ecf4c916b3ee.tar.xz | |
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 (limited to 'vis-operators.c')
| -rw-r--r-- | vis-operators.c | 24 |
1 files changed, 9 insertions, 15 deletions
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); |
