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