diff options
| -rw-r--r-- | config.def.h | 4 | ||||
| -rw-r--r-- | main.c | 2 | ||||
| -rw-r--r-- | vis.h | 1 |
3 files changed, 7 insertions, 0 deletions
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, }, @@ -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; @@ -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 */ |
