From 04b3c327723587fa63f391884b8dfce44233cc77 Mon Sep 17 00:00:00 2001 From: KillTheMule Date: Sun, 5 Nov 2017 17:11:44 +0100 Subject: [PATCH] 'inccommand': Fix matches for zero-width (#7487) closes #7485 --- src/nvim/ex_cmds.c | 4 +++ test/functional/ui/inccommand_spec.lua | 36 ++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 112f53247c..39059a2c80 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -3478,6 +3478,10 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout) else ++matchcol; } + // match will be pushed to preview_lines, bring it into a proper state + current_match.start.col = matchcol; + current_match.end.lnum = sub_firstlnum; + current_match.end.col = matchcol; goto skip; } diff --git a/test/functional/ui/inccommand_spec.lua b/test/functional/ui/inccommand_spec.lua index 6646e65bad..53fd17c309 100644 --- a/test/functional/ui/inccommand_spec.lua +++ b/test/functional/ui/inccommand_spec.lua @@ -1791,6 +1791,42 @@ describe("'inccommand' with 'gdefault'", function() expect("A\nA") eq({mode='n', blocking=false}, nvim("get_mode")) end) + + it("does not crash on zero-width matches #7485", function() + common_setup(nil, "split", default_text) + command("set gdefault") + feed("gg") + feed("Vj") + feed(":s/\\%V") + eq({mode='c', blocking=false}, nvim("get_mode")) + feed("") + eq({mode='n', blocking=false}, nvim("get_mode")) + end) + + it("removes highlights after abort for a zero-width match", function() + local screen = Screen.new(30,5) + common_setup(screen, "nosplit", default_text) + command("set gdefault") + + feed(":%s/\\%1c/a/") + screen:expect([[ + {12:a}Inc substitution on | + {12:a}two lines | + {12:a} | + {15:~ }| + :%s/\%1c/a/^ | + ]]) + + feed("") + screen:expect([[ + Inc substitution on | + two lines | + ^ | + {15:~ }| + | + ]]) + end) + end) describe(":substitute", function()