aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.c4
-rw-r--r--vis-core.h1
-rw-r--r--vis.c8
-rw-r--r--vis.h2
4 files changed, 13 insertions, 2 deletions
diff --git a/main.c b/main.c
index b0b932d..963b256 100644
--- a/main.c
+++ b/main.c
@@ -1630,8 +1630,10 @@ static const char *selections_trim(Vis *vis, const char *keys, const Arg *arg) {
}
static const char *replace(Vis *vis, const char *keys, const Arg *arg) {
- if (!keys[0])
+ if (!keys[0]) {
+ vis_keymap_disable(vis);
return NULL;
+ }
const char *next = vis_keys_next(vis, keys);
if (!next)
return NULL;
diff --git a/vis-core.h b/vis-core.h
index 16fea28..a998586 100644
--- a/vis-core.h
+++ b/vis-core.h
@@ -161,6 +161,7 @@ struct Vis {
Map *usercmds; /* user registered ":"-commands */
Map *options; /* ":set"-options */
Map *keymap; /* key translation before any bindings are matched */
+ bool keymap_disabled; /* ignore key map for next key press, gets automatically re-enabled */
Buffer input_queue; /* holds pending input keys */
Buffer *keys; /* currently active keys buffer (either the input_queue or a macro) */
bool errorhandler; /* whether we are currently in an error handler, used to avoid recursion */
diff --git a/vis.c b/vis.c
index 289b7b9..41d2037 100644
--- a/vis.c
+++ b/vis.c
@@ -532,6 +532,10 @@ bool vis_keymap_add(Vis *vis, const char *key, const char *mapping) {
return map_put(vis->keymap, key, mapping);
}
+void vis_keymap_disable(Vis *vis) {
+ vis->keymap_disabled = true;
+}
+
static void window_jumplist_add(Win *win, size_t pos) {
Mark mark = text_mark_set(win->file->text, pos);
if (mark && win->jumplist)
@@ -864,7 +868,9 @@ static const char *getkey(Vis *vis) {
if (!key)
return NULL;
vis_info_hide(vis);
- if (!vis->mode->input) {
+ bool use_keymap = !vis->mode->input && !vis->keymap_disabled;
+ vis->keymap_disabled = false;
+ if (use_keymap) {
const char *mapped = map_get(vis->keymap, key);
if (mapped)
return mapped;
diff --git a/vis.h b/vis.h
index a9ffb90..142123a 100644
--- a/vis.h
+++ b/vis.h
@@ -171,6 +171,8 @@ bool vis_action_register(Vis*, const KeyAction*);
/* add a key mapping which is applied for all modes except insert/replace
* before any key bindings are evaluated */
bool vis_keymap_add(Vis*, const char *key, const char *mapping);
+/* disable the keymap for the next key press */
+void vis_keymap_disable(Vis*);
enum VisOperator {
VIS_OP_DELETE,