vis

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

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

commit a529ce240bbf114ec80525e8746059128e88e90e
parent 39ee47be9334ae56ffcd167465e58f3b9c3bad63
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Tue, 19 Jan 2016 13:17:45 +0100

vis: improve cursor placement after shift operators

Diffstat:
Mvis-operators.c | 13++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/vis-operators.c b/vis-operators.c @@ -87,6 +87,7 @@ static size_t op_shift_right(Vis *vis, Text *txt, OperatorContext *c) { const char *tab = vis->expandtab ? spaces : "\t"; size_t tablen = strlen(tab); size_t pos = text_line_begin(txt, c->range.end), prev_pos; + size_t inserted = 0; /* if range ends at the begin of a line, skip line break */ if (pos == c->range.end) @@ -96,14 +97,16 @@ static size_t op_shift_right(Vis *vis, Text *txt, OperatorContext *c) { prev_pos = pos = text_line_begin(txt, pos); text_insert(txt, pos, tab, tablen); pos = text_line_prev(txt, pos); + inserted += tablen; } while (pos >= c->range.start && pos != prev_pos); - return c->pos + tablen; + return c->pos + inserted; } static size_t op_shift_left(Vis *vis, Text *txt, OperatorContext *c) { size_t pos = text_line_begin(txt, c->range.end), prev_pos; size_t tabwidth = vis->tabwidth, tablen; + size_t deleted = 0; /* if range ends at the begin of a line, skip line break */ if (pos == c->range.end) @@ -123,9 +126,10 @@ static size_t op_shift_left(Vis *vis, Text *txt, OperatorContext *c) { tablen = MIN(len, tabwidth); text_delete(txt, pos, tablen); pos = text_line_prev(txt, pos); + deleted += tablen; } while (pos >= c->range.start && pos != prev_pos); - return c->pos - tablen; + return c->pos - deleted; } static size_t op_case_change(Vis *vis, Text *txt, OperatorContext *c) { @@ -236,8 +240,11 @@ bool vis_operator(Vis *vis, enum VisOperator id, ...) { id = VIS_OP_PUT_AFTER; break; case VIS_OP_FILTER: - vis->action.type = LINEWISE; vis->action.arg.s = va_arg(ap, char*); + /* fall through */ + case VIS_OP_SHIFT_LEFT: + case VIS_OP_SHIFT_RIGHT: + vis_motion_type(vis, VIS_MOTIONTYPE_LINEWISE); break; default: break;