tex: support regular expression groups in :s replacement - neatvi - [fork] simple vi-type editor with UTF-8 support (HTM) git clone git://src.adamsgaard.dk/neatvi (DIR) Log (DIR) Files (DIR) Refs (DIR) README --- (DIR) commit 9cc9b8bb918f8a581ed57c730a42d4fe85b3152c (DIR) parent df9f5a424f9e869ce1367f3c9ee3ceee84683f9f (HTM) Author: Ali Gholami Rudi <ali@rudi.ir> 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(-) --- (DIR) 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;