Hi, the new case-preserving replace is a very nice feature - unless you want to replace a string with the exact capitalisation.
>From florian@'s original commit message: > Use (mostly) the same capitalisation in the replacement string as in > > the replaced string: > > replacing foo with bar turns > > foo > Foo > FOO > > into > > bar > Bar > BAR > > OK phessler, benno Now I had the case that I wanted to replace FOO with bar, not BAR. Emacs has an option "case-replace" to turn it off - it can be set to nil to not preserve the case of the replaced string. This adds set-case-replace. Ok? Reyk Index: usr.bin/mg/def.h =================================================================== RCS file: /cvs/src/usr.bin/mg/def.h,v retrieving revision 1.155 diff -u -p -u -p -r1.155 def.h --- usr.bin/mg/def.h 14 Apr 2016 17:05:32 -0000 1.155 +++ usr.bin/mg/def.h 28 Aug 2018 11:59:49 -0000 @@ -391,6 +391,7 @@ int ldelete(RSIZE, int); int ldelnewline(void); int lreplace(RSIZE, char *); char * linetostr(const struct line *); +int setcasereplace(int, int); /* yank.c X */ Index: usr.bin/mg/funmap.c =================================================================== RCS file: /cvs/src/usr.bin/mg/funmap.c,v retrieving revision 1.53 diff -u -p -u -p -r1.53 funmap.c --- usr.bin/mg/funmap.c 14 Apr 2016 17:05:32 -0000 1.53 +++ usr.bin/mg/funmap.c 28 Aug 2018 11:59:49 -0000 @@ -184,6 +184,7 @@ static struct funmap functnames[] = { #ifdef REGEX {setcasefold, "set-case-fold-search",}, #endif /* REGEX */ + {setcasereplace, "set-case-replace",}, {set_default_mode, "set-default-mode",}, {setfillcol, "set-fill-column",}, {setmark, "set-mark-command",}, Index: usr.bin/mg/line.c =================================================================== RCS file: /cvs/src/usr.bin/mg/line.c,v retrieving revision 1.60 diff -u -p -u -p -r1.60 line.c --- usr.bin/mg/line.c 12 Jul 2018 12:38:56 -0000 1.60 +++ usr.bin/mg/line.c 28 Aug 2018 11:59:49 -0000 @@ -27,6 +27,22 @@ #include "def.h" +int casereplace = TRUE; + +/* + * Preserve the case of the replaced string. + */ +int +setcasereplace(int f, int n) +{ + if (f & FFARG) + casereplace = n > 0; + else + casereplace = !casereplace; + ewprintf("Case-replace is %sabled", casereplace ? "en" : "dis"); + return (TRUE); +} + /* * Allocate a new line of size `used'. lrealloc() can be called if the line * ever needs to grow beyond that. @@ -516,7 +532,7 @@ lreplace(RSIZE plen, char *st) RSIZE n; int s, doto, is_query_capitalised = 0, is_query_allcaps = 0; int is_replace_alllower = 0; - char *repl; + char *repl = NULL; if ((s = checkdirty(curbp)) != TRUE) return (s); @@ -531,11 +547,14 @@ lreplace(RSIZE plen, char *st) ewprintf("out of memory"); return (FALSE); } + rlen = strlen(repl); undo_boundary_enable(FFRAND, 0); - (void)backchar(FFARG | FFRAND, (int)plen); + if (casereplace != TRUE) + goto done; + lp = curwp->w_dotp; doto = curwp->w_doto; n = plen; @@ -556,9 +575,6 @@ lreplace(RSIZE plen, char *st) } } - (void)ldelete(plen, KNONE); - - rlen = strlen(repl); for (n = 0, is_replace_alllower = 1; n < rlen && is_replace_alllower; n++) is_replace_alllower = !isupper((unsigned char)repl[n]); @@ -572,6 +588,8 @@ lreplace(RSIZE plen, char *st) } } + done: + (void)ldelete(plen, KNONE); region_put_data(repl, rlen); lchange(WFFULL); Index: usr.bin/mg/mg.1 =================================================================== RCS file: /cvs/src/usr.bin/mg/mg.1,v retrieving revision 1.106 diff -u -p -u -p -r1.106 mg.1 --- usr.bin/mg/mg.1 11 Dec 2017 07:27:07 -0000 1.106 +++ usr.bin/mg/mg.1 28 Aug 2018 11:59:49 -0000 @@ -846,6 +846,9 @@ Currently only affects fill-paragraph. Set case-fold searching, causing case not to matter in regular expression searches. This is the default. +.It set-case-replace +Preserve the case of the replaced string. +This is the default. .It set-default-mode Append the supplied mode to the list of default modes used by subsequent buffer creation.