diff options
author | zeertzjq <zeertzjq@outlook.com> | 2025-02-22 16:38:12 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-22 08:38:12 +0000 |
commit | 5cead869fb6ddc57594c0dc7e6e575f9427630c8 (patch) | |
tree | 20082ed888b758167edd10006c62f39b8a8b2b9a | |
parent | 8d7eb03040c26e8e3bdbf51b25fe03a735b85b5b (diff) | |
download | rneovim-5cead869fb6ddc57594c0dc7e6e575f9427630c8.tar.gz rneovim-5cead869fb6ddc57594c0dc7e6e575f9427630c8.tar.bz2 rneovim-5cead869fb6ddc57594c0dc7e6e575f9427630c8.zip |
vim-patch:9.1.1135: 'suffixesadd' doesn't work with multiple items (#32573)
Problem: 'suffixesadd' doesn't work with multiple items
(after 9.1.1122).
Solution: Don't concat multiple suffixes together.
(zeertzjq)
fixes: vim/vim#16694
closes: vim/vim#16699
https://github.com/vim/vim/commit/bf595ae4ac9ecc1e0620664177072926ed3679ff
-rw-r--r-- | src/nvim/file_search.c | 13 | ||||
-rw-r--r-- | test/old/testdir/test_findfile.vim | 30 | ||||
-rw-r--r-- | test/old/testdir/test_gf.vim | 32 |
3 files changed, 69 insertions, 6 deletions
diff --git a/src/nvim/file_search.c b/src/nvim/file_search.c index c374322d22..8ca0676a0f 100644 --- a/src/nvim/file_search.c +++ b/src/nvim/file_search.c @@ -856,6 +856,7 @@ char *vim_findfile(void *search_ctx_arg) // Try without extra suffix and then with suffixes // from 'suffixesadd'. + len = file_path.size; char *suf = search_ctx->ffsc_tagfile ? "" : curbuf->b_p_sua; while (true) { // if file exists and we didn't already find it @@ -916,8 +917,8 @@ char *vim_findfile(void *search_ctx_arg) break; } assert(MAXPATHL >= file_path.size); - file_path.size += copy_option_part(&suf, file_path.data + file_path.size, - MAXPATHL - file_path.size, ","); + file_path.size = len + copy_option_part(&suf, file_path.data + len, + MAXPATHL - len, ","); } } } else { @@ -1515,20 +1516,20 @@ char *find_file_in_path_option(char *ptr, size_t len, int options, int first, ch } // When the file doesn't exist, try adding parts of 'suffixesadd'. + size_t NameBufflen = l; char *suffix = suffixes; while (true) { if ((os_path_exists(NameBuff) && (find_what == FINDFILE_BOTH - || ((find_what == FINDFILE_DIR) - == os_isdir(NameBuff))))) { - file_name = xmemdupz(NameBuff, l); + || ((find_what == FINDFILE_DIR) == os_isdir(NameBuff))))) { + file_name = xmemdupz(NameBuff, NameBufflen); goto theend; } if (*suffix == NUL) { break; } assert(MAXPATHL >= l); - l += copy_option_part(&suffix, NameBuff + l, MAXPATHL - l, ","); + NameBufflen = l + copy_option_part(&suffix, NameBuff + l, MAXPATHL - l, ","); } } } diff --git a/test/old/testdir/test_findfile.vim b/test/old/testdir/test_findfile.vim index 539c7a661a..62cdd767be 100644 --- a/test/old/testdir/test_findfile.vim +++ b/test/old/testdir/test_findfile.vim @@ -222,6 +222,36 @@ func Test_finddir_error() call assert_fails('call finddir("x", repeat("x", 5000))', 'E854:') endfunc +func Test_findfile_with_suffixesadd() + let save_path = &path + let save_dir = getcwd() + set path=,, + call mkdir('Xfinddir1', 'pR') + cd Xfinddir1 + + call writefile([], 'foo.c', 'D') + call writefile([], 'bar.cpp', 'D') + call writefile([], 'baz.cc', 'D') + call writefile([], 'foo.o', 'D') + call writefile([], 'bar.o', 'D') + call writefile([], 'baz.o', 'D') + + set suffixesadd=.c,.cpp + call assert_equal('foo.c', findfile('foo')) + call assert_equal('./foo.c', findfile('./foo')) + call assert_equal('bar.cpp', findfile('bar')) + call assert_equal('./bar.cpp', findfile('./bar')) + call assert_equal('', findfile('baz')) + call assert_equal('', findfile('./baz')) + set suffixesadd+=.cc + call assert_equal('baz.cc', findfile('baz')) + call assert_equal('./baz.cc', findfile('./baz')) + + set suffixesadd& + call chdir(save_dir) + let &path = save_path +endfunc + " Test for the :find, :sfind and :tabfind commands func Test_find_cmd() new diff --git a/test/old/testdir/test_gf.vim b/test/old/testdir/test_gf.vim index 9824c8276e..0e5d8407bc 100644 --- a/test/old/testdir/test_gf.vim +++ b/test/old/testdir/test_gf.vim @@ -361,4 +361,36 @@ func Test_gf_switchbuf() %bw! endfunc +func Test_gf_with_suffixesadd() + let cwd = getcwd() + let dir = 'Xtestgf_sua_dir' + call mkdir(dir, 'R') + call chdir(dir) + + call writefile([], 'foo.c', 'D') + call writefile([], 'bar.cpp', 'D') + call writefile([], 'baz.cc', 'D') + call writefile([], 'foo.o', 'D') + call writefile([], 'bar.o', 'D') + call writefile([], 'baz.o', 'D') + + new + setlocal path=,, suffixesadd=.c,.cpp + call setline(1, ['./foo', './bar', './baz']) + exe "normal! gg\<C-W>f" + call assert_equal('foo.c', expand('%:t')) + close + exe "normal! 2gg\<C-W>f" + call assert_equal('bar.cpp', expand('%:t')) + close + call assert_fails('exe "normal! 3gg\<C-W>f"', 'E447:') + setlocal suffixesadd+=.cc + exe "normal! 3gg\<C-W>f" + call assert_equal('baz.cc', expand('%:t')) + close + + %bwipe! + call chdir(cwd) +endfunc + " vim: shiftwidth=2 sts=2 expandtab |