vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit 892d60f18862a09c13a7395404c4c04958b660e3 parent 9a9c2b4b6f9fe61ecdbd740670135d76e1c2f341 Author: Marc André Tanner <mat@brain-dump.org> Date: Sun, 25 Sep 2016 11:38:00 +0200 vis: disable language map for replacement character of `r` command The character following the `r` command in normal mode should be treated as regular input given in insert/replace mode, that is no tranformation should be applied. Temporarily disable the language map for this reason. Close #382 Diffstat:
| M | main.c | | | 4 | +++- |
| M | vis-core.h | | | 1 | + |
| M | vis.c | | | 8 | +++++++- |
| M | vis.h | | | 2 | ++ |
4 files changed, 13 insertions(+), 2 deletions(-)
diff --git 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 @@ -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 @@ -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 @@ -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,