neovim

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

commit d38da27f1e1e4d8f2ff0af94b32aa531a9183255
parent 29b80f6f2e9391b5d78390f65d09f00f73829310
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Sat, 26 Nov 2022 07:32:45 +0800

vim-patch:9.0.0950: the pattern "\_s\zs" matches at EOL (#21192)

Problem:    The pattern "\_s\zs" matches at EOL.
Solution:   Make the pattern "\_s\zs" match at the start of the next line.
            (closes vim/vim#11617)

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

Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat:
Msrc/nvim/search.c | 21++++++++++++---------
Msrc/nvim/testdir/test_search.vim | 26++++++++++++++++++++++++--
2 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/src/nvim/search.c b/src/nvim/search.c @@ -655,6 +655,8 @@ int searchit(win_T *win, buf_T *buf, pos_T *pos, pos_T *end_pos, Direction dir, // match (this is vi compatible) or on the next char. if (dir == FORWARD && at_first_line) { match_ok = true; + matchcol = col; + // When the match starts in a next line it's certainly // past the start position. // When match lands on a NUL the cursor will be put @@ -679,20 +681,21 @@ int searchit(win_T *win, buf_T *buf, pos_T *pos, pos_T *end_pos, Direction dir, break; } matchcol = endpos.col; - // for empty match (matchcol == matchpos.col): advance one char + // for empty match: advance one char + if (matchcol == matchpos.col && ptr[matchcol] != NUL) { + matchcol += utfc_ptr2len(ptr + matchcol); + } } else { - // Prepare to start after first matched character. - matchcol = matchpos.col; - } - - if (matchcol == matchpos.col && ptr[matchcol] != NUL) { - matchcol += utfc_ptr2len(ptr + matchcol); + // Advance "matchcol" to the next character. + // This does not use matchpos.col, because + // "\zs" may have have set it. + if (ptr[matchcol] != NUL) { + matchcol += utfc_ptr2len(ptr + matchcol); + } } - if (matchcol == 0 && (options & SEARCH_START)) { break; } - if (ptr[matchcol] == NUL || (nmatched = vim_regexec_multi(&regmatch, win, buf, lnum, matchcol, tm, diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim @@ -1816,7 +1816,7 @@ func Test_search_smartcase_utf8() set ignorecase& smartcase& let &encoding = save_enc - close! + bwipe! endfunc " Test searching past the end of a file @@ -1825,7 +1825,29 @@ func Test_search_past_eof() call setline(1, ['Line']) exe "normal /\\n\\zs\<CR>" call assert_equal([1, 4], [line('.'), col('.')]) - close! + bwipe! +endfunc + +" Test setting the start of the match and still finding a next match in the +" same line. +func Test_search_set_start_same_line() + new + set cpo-=c + + call setline(1, ['1', '2', '3 .', '4', '5']) + exe "normal /\\_s\\zs\\S\<CR>" + call assert_equal([2, 1], [line('.'), col('.')]) + exe 'normal n' + call assert_equal([3, 1], [line('.'), col('.')]) + exe 'normal n' + call assert_equal([3, 3], [line('.'), col('.')]) + exe 'normal n' + call assert_equal([4, 1], [line('.'), col('.')]) + exe 'normal n' + call assert_equal([5, 1], [line('.'), col('.')]) + + set cpo+=c + bwipe! endfunc " Test for various search offsets