如何触发搜索结束或调用nohlsearch

How to trigger end of search or nohlsearch was called

我的 vimrc 中有以下代码

hi CurrentWordUL cterm=underline gui=underline
hi Search cterm=underline ctermfg=124 gui=underline guifg=#af0000

augroup MyHighlighter
  autocmd!
  " autocmd User IncSearchEnter MatchHighlighter 0
  " autocmd User IncSearchExecute MatchHighlighter 1

  set updatetime=700
  autocmd CursorHold * if (get(g:, 'matchhl', 1) && (&ft !~ join(g:ft_blacklist, '\|')))
\ | silent! exe printf('match CurrentWordUL /\<%s\>/', expand('<cword>'))
\ | endif
  autocmd CursorMoved * if (get(g:, 'matchhl', 1) && (&ft !~ join(g:ft_blacklist, '\|')))
\ | silent! exe printf('match none')
\ | endif
augroup END

nnoremap <silent> <f4> :MatchHighlighter<CR>
command! -nargs=? MatchHighlighter
\  call ToggleSetMatchHL(
\  empty(<q-args>) ? !get(g:, 'matchhl', 1) : expand(<q-args>))

function! ToggleSetMatchHL(arg) abort
match none | diffupdate | syntax sync fromstart
let g:matchhl = a:arg
endfunction

这样做的目的是突出显示(下划线)光标下的匹配词。

我遇到的问题是当我使用 /、?、*、# 等进行搜索时。匹配的突出显示会覆盖搜索突出显示。

我能知道 "end of search"(我不知道 "end of search" 的定义,但也许有人可以提出建议)或 "nohlsearch" 被调用了吗?

提前致谢。

  • 如果从 :match 切换到 :call matchadd(...),则可以指定 {priority}。负数会将突出显示 置于搜索突出显示 下方(优先级为 0;默认为 10)。
  • "end of search" 没有活动。您可以覆盖所有与搜索相关的命令(/?* 等);这将检测到 start 搜索。对于 /?,您可以定义 cmap <CR> 并检查 getcmdtype() =~# '[/?]' 以检测搜索的结论。我不推荐这种方法;映射可能会干扰其他插件。
  • 而不是使用 :match(这是 window-local,因此突出显示的行为也不同于内置搜索突出显示),您可以自动调整当前搜索模式(注册 /) 代替。我的 SearchHighlighting plugin 使用其 :SearchAutoHighlighting 命令选择了这种方法。 (插件页面有许多您可能想要查看的替代插件的链接;我更喜欢维护良好的插件,而不是我 ~/.vimrc 中的自定义代码片段。)