aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--config.def.h2
-rw-r--r--editor.h1
-rw-r--r--vis.c32
4 files changed, 37 insertions, 0 deletions
diff --git a/README.md b/README.md
index d5c6e93..77f739e 100644
--- a/README.md
+++ b/README.md
@@ -352,6 +352,8 @@ and their current support in vis.
t{char} (till before next occurrence of char to the right)
F{char} (to next occurrence of char to the left)
T{char} (till before next occurrence of char to the left)
+ ; (repeat last to/till movement)
+ , (repeat last to/till movement but in opposite direction)
/{text} (to next match of text in forward direction)
?{text} (to next match of text in backward direction)
diff --git a/config.def.h b/config.def.h
index e91eddd..bb7d86e 100644
--- a/config.def.h
+++ b/config.def.h
@@ -142,6 +142,8 @@ static KeyBinding vis_movements[] = {
{ { NONE('F') }, movement_key, { .i = MOVE_LEFT_TO } },
{ { NONE('t') }, movement_key, { .i = MOVE_RIGHT_TILL } },
{ { NONE('T') }, movement_key, { .i = MOVE_LEFT_TILL } },
+ { { NONE(';') }, totill_repeat, { NULL } },
+ { { NONE(',') }, totill_reverse,{ NULL } },
{ { NONE('/') }, prompt_search,{ .s = "/" } },
{ { NONE('?') }, prompt_search,{ .s = "?" } },
{ /* empty last element, array terminator */ },
diff --git a/editor.h b/editor.h
index 2466f1f..a3077c5 100644
--- a/editor.h
+++ b/editor.h
@@ -230,6 +230,7 @@ struct Editor {
char prompt_type; /* command ':' or search '/','?' prompt */
Regex *search_pattern; /* last used search pattern */
char search_char[8]; /* last used character to search for via 'f', 'F', 't', 'T' */
+ int last_totill; /* last to/till movement used for ';' and ',' */
int tabwidth; /* how many spaces should be used to display a tab */
bool expandtab; /* whether typed tabs should be converted to spaces */
bool autoindent; /* whether indentation should be copied from previous line on newline */
diff --git a/vis.c b/vis.c
index 1510fce..50e2196 100644
--- a/vis.c
+++ b/vis.c
@@ -303,6 +303,10 @@ static void join(const Arg *arg);
static void cmd(const Arg *arg);
/* perform last action i.e. action_prev again */
static void repeat(const Arg *arg);
+/* repeat last to/till movement */
+static void totill_repeat(const Arg *arg);
+/* repeat last to/till movement but in opposite direction */
+static void totill_reverse(const Arg *arg);
/* replace character at cursor with one read form keyboard */
static void replace(const Arg *arg);
/* adjust action.count by arg->i */
@@ -774,6 +778,33 @@ static void repeat(const Arg *arg) {
action_do(&vis->action);
}
+static void totill_repeat(const Arg *arg) {
+ if (!vis->last_totill)
+ return;
+ movement(&(const Arg){ .i = vis->last_totill });
+}
+
+static void totill_reverse(const Arg *arg) {
+ int type = vis->last_totill;
+ switch (type) {
+ case MOVE_RIGHT_TO:
+ type = MOVE_LEFT_TO;
+ break;
+ case MOVE_LEFT_TO:
+ type = MOVE_RIGHT_TO;
+ break;
+ case MOVE_RIGHT_TILL:
+ type = MOVE_LEFT_TILL;
+ break;
+ case MOVE_LEFT_TILL:
+ type = MOVE_RIGHT_TILL;
+ break;
+ default:
+ return;
+ }
+ movement(&(const Arg){ .i = type });
+}
+
static void replace(const Arg *arg) {
Key k = getkey();
if (!k.str[0])
@@ -843,6 +874,7 @@ static void movement_key(const Arg *arg) {
return;
}
strncpy(vis->search_char, k.str, sizeof(vis->search_char));
+ vis->last_totill = arg->i;
vis->action.movement = &moves[arg->i];
action_do(&vis->action);
}