1
0
forked from aniani/vim

patch 8.2.4724: current instance of last search pattern not easily spotted

Problem:    Current instance of last search pattern not easily spotted.
Solution:   Add CurSearch highlighting. (closes #10133)
This commit is contained in:
LemonBoy 2022-04-09 21:04:08 +01:00 committed by Bram Moolenaar
parent 2bf52dd065
commit a43993897a
14 changed files with 103 additions and 2 deletions

View File

@ -4165,6 +4165,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|hl-ErrorMsg| e error messages |hl-ErrorMsg| e error messages
h (obsolete, ignored) h (obsolete, ignored)
|hl-IncSearch| i 'incsearch' highlighting |hl-IncSearch| i 'incsearch' highlighting
|hl-CurSearch| y current instance of last search pattern
|hl-Search| l last search pattern highlighting (see 'hlsearch') |hl-Search| l last search pattern highlighting (see 'hlsearch')
|hl-MoreMsg| m |more-prompt| |hl-MoreMsg| m |more-prompt|
|hl-ModeMsg| M Mode (e.g., "-- INSERT --") |hl-ModeMsg| M Mode (e.g., "-- INSERT --")

View File

@ -5318,6 +5318,8 @@ QuickFixLine Current |quickfix| item in the quickfix window.
*hl-Search* *hl-Search*
Search Last search pattern highlighting (see 'hlsearch'). Search Last search pattern highlighting (see 'hlsearch').
Also used for similar items that need to stand out. Also used for similar items that need to stand out.
*hl-CurSearch*
CurSearch Current match for the last search pattern (see 'hlsearch').
*hl-SpecialKey* *hl-SpecialKey*
SpecialKey Meta and special keys listed with ":map", also for text used SpecialKey Meta and special keys listed with ":map", also for text used
to show unprintable characters in the text, 'listchars'. to show unprintable characters in the text, 'listchars'.

View File

@ -157,6 +157,7 @@ static char *(highlight_init_both[]) = {
"default link QuickFixLine Search", "default link QuickFixLine Search",
"default link CursorLineSign SignColumn", "default link CursorLineSign SignColumn",
"default link CursorLineFold FoldColumn", "default link CursorLineFold FoldColumn",
"default link CurSearch Search",
CENT("Normal cterm=NONE", "Normal gui=NONE"), CENT("Normal cterm=NONE", "Normal gui=NONE"),
NULL NULL
}; };

View File

@ -652,6 +652,7 @@ prepare_search_hl_line(
shl = &cur->hl; shl = &cur->hl;
shl->startcol = MAXCOL; shl->startcol = MAXCOL;
shl->endcol = MAXCOL; shl->endcol = MAXCOL;
shl->lines = 0;
shl->attr_cur = 0; shl->attr_cur = 0;
shl->is_addpos = FALSE; shl->is_addpos = FALSE;
if (cur != NULL) if (cur != NULL)
@ -674,6 +675,10 @@ prepare_search_hl_line(
shl->endcol = shl->rm.endpos[0].col; shl->endcol = shl->rm.endpos[0].col;
else else
shl->endcol = MAXCOL; shl->endcol = MAXCOL;
if (shl->rm.endpos[0].lnum != shl->rm.startpos[0].lnum)
shl->lines = shl->rm.endpos[0].lnum - shl->rm.startpos[0].lnum;
else
shl->lines = 1;
// Highlight one character for an empty match. // Highlight one character for an empty match.
if (shl->startcol == shl->endcol) if (shl->startcol == shl->endcol)
{ {
@ -768,6 +773,17 @@ update_search_hl(
else else
*has_match_conc = 0; *has_match_conc = 0;
# endif # endif
// Highlight the match were the cursor is using the CurSearch
// group.
if (shl == search_hl
&& wp->w_cursor.lnum >= shl->lnum
&& wp->w_cursor.lnum < shl->lnum + shl->lines
&& wp->w_cursor.col >= shl->startcol
&& wp->w_cursor.col < shl->endcol)
{
shl->attr_cur = HL_ATTR(HLF_LC);
}
} }
else if (col == shl->endcol) else if (col == shl->endcol)
{ {

View File

@ -4153,6 +4153,7 @@ nv_search(cmdarg_T *cap)
? 0 : SEARCH_MARK, NULL); ? 0 : SEARCH_MARK, NULL);
} }
/* /*
* Handle "N" and "n" commands. * Handle "N" and "n" commands.
* cap->arg is SEARCH_REV for "N", 0 for "n". * cap->arg is SEARCH_REV for "N", 0 for "n".
@ -4173,6 +4174,12 @@ nv_next(cmdarg_T *cap)
(void)normal_search(cap, 0, NULL, SEARCH_MARK | cap->arg, NULL); (void)normal_search(cap, 0, NULL, SEARCH_MARK | cap->arg, NULL);
cap->count1 -= 1; cap->count1 -= 1;
} }
#ifdef FEAT_SEARCH_EXTRA
// Redraw the window to refresh the highlighted matches.
if (i > 0 && p_hls && !no_hlsearch)
redraw_later(SOME_VALID);
#endif
} }
/* /*
@ -4190,6 +4197,7 @@ normal_search(
{ {
int i; int i;
searchit_arg_T sia; searchit_arg_T sia;
pos_T prev_cursor = curwin->w_cursor;
cap->oap->motion_type = MCHAR; cap->oap->motion_type = MCHAR;
cap->oap->inclusive = FALSE; cap->oap->inclusive = FALSE;
@ -4213,6 +4221,11 @@ normal_search(
foldOpenCursor(); foldOpenCursor();
#endif #endif
} }
#ifdef FEAT_SEARCH_EXTRA
// Redraw the window to refresh the highlighted matches.
if (!EQUAL_POS(curwin->w_cursor, prev_cursor) && p_hls && !no_hlsearch)
redraw_later(SOME_VALID);
#endif
// "/$" will put the cursor after the end of the line, may need to // "/$" will put the cursor after the end of the line, may need to
// correct that here // correct that here

View File

@ -299,7 +299,7 @@ struct vimoption
# define ISP_LATIN1 (char_u *)"@,161-255" # define ISP_LATIN1 (char_u *)"@,161-255"
#endif #endif
# define HIGHLIGHT_INIT "8:SpecialKey,~:EndOfBuffer,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,a:LineNrAbove,b:LineNrBelow,N:CursorLineNr,G:CursorLineSign,O:CursorLineFold,r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title,v:Visual,V:VisualNOS,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn,A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn,-:Conceal,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar,X:PmenuThumb,*:TabLine,#:TabLineSel,_:TabLineFill,!:CursorColumn,.:CursorLine,o:ColorColumn,q:QuickFixLine,z:StatusLineTerm,Z:StatusLineTermNC" # define HIGHLIGHT_INIT "8:SpecialKey,~:EndOfBuffer,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,y:CurSearch,m:MoreMsg,M:ModeMsg,n:LineNr,a:LineNrAbove,b:LineNrBelow,N:CursorLineNr,G:CursorLineSign,O:CursorLineFold,r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title,v:Visual,V:VisualNOS,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn,A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn,-:Conceal,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar,X:PmenuThumb,*:TabLine,#:TabLineSel,_:TabLineFill,!:CursorColumn,.:CursorLine,o:ColorColumn,q:QuickFixLine,z:StatusLineTerm,Z:StatusLineTermNC"
// Default python version for pyx* commands // Default python version for pyx* commands
#if defined(FEAT_PYTHON) && defined(FEAT_PYTHON3) #if defined(FEAT_PYTHON) && defined(FEAT_PYTHON3)

View File

@ -3329,6 +3329,7 @@ typedef struct
// found match (may continue in next line) // found match (may continue in next line)
buf_T *buf; // the buffer to search for a match buf_T *buf; // the buffer to search for a match
linenr_T lnum; // the line to search for a match linenr_T lnum; // the line to search for a match
linenr_T lines; // number of lines starting from lnum
int attr; // attributes to be used for a match int attr; // attributes to be used for a match
int attr_cur; // attributes currently active in win_line() int attr_cur; // attributes currently active in win_line()
linenr_T first_lnum; // first lnum to search for multi-line pat linenr_T first_lnum; // first lnum to search for multi-line pat

View File

@ -0,0 +1,9 @@
|o+0&#ffffff0|n|e| @56
>f+0&#4040ff13|o@1| | +0&#ffffff0@55
|b+0&#4040ff13|a|r| +0&#ffffff0@56
|b|a|z| @56
|f+0&#ffff4012|o@1| | +0&#ffffff0@55
|b+0&#ffff4012|a|r| +0&#ffffff0@56
|~+0#4040ff13&| @58
|~| @58
|/+0#0000000&|f|o@1|\|n|b|a|r| @32|2|,|1| @10|A|l@1|

View File

@ -0,0 +1,9 @@
|o+0&#ffffff0|n|e| @56
>f+0&#4040ff13|o@1| +0&#ffffff0@56
|b|a|r| @56
|b|a|z| @56
|f+0&#ffff4012|o@1| +0&#ffffff0@56
|b|a|r| @56
|~+0#4040ff13&| @58
|~| @58
|/+0#0000000&|f|o@1| @37|2|,|1| @10|A|l@1|

View File

@ -0,0 +1,9 @@
|o+0&#ffffff0|n|e| @56
|f+0&#ffff4012|o@1| +0&#ffffff0@56
|b|a|r| @56
|b|a|z| @56
>f+0&#4040ff13|o@1| +0&#ffffff0@56
|b|a|r| @56
|~+0#4040ff13&| @58
|~| @58
|/+0#0000000&|f|o@1| @37|5|,|1| @10|A|l@1|

View File

@ -0,0 +1,9 @@
|o+0&#ffffff0|n|e| @56
>f+0&#4040ff13|o@1| +0&#ffffff0@56
|b|a|r| @56
|b|a|z| @56
|f+0&#ffff4012|o@1| +0&#ffffff0@56
|b|a|r| @56
|~+0#4040ff13&| @58
|~| @58
|?+0#0000000&|f|o@1| @37|2|,|1| @10|A|l@1|

View File

@ -1038,6 +1038,34 @@ func Test_incsearch_substitute_long_line()
bwipe! bwipe!
endfunc endfunc
func Test_hlsearch_cursearch()
CheckScreendump
let lines =<< trim END
set hlsearch scrolloff=0
call setline(1, ['one', 'foo', 'bar', 'baz', 'foo', 'bar'])
hi Search ctermbg=yellow
hi CurSearch ctermbg=blue
END
call writefile(lines, 'Xhlsearch_cursearch')
let buf = RunVimInTerminal('-S Xhlsearch_cursearch', {'rows': 9, 'cols': 60})
call term_sendkeys(buf, "gg/foo\<CR>")
call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_1', {})
call term_sendkeys(buf, "n")
call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_2', {})
call term_sendkeys(buf, "?\<CR>")
call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_3', {})
call term_sendkeys(buf, "gg/foo\\nbar\<CR>")
call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_multiple_line', {})
call StopVimInTerminal(buf)
call delete('Xhlsearch_cursearch')
endfunc
" Similar to Test_incsearch_substitute() but with a screendump halfway. " Similar to Test_incsearch_substitute() but with a screendump halfway.
func Test_incsearch_substitute_dump() func Test_incsearch_substitute_dump()
CheckOption incsearch CheckOption incsearch

View File

@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4724,
/**/ /**/
4723, 4723,
/**/ /**/

View File

@ -1410,6 +1410,7 @@ typedef enum
, HLF_H // obsolete, ignored , HLF_H // obsolete, ignored
, HLF_I // incremental search , HLF_I // incremental search
, HLF_L // last search string , HLF_L // last search string
, HLF_LC // last search string under cursor
, HLF_M // "--More--" message , HLF_M // "--More--" message
, HLF_CM // Mode (e.g., "-- INSERT --") , HLF_CM // Mode (e.g., "-- INSERT --")
, HLF_N // line number for ":number" and ":#" commands , HLF_N // line number for ":number" and ":#" commands
@ -1457,7 +1458,7 @@ typedef enum
// The HL_FLAGS must be in the same order as the HLF_ enums! // The HL_FLAGS must be in the same order as the HLF_ enums!
// When changing this also adjust the default for 'highlight'. // When changing this also adjust the default for 'highlight'.
#define HL_FLAGS {'8', '~', '@', 'd', 'e', 'h', 'i', 'l', 'm', 'M', \ #define HL_FLAGS {'8', '~', '@', 'd', 'e', 'h', 'i', 'l', 'y', 'm', 'M', \
'n', 'a', 'b', 'N', 'G', 'O', 'r', 's', 'S', 'c', 't', 'v', 'V', \ 'n', 'a', 'b', 'N', 'G', 'O', 'r', 's', 'S', 'c', 't', 'v', 'V', \
'w', 'W', 'f', 'F', 'A', 'C', 'D', 'T', '-', '>', \ 'w', 'W', 'f', 'F', 'A', 'C', 'D', 'T', '-', '>', \
'B', 'P', 'R', 'L', \ 'B', 'P', 'R', 'L', \