summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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");
}