강조 표시된 단어에서 커서 색상을 다르게 설정


19

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

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

문제의 스크린 샷

답변:


14

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의 플러그인은 원래 요청한 기능을 제공합니다.


잘 작동합니다. 나는 지금부터 이것을 사용할 것입니다. 언젠가는 지속성을 구현하려고 노력할 것입니다.
ma08

처음 두 줄은 무엇을합니까? 내가 볼 수있는 한 할당 된 변수는 사용되지 않으며 해당 줄을 제거해도 여전히 작동합니다.
Martin Tournoij

@Carpetsmoker 그 라인 (지금 삭제)은 구식 크 루프트였습니다. 대화를 보면 몇 번의 반복 후에 Conway가이 솔루션에 도달 한 것을 알 수 있습니다. 불필요한 변수는 이전 변수에서는 사용되었지만이 변수에서는 사용되지 않았습니다. 나는 실제로 vimscript를 배우기 전에 그것을 .vimrc에 복사했으며, 내 대답에 붙여 넣을 때도 코드를 다시 보지 않았습니다. 잘 발견되었습니다.
Rich

나는 최근에 vim-pulse (이것이라고 불린다) 애드온을이 스 니펫으로 교체했으며 훨씬 더 빠르다
craigp

@Badger 다행입니다. :)
Rich

5

여기 에 몇 가지 차이점이 있는 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>

3

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

hi Cursor guifg=#121212 guibg=#afd700

그것은 항상 옵션이며, 상황에 따라 색상을 설정할 수 있는지 확인하려고합니다.
ma08

나는이 유용 생각하지 않습니다,하지만 당신은 (에 / 또는 #)의 검색 패턴 경우 감지 할 수 커서 아래의 단어와 동일한 및 변경 커서 강조
adelarsq

3

내가 생각할 수있는 유일한 방법은 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로 다시 매핑 하는 것입니다 ...

  • 이것은 커서가 움직일 때마다 실행 되며 특히 큰 파일 / 줄, 느린 시스템 또는 복잡한 정규 표현식의 경우 빠르지 않을 수 있습니다 (하지만 괜찮습니다).


1

일을 최소화하지만 여전히 완벽하게 작동하려면 위에서 영감을 얻었습니다 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


0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.