vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit b77abc418d6ce268c442fd24e5ac9441d2202c6d
parent a5a936d91170235653596bdfdf5a4a7df281472a
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Mon, 19 Feb 2018 16:55:22 +0100

sam: fix g/^$/

With POSIX ERE the pattern ^$ matches strings ending with a new
line because an empty match is reported after the trailing newline
at the very end of the input.

This is undesirable for use cases like

  x g/^$/ d

which is supposed to delete all empty lines of a file.

As a fix we disregard empty matches at the end of the given range.

Diffstat:
Msam.c | 9+++++++--
1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/sam.c b/sam.c @@ -1343,8 +1343,13 @@ static bool cmd_delete(Vis *vis, Win *win, Command *cmd, const char *argv[], Sel static bool cmd_guard(Vis *vis, Win *win, Command *cmd, const char *argv[], Selection *sel, Filerange *range) { if (!win) return false; - bool match = !cmd->regex || !text_search_range_forward(win->file->text, range->start, - text_range_size(range), cmd->regex, 0, NULL, 0); + bool match = false; + RegexMatch captures[1]; + size_t len = text_range_size(range); + if (!cmd->regex) + match = true; + else if (!text_search_range_forward(win->file->text, range->start, len, cmd->regex, 1, captures, 0)) + match = captures[0].start < range->end; if ((count_evaluate(cmd) && match) ^ (argv[0][0] == 'v')) return sam_execute(vis, win, cmd->cmd, sel, range); view_selections_dispose_force(sel);