Yanıtlar:
Bu pasajı Damian Conway'in muhteşem konuşması olan More Instantly Better Vim'den (4m 59s) kullanıyorum. Arama sonuçları arasında sıçradığınızda tüm vurgulamanın kısa bir süre yanıp sönmesine neden olur.
" 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
Vurgulama değişikliğinin daha kalıcı olmasını istiyorsanız, bunu matchdelete
başka bir zamanda aramak için değiştirebilirsiniz (örneğin imleç hareket ettiğinde).
Geçenlerde başka bir soruya yanıt olarak bu daha gelişmiş sürümü yazdım . Aşağıdaki değişikliklere sahiptir ::
n
sonraki eşleşmeye atlamak için tekrar basmak gibi ) Bu, daha uzun bir süre belirlemenizi sağlar.Vim-searchhi eklentisi başlangıçta istediği özelliği sağlar.
Rich'in burada bazı farklılıklar ile verdiği cevaba dayanarak :
Vurgulamayı ile temizleyebilirsiniz <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>
Daha iyi bir renk seçebilirsiniz. Bunu vimrc'nize koyun:
hi Cursor guifg=#121212 guibg=#afd700
Aklıma gelen tek yol, CursorMoved
ve CursorMovedI
autocmds kullanmaktır, bunlar imleç her hareket ettirildiğinde çağrılır ...
İşte tam olarak bunu yapan bazı kod:
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>/
Bazı uyarılar var :
Bu sadece gVim için çalışır, çünkü terminal Vim'de imleç rengini değiştirmek mümkün değildir (bu terminal emülatöründe yapılandırdığınız bir şeydir ve Vim'in çoğu terminalde kontrol edebileceği bir şey değildir).
Bulunduğum karakterin mevcut arama teriminin bir parçası olup olmadığını ve / veya vurgulanıp vurgulanmadığını kontrol etmek için açık bir yol bulamıyorum; tek yol hattı almak ve (tekrar) ile regexp @/
. Ayarlarınız arasında /
ve match()
ayarlarınıza bağlı olarak normal ifade yorumunda bazı küçük farklılıklar olabilir (bkz. :help match()
).
Şu anda bir şeyi gerçekten vurgulayıp vurgulamadığımızı kontrol etmenin bir yolunu bulamıyorum, @/
kayıtta ne vurguladığımızdan bağımsız olarak son kullanılan aramayı içeriyor. Yaptığım şey, öncelikle aktif bir arama yaptığımızı belirtmek /
için g:searching
değişkeni ayarlamaktan ve vurgulamayı temizlemek için <C-l>
çağırdığımız ve arama yapmadığımızı belirtmek için yanlış olarak :nohlsearch
ayarladığımız g:searching
için yeniden düzenlemektir ...
Bu, imleç her hareket ettiğinde çalıştırılır , özellikle büyük dosyalar / satırlar, yavaş sistemler veya karmaşık normal ifadeler için çok hızlı olmayabilir (yine de benim için iyi çalışıyor gibi görünüyor).
İşleri minimumda tutmak, ancak yine de benim için mükemmel çalışıyor, yukarıdan ilham aldım: düz vurgulama 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>
Şimdi, n
olmadan bile hlsearch
bana imleci hareket ettirene kadar nereye gittiğimi gösteriyor. SpellRare
Aksi takdirde pürüzsüz, yalnızca tek bir karakter maçları daha ovbious yapmak için kullanılırIncSearch