Vurgulanan kelimedeyken imleç rengini farklı ayarla


19

Kullandığım mevcut renk şeması ile, arama sonuçlarında gezinirken imlecin nereye yerleştirildiğini bulmak zor. Vurgulama rengi ve imleç rengi, imleci bulmayı zorlaştırmak için harmanlanmıştır.

Vurgulanan kelimede olduğunda imleç rengini nasıl farklı ayarlayabilirim?

Sorunun ekran görüntüsü

Yanıtlar:


14

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 matchdeletebaşka bir zamanda aramak için değiştirebilirsiniz (örneğin imleç hareket ettiğinde).

GÜNCELLEME:

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 ::

  1. (İsteğe bağlı) art arda yanıp sönüyor: Conway'in orijinal sürümü yalnızca bir kez yanıp sönüyor: açık ve kapalı,
  2. Başka komutlar yazarak yanıp sönmeyi kesmenizi sağlar (bir nsonraki eşleşmeye atlamak için tekrar basmak gibi ) Bu, daha uzun bir süre belirlemenizi sağlar.

GÜNCELLEME 2:

Vim-searchhi eklentisi başlangıçta istediği özelliği sağlar.


Harika çalışıyor. Bunu bundan sonra kullanacağım. Kalıcı olanı bir süre sonra uygulamaya çalışacağım.
ma08

İlk 2 satır ne işe yarar? Görebildiğim kadarıyla, atanan değişkenler kullanılmıyor ve bu satırları kaldırırsam hala çalışıyor.
Martin Tournoij

@Carpetsmoker Bu satırlar (şimdi silindi) eski moda bir hamleydi. Konuşmayı izlerseniz, Conway'in birkaç tekrardan sonra bu çözüme ulaştığını göreceksiniz. Gereksiz değişkenler önceki varyasyonlarda kullanılmıştır, ancak bu değişkenlerde kullanılmamıştır. Gerçekten vimscript öğrenmeye başlamadan önce .vimrc'ye kopyaladım ve açıkçası cevabımın içine yapıştırırken bile koda bir daha bakmadım! İyi gördüm.
Zengin

Geçenlerde vim-pulse (sanırım denir) eklentisini bu snippet ile değiştirdim ve çok daha iyi / daha hızlı
15'te craigp

@Badger Bunu duyduğuma sevindim. :)
Zengin

5

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>

3

Daha iyi bir renk seçebilirsiniz. Bunu vimrc'nize koyun:

hi Cursor guifg=#121212 guibg=#afd700

Bu her zaman bir seçenek, sadece içeriğe göre renk ayarlamanın mümkün olup olmadığını görmek için arıyorum.
ma08

Bunun yararlı olduğunu düşünmüyorum, ancak arama deseninin (açık / veya #) imlecin altındaki kelimeyle aynı olup olmadığını tespit edebilir ve İmleç vurgulamasını değiştirebilirsiniz
adelarsq

3

Aklıma gelen tek yol, CursorMovedve CursorMovedIautocmds 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:searchingdeğişkeni ayarlamaktan ve vurgulamayı temizlemek için <C-l>çağırdığımız ve arama yapmadığımızı belirtmek için yanlış olarak :nohlsearchayarladığımız g:searchingiç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).


1

İş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, nolmadan bile hlsearchbana imleci hareket ettirene kadar nereye gittiğimi gösteriyor. SpellRareAksi takdirde pürüzsüz, yalnızca tek bir karakter maçları daha ovbious yapmak için kullanılırIncSearch


0

Burada listelenen diğer cevapları ve burada çözümü denedim, ancak dikkat dağıtıcı ve hata mesajlarına eğilimli buldum. timakro sorunu çözen ve benim için şimdiye kadar iyi çalışan bir eklenti yazdı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.