aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2014-09-04 22:44:53 +0200
committerMarc André Tanner <mat@brain-dump.org>2014-09-04 22:44:53 +0200
commitbf60ce7d75949a8d6d53473d3b2430c162f5f897 (patch)
tree0ade285ba44ee4b0a705898619a5658102a967dd
parent33812921a2294637e4635d5b8426fc47f69a05a5 (diff)
downloadvis-bf60ce7d75949a8d6d53473d3b2430c162f5f897.tar.gz
vis-bf60ce7d75949a8d6d53473d3b2430c162f5f897.tar.xz
Skip modes with common prefix if it does not match
-rw-r--r--config.def.h4
-rw-r--r--main.c2
-rw-r--r--vis.h1
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,
},
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 */