Skip to content

Commit

Permalink
vis: respect window local mappings for child modes
Browse files Browse the repository at this point in the history
Since commit 197ab82 visual line
and replace modes are child modes, hence we also have to consider
the window local key bindings of their respective parent modes.

For example in replace mode the key lookup chain is now as follows:

 window local replace mode -> global replace mode ->
 window local insert mode -> global insert mode

This fixes <Enter> behaviour in prompt for replace and visual line
modes.
  • Loading branch information
martanne committed Feb 12, 2016
1 parent 49fffba commit e0b157f
Showing 3 changed files with 17 additions and 16 deletions.
1 change: 1 addition & 0 deletions vis-core.h
Original file line number Diff line number Diff line change
@@ -21,6 +21,7 @@
*/
typedef struct Mode Mode;
struct Mode {
enum VisMode id;
Mode *parent; /* if no match is found in this mode, search will continue there */
Map *bindings;
const char *name; /* descriptive, user facing name of the mode */
6 changes: 6 additions & 0 deletions vis-modes.c
Original file line number Diff line number Diff line change
@@ -140,16 +140,19 @@ static void vis_mode_replace_input(Vis *vis, const char *str, size_t len) {

Mode vis_modes[] = {
[VIS_MODE_OPERATOR_PENDING] = {
.id = VIS_MODE_OPERATOR_PENDING,
.name = "OPERATOR-PENDING",
.input = vis_mode_operator_input,
.help = "",
},
[VIS_MODE_NORMAL] = {
.id = VIS_MODE_NORMAL,
.name = "NORMAL",
.status = "",
.help = "",
},
[VIS_MODE_VISUAL] = {
.id = VIS_MODE_VISUAL,
.name = "VISUAL",
.status = "--VISUAL--",
.help = "",
@@ -158,6 +161,7 @@ Mode vis_modes[] = {
.visual = true,
},
[VIS_MODE_VISUAL_LINE] = {
.id = VIS_MODE_VISUAL_LINE,
.name = "VISUAL LINE",
.parent = &vis_modes[VIS_MODE_VISUAL],
.status = "--VISUAL LINE--",
@@ -167,6 +171,7 @@ Mode vis_modes[] = {
.visual = true,
},
[VIS_MODE_INSERT] = {
.id = VIS_MODE_INSERT,
.name = "INSERT",
.status = "--INSERT--",
.help = "",
@@ -177,6 +182,7 @@ Mode vis_modes[] = {
.idle_timeout = 3,
},
[VIS_MODE_REPLACE] = {
.id = VIS_MODE_REPLACE,
.name = "REPLACE",
.parent = &vis_modes[VIS_MODE_INSERT],
.status = "--REPLACE--",
26 changes: 10 additions & 16 deletions vis.c
Original file line number Diff line number Diff line change
@@ -670,25 +670,19 @@ static const char *vis_keys_raw(Vis *vis, Buffer *buf, const char *input) {
prefix = false;
binding = NULL;

Mode *mode = vis->mode;
for (size_t i = 0; i < LENGTH(vis->win->modes); i++) {
if (mode == &vis_modes[i]) {
if (vis->win->modes[i].bindings)
mode = &vis->win->modes[i];
break;
for (Mode *mode = vis->mode; mode && !binding && !prefix; mode = mode->parent) {
for (int global = 0; global < 2 && !binding && !prefix; global++) {
Mode *mode_local = global ? mode : &vis->win->modes[mode->id];
if (!mode_local->bindings)
continue;
binding = map_get(mode_local->bindings, start);
/* "<" is never treated as a prefix because it is used to denote
* special key symbols */
if (strcmp(cur, "<"))
prefix = !binding && map_contains(mode_local->bindings, start);
}
}

for (; mode && !binding && !prefix; mode = mode->parent) {
if (!mode->bindings)
continue;
binding = map_get(mode->bindings, start);
/* "<" is never treated as a prefix because it is used to denote
* special key symbols */
if (strcmp(cur, "<"))
prefix = !binding && map_contains(mode->bindings, start);
}

*end = tmp;
vis->keys = buf;

0 comments on commit e0b157f

Please sign in to comment.