diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-01-19 13:17:45 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-01-19 13:17:45 +0100 |
| commit | 48ce013f1df470b340908f02d4ea87c812f902f7 (patch) | |
| tree | 95d08a5fd41712cbf29da9c4195eafed51d1b7bb | |
| parent | 845dc34aa45a95a9157e487ca9f4ebe389dd6303 (diff) | |
| download | vis-48ce013f1df470b340908f02d4ea87c812f902f7.tar.gz vis-48ce013f1df470b340908f02d4ea87c812f902f7.tar.xz | |
vis: improve cursor placement after shift operators
| -rw-r--r-- | vis-operators.c | 13 |
1 files 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; |
