From bf60ce7d75949a8d6d53473d3b2430c162f5f897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Thu, 4 Sep 2014 22:44:53 +0200 Subject: Skip modes with common prefix if it does not match --- config.def.h | 4 ++++ main.c | 2 ++ vis.h | 1 + 3 files changed, 7 insertions(+) diff --git a/config.def.h b/config.def.h index 1a5c3e3..b9547a1 100644 --- 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 index d1c0b07..5e7240e 100644 --- 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 index c3f81c3..6d6972c 100644 --- 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 */ -- cgit v1.2.3