강조 표시된 단어에서 커서 색상을 다르게 설정 검색 결과를 탐색 할 때 커서가있는 위치를

현재 사용중인 색상 표를 사용하면 검색 결과를 탐색 할 때 커서가있는 위치를 찾기가 어렵습니다. 커서를 찾기가 어려워 강조 표시 색상과 커서 색상이 혼합됩니다.

강조 표시된 단어에있을 때 커서 색상을 어떻게 다르게 설정합니까?



답변

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다른 시간에 (예 : 커서가 움직이는 경우) 호출하도록이 설정을 조정할 수 있습니다.

최신 정보:

최근 에 다른 질문에 대한 답변 으로이 고급 버전작성했습니다 . 다음과 같이 변경되었습니다.

  1. (선택 사항) 반복적으로 깜박임 : Conway의 원본 버전이 한 번만 깜박임 : 켜짐 및 꺼짐,
  2. 다른 명령 (예 : n다시 누르면 다음 경기로 이동) 을 입력하여 깜박임을 중단 할 수 있습니다 .이를 통해 더 긴 시간을 설정할 수 있습니다

업데이트 2 :

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>

답변

더 나은 색상을 선택할 수 있습니다. 이것을 vimrc에 넣으십시오.

hi Cursor guifg=#121212 guibg=#afd700

답변

내가 생각할 수있는 유일한 방법은 CursorMovedand CursorMovedIautocmds 를 사용하는 것입니다 . 커서가 움직일 때마다 호출됩니다 …

다음은 정확히 수행하는 코드입니다.

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


답변

나는 여기에 나열된 다른 답변과 해결책의 일부를하려고 여기에 있지만이 산만하고 오류 메시지 경향이 발견했다. timakro는 문제를 해결하고 지금까지 잘 작동 하는 플러그인 을 작성했습니다 .