| tex: support regular expression groups in :s replacement - neatvi - [fork] simp… | |
| git clone git://src.adamsgaard.dk/neatvi | |
| Log | |
| Files | |
| Refs | |
| README | |
| --- | |
| commit 9cc9b8bb918f8a581ed57c730a42d4fe85b3152c | |
| parent df9f5a424f9e869ce1367f3c9ee3ceee84683f9f | |
| Author: Ali Gholami Rudi <[email protected]> | |
| Date: Sat, 7 May 2016 21:35:01 +0430 | |
| ex: support regular expression groups in :s replacement | |
| Diffstat: | |
| M ex.c | 21 ++++++++++++++++++++- | |
| 1 file changed, 20 insertions(+), 1 deletion(-) | |
| --- | |
| diff --git a/ex.c b/ex.c | |
| t@@ -660,6 +660,25 @@ static int ec_mark(char *ec) | |
| return 0; | |
| } | |
| +static void replace(struct sbuf *dst, char *rep, char *ln, int *offs) | |
| +{ | |
| + while (rep[0]) { | |
| + if (rep[0] == '\\' && rep[1]) { | |
| + if (rep[1] >= '0' && rep[1] <= '9') { | |
| + int grp = (rep[1] - '0') * 2; | |
| + int len = offs[grp + 1] - offs[grp]; | |
| + sbuf_mem(dst, ln + offs[grp], len); | |
| + } else { | |
| + sbuf_chr(dst, (unsigned char) rep[1]); | |
| + } | |
| + rep++; | |
| + } else { | |
| + sbuf_chr(dst, (unsigned char) rep[0]); | |
| + } | |
| + rep++; | |
| + } | |
| +} | |
| + | |
| static int ec_substitute(char *ec) | |
| { | |
| char loc[EXLEN]; | |
| t@@ -697,7 +716,7 @@ static int ec_substitute(char *ec) | |
| struct sbuf *r = sbuf_make(); | |
| while (rset_find(re, ln, LEN(offs) / 2, offs, 0) >= 0) { | |
| sbuf_mem(r, ln, offs[0]); | |
| - sbuf_str(r, rep); | |
| + replace(r, rep, ln, offs); | |
| ln += offs[1]; | |
| if (!strchr(s, 'g')) | |
| break; |