vis

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

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

commit 1e8912f6b5f2cbad7eb6f17df12bd5302ab5f207
parent 1232c497dcbfed2120f440ecf01b3b9782a8ddf5
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Wed, 28 Feb 2018 19:45:26 +0100

vis: improve handling of linewise ranges in change operator

Diffstat:
Mtext-objects.c | 2+-
Mvis-operators.c | 8++++++--
2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/text-objects.c b/text-objects.c @@ -375,7 +375,7 @@ Filerange text_range_linewise(Text *txt, Filerange *rin) { } bool text_range_is_linewise(Text *txt, Filerange *r) { - return text_range_valid(r) && + return text_range_size(r) > 0 && r->start == text_line_begin(txt, r->start) && r->end == text_line_begin(txt, r->end); } diff --git a/vis-operators.c b/vis-operators.c @@ -17,10 +17,14 @@ static size_t op_delete(Vis *vis, Text *txt, OperatorContext *c) { } static size_t op_change(Vis *vis, Text *txt, OperatorContext *c) { + bool linewise = c->linewise || text_range_is_linewise(txt, &c->range); op_delete(vis, txt, c); size_t pos = c->range.start; - if (c->linewise) - pos = vis_text_insert_nl(vis, txt, pos > 0 ? pos-1 : pos); + if (linewise) { + size_t newpos = vis_text_insert_nl(vis, txt, pos > 0 ? pos-1 : pos); + if (pos > 0) + pos = newpos; + } return pos; }