Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add CurSearch highlight group #10133

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions runtime/doc/options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
h (obsolete, ignored)
|hl-IncSearch| i 'incsearch' highlighting
|hl-CurSearch| y current instance of last search pattern
|hl-Search| l last search pattern highlighting (see 'hlsearch')
|hl-MoreMsg| m |more-prompt|
|hl-ModeMsg| M Mode (e.g., "-- INSERT --")
Expand Down
2 changes: 2 additions & 0 deletions runtime/doc/syntax.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5318,6 +5318,8 @@ QuickFixLine Current |quickfix| item in the quickfix window.
*hl-Search*
Search Last search pattern highlighting (see 'hlsearch').
Also used for similar items that need to stand out.
*hl-CurSearch*
CurSearch Current match for the last search pattern (see 'hlsearch').
*hl-SpecialKey*
SpecialKey Meta and special keys listed with ":map", also for text used
to show unprintable characters in the text, 'listchars'.
Expand Down
1 change: 1 addition & 0 deletions src/highlight.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ static char *(highlight_init_both[]) = {
"default link QuickFixLine Search",
"default link CursorLineSign SignColumn",
"default link CursorLineFold FoldColumn",
"default link CurSearch Search",
CENT("Normal cterm=NONE", "Normal gui=NONE"),
NULL
};
Expand Down
16 changes: 16 additions & 0 deletions src/match.c
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,7 @@ prepare_search_hl_line(
shl = &cur->hl;
shl->startcol = MAXCOL;
shl->endcol = MAXCOL;
shl->lines = 0;
shl->attr_cur = 0;
shl->is_addpos = FALSE;
if (cur != NULL)
Expand All @@ -674,6 +675,10 @@ prepare_search_hl_line(
shl->endcol = shl->rm.endpos[0].col;
else
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.
if (shl->startcol == shl->endcol)
{
Expand Down Expand Up @@ -768,6 +773,17 @@ update_search_hl(
else
*has_match_conc = 0;
# 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)
{
Expand Down
7 changes: 7 additions & 0 deletions src/normal.c
Original file line number Diff line number Diff line change
Expand Up @@ -4153,6 +4153,7 @@ nv_search(cmdarg_T *cap)
? 0 : SEARCH_MARK, NULL);
}


/*
* Handle "N" and "n" commands.
* cap->arg is SEARCH_REV for "N", 0 for "n".
Expand All @@ -4173,6 +4174,12 @@ nv_next(cmdarg_T *cap)
(void)normal_search(cap, 0, NULL, SEARCH_MARK | cap->arg, NULL);
cap->count1 -= 1;
}

#ifdef FEAT_SEARCH_EXTRA
// Redraw the window to refresh the highlighted matches.
if (i > 0 && p_hls && !no_hlsearch)
redraw_later(VALID);
#endif
}

/*
Expand Down
2 changes: 1 addition & 1 deletion src/optiondefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ struct vimoption
# define ISP_LATIN1 (char_u *)"@,161-255"
#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
#if defined(FEAT_PYTHON) && defined(FEAT_PYTHON3)
Expand Down
1 change: 1 addition & 0 deletions src/structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -3329,6 +3329,7 @@ typedef struct
// found match (may continue in next line)
buf_T *buf; // the buffer 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_cur; // attributes currently active in win_line()
linenr_T first_lnum; // first lnum to search for multi-line pat
Expand Down
9 changes: 9 additions & 0 deletions src/testdir/dumps/Test_hlsearch_cursearch_multiple_line.dump
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
|f+0&#ffff4012|o@1| | +0&#ffffff0@55
|b+0&#ffff4012|a|r| +0&#ffffff0@56
|b|a|z| @56
>f+0&#4040ff13|o@1| | +0&#ffffff0@55
|b+0&#4040ff13|a|r| +0&#ffffff0@56
|~+0#4040ff13&| @58
|~| @58
|~| @58
|/+0#0000000&|f|o@1|\|n|b|a|r| @32|4|,|1| @10|A|l@1|
9 changes: 9 additions & 0 deletions src/testdir/dumps/Test_hlsearch_cursearch_single_line.dump
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
|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
|~| @58
|/+0#0000000&|f|o@1| @37|4|,|1| @10|A|l@1|
24 changes: 24 additions & 0 deletions src/testdir/test_search.vim
Original file line number Diff line number Diff line change
Expand Up @@ -1038,6 +1038,30 @@ func Test_incsearch_substitute_long_line()
bwipe!
endfunc

func Test_hlsearch_cursearch()
CheckScreendump

let lines =<< trim END
set hlsearch scrolloff=0
call setline(1, ['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>")
sleep 100m
call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line', {})

call term_sendkeys(buf, "gg/foo\\nbar\<CR>")
sleep 100m
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.
func Test_incsearch_substitute_dump()
CheckOption incsearch
Expand Down
3 changes: 2 additions & 1 deletion src/vim.h
Original file line number Diff line number Diff line change
Expand Up @@ -1410,6 +1410,7 @@ typedef enum
, HLF_H // obsolete, ignored
, HLF_I // incremental search
, HLF_L // last search string
, HLF_LC // last search string under cursor
, HLF_M // "--More--" message
, HLF_CM // Mode (e.g., "-- INSERT --")
, HLF_N // line number for ":number" and ":#" commands
Expand Down Expand Up @@ -1457,7 +1458,7 @@ typedef enum

// The HL_FLAGS must be in the same order as the HLF_ enums!
// 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', \
'w', 'W', 'f', 'F', 'A', 'C', 'D', 'T', '-', '>', \
'B', 'P', 'R', 'L', \
Expand Down