Skip to content

Commit

Permalink
patch 8.0.1250: 'hlsearch' highlighting not removed after incsearch
Browse files Browse the repository at this point in the history
Problem:    'hlsearch' highlighting not removed after incsearch (lacygoill)
Solution:   Redraw all windows. Start search at the end of the match.  Improve
            how CTRL-G works with incremental search. Add tests. (Christian
            Brabandt, Hirohito Higashi, haya14busa, closes #2267)
  • Loading branch information
brammool committed Nov 2, 2017
1 parent c20e0d5 commit f8f8b2e
Show file tree
Hide file tree
Showing 4 changed files with 125 additions and 3 deletions.
4 changes: 2 additions & 2 deletions runtime/doc/options.txt
Expand Up @@ -4454,8 +4454,8 @@ A jump table for the options with a short description can be found at |Q_op|.
Example: >
augroup vimrc-incsearch-highlight
autocmd!
autocmd CmdlineEnter [/\?] :set hlsearch
autocmd CmdlineLeave [/\?] :set nohlsearch
autocmd CmdlineEnter /,\? :set hlsearch
autocmd CmdlineLeave /,\? :set nohlsearch
augroup END
<
CTRL-L can be used to add one character from after the current match
Expand Down
10 changes: 9 additions & 1 deletion src/ex_getln.c
Expand Up @@ -1717,12 +1717,19 @@ getcmdline(
pos_T t;
int search_flags = SEARCH_NOOF;

if (ccline.cmdlen == 0)
goto cmdline_not_changed;

save_last_search_pattern();
cursor_off();
out_flush();
if (c == Ctrl_G)
{
t = match_end;
if (LT_POS(match_start, match_end))
/* start searching at the end of the match
* not at the beginning of the next column */
(void)decl(&t);
search_flags += SEARCH_COL;
}
else
Expand Down Expand Up @@ -1945,6 +1952,7 @@ getcmdline(
{
i = 0;
SET_NO_HLSEARCH(TRUE); /* turn off previous highlight */
redraw_all_later(SOME_VALID);
}
else
{
Expand Down Expand Up @@ -2082,7 +2090,7 @@ getcmdline(
curwin->w_botline = old_botline;
highlight_match = FALSE;
validate_cursor(); /* needed for TAB */
redraw_later(SOME_VALID);
redraw_all_later(SOME_VALID);
}
#endif

Expand Down
112 changes: 112 additions & 0 deletions src/testdir/test_search.vim
Expand Up @@ -397,6 +397,117 @@ func Test_search_cmdline5()
bw!
endfunc

func Test_search_cmdline6()
" Test that consecutive matches
" are caught by <c-g>/<c-t>
if !exists('+incsearch')
return
endif
" need to disable char_avail,
" so that expansion of commandline works
call test_override("char_avail", 1)
new
call setline(1, [' bbvimb', ''])
set incsearch
" first match
norm! gg0
call feedkeys("/b\<cr>", 'tx')
call assert_equal([0,1,2,0], getpos('.'))
" second match
norm! gg0
call feedkeys("/b\<c-g>\<cr>", 'tx')
call assert_equal([0,1,3,0], getpos('.'))
" third match
norm! gg0
call feedkeys("/b\<c-g>\<c-g>\<cr>", 'tx')
call assert_equal([0,1,7,0], getpos('.'))
" first match again
norm! gg0
call feedkeys("/b\<c-g>\<c-g>\<c-g>\<cr>", 'tx')
call assert_equal([0,1,2,0], getpos('.'))
set nowrapscan
" last match
norm! gg0
call feedkeys("/b\<c-g>\<c-g>\<c-g>\<cr>", 'tx')
call assert_equal([0,1,7,0], getpos('.'))
" clean up
set wrapscan&vim
set noincsearch
call test_override("char_avail", 0)
bw!
endfunc

func Test_search_cmdline7()
" Test that an pressing <c-g> in an empty command line
" does not move the cursor
if !exists('+incsearch')
return
endif
" need to disable char_avail,
" so that expansion of commandline works
call test_override("char_avail", 1)
new
let @/='b'
call setline(1, [' bbvimb', ''])
set incsearch
" first match
norm! gg0
" moves to next match of previous search pattern, just like /<cr>
call feedkeys("/\<c-g>\<cr>", 'tx')
call assert_equal([0,1,2,0], getpos('.'))
" moves to next match of previous search pattern, just like /<cr>
call feedkeys("/\<cr>", 'tx')
call assert_equal([0,1,3,0], getpos('.'))
" moves to next match of previous search pattern, just like /<cr>
call feedkeys("/\<c-t>\<cr>", 'tx')
call assert_equal([0,1,7,0], getpos('.'))
set noincsearch
call test_override("char_avail", 0)
bw!
endfunc

func Test_search_cmdline8()
" Highlighting is cleared in all windows
" since hls applies to all windows
if !exists('+incsearch') || !has('terminal') || has('gui_running') || winwidth(0) < 30
return
endif
if has("win32")
throw "Skipped: Bug with sending <ESC> to terminal window not fixed yet"
endif
let h = winheight(0)
if h < 3
return
endif
" Prepare buffer text
let lines = ['abb vim vim vi', 'vimvivim']
call writefile(lines, 'Xsearch.txt')
let g:buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3})

call term_wait(g:buf, 200)
call assert_equal(lines[0], term_getline(g:buf, 1))
call assert_equal(lines[1], term_getline(g:buf, 2))

call term_sendkeys(g:buf, ":set incsearch hlsearch\<cr>")
call term_sendkeys(g:buf, ":14vsp\<cr>")
call term_sendkeys(g:buf, "/vim\<cr>")
call term_sendkeys(g:buf, "/b\<esc>")
call term_sendkeys(g:buf, "gg0")
call term_wait(g:buf, 500)
let screen_line = term_scrape(g:buf, 1)
let [a0,a1,a2,a3] = [screen_line[3].attr, screen_line[4].attr,
\ screen_line[18].attr, screen_line[19].attr]
call assert_notequal(a0, a1)
call assert_notequal(a0, a3)
call assert_notequal(a1, a2)
call assert_equal(a0, a2)
call assert_equal(a1, a3)
" clean up
call delete('Xsearch.txt')

bwipe!
endfunc

" Tests for regexp with various magic settings
func Test_search_regexp()
enew!
Expand Down Expand Up @@ -566,6 +677,7 @@ func Test_search_cmdline_incsearch_highlight_attr()
let attr_line2 = [a0,a0,a0,a0,a0,a0,a0,a0]
call assert_equal(attr_line1, map(term_scrape(g:buf, 1)[:len(attr_line1)-1], 'v:val.attr'))
call assert_equal(attr_line2, map(term_scrape(g:buf, 2)[:len(attr_line2)-1], 'v:val.attr'))
call delete('Xsearch.txt')

call delete('Xsearch.txt')
bwipe!
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -761,6 +761,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1250,
/**/
1249,
/**/
Expand Down

0 comments on commit f8f8b2e

Please sign in to comment.