एक हाइलाइट किए गए शब्द पर कर्सर का रंग अलग सेट करें


19

वर्तमान colourscheme के साथ मैं उपयोग कर रहा हूं, यह खोजना मुश्किल है कि खोज परिणामों के माध्यम से नेविगेट करते समय कर्सर कहाँ स्थित है। हाइलाइटिंग रंग और कर्सर रंग सम्मिश्रण कर रहे हैं ताकि कर्सर को ढूंढना मुश्किल हो जाए।

जब मैं एक हाइलाइट किए गए शब्द पर होता है तो मैं कर्सर का रंग कैसे अलग कर सकता हूं?

समस्या का स्क्रीनशॉट

जवाबों:


14

मैं इस स्निपेट का उपयोग डेमियन कॉनवे की शानदार बातचीत, अधिक तुरन्त बेहतर विम (4 मी 59 के दशक में) से करता हूं । जब आप खोज परिणामों के बीच छलांग लगाते हैं, तो यह पूरी तरह से संक्षिप्त रूप से झपकने का कारण बनता है।

" 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. (वैकल्पिक रूप से) बार-बार झपकाता है: कॉनवे का मूल संस्करण सिर्फ एक बार झपकाता है: चालू और फिर बंद,
  2. आपको अन्य आदेशों को टाइप करके पलक झपकने की अनुमति देता है (जैसे nकि अगले मैच में फिर से कूदने के लिए दबाव डालना ।) यह आपको लंबे समय तक सेट करने की अनुमति देता है।

अद्यतन 2:

Vim-searchhi प्लगइन मूल रूप से अनुरोधित सुविधा प्रदान करता है।


बहुत अच्छा काम करता है। मैं अभी से इसका उपयोग करूंगा। मैं कुछ समय बाद लगातार एक को लागू करने की कोशिश करूंगा।
ma08

पहली 2 लाइनें क्या करती हैं? जहाँ तक मैं देख सकता हूँ, निर्धारित चर का उपयोग नहीं किया गया है, और यदि मैं उन पंक्तियों को हटाता हूँ, तो भी यह काम करता है।
मार्टिन टूरनोइज

@Carpetsmoker उन पंक्तियों (अब हटाए गए) अच्छे पुराने जमाने के cruft थे। यदि आप बात देखते हैं, तो आप देखेंगे कि कॉनवे कुछ पुनरावृत्तियों के बाद इस समाधान पर आता है। अनावश्यक चर का उपयोग पहले के बदलावों में किया गया था, लेकिन इस एक में नहीं। मैंने इसे अपने .vimrc पर कॉपी कर लिया, इससे पहले कि मैं वास्तव में vimcript सीखना शुरू कर दूं, और जाहिर है कि कोड को फिर कभी नहीं देखा, यहां तक ​​कि जब तक कि यह मेरे उत्तर में पेस्ट न हो जाए! अच्छी तरह से देखा गया।
रिच

मैं हाल ही में vim-पल्स (मुझे लगता है कि यह कहा जाता है) इस स्निपेट के साथ ऐड-ऑन की जगह है और यह काफी बेहतर / तेज है
craigp

@ बेजर को यह सुनकर खुशी हुई। :)
रिच

5

रिच के जवाब के आधार पर यहां कुछ अंतर हैं:

आप के साथ हाइलाइटिंग साफ़ कर सकते हैं <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

एक ही रास्ता मैं के बारे में सोच सकते हैं का उपयोग करना है CursorMovedऔर 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>/

कुछ चेतावनी हैं :

  • यह केवल gVim के लिए काम करता है, क्योंकि कर्सर का रंग टर्मिनल Vim में बदलना संभव नहीं है (यह कुछ ऐसा है जिसे आप अपने टर्मिनल एमुलेटर में कॉन्फ़िगर करते हैं, और कुछ ऐसा नहीं है जो विम अधिकांश टर्मिनलों में नियंत्रित कर सकता है)।

  • मुझे यह देखने का कोई स्पष्ट तरीका नहीं मिल रहा है कि क्या मैं जिस चरित्र पर हूं वह वर्तमान खोज शब्द का हिस्सा है और / या हाइलाइट किया जा रहा है; एकमात्र तरीका लाइन प्राप्त करना है, और regexp कि (फिर से) के साथ @/। आपकी सेटिंग्स (देखें ) के बीच /और match()उसके आधार पर regexp व्याख्या पर कुछ मामूली अंतर हो सकते हैं :help match()

  • मुझे यह जांचने का कोई तरीका नहीं मिल रहा है कि क्या हम वास्तव में किसी चीज को उजागर कर रहे हैं, @/रजिस्टर में अंतिम उपयोग की गई खोज शामिल है, फिर चाहे हम किसी भी चीज को उजागर कर रहे हों। इसलिए मैंने जो किया, वह यह था कि /पहले g:searchingहम एक सक्रिय खोज कर रहे हैं, और <C-l>हम :nohlsearchहाइलाइटिंग को खाली करने के लिए कॉल करने के लिए वैरिएबल सेट करने के लिए रिमैप करते हैं, और g:searchingयह संकेत देने के लिए कि हम खोज नहीं कर रहे हैं, यह बताने के लिए सेट किया गया है ...

  • यह हर बार कर्सर के चलने पर चलाया जाता है , यह विशेष रूप से बड़ी फ़ाइलों / लाइनों, धीमी प्रणाली या जटिल रीजैक्स के लिए बहुत तेज़ नहीं हो सकता है (हालांकि यह मेरे लिए ठीक काम करता है)।


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उपयोग केवल एक ही चरित्र से मेल खाने पर इसे और अधिक शानदार बनाने के लिए किया जाता है, अन्यथा यह चिकना हैIncSearch


0

मैं यहाँ सूचीबद्ध अन्य उत्तर और समाधान के कुछ करने की कोशिश की यहाँ लेकिन उन्हें ध्यान भंग और त्रुटि संदेश से ग्रस्त पाया गया। timakro ने एक प्लगइन लिखा है जो समस्या को हल करता है और अब तक मेरे लिए अच्छा काम कर रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.