Add a non-interactive version of query-replace-regexp function called
authorlum <lum@openbsd.org>
Thu, 22 Apr 2021 19:50:55 +0000 (19:50 +0000)
committerlum <lum@openbsd.org>
Thu, 22 Apr 2021 19:50:55 +0000 (19:50 +0000)
replace-regexp. Unfortunately query-replace-regexp can't be used in a
startup file.

usr.bin/mg/def.h
usr.bin/mg/funmap.c
usr.bin/mg/mg.1
usr.bin/mg/re_search.c

index f5102b8..ee32c06 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: def.h,v 1.172 2021/04/20 10:02:50 lum Exp $   */
+/*     $OpenBSD: def.h,v 1.173 2021/04/22 19:50:55 lum Exp $   */
 
 /* This file is in the public domain. */
 
@@ -673,6 +673,7 @@ int          re_forwsearch(int, int);
 int             re_backsearch(int, int);
 int             re_searchagain(int, int);
 int             re_queryrepl(int, int);
+int             re_repl(int, int);
 int             replstr(int, int);
 int             setcasefold(int, int);
 int             delmatchlines(int, int);
index c6c5927..36a88e4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: funmap.c,v 1.62 2021/04/20 16:34:20 lum Exp $ */
+/*     $OpenBSD: funmap.c,v 1.63 2021/04/22 19:50:55 lum Exp $ */
 
 /* This file is in the public domain */
 
@@ -181,6 +181,7 @@ static struct funmap functnames[] = {
        {reposition, "recenter", 0},
        {redraw, "redraw-display", 0},
 #ifdef REGEX
+       {re_repl, "replace-regexp", 2},
        {replstr, "replace-string", 2},
 #endif /* REGEX */
        {revertbuffer, "revert-buffer", 0},
index e43d851..c13a7c1 100644 (file)
@@ -1,7 +1,7 @@
-.\"    $OpenBSD: mg.1,v 1.123 2021/04/20 10:02:50 lum Exp $
+.\"    $OpenBSD: mg.1,v 1.124 2021/04/22 19:50:55 lum Exp $
 .\" This file is in the public domain.
 .\"
-.Dd $Mdocdate: April 20 2021 $
+.Dd $Mdocdate: April 22 2021 $
 .Dt MG 1
 .Os
 .Sh NAME
@@ -778,6 +778,8 @@ Display current (global) working directory in the status area.
 .It query-replace
 Query Replace.
 Search and replace strings selectively, prompting after each match.
+.It replace-regexp
+Replace regular expression globally without individual prompting.
 .It replace-string
 Replace string globally without individual prompting.
 .It query-replace-regexp
index 95349dd..eba9b03 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: re_search.c,v 1.35 2020/07/22 13:29:05 tb Exp $       */
+/*     $OpenBSD: re_search.c,v 1.36 2021/04/22 19:50:55 lum Exp $      */
 
 /* This file is in the public domain. */
 
@@ -211,6 +211,34 @@ stopsearch:
        return (TRUE);
 }
 
+int
+re_repl(int f, int n)
+{
+       int     rcnt = 0;               /* replacements made so far     */
+       int     plen, s;                /* length of found string       */
+       char    news[NPAT];             /* replacement string           */
+
+       if ((s = re_readpattern("RE Replace")) != TRUE)
+               return (s);
+       if (eread("Replace %s with: ", news, NPAT,
+           EFNUL | EFNEW | EFCR, re_pat) == NULL)
+                return (ABORT);
+
+       while (re_forwsrch() == TRUE) {
+               plen = regex_match[0].rm_eo - regex_match[0].rm_so;
+               if (re_doreplace((RSIZE)plen, news) == FALSE)
+                       return (FALSE);
+               rcnt++;
+       }
+
+       curwp->w_rflag |= WFFULL;
+       update(CMODE);
+       if (!inmacro)
+               ewprintf("(%d replacement(s) done)", rcnt);
+       
+       return(TRUE);
+}
+
 /*
  * Routine re_doreplace calls lreplace to make replacements needed by
  * re_query replace.  Its reason for existence is to deal with \1, \2. etc.