vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit d26ac2103119d7b809c15b980eb34f5974c5fac9 parent 821c113695540f79cbd908a5aec17207f0bc86f5 Author: Marc André Tanner <mat@brain-dump.org> Date: Wed, 13 Apr 2016 17:20:18 +0200 sam: improve ^ matching start of line There are some nasty differences between the meaning of ^ in Plan 9's regexp library and POSIX when using REG_NEWLINE. The former only matches at the beginning of a line wheras the latter matches the zero-length string immediately after a newline character \n. As a result this also matches after the very last newline at the end of the file. This is undesired behavior for a command like :x/^/c/#/ Hence we try to filter out this last match. Close #264 Diffstat:
| M | sam.c | | | 14 | ++++++++++---- |
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/sam.c b/sam.c @@ -833,7 +833,8 @@ static bool cmd_extract(Vis *vis, Win *win, Command *cmd, const char *argv[], Cu RegexMatch match[1]; while (start < end) { bool found = text_search_range_forward(txt, start, - end - start, cmd->regex, 1, match, 0) == 0; + end - start, cmd->regex, 1, match, + start > range->start ? REG_NOTBOL : 0) == 0; Filerange r = text_range_empty(); if (found) { if (argv[0][0] == 'x') @@ -845,10 +846,15 @@ static bool cmd_extract(Vis *vis, Win *win, Command *cmd, const char *argv[], Cu start++; continue; } - start = match[0].end+1; - } else { - start = match[0].end; + /* in Plan 9's regexp library ^ matches the beginning + * of a line, however in POSIX with REG_NEWLINE ^ + * matches the zero-length string immediately after a + * newline. Try filtering out the last such match at EOF. + */ + if (end == match[0].start && start > range->start) + break; } + start = match[0].end; } else { if (argv[0][0] == 'y') r = text_range_new(start, end);