vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit 86ea1dc563a528fca552d29fb8dbb4a1978f28fc parent 7da2e16b918be2aa13ddfef2a1cd9dda6be7c360 Author: Marc André Tanner <mat@brain-dump.org> Date: Fri, 6 Jan 2017 22:10:37 +0100 vis: simplify mode lookup for :map and :unmap Diffstat:
| M | vis-cmds.c | | | 21 | ++------------------- |
| M | vis-modes.c | | | 12 | +++++++++++- |
| M | vis.h | | | 1 | + |
3 files changed, 14 insertions(+), 20 deletions(-)
diff --git a/vis-cmds.c b/vis-cmds.c @@ -741,23 +741,6 @@ static bool cmd_help(Vis *vis, Win *win, Command *cmd, const char *argv[], Curso return true; } -static enum VisMode str2vismode(const char *mode) { - const char *modes[] = { - [VIS_MODE_NORMAL] = "normal", - [VIS_MODE_OPERATOR_PENDING] = "operator-pending", - [VIS_MODE_VISUAL] = "visual", - [VIS_MODE_VISUAL_LINE] = "visual-line", - [VIS_MODE_INSERT] = "insert", - [VIS_MODE_REPLACE] = "replace", - }; - - for (size_t i = 0; i < LENGTH(modes); i++) { - if (mode && modes[i] && strcmp(mode, modes[i]) == 0) - return i; - } - return VIS_MODE_INVALID; -} - static bool cmd_langmap(Vis *vis, Win *win, Command *cmd, const char *argv[], Cursor *cur, Filerange *range) { const char *nonlatin = argv[1]; const char *latin = argv[2]; @@ -792,7 +775,7 @@ static bool cmd_langmap(Vis *vis, Win *win, Command *cmd, const char *argv[], Cu static bool cmd_map(Vis *vis, Win *win, Command *cmd, const char *argv[], Cursor *cur, Filerange *range) { bool mapped = false; bool local = strstr(argv[0], "-") != NULL; - enum VisMode mode = str2vismode(argv[1]); + enum VisMode mode = vis_mode_from(vis, argv[1]); if (local && !win) return false; @@ -820,7 +803,7 @@ err: static bool cmd_unmap(Vis *vis, Win *win, Command *cmd, const char *argv[], Cursor *cur, Filerange *range) { bool local = strstr(argv[0], "-") != NULL; - enum VisMode mode = str2vismode(argv[1]); + enum VisMode mode = vis_mode_from(vis, argv[1]); const char *lhs = argv[2]; if (local && !win) diff --git a/vis-modes.c b/vis-modes.c @@ -1,4 +1,5 @@ #include <string.h> +#include <strings.h> #include "vis-core.h" #include "util.h" @@ -86,6 +87,15 @@ void vis_mode_switch(Vis *vis, enum VisMode mode) { mode_set(vis, &vis_modes[mode]); } +enum VisMode vis_mode_from(Vis *vis, const char *name) { + for (size_t i = 0; i < LENGTH(vis_modes); i++) { + Mode *mode = &vis_modes[i]; + if (!strcasecmp(mode->name, name)) + return mode->id; + } + return VIS_MODE_INVALID; +} + enum VisMode vis_mode_get(Vis *vis) { return vis->mode->id; } @@ -241,7 +251,7 @@ Mode vis_modes[] = { }, [VIS_MODE_VISUAL_LINE] = { .id = VIS_MODE_VISUAL_LINE, - .name = "VISUAL LINE", + .name = "VISUAL-LINE", .parent = &vis_modes[VIS_MODE_VISUAL], .status = "VISUAL-LINE", .help = "", diff --git a/vis.h b/vis.h @@ -169,6 +169,7 @@ enum VisMode { void vis_mode_switch(Vis*, enum VisMode); enum VisMode vis_mode_get(Vis*); +enum VisMode vis_mode_from(Vis*, const char *name); /* In the specified mode: map a given key to a binding (binding->key is ignored). * Fails if a prefix of `key' is already mapped and `force' is false. Otherwise * all such prefixes are unmapped. */