vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit 0fb48d9172246f596fd1982b44a3ea9b37643e94
parent 9119f833f4d12bd716b258f1003167751f527599
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Thu,  4 Sep 2014 22:44:53 +0200

Skip modes with common prefix if it does not match

Diffstat:
Mconfig.def.h | 4++++
Mmain.c | 2++
Mvis.h | 1+
3 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -629,11 +629,13 @@ static Mode vis_modes[] = { }, [VIS_MODE_MARK] = { .name = "MARK", + .common_prefix = true, .parent = &vis_modes[VIS_MODE_BASIC], .bindings = vis_marks, }, [VIS_MODE_MARK_LINE] = { .name = "MARK-LINE", + .common_prefix = true, .parent = &vis_modes[VIS_MODE_MARK], .bindings = vis_marks_line, }, @@ -662,11 +664,13 @@ static Mode vis_modes[] = { }, [VIS_MODE_REGISTER] = { .name = "REGISTER", + .common_prefix = true, .parent = &vis_modes[VIS_MODE_OPERATOR], .bindings = vis_registers, }, [VIS_MODE_MARK_SET] = { .name = "MARK-SET", + .common_prefix = true, .parent = &vis_modes[VIS_MODE_REGISTER], .bindings = vis_marks_set, }, diff --git a/main.c b/main.c @@ -103,6 +103,8 @@ static bool keymatch(Key *key0, Key *key1) { static KeyBinding *keybinding(Mode *mode, Key *key0, Key *key1) { for (; mode; mode = mode->parent) { + if (mode->common_prefix && !keymatch(key0, &mode->bindings->key[0])) + continue; for (KeyBinding *kb = mode->bindings; kb && (kb->key[0].code || kb->key[0].str[0]); kb++) { if (keymatch(key0, &kb->key[0]) && (!key1 || keymatch(key1, &kb->key[1]))) return kb; diff --git a/vis.h b/vis.h @@ -75,6 +75,7 @@ struct Mode { Mode *parent; KeyBinding *bindings; const char *name; + bool common_prefix; void (*enter)(void); void (*leave)(void); bool (*unknown)(Key *key0, Key *key1); /* unknown key for this mode, return value determines whether parent modes will be checked */