aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2014-09-11 18:23:49 +0200
committerMarc André Tanner <mat@brain-dump.org>2014-09-11 18:23:49 +0200
commit838631bc7d6d242ea168f3ed4206cf3c51b63733 (patch)
tree877b639ac78b0efe83b1bf851564effa8916edd5
parentae450167e7f0574876db44bbe434c4021ee02979 (diff)
downloadvis-838631bc7d6d242ea168f3ed4206cf3c51b63733.tar.gz
vis-838631bc7d6d242ea168f3ed4206cf3c51b63733.tar.xz
Be stricter on what commands to accept at the ':'- prompt
-rw-r--r--config.def.h29
-rw-r--r--vis.c14
2 files changed, 21 insertions, 22 deletions
diff --git a/config.def.h b/config.def.h
index 4b5bf79..62fce25 100644
--- a/config.def.h
+++ b/config.def.h
@@ -44,23 +44,20 @@ enum {
VIS_MODE_REPLACE,
};
-/* command recognized at the ':'-prompt, matched using a greedy top to bottom,
- * regex search. make sure the longer commands are listed before the shorter ones
- * e.g. 'sp' before 's' and 'wq' before 'w'.
- */
+/* command recognized at the ':'-prompt. tested top to bottom, first match wins. */
static Command cmds[] = {
- { "^[0-9]+", cmd_gotoline },
- { "^e(dit)?", cmd_edit },
- { "^o(pen)?", cmd_open },
- { "^qa(ll)?", cmd_qall },
- { "^q(quit)?", cmd_quit },
- { "^r(ead)?", cmd_read },
- { "^sp(lit)?", cmd_split },
- { "^s(ubstitute)?", cmd_substitute },
- { "^v(split)?", cmd_vsplit },
- { "^wq", cmd_wq },
- { "^w(rite)?", cmd_write },
- { /* array terminator */ },
+ { "^[0-9]+$", cmd_gotoline },
+ { "^e(dit)?!?$", cmd_edit },
+ { "^o(pen)?$", cmd_open },
+ { "^qa(ll)?!?$", cmd_qall },
+ { "^q(quit)?!?$", cmd_quit },
+ { "^r(ead)?$", cmd_read },
+ { "^sp(lit)?$", cmd_split },
+ { "^s(ubstitute)?$", cmd_substitute },
+ { "^v(split)?$", cmd_vsplit },
+ { "^wq!?$", cmd_wq },
+ { "^w(rite)?$", cmd_write },
+ { /* array terminator */ },
};
/* draw a statubar, do whatever you want with win->statuswin curses window */
diff --git a/vis.c b/vis.c
index 8ca33bd..88cefd2 100644
--- a/vis.c
+++ b/vis.c
@@ -993,6 +993,11 @@ static bool exec_command(char *cmdline) {
init = true;
}
+ /* regex should only apply to command name */
+ char *s = strchr(cmdline, ' ');
+ if (s)
+ *s++ = '\0';
+
Command *cmd = NULL;
for (Command *c = cmds; c->name; c++) {
if (!regexec(&c->regex, cmdline, 0, NULL, 0)) {
@@ -1005,15 +1010,12 @@ static bool exec_command(char *cmdline) {
return false;
const char *argv[32] = { cmdline };
- char *s = cmdline;
for (int i = 1; i < LENGTH(argv); i++) {
- if (s) {
- if ((s = strchr(s, ' ')))
- *s++ = '\0';
- }
while (s && *s && *s == ' ')
s++;
- argv[i] = s ? s : NULL;
+ argv[i] = s;
+ if (s && (s = strchr(s, ' ')))
+ *s++ = '\0';
}
cmd->cmd(argv);