]> granicus.if.org Git - vim/commitdiff
patch 8.0.1250: 'hlsearch' highlighting not removed after incsearch v8.0.1250
authorBram Moolenaar <Bram@vim.org>
Thu, 2 Nov 2017 18:08:48 +0000 (19:08 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 2 Nov 2017 18:08:48 +0000 (19:08 +0100)
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)

runtime/doc/options.txt
src/ex_getln.c
src/testdir/test_search.vim
src/version.c

index 181aa94b2dbc3220873ff2070a4e52920eed3661..c3b5ab801892a6a7a6ad80774b7bac2fab5e6840 100644 (file)
@@ -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
index 717a0122486b24e765be5b416e02ff807562af08..0270477283c8f27c46d3b231052d3a83e6ae4169 100644 (file)
@@ -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
@@ -1945,6 +1952,7 @@ cmdline_changed:
            {
                i = 0;
                SET_NO_HLSEARCH(TRUE); /* turn off previous highlight */
+               redraw_all_later(SOME_VALID);
            }
            else
            {
@@ -2082,7 +2090,7 @@ returncmd:
        curwin->w_botline = old_botline;
        highlight_match = FALSE;
        validate_cursor();      /* needed for TAB */
-       redraw_later(SOME_VALID);
+       redraw_all_later(SOME_VALID);
     }
 #endif
 
index ded28f4839b9917e0e8ed41e55a6cc3469063e6a..be8b9a4b71f789f5a4536bd02c33e2a0d41a8d9a 100644 (file)
@@ -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!
@@ -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!
index 56e2910fd08cb673eb8f52a9683a6caa690ff770..e14c2fe03466413d233c1ef89b095bdff902502c 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1250,
 /**/
     1249,
 /**/