From 48ce013f1df470b340908f02d4ea87c812f902f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Tue, 19 Jan 2016 13:17:45 +0100 Subject: vis: improve cursor placement after shift operators --- vis-operators.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/vis-operators.c b/vis-operators.c index 11fec1c..c4165d9 100644 --- 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; -- cgit v1.2.3