diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-05-07 07:57:29 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-07 07:57:29 +0800 |
commit | 9e34aa76c132b5637ed2f2dafa4487f4c850bf35 (patch) | |
tree | 263b1f59a368577352fd809f4bfb021acec4b176 | |
parent | e218965338ad8020935a10e678d2a7c6a059ee43 (diff) | |
download | rneovim-9e34aa76c132b5637ed2f2dafa4487f4c850bf35.tar.gz rneovim-9e34aa76c132b5637ed2f2dafa4487f4c850bf35.tar.bz2 rneovim-9e34aa76c132b5637ed2f2dafa4487f4c850bf35.zip |
vim-patch:9.0.1518: search stats not always visible when searching backwards (#23517)
Problem: Search stats not always visible when searching backwards.
Solution: Do not display the top/bot message on top of the search stats.
(Christian Brabandt, closes vim/vim#12322, closes vim/vim#12222)
https://github.com/vim/vim/commit/34a6a3617b5b6ce11372439f14762caddc4b0cea
Co-authored-by: Christian Brabandt <cb@256bit.org>
-rw-r--r-- | src/nvim/option_defs.h | 2 | ||||
-rw-r--r-- | src/nvim/search.c | 15 | ||||
-rw-r--r-- | test/functional/legacy/search_stat_spec.lua | 56 | ||||
-rw-r--r-- | test/old/testdir/test_search_stat.vim | 33 |
4 files changed, 95 insertions, 11 deletions
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h index 944cc583b3..dc652054e8 100644 --- a/src/nvim/option_defs.h +++ b/src/nvim/option_defs.h @@ -259,7 +259,7 @@ enum { SHM_COMPLETIONSCAN = 'C', ///< Completion scanning messages. SHM_RECORDING = 'q', ///< Short recording message. SHM_FILEINFO = 'F', ///< No file info messages. - SHM_SEARCHCOUNT = 'S', ///< Search stats: '[1/10]' + SHM_SEARCHCOUNT = 'S', ///< No search stats: '[1/10]' SHM_LEN = 30, ///< Max length of all flags together plus a NUL character. }; /// Represented by 'a' flag. diff --git a/src/nvim/search.c b/src/nvim/search.c index 8f1e9148d4..d1a31a357f 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -913,19 +913,22 @@ int searchit(win_T *win, buf_T *buf, pos_T *pos, pos_T *end_pos, Direction dir, || found || loop) { break; } - // + // If 'wrapscan' is set we continue at the other end of the file. - // If 'shortmess' does not contain 's', we give a message. + // If 'shortmess' does not contain 's', we give a message, but + // only, if we won't show the search stat later anyhow, + // (so SEARCH_COUNT must be absent). // This message is also remembered in keep_msg for when the screen // is redrawn. The keep_msg is cleared whenever another message is // written. - // if (dir == BACKWARD) { // start second loop at the other end lnum = buf->b_ml.ml_line_count; } else { lnum = 1; } - if (!shortmess(SHM_SEARCH) && (options & SEARCH_MSG)) { + if (!shortmess(SHM_SEARCH) + && shortmess(SHM_SEARCHCOUNT) + && (options & SEARCH_MSG)) { give_warning(_(dir == BACKWARD ? top_bot_msg : bot_top_msg), true); } if (extra_arg != NULL) { @@ -2702,8 +2705,10 @@ static void update_search_stat(int dirc, pos_T *pos, pos_T *cursor_pos, searchst lbuf = curbuf; } + // when searching backwards and having jumped to the first occurrence, + // cur must remain greater than 1 if (equalpos(lastpos, *cursor_pos) && !wraparound - && (dirc == 0 || dirc == '/' ? cur < cnt : cur > 0)) { + && (dirc == 0 || dirc == '/' ? cur < cnt : cur > 1)) { cur += dirc == 0 ? 0 : dirc == '/' ? 1 : -1; } else { proftime_T start; diff --git a/test/functional/legacy/search_stat_spec.lua b/test/functional/legacy/search_stat_spec.lua index 06e0b2320a..bd5ab68e5c 100644 --- a/test/functional/legacy/search_stat_spec.lua +++ b/test/functional/legacy/search_stat_spec.lua @@ -10,8 +10,9 @@ describe('search stat', function() screen:set_default_attr_ids({ [1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText [2] = {background = Screen.colors.Yellow}, -- Search - [3] = {foreground = Screen.colors.Blue4, background = Screen.colors.LightGrey}, -- Folded + [3] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey}, -- Folded [4] = {reverse = true}, -- IncSearch, TabLineFill + [5] = {foreground = Screen.colors.Red}, -- WarningMsg }) screen:attach() end) @@ -183,4 +184,57 @@ describe('search stat', function() /abc^ | ]]) end) + + -- oldtest: Test_search_stat_backwards() + it('when searching backwards', function() + screen:try_resize(60, 10) + exec([[ + set shm-=S + call setline(1, ['test', '']) + ]]) + + feed('*') + screen:expect([[ + {2:^test} | + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + /\<test\> [1/1] | + ]]) + + feed('N') + screen:expect([[ + {2:^test} | + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ?\<test\> [1/1] | + ]]) + + command('set shm+=S') + feed('N') + -- shows "Search Hit Bottom.." + screen:expect([[ + {2:^test} | + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {5:search hit TOP, continuing at BOTTOM} | + ]]) + end) end) diff --git a/test/old/testdir/test_search_stat.vim b/test/old/testdir/test_search_stat.vim index 8dfc850956..e7dc71e302 100644 --- a/test/old/testdir/test_search_stat.vim +++ b/test/old/testdir/test_search_stat.vim @@ -153,7 +153,6 @@ func Test_search_stat() let g:a = execute(':unsilent :norm! n') let stat = 'W \[20/1\]' call assert_match(pat .. stat, g:a) - call assert_match('search hit BOTTOM, continuing at TOP', g:a) set norl endif @@ -164,7 +163,6 @@ func Test_search_stat() let g:a = execute(':unsilent :norm! N') let stat = 'W \[20/20\]' call assert_match(pat .. stat, g:a) - call assert_match('search hit TOP, continuing at BOTTOM', g:a) call assert_match('W \[20/20\]', Screenline(&lines)) " normal, no match @@ -422,7 +420,7 @@ func Test_search_stat_and_incsearch() set tabline=%!MyTabLine() END - call writefile(lines, 'Xsearchstat_inc') + call writefile(lines, 'Xsearchstat_inc', 'D') let buf = RunVimInTerminal('-S Xsearchstat_inc', #{rows: 10}) call term_sendkeys(buf, "/abc") @@ -441,8 +439,35 @@ func Test_search_stat_and_incsearch() call TermWait(buf) call StopVimInTerminal(buf) - call delete('Xsearchstat_inc') endfunc +func Test_search_stat_backwards() + CheckScreendump + + let lines =<< trim END + set shm-=S + call setline(1, ['test', '']) + END + call writefile(lines, 'Xsearchstat_back', 'D') + + let buf = RunVimInTerminal('-S Xsearchstat_back', #{rows: 10}) + call term_sendkeys(buf, "*") + call TermWait(buf) + call VerifyScreenDump(buf, 'Test_searchstat_back_1', {}) + + call term_sendkeys(buf, "N") + call TermWait(buf) + call VerifyScreenDump(buf, 'Test_searchstat_back_2', {}) + + call term_sendkeys(buf, ":set shm+=S\<cr>N") + call TermWait(buf) + " shows "Search Hit Bottom.." + call VerifyScreenDump(buf, 'Test_searchstat_back_3', {}) + + call term_sendkeys(buf, "\<esc>:qa\<cr>") + call TermWait(buf) + + call StopVimInTerminal(buf) +endfunc " vim: shiftwidth=2 sts=2 expandtab |