neovim

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

commit 5fe310c5e689f2d19dc0a3a0dc4df367eb1182e3
parent ef0ec7edac5b7923955998ebddbfe02a1146bbf3
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Wed,  9 Jul 2025 07:47:15 +0800

vim-patch:9.1.1528: completion: crash with getcompletion()

Problem:  completion: crash with getcompletion()
          (zeertzjq)
Solution: Don't set may_expand_pattern in f_getcompletion(),
          unset may_expand_pattern() once it is not longer needed
          (Girish Palya).

fixes: vim/vim#17680
closes: vim/vim#17686

https://github.com/vim/vim/commit/f2ec8d4afc0623a477d198c42994544190b4e427

Co-authored-by: Christian Brabandt <cb@256bit.org>

Diffstat:
Msrc/nvim/cmdexpand.c | 3++-
Mtest/old/testdir/test_cmdline.vim | 31++++++++++++++++++-------------
2 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/src/nvim/cmdexpand.c b/src/nvim/cmdexpand.c @@ -249,13 +249,14 @@ int nextwild(expand_T *xp, int type, int options, bool escape) char *p; if (xp->xp_numfiles == -1) { - may_expand_pattern = options & WILD_MAY_EXPAND_PATTERN; pre_incsearch_pos = xp->xp_pre_incsearch_pos; if (ccline->input_fn && ccline->xp_context == EXPAND_COMMANDS) { // Expand commands typed in input() function set_cmd_context(xp, ccline->cmdbuff, ccline->cmdlen, ccline->cmdpos, false); } else { + may_expand_pattern = options & WILD_MAY_EXPAND_PATTERN; set_expand_context(xp); + may_expand_pattern = false; } if (xp->xp_context == EXPAND_LUA) { nlua_expand_pat(xp); diff --git a/test/old/testdir/test_cmdline.vim b/test/old/testdir/test_cmdline.vim @@ -4505,7 +4505,7 @@ func Test_search_complete() call feedkeys("gg/Fo\<tab>\<f9>", 'tx') call assert_equal(['Foobar', 'FooBARR'], g:compl_info.matches) call feedkeys("gg/FO\<tab>\<f9>", 'tx') - call assert_equal({}, g:compl_info) + call assert_equal({}, g:compl_info) call feedkeys("gg/\\cFo\<tab>\<f9>", 'tx') call assert_equal(['\cFoobar', '\cFooBAr', '\cFooBARR'], g:compl_info.matches) @@ -4525,7 +4525,12 @@ func Test_search_complete() call feedkeys("gg/Fo\<tab>\<f9>", 'tx') call assert_equal(['Foobar', 'FooBARR'], g:compl_info.matches) call feedkeys("gg/FO\<tab>\<f9>", 'tx') - call assert_equal({}, g:compl_info) + call assert_equal({}, g:compl_info) + + " Issue #17680 (getcompletion() does not support search completion) + let result = getcompletion('%s/', 'cmdline') + call assert_equal([], result) + call feedkeys("gg/foob\<tab>\<f9>", 'tx') call assert_equal(['foobar', 'foobarr'], g:compl_info.matches) call feedkeys("gg/\\Cfo\<tab>\<f9>", 'tx') @@ -4630,44 +4635,44 @@ func Test_range_complete() for trig in ["\<tab>", "\<c-z>"] call feedkeys($":%s/a{trig}\<f9>", 'xt') - call assert_equal(['ab', 'a', 'af'], g:compl_info.matches) + call assert_equal(['ab', 'a', 'af'], g:compl_info.matches) " call feedkeys($":vim9cmd :%s/a{trig}\<f9>", 'xt') call feedkeys($":verbose :%s/a{trig}\<f9>", 'xt') - call assert_equal(['ab', 'a', 'af'], g:compl_info.matches) + call assert_equal(['ab', 'a', 'af'], g:compl_info.matches) endfor call feedkeys(":%s/\<c-z>\<f9>", 'xt') - call assert_equal({}, g:compl_info) + call assert_equal({}, g:compl_info) for cmd in ['s', 'g'] - call feedkeys(":1,2" . cmd . "/a\<c-z>\<f9>", 'xt') - call assert_equal(['ab', 'a'], g:compl_info.matches) + call feedkeys($":1,2{cmd}/a\<c-z>\<f9>", 'xt') + call assert_equal(['ab', 'a'], g:compl_info.matches) endfor 1 call feedkeys(":.,+2s/a\<c-z>\<f9>", 'xt') - call assert_equal(['ab', 'a'], g:compl_info.matches) + call assert_equal(['ab', 'a'], g:compl_info.matches) /f call feedkeys(":1,s/b\<c-z>\<f9>", 'xt') - call assert_equal(['b', 'ba'], g:compl_info.matches) + call assert_equal(['b', 'ba'], g:compl_info.matches) /c call feedkeys(":\\?,4s/a\<c-z>\<f9>", 'xt') - call assert_equal(['a', 'af'], g:compl_info.matches) + call assert_equal(['a', 'af'], g:compl_info.matches) %s/c/c/ call feedkeys(":1,\\&s/a\<c-z>\<f9>", 'xt') - call assert_equal(['ab', 'a'], g:compl_info.matches) + call assert_equal(['ab', 'a'], g:compl_info.matches) 3 normal! ma call feedkeys(":'a,$s/a\<c-z>\<f9>", 'xt') - call assert_equal(['a', 'af'], g:compl_info.matches) + call assert_equal(['a', 'af'], g:compl_info.matches) " Line number followed by a search pattern ([start]/pattern/[command]) call feedkeys("3/a\<c-z>\<f9>", 'xt') - call assert_equal(['a', 'af', 'ab'], g:compl_info.matches) + call assert_equal(['a', 'af', 'ab'], g:compl_info.matches) bw! call Ntest_override("char_avail", 0)