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:
Msam.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);