현재 사용중인 색상 표를 사용하면 검색 결과를 탐색 할 때 커서가있는 위치를 찾기가 어렵습니다. 커서를 찾기가 어려워 강조 표시 색상과 커서 색상이 혼합됩니다.
강조 표시된 단어에있을 때 커서 색상을 어떻게 다르게 설정합니까?
답변
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
다른 시간에 (예 : 커서가 움직이는 경우) 호출하도록이 설정을 조정할 수 있습니다.
최신 정보:
최근 에 다른 질문에 대한 답변 으로이 고급 버전 을 작성했습니다 . 다음과 같이 변경되었습니다.
- (선택 사항) 반복적으로 깜박임 : Conway의 원본 버전이 한 번만 깜박임 : 켜짐 및 꺼짐,
- 다른 명령 (예 :
n
다시 누르면 다음 경기로 이동) 을 입력하여 깜박임을 중단 할 수 있습니다 .이를 통해 더 긴 시간을 설정할 수 있습니다
업데이트 2 :
VIM-searchhi의 플러그인은 원래 요청한 기능을 제공합니다.
답변
여기 에 몇 가지 차이점이 있는 Rich의 답변을 기반으로합니다 .
- 일치하는 전류를 무기한 강조 표시하고 깜박 거리는 것을 발견했으며 다른 키 누르기가 등록되기 전에 약간의 0.1 초 지연이 발생했습니다.
- 그것은에서 답 통합 내가 얻을 수있는 ‘n’을 내가 함께 검색을 시작하는 경우에도 전진하는 방법을 ‘?’ 또는 ‘#’?
로 강조 표시를 지울 수 있습니다 <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
답변
내가 생각할 수있는 유일한 방법은 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