aboutsummaryrefslogtreecommitdiff
path: root/vis-operators.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-10-28 10:34:45 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-10-28 10:34:45 +0200
commit145ed8407fdec46a514e366bb531ecf4c916b3ee (patch)
treea428d7f3837d0e8f3231406726038aec1fe9350d /vis-operators.c
parent0a724e48a7b7a4e0ece4d2ae4c95a78ac83ed4fe (diff)
downloadvis-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.c24
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);