summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorMark Lumsden <lum@cvs.openbsd.org>2019-07-11 18:20:19 +0000
committerMark Lumsden <lum@cvs.openbsd.org>2019-07-11 18:20:19 +0000
commit68d5d4acf1ba64582d9f55ae219a12145f552f74 (patch)
treebea90fae58f6492677459e2d163470d1caa7e3cb /usr.bin
parentd9873d02f5ac253f95bc31c8e11057525e35f834 (diff)
Allow functions that have 1 or more parameters receive and process
multiple arguments when evaluated in a startup file or via one of the 'eval' commands. This diff does treat the '(' and ')' chars differently during evaluation than previously, in-so-far as they are not ignored if they are at the end or start of a line now. However, even though these characters are not ignored, this diff should not change the behaviour of an extant .mg file, with '(' and ')' chars at the end and start of a line. This situation is accomodated for in this diff (with limited testing though).
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/mg/cmode.c14
-rw-r--r--usr.bin/mg/dired.c38
-rw-r--r--usr.bin/mg/extend.c131
-rw-r--r--usr.bin/mg/funmap.c399
-rw-r--r--usr.bin/mg/funmap.h5
-rw-r--r--usr.bin/mg/grep.c12
6 files changed, 378 insertions, 221 deletions
diff --git a/usr.bin/mg/cmode.c b/usr.bin/mg/cmode.c
index a2382854679..6c0ef5b8975 100644
--- a/usr.bin/mg/cmode.c
+++ b/usr.bin/mg/cmode.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmode.c,v 1.16 2015/09/26 21:51:58 jasper Exp $ */
+/* $OpenBSD: cmode.c,v 1.17 2019/07/11 18:20:18 lum Exp $ */
/*
* This file is in the public domain.
*
@@ -91,12 +91,12 @@ static struct KEYMAPE (3) cmodemap = {
void
cmode_init(void)
{
- funmap_add(cmode, "c-mode");
- funmap_add(cc_char, "c-handle-special-char");
- funmap_add(cc_brace, "c-handle-special-brace");
- funmap_add(cc_tab, "c-tab-or-indent");
- funmap_add(cc_indent, "c-indent");
- funmap_add(cc_lfindent, "c-indent-and-newline");
+ funmap_add(cmode, "c-mode", 0);
+ funmap_add(cc_char, "c-handle-special-char", 0);
+ funmap_add(cc_brace, "c-handle-special-brace", 0);
+ funmap_add(cc_tab, "c-tab-or-indent", 0);
+ funmap_add(cc_indent, "c-indent", 0);
+ funmap_add(cc_lfindent, "c-indent-and-newline", 0);
maps_add((KEYMAP *)&cmodemap, "c");
}
diff --git a/usr.bin/mg/dired.c b/usr.bin/mg/dired.c
index c455e5aafd3..69c806f4ebc 100644
--- a/usr.bin/mg/dired.c
+++ b/usr.bin/mg/dired.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dired.c,v 1.92 2019/07/01 19:36:17 lum Exp $ */
+/* $OpenBSD: dired.c,v 1.93 2019/07/11 18:20:18 lum Exp $ */
/* This file is in the public domain. */
@@ -204,24 +204,24 @@ static struct KEYMAPE (7) diredmap = {
void
dired_init(void)
{
- funmap_add(dired, "dired");
- funmap_add(d_create_directory, "dired-create-directory");
- funmap_add(d_copy, "dired-do-copy");
- funmap_add(d_expunge, "dired-do-flagged-delete");
- funmap_add(d_rename, "dired-do-rename");
- funmap_add(d_findfile, "dired-find-file");
- funmap_add(d_ffotherwindow, "dired-find-file-other-window");
- funmap_add(d_del, "dired-flag-file-deletion");
- funmap_add(d_gotofile, "dired-goto-file");
- funmap_add(d_forwline, "dired-next-line");
- funmap_add(d_otherwindow, "dired-other-window");
- funmap_add(d_backline, "dired-previous-line");
- funmap_add(d_refreshbuffer, "dired-revert");
- funmap_add(d_backpage, "dired-scroll-down");
- funmap_add(d_forwpage, "dired-scroll-up");
- funmap_add(d_undel, "dired-unmark");
- funmap_add(d_undelbak, "dired-unmark-backward");
- funmap_add(d_killbuffer_cmd, "quit-window");
+ funmap_add(dired, "dired", 1);
+ funmap_add(d_create_directory, "dired-create-directory", 1);
+ funmap_add(d_copy, "dired-do-copy", 1);
+ funmap_add(d_expunge, "dired-do-flagged-delete", 0);
+ funmap_add(d_rename, "dired-do-rename", 1);
+ funmap_add(d_findfile, "dired-find-file", 1);
+ funmap_add(d_ffotherwindow, "dired-find-file-other-window", 1);
+ funmap_add(d_del, "dired-flag-file-deletion", 0);
+ funmap_add(d_gotofile, "dired-goto-file", 1);
+ funmap_add(d_forwline, "dired-next-line", 0);
+ funmap_add(d_otherwindow, "dired-other-window", 0);
+ funmap_add(d_backline, "dired-previous-line", 0);
+ funmap_add(d_refreshbuffer, "dired-revert", 0);
+ funmap_add(d_backpage, "dired-scroll-down", 0);
+ funmap_add(d_forwpage, "dired-scroll-up", 0);
+ funmap_add(d_undel, "dired-unmark", 0);
+ funmap_add(d_undelbak, "dired-unmark-backward", 0);
+ funmap_add(d_killbuffer_cmd, "quit-window", 0);
maps_add((KEYMAP *)&diredmap, "dired");
dobindkey(fundamental_map, "dired", "^Xd");
}
diff --git a/usr.bin/mg/extend.c b/usr.bin/mg/extend.c
index 2061bb3a358..9a007b3de9c 100644
--- a/usr.bin/mg/extend.c
+++ b/usr.bin/mg/extend.c
@@ -1,5 +1,4 @@
-/* $OpenBSD: extend.c,v 1.66 2019/07/05 14:50:59 lum Exp $ */
-
+/* $OpenBSD: extend.c,v 1.67 2019/07/11 18:20:18 lum Exp $ */
/* This file is in the public domain. */
/*
@@ -8,6 +7,7 @@
#include <sys/queue.h>
#include <sys/types.h>
+#include <regex.h>
#include <ctype.h>
#include <limits.h>
#include <signal.h>
@@ -693,6 +693,129 @@ load(const char *fname)
}
/*
+ * Line has a '(' as the first non-white char.
+ */
+static int
+multiarg(char *funstr)
+{
+ regex_t regex_buff;
+ PF funcp;
+ char excbuf[128];
+ char *cmdp, *argp, *fendp, *endp, *p, *s = " ";
+ int singlecmd = 0, spc, numparams, numspc;
+
+ endp = strrchr(funstr, ')');
+ if (endp == NULL) {
+ ewprintf("No closing parenthesis found");
+ return(FALSE);
+ }
+ p = endp + 1;
+ if (*p != '\0')
+ *p = '\0';
+ /* we now know that string starts with '(' and ends with ')' */
+ if (regcomp(&regex_buff, "^[(][\t ]*[)]$", REG_EXTENDED)) {
+ dobeep();
+ ewprintf("Could not compile regex");
+ regfree(&regex_buff);
+ return(FALSE);
+ }
+ if (!regexec(&regex_buff, funstr, 0, NULL, 0)) {
+ dobeep();
+ ewprintf("No command found");
+ regfree(&regex_buff);
+ return(FALSE);
+ }
+ /* currently there are no mg commands that don't have a letter */
+ if (regcomp(&regex_buff, "^[(][\t ]*[A-Za-z-]+[\t ]*[)]$",
+ REG_EXTENDED)) {
+ dobeep();
+ ewprintf("Could not compile regex");
+ regfree(&regex_buff);
+ return(FALSE);
+ }
+ if (!regexec(&regex_buff, funstr, 0, NULL, 0))
+ singlecmd = 1;
+
+ regfree(&regex_buff);
+ p = funstr + 1; /* move past first '(' char. */
+ cmdp = skipwhite(p); /* find first char of command. */
+
+ if (singlecmd) {
+ /* remove ')', then check for spaces at the end */
+ cmdp[strlen(cmdp) - 1] = '\0';
+ if ((fendp = strchr(cmdp, ' ')) != NULL)
+ *fendp = '\0';
+ else if ((fendp = strchr(cmdp, '\t')) != NULL)
+ *fendp = '\0';
+ return(excline(cmdp));
+ }
+ if ((fendp = strchr(cmdp, ' ')) == NULL)
+ fendp = strchr(cmdp, '\t');
+
+ *fendp = '\0';
+ /*
+ * If no extant mg command found, line could be a (define of some kind.
+ * Since no defines exist at the moment, just return.
+ */
+ if ((funcp = name_function(cmdp)) == NULL) {
+ dobeep();
+ ewprintf("Unknown command: %s", cmdp);
+ return (FALSE);
+ }
+ numparams = numparams_function(funcp);
+ if (numparams == 0) {
+ dobeep();
+ ewprintf("Command takes no arguments: %s", cmdp);
+ return (FALSE);
+ }
+
+ /* now find the first argument */
+ p = fendp + 1;
+ argp = skipwhite(p);
+ numspc = spc = 1; /* initially fake a space so we find first argument */
+
+ for (p = argp; *p != '\0'; p++) {
+ if (*p == ' ' || *p == '\t' || *p == ')') {
+ if (spc == 1)
+ continue;
+ if (spc == 0 && (numspc % numparams == 0)) {
+ *p = '\0'; /* terminate arg string */
+ excbuf[0] = '\0';
+ if (strlcpy(excbuf, cmdp, sizeof(excbuf))
+ >= sizeof(excbuf)) {
+ dobeep();
+ ewprintf("strlcpy error");
+ return (FALSE);
+ }
+ if (strlcat(excbuf, s, sizeof(excbuf))
+ >= sizeof(excbuf)) {
+ dobeep();
+ ewprintf("strlcpy error");
+ return (FALSE);
+ }
+ if (strlcat(excbuf, argp, sizeof(excbuf))
+ >= sizeof(excbuf)) {
+ dobeep();
+ ewprintf("strlcpy error");
+ return (FALSE);
+ }
+ excline(excbuf);
+ *p = ' '; /* so 'for' loop can continue */
+ }
+ numspc++;
+ spc = 1;
+ } else {
+ if (spc == 1)
+ if ((numparams == 1) ||
+ ((numspc + 1) % numparams) == 0)
+ argp = p;
+ spc = 0;
+ }
+ }
+ return (TRUE);
+}
+
+/*
* excline - run a line from a load file or eval-expression.
*/
int
@@ -724,6 +847,8 @@ excline(char *line)
funcp = skipwhite(line);
if (*funcp == '\0')
return (TRUE); /* No error on blank lines */
+ if (*funcp == '(')
+ return (multiarg(funcp));
line = parsetoken(funcp);
if (*line != '\0') {
*line++ = '\0';
@@ -928,7 +1053,7 @@ cleanup:
static char *
skipwhite(char *s)
{
- while (*s == ' ' || *s == '\t' || *s == ')' || *s == '(')
+ while (*s == ' ' || *s == '\t')
s++;
if ((*s == ';') || (*s == '#'))
*s = '\0';
diff --git a/usr.bin/mg/funmap.c b/usr.bin/mg/funmap.c
index 0d0c026d546..20adbf69f21 100644
--- a/usr.bin/mg/funmap.c
+++ b/usr.bin/mg/funmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: funmap.c,v 1.58 2019/07/03 18:11:07 lum Exp $ */
+/* $OpenBSD: funmap.c,v 1.59 2019/07/11 18:20:18 lum Exp $ */
/* This file is in the public domain */
@@ -13,213 +13,228 @@
#include "kbd.h"
/*
- * If the function is NULL, it must be listed with the
- * same name in the map_table.
+ * funmap structure: a list of functions and their command-names/#parameters.
+ *
+ * If the function is NULL, it must be listed with the same name in the
+ * map_table.
*/
-
struct funmap {
PF fn_funct;
const char *fn_name;
+ int fn_nparams;
struct funmap *fn_next;
};
-
static struct funmap *funs;
+/*
+ * 3rd column in the functnames structure indicates how many parameters the
+ * function takes in 'normal' usage. This column is only used to identify
+ * function profiles when lines of a buffer are being evaluated via excline().
+ *
+ * 0 = a toggle, non-modifiable insert/delete, region modifier, etc
+ * 1 = value can be string or number value (like: file/buf name, search string)
+ * 2 = multiple type value required, see auto-execute, or global-set-key, etc
+ * -1 = variable length # parameters (unused at moment)
+ *
+ * Some functions when used interactively may ask for a 'y' or 'n' (or another
+ * character) to continue, in excline, a 'y' is assumed. Functions like this
+ * have '0' in the 3rd column below.
+ */
static struct funmap functnames[] = {
- {apropos_command, "apropos",},
- {toggleaudiblebell, "audible-bell",},
- {auto_execute, "auto-execute",},
- {fillmode, "auto-fill-mode",},
- {indentmode, "auto-indent-mode",},
- {backtoindent, "back-to-indentation",},
- {backuptohomedir, "backup-to-home-directory",},
- {backchar, "backward-char",},
- {delbword, "backward-kill-word",},
- {gotobop, "backward-paragraph",},
- {backword, "backward-word",},
- {gotobob, "beginning-of-buffer",},
- {gotobol, "beginning-of-line",},
- {showmatch, "blink-and-insert",},
- {bsmap, "bsmap-mode",},
- {NULL, "c-x 4 prefix",},
- {NULL, "c-x prefix",},
- {executemacro, "call-last-kbd-macro",},
- {capword, "capitalize-word",},
- {changedir, "cd",},
- {clearmark, "clear-mark",},
- {colnotoggle, "column-number-mode",},
- {copyregion, "copy-region-as-kill",},
+ {apropos_command, "apropos", 1},
+ {toggleaudiblebell, "audible-bell", 0},
+ {auto_execute, "auto-execute", 2},
+ {fillmode, "auto-fill-mode", 0},
+ {indentmode, "auto-indent-mode", 0},
+ {backtoindent, "back-to-indentation", 0},
+ {backuptohomedir, "backup-to-home-directory", 0},
+ {backchar, "backward-char", 0},
+ {delbword, "backward-kill-word", 0},
+ {gotobop, "backward-paragraph", 0},
+ {backword, "backward-word", 0},
+ {gotobob, "beginning-of-buffer", 0},
+ {gotobol, "beginning-of-line", 0},
+ {showmatch, "blink-and-insert", 1}, /* startup only */
+ {bsmap, "bsmap-mode", 0},
+ {NULL, "c-x 4 prefix", 0}, /* internal */
+ {NULL, "c-x prefix", 0}, /* internal */
+ {executemacro, "call-last-kbd-macro", 0},
+ {capword, "capitalize-word", 0},
+ {changedir, "cd", 1},
+ {clearmark, "clear-mark", 0},
+ {colnotoggle, "column-number-mode", 0},
+ {copyregion, "copy-region-as-kill", 0},
#ifdef REGEX
- {cntmatchlines, "count-matches",},
- {cntnonmatchlines, "count-non-matches",},
+ {cntmatchlines, "count-matches", 1},
+ {cntnonmatchlines, "count-non-matches", 1},
#endif /* REGEX */
- {cscreatelist, "cscope-create-list-of-files-to-index",},
- {csfuncalled, "cscope-find-called-functions",},
- {csegrep, "cscope-find-egrep-pattern",},
- {csfindinc, "cscope-find-files-including-file",},
- {cscallerfuncs, "cscope-find-functions-calling-this-function",},
- {csdefinition, "cscope-find-global-definition",},
- {csfindfile, "cscope-find-this-file",},
- {cssymbol, "cscope-find-this-symbol",},
- {csfindtext, "cscope-find-this-text-string",},
- {csnextfile, "cscope-next-file",},
- {csnextmatch, "cscope-next-symbol",},
- {csprevfile, "cscope-prev-file",},
- {csprevmatch, "cscope-prev-symbol",},
- {redefine_key, "define-key",},
- {backdel, "delete-backward-char",},
- {deblank, "delete-blank-lines",},
- {forwdel, "delete-char",},
- {delwhite, "delete-horizontal-space",},
- {delleadwhite, "delete-leading-space",},
+ {cscreatelist, "cscope-create-list-of-files-to-index", 1},
+ {csfuncalled, "cscope-find-called-functions", 1},
+ {csegrep, "cscope-find-egrep-pattern", 1},
+ {csfindinc, "cscope-find-files-including-file", 1},
+ {cscallerfuncs, "cscope-find-functions-calling-this-function", 1},
+ {csdefinition, "cscope-find-global-definition", 1},
+ {csfindfile, "cscope-find-this-file", 1},
+ {cssymbol, "cscope-find-this-symbol", 1},
+ {csfindtext, "cscope-find-this-text-string", 1},
+ {csnextfile, "cscope-next-file", 0},
+ {csnextmatch, "cscope-next-symbol", 0},
+ {csprevfile, "cscope-prev-file", 0},
+ {csprevmatch, "cscope-prev-symbol", 0},
+ {redefine_key, "define-key", 3},
+ {backdel, "delete-backward-char", 0},
+ {deblank, "delete-blank-lines", 0},
+ {forwdel, "delete-char", 0},
+ {delwhite, "delete-horizontal-space", 0},
+ {delleadwhite, "delete-leading-space", 0},
#ifdef REGEX
- {delmatchlines, "delete-matching-lines",},
- {delnonmatchlines, "delete-non-matching-lines",},
+ {delmatchlines, "delete-matching-lines", 1},
+ {delnonmatchlines, "delete-non-matching-lines", 1},
#endif /* REGEX */
- {onlywind, "delete-other-windows",},
- {deltrailwhite, "delete-trailing-space",},
- {delwind, "delete-window",},
- {wallchart, "describe-bindings",},
- {desckey, "describe-key-briefly",},
- {diffbuffer, "diff-buffer-with-file",},
- {digit_argument, "digit-argument",},
- {lowerregion, "downcase-region",},
- {lowerword, "downcase-word",},
- {showversion, "emacs-version",},
- {finishmacro, "end-kbd-macro",},
- {gotoeob, "end-of-buffer",},
- {gotoeol, "end-of-line",},
- {enlargewind, "enlarge-window",},
- {NULL, "esc prefix",},
- {evalbuffer, "eval-current-buffer",},
- {evalexpr, "eval-expression",},
- {swapmark, "exchange-point-and-mark",},
- {extend, "execute-extended-command",},
- {fillpara, "fill-paragraph",},
- {filevisitalt, "find-alternate-file",},
- {filevisit, "find-file",},
- {poptofile, "find-file-other-window",},
- {filevisitro, "find-file-read-only",},
- {findtag, "find-tag",},
- {forwchar, "forward-char",},
- {gotoeop, "forward-paragraph",},
- {forwword, "forward-word",},
- {bindtokey, "global-set-key",},
- {unbindtokey, "global-unset-key",},
- {globalwdtoggle, "global-wd-mode",},
- {gotoline, "goto-line",},
- {help_help, "help-help",},
- {indent, "indent-current-line",},
- {insert, "insert",},
- {bufferinsert, "insert-buffer",},
- {fileinsert, "insert-file",},
- {fillword, "insert-with-wrap",},
- {backisearch, "isearch-backward",},
- {forwisearch, "isearch-forward",},
- {joinline, "join-line",},
- {justone, "just-one-space",},
- {ctrlg, "keyboard-quit",},
- {killbuffer_cmd, "kill-buffer",},
- {killline, "kill-line",},
- {killpara, "kill-paragraph",},
- {killregion, "kill-region",},
- {delfword, "kill-word",},
- {toggleleavetmp, "leave-tmpdir-backups",},
- {linenotoggle, "line-number-mode",},
- {listbuffers, "list-buffers",},
- {evalfile, "load",},
- {localbind, "local-set-key",},
- {localunbind, "local-unset-key",},
- {makebkfile, "make-backup-files",},
- {makedir, "make-directory",},
- {markpara, "mark-paragraph",},
- {markbuffer, "mark-whole-buffer",},
- {do_meta, "meta-key-mode",}, /* better name, anyone? */
- {negative_argument, "negative-argument",},
- {enewline, "newline",},
- {lfindent, "newline-and-indent",},
- {forwline, "next-line",},
+ {onlywind, "delete-other-windows", 0},
+ {deltrailwhite, "delete-trailing-space", 0},
+ {delwind, "delete-window", 0},
+ {wallchart, "describe-bindings", 0},
+ {desckey, "describe-key-briefly", 1},
+ {diffbuffer, "diff-buffer-with-file", 0},
+ {digit_argument, "digit-argument", 1},
+ {lowerregion, "downcase-region", 0},
+ {lowerword, "downcase-word", 0},
+ {showversion, "emacs-version", 0},
+ {finishmacro, "end-kbd-macro", 0},
+ {gotoeob, "end-of-buffer", 0},
+ {gotoeol, "end-of-line", 0},
+ {enlargewind, "enlarge-window", 0},
+ {NULL, "esc prefix", 0}, /* internal */
+ {evalbuffer, "eval-current-buffer", 0},
+ {evalexpr, "eval-expression", 0},
+ {swapmark, "exchange-point-and-mark", 0},
+ {extend, "execute-extended-command", 1},
+ {fillpara, "fill-paragraph", 0},
+ {filevisitalt, "find-alternate-file", 1},
+ {filevisit, "find-file", 1},
+ {poptofile, "find-file-other-window", 1},
+ {filevisitro, "find-file-read-only", 1},
+ {findtag, "find-tag", 1},
+ {forwchar, "forward-char", 0},
+ {gotoeop, "forward-paragraph", 0},
+ {forwword, "forward-word", 0},
+ {bindtokey, "global-set-key", 2},
+ {unbindtokey, "global-unset-key", 1},
+ {globalwdtoggle, "global-wd-mode", 0},
+ {gotoline, "goto-line", 1},
+ {help_help, "help-help", 0},
+ {indent, "indent-current-line", 0},
+ {insert, "insert", 1},
+ {bufferinsert, "insert-buffer", 1},
+ {fileinsert, "insert-file", 1},
+ {fillword, "insert-with-wrap", 1}, /* startup only */
+ {backisearch, "isearch-backward", 1},
+ {forwisearch, "isearch-forward", 1},
+ {joinline, "join-line", 0},
+ {justone, "just-one-space", 0},
+ {ctrlg, "keyboard-quit", 0},
+ {killbuffer_cmd, "kill-buffer", 1},
+ {killline, "kill-line", 0},
+ {killpara, "kill-paragraph", 0},
+ {killregion, "kill-region", 0},
+ {delfword, "kill-word", 0},
+ {toggleleavetmp, "leave-tmpdir-backups", 0},
+ {linenotoggle, "line-number-mode", 0},
+ {listbuffers, "list-buffers", 0},
+ {evalfile, "load", 1},
+ {localbind, "local-set-key", 1},
+ {localunbind, "local-unset-key", 1},
+ {makebkfile, "make-backup-files", 0},
+ {makedir, "make-directory", 1},
+ {markpara, "mark-paragraph", 0},
+ {markbuffer, "mark-whole-buffer", 0},
+ {do_meta, "meta-key-mode", 0}, /* better name, anyone? */
+ {negative_argument, "negative-argument", 1},
+ {enewline, "newline", 0},
+ {lfindent, "newline-and-indent", 0},
+ {forwline, "next-line", 0},
#ifdef NOTAB
- {notabmode, "no-tab-mode",},
+ {notabmode, "no-tab-mode", 0},
#endif /* NOTAB */
- {notmodified, "not-modified",},
- {openline, "open-line",},
- {nextwind, "other-window",},
- {overwrite_mode, "overwrite-mode",},
- {poptag, "pop-tag-mark",},
- {prefixregion, "prefix-region",},
- {backline, "previous-line",},
- {prevwind, "previous-window",},
- {spawncli, "push-shell",},
- {showcwdir, "pwd",},
- {queryrepl, "query-replace",},
+ {notmodified, "not-modified", 0},
+ {openline, "open-line", 0},
+ {nextwind, "other-window", 0},
+ {overwrite_mode, "overwrite-mode", 0},
+ {poptag, "pop-tag-mark", 0},
+ {prefixregion, "prefix-region", 0},
+ {backline, "previous-line", 0},
+ {prevwind, "previous-window", 0},
+ {spawncli, "push-shell", 0},
+ {showcwdir, "pwd", 0},
+ {queryrepl, "query-replace", 1},
#ifdef REGEX
- {re_queryrepl, "query-replace-regexp",},
+ {re_queryrepl, "query-replace-regexp", 1},
#endif /* REGEX */
- {quote, "quoted-insert",},
+ {quote, "quoted-insert", 1},
#ifdef REGEX
- {re_searchagain, "re-search-again",},
- {re_backsearch, "re-search-backward",},
- {re_forwsearch, "re-search-forward",},
+ {re_searchagain, "re-search-again", 0},
+ {re_backsearch, "re-search-backward", 0},
+ {re_forwsearch, "re-search-forward", 0},
#endif /* REGEX */
- {reposition, "recenter",},
- {redraw, "redraw-display",},
+ {reposition, "recenter", 0},
+ {redraw, "redraw-display", 0},
#ifdef REGEX
- {replstr, "replace-string",},
+ {replstr, "replace-string", 2},
#endif /* REGEX */
- {revertbuffer, "revert-buffer",},
- {filesave, "save-buffer",},
- {quit, "save-buffers-kill-emacs",},
- {savebuffers, "save-some-buffers",},
- {backpage, "scroll-down",},
- {back1page, "scroll-one-line-down",},
- {forw1page, "scroll-one-line-up",},
- {pagenext, "scroll-other-window",},
- {forwpage, "scroll-up",},
- {searchagain, "search-again",},
- {backsearch, "search-backward",},
- {forwsearch, "search-forward",},
- {ask_selfinsert, "self-insert-char",},
- {selfinsert, "self-insert-command",},
- {sentencespace, "sentence-end-double-space",},
+ {revertbuffer, "revert-buffer", 0},
+ {filesave, "save-buffer", 0},
+ {quit, "save-buffers-kill-emacs", 0},
+ {savebuffers, "save-some-buffers", 0},
+ {backpage, "scroll-down", 0},
+ {back1page, "scroll-one-line-down", 0},
+ {forw1page, "scroll-one-line-up", 0},
+ {pagenext, "scroll-other-window", 0},
+ {forwpage, "scroll-up", 0},
+ {searchagain, "search-again", 0},
+ {backsearch, "search-backward", 0},
+ {forwsearch, "search-forward", 0},
+ {ask_selfinsert, "self-insert-char", 1},
+ {selfinsert, "self-insert-command", 1}, /* startup only */
+ {sentencespace, "sentence-end-double-space", 0},
#ifdef REGEX
- {setcasefold, "set-case-fold-search",},
+ {setcasefold, "set-case-fold-search", 0},
#endif /* REGEX */
- {setcasereplace, "set-case-replace",},
- {set_default_mode, "set-default-mode",},
- {setfillcol, "set-fill-column",},
- {setmark, "set-mark-command",},
- {setprefix, "set-prefix-string",},
- {shellcommand, "shell-command",},
- {piperegion, "shell-command-on-region",},
- {shrinkwind, "shrink-window",},
+ {setcasereplace, "set-case-replace", 0},
+ {set_default_mode, "set-default-mode", 1},
+ {setfillcol, "set-fill-column", 1},
+ {setmark, "set-mark-command", 0},
+ {setprefix, "set-prefix-string", 1},
+ {shellcommand, "shell-command", 1},
+ {piperegion, "shell-command-on-region", 0},
+ {shrinkwind, "shrink-window", 0},
#ifdef NOTAB
- {space_to_tabstop, "space-to-tabstop",},
+ {space_to_tabstop, "space-to-tabstop", 0},
#endif /* NOTAB */
- {splitwind, "split-window-vertically",},
- {definemacro, "start-kbd-macro",},
- {spawncli, "suspend-emacs",},
- {usebuffer, "switch-to-buffer",},
- {poptobuffer, "switch-to-buffer-other-window",},
- {togglereadonly, "toggle-read-only" },
- {togglereadonlyall, "toggle-read-only-all" },
- {twiddle, "transpose-chars",},
- {transposepara, "transpose-paragraphs",},
- {transposeword, "transpose-words",},
- {undo, "undo",},
- {undo_add_boundary, "undo-boundary",},
- {undo_boundary_enable, "undo-boundary-toggle",},
- {undo_enable, "undo-enable",},
- {undo_dump, "undo-list",},
- {universal_argument, "universal-argument",},
- {upperregion, "upcase-region",},
- {upperword, "upcase-word",},
- {togglevisiblebell, "visible-bell",},
- {tagsvisit, "visit-tags-table",},
- {showcpos, "what-cursor-position",},
- {filewrite, "write-file",},
- {yank, "yank",},
- {NULL, NULL,}
+ {splitwind, "split-window-vertically", 0},
+ {definemacro, "start-kbd-macro", 0},
+ {spawncli, "suspend-emacs", 0},
+ {usebuffer, "switch-to-buffer", 1},
+ {poptobuffer, "switch-to-buffer-other-window", 1},
+ {togglereadonly, "toggle-read-only", 0},
+ {togglereadonlyall, "toggle-read-only-all", 0},
+ {twiddle, "transpose-chars", 0},
+ {transposepara, "transpose-paragraphs", 0},
+ {transposeword, "transpose-words", 0},
+ {undo, "undo", 0},
+ {undo_add_boundary, "undo-boundary", 0},
+ {undo_boundary_enable, "undo-boundary-toggle", 0},
+ {undo_enable, "undo-enable", 0},
+ {undo_dump, "undo-list", 0},
+ {universal_argument, "universal-argument", 1},
+ {upperregion, "upcase-region", 0},
+ {upperword, "upcase-word", 0},
+ {togglevisiblebell, "visible-bell", 0},
+ {tagsvisit, "visit-tags-table", 0},
+ {showcpos, "what-cursor-position", 0},
+ {filewrite, "write-file", 1},
+ {yank, "yank", 0},
+ {NULL, NULL, 0}
};
void
@@ -234,7 +249,7 @@ funmap_init(void)
}
int
-funmap_add(PF fun, const char *fname)
+funmap_add(PF fun, const char *fname, int fparams)
{
struct funmap *fn;
@@ -243,6 +258,7 @@ funmap_add(PF fun, const char *fname)
fn->fn_funct = fun;
fn->fn_name = fname;
+ fn->fn_nparams = fparams;
fn->fn_next = funs;
funs = fn;
@@ -301,3 +317,18 @@ complete_function_list(const char *fname)
}
return (head);
}
+
+/*
+ * Find number of parameters for function name.
+ */
+int
+numparams_function(PF fun)
+{
+ struct funmap *fn;
+
+ for (fn = funs; fn != NULL; fn = fn->fn_next) {
+ if (fn->fn_funct == fun)
+ return (fn->fn_nparams);
+ }
+ return (FALSE);
+}
diff --git a/usr.bin/mg/funmap.h b/usr.bin/mg/funmap.h
index acc24ae3172..b5bca71c69d 100644
--- a/usr.bin/mg/funmap.h
+++ b/usr.bin/mg/funmap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: funmap.h,v 1.7 2008/06/10 00:19:31 kjell Exp $ */
+/* $OpenBSD: funmap.h,v 1.8 2019/07/11 18:20:18 lum Exp $ */
/* This file is in the public domain */
@@ -6,4 +6,5 @@ void funmap_init(void);
PF name_function(const char *);
const char *function_name(PF);
struct list *complete_function_list(const char *);
-int funmap_add(PF, const char *);
+int funmap_add(PF, const char *, int);
+int numparams_function(PF);
diff --git a/usr.bin/mg/grep.c b/usr.bin/mg/grep.c
index c3e874a6bcb..97d22c68a81 100644
--- a/usr.bin/mg/grep.c
+++ b/usr.bin/mg/grep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: grep.c,v 1.47 2018/12/30 23:09:58 guenther Exp $ */
+/* $OpenBSD: grep.c,v 1.48 2019/07/11 18:20:18 lum Exp $ */
/* This file is in the public domain */
@@ -53,11 +53,11 @@ static struct KEYMAPE (1) compilemap = {
void
grep_init(void)
{
- funmap_add(compile_goto_error, "compile-goto-error");
- funmap_add(next_error, "next-error");
- funmap_add(grep, "grep");
- funmap_add(compile, "compile");
- funmap_add(gid, "gid");
+ funmap_add(compile_goto_error, "compile-goto-error", 0);
+ funmap_add(next_error, "next-error", 0);
+ funmap_add(grep, "grep", 1);
+ funmap_add(compile, "compile", 0);
+ funmap_add(gid, "gid", 1);
maps_add((KEYMAP *)&compilemap, "compile");
}