답변:
Damian Conway의 환상적인 강연 인 More Instantly Better Vim (4m 59s) 의이 스 니펫을 사용합니다 . 검색 결과 사이를 뛰어 넘을 때 전체 강조 표시가 잠깐 동안 깜박입니다.
" Damian Conway's Die Blinkënmatchen: highlight matches
nnoremap <silent> n n:call HLNext(0.1)<cr>
nnoremap <silent> N N:call HLNext(0.1)<cr>
function! HLNext (blinktime)
let target_pat = '\c\%#'.@/
let ring = matchadd('ErrorMsg', target_pat, 101)
redraw
exec 'sleep ' . float2nr(a:blinktime * 1000) . 'm'
call matchdelete(ring)
redraw
endfunction
강조 표시 변경 사항을보다 영구적으로 유지하려면 matchdelete
다른 시간에 (예 : 커서가 움직이는 경우) 호출하도록이 설정을 조정할 수 있습니다.
최근 에 다른 질문에 대한 답변 으로이 고급 버전 을 작성했습니다 . 다음과 같이 변경되었습니다.
n
다시 누르면 다음 경기로 이동) 을 입력하여 깜박임을 중단 할 수 있습니다 .이를 통해 더 긴 시간을 설정할 수 있습니다VIM-searchhi의 플러그인은 원래 요청한 기능을 제공합니다.
여기 에 몇 가지 차이점이 있는 Rich의 답변을 기반으로합니다 .
로 강조 표시를 지울 수 있습니다 <C-l>
.
fun! SearchHighlight()
silent! call matchdelete(b:ring)
let b:ring = matchadd('ErrorMsg', '\c\%#' . @/, 101)
endfun
fun! SearchNext()
try
execute 'normal! ' . 'Nn'[v:searchforward]
catch /E385:/
echohl ErrorMsg | echo "E385: search hit BOTTOM without match for: " . @/ | echohl None
endtry
call SearchHighlight()
endfun
fun! SearchPrev()
try
execute 'normal! ' . 'nN'[v:searchforward]
catch /E384:/
echohl ErrorMsg | echo "E384: search hit TOP without match for: " . @/ | echohl None
endtry
call SearchHighlight()
endfun
" Highlight entry
nnoremap <silent> n :call SearchNext()<CR>
nnoremap <silent> N :call SearchPrev()<CR>
" Use <C-L> to clear some highlighting
nnoremap <silent> <C-L> :silent! call matchdelete(b:ring)<CR>:nohlsearch<CR>:set nolist nospell<CR><C-L>
내가 생각할 수있는 유일한 방법은 CursorMoved
and CursorMovedI
autocmds 를 사용하는 것입니다 . 커서가 움직일 때마다 호출됩니다 ...
다음은 정확히 수행하는 코드입니다.
fun! CursorColour()
if !g:searching | return | endif
let l:prev_end = 0
" Loop until we've found all matches of the current search pattern
while 1
let l:start = match(getline('.'), @/, l:prev_end)
" No more matches: stop looping
if l:start == -1 | break | endif
let l:cursor = col('.')
" Check if the cursor is inside the string
if l:cursor > l:start && l:cursor <= l:start + strlen(@/)
hi Cursor guifg=#121212 guibg=#afd700
return
endif
" Set start location for next loop iteration
let l:prev_end = l:start + strlen(@/)
endwhile
" We return if we're on a highlighted string, if we're here we didn't
" match anything
call ResetCursorColour()
endfun
fun! ResetCursorColour()
hi Cursor guifg=#ffffff guibg=#000000
endfun
autocmd CursorMoved,CursorMovedI * call CursorColour()
let g:searching=0
nnoremap <silent> <C-L> :nohlsearch<CR>:let g:searching=0<CR>:call ResetCursorColour()<CR><C-L>
nnoremap / :let g:searching=1<CR>/
몇 가지 주의 사항이 있습니다 .
이것은 터미널 Vim에서 커서 색상을 변경할 수 없기 때문에 gVim에서만 작동합니다 (이것은 터미널 에뮬레이터에서 구성하는 것이며 Vim이 대부분의 터미널에서 제어 할 수있는 것은 아닙니다).
내가있는 캐릭터가 현재 검색어의 일부인지 또는 강조 표시 중인지 확인할 수있는 확실한 방법을 찾을 수 없습니다. 유일한 방법은 줄을 가져 와서 (다시) 정규 표현식을 사용하는 것입니다 @/
. 사이 정규 표현식 해석에 약간의 차이가있을 수 있습니다 /
및 match()
설정에 따라 (참조 :help match()
).
현재 실제로 강조 표시하고 있는지 확인하는 방법을 찾을 수 없습니다. @/
레지스터에는 강조 표시된 내용에 관계없이 마지막으로 사용한 검색이 포함됩니다. 그래서 내가 한 것은 /
먼저 g:searching
활성 검색을 수행하고 있음을 나타내 도록 변수를 설정 하고 강조 표시를 지우도록 <C-l>
호출 :nohlsearch
하고 g:searching
검색하지 않음을 나타내려면 false로 다시 매핑 하는 것입니다 ...
이것은 커서가 움직일 때마다 실행 되며 특히 큰 파일 / 줄, 느린 시스템 또는 복잡한 정규 표현식의 경우 빠르지 않을 수 있습니다 (하지만 괜찮습니다).
일을 최소화하지만 여전히 완벽하게 작동하려면 위에서 영감을 얻었습니다 CursorMoved
.
function! HLNext()
let l:higroup = matchend(getline('.'), '\c'.@/, col('.')-1) == col('.')
\ ? 'SpellRare' : 'IncSearch'
let b:cur_match = matchadd(l:higroup, '\c\%#'.@/, 101)
redraw
augroup HLNext
autocmd CursorMoved <buffer>
\ execute 'silent! call matchdelete('.b:cur_match.')'
\ | redraw
\ | autocmd! HLNext
augroup END
endfunction
nnoremap <silent> * *:call HLNext()<CR>
nnoremap <silent> # #:call HLNext()<CR>
nnoremap <silent> n n:call HLNext()<cr>
nnoremap <silent> N N:call HLNext()<cr>
이제 n
도없이 hlsearch
내가 커서를 이동시킬 때까지 내가 착륙 나 쇼. 은 SpellRare
그렇지 않으면 원활한입니다, 경우에만 단일 문자의 일치가 더 ovbious 만드는 데 사용됩니다IncSearch