aboutsummaryrefslogtreecommitdiff
path: root/vis-operators.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-01-19 13:17:45 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-01-19 13:17:45 +0100
commit48ce013f1df470b340908f02d4ea87c812f902f7 (patch)
tree95d08a5fd41712cbf29da9c4195eafed51d1b7bb /vis-operators.c
parent845dc34aa45a95a9157e487ca9f4ebe389dd6303 (diff)
downloadvis-48ce013f1df470b340908f02d4ea87c812f902f7.tar.gz
vis-48ce013f1df470b340908f02d4ea87c812f902f7.tar.xz
vis: improve cursor placement after shift operators
Diffstat (limited to 'vis-operators.c')
-rw-r--r--vis-operators.c13
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;