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:
parent
2bf52dd065
commit
a43993897a
@ -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 --")
|
||||||
|
@ -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'.
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
|
16
src/match.c
16
src/match.c
@ -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)
|
||||||
{
|
{
|
||||||
|
13
src/normal.c
13
src/normal.c
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
|o+0&#ffffff0|n|e| @56
|
||||||
|
>f+0࿈ff13|o@1| | +0&#ffffff0@55
|
||||||
|
|b+0࿈ff13|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|
|
@ -0,0 +1,9 @@
|
|||||||
|
|o+0&#ffffff0|n|e| @56
|
||||||
|
>f+0࿈ff13|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|
|
@ -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࿈ff13|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|
|
@ -0,0 +1,9 @@
|
|||||||
|
|o+0&#ffffff0|n|e| @56
|
||||||
|
>f+0࿈ff13|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|
|
@ -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
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@ -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', \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user