neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit b60a2ab4cb7bb7d86dcda1dfe2396a9eda384e35
parent f660b794808ac809ee8cafe82ddd824840bc8e2c
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Mon, 17 Jul 2023 10:15:45 +0800

fix(inccommand): block errors when parsing command line again (#24374)

Revert the change to ex_getln.c from a741c7fd0465c949a0016fcbee5f4526b65f8c02
Diffstat:
Msrc/nvim/ex_getln.c | 5+++++
Mtest/functional/ui/inccommand_spec.lua | 18++++++++++++++++--
2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c @@ -261,6 +261,7 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s return false; } + emsg_off++; exarg_T ea = { .line1 = 1, .line2 = 1, @@ -368,6 +369,7 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s curwin->w_cursor = save_cursor; retval = true; theend: + emsg_off--; return retval; } @@ -2427,9 +2429,12 @@ static bool cmdpreview_may_show(CommandLineState *s) int cmdpreview_type = 0; char *cmdline = xstrdup(ccline.cmdbuff); const char *errormsg = NULL; + emsg_off++; // Block errors when parsing the command line, and don't update v:errmsg if (!parse_cmdline(cmdline, &ea, &cmdinfo, &errormsg)) { + emsg_off--; goto end; } + emsg_off--; // Check if command is previewable, if not, don't attempt to show preview if (!(ea.argt & EX_PREVIEW)) { diff --git a/test/functional/ui/inccommand_spec.lua b/test/functional/ui/inccommand_spec.lua @@ -3086,8 +3086,7 @@ end) it('long :%s/ with inccommand does not collapse cmdline', function() clear() local screen = Screen.new(10,5) - common_setup(screen) - command('set inccommand=nosplit') + common_setup(screen, 'nosplit') feed(':%s/AAAAAAA', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A') screen:expect([[ @@ -3099,6 +3098,21 @@ it('long :%s/ with inccommand does not collapse cmdline', function() ]]) end) +it("with 'inccommand' typing invalid `={expr}` does not show error", function() + clear() + local screen = Screen.new(30, 6) + common_setup(screen, 'nosplit') + feed(':edit `=`') + screen:expect([[ + | + {15:~ }| + {15:~ }| + {15:~ }| + {15:~ }| + :edit `=`^ | + ]]) +end) + it("with 'inccommand' typing :filter doesn't segfault or leak memory #19057", function() clear() common_setup(nil, 'nosplit')