একটি হাইলাইট শব্দের উপর যখন কার্সারের রঙ আলাদা করুন


19

আমি যে বর্তমান কলারশেমটি ব্যবহার করে আসছি তার সাথে অনুসন্ধানের ফলাফলের মাধ্যমে নেভিগেট করার সময় কার্সারটি কোথায় অবস্থিত তা সন্ধান করা শক্ত is হাইলাইট করা রঙ এবং কার্সার রঙটি কার্সারটি খুঁজে পাওয়া শক্ত করে এটি মিশ্রিত করছে।

যখন আমি হাইলাইট করা শব্দের সাথে কার্সারের রঙটি আলাদা করব তখন কীভাবে?

সমস্যার স্ক্রিনশট

উত্তর:


14

আমি এই স্নিপেটটি দামিয়ান কনওয়ের দুর্দান্ত কথাবার্তা, আরও তাত্ক্ষণিকভাবে আরও ভাল ভিমে (4 মি 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. (Ptionচ্ছিকভাবে) বারবার জ্বলজ্বল হয়: কনওয়ের মূল সংস্করণটি একবারে জ্বলজ্বল করে: চালু এবং তারপরে,
  2. আপনাকে অন্যান্য আদেশগুলি টাইপ করে ঝলকানি বাধতে দেয় (যেমন nপরের ম্যাচে ঝাঁপিয়ে পড়তে আবার টিপুন )) এটি আপনাকে দীর্ঘ সময় নির্ধারণের অনুমতি দেয়

আপডেট 2:

তেজ-searchhi প্লাগইন মূলত অনুরোধের বৈশিষ্ট্য প্রদান করে।


দুর্দান্ত কাজ করে। আমি এখন থেকে এটি ব্যবহার করা হবে। আমি কিছুক্ষণ পরে এই অধ্যবসায় বাস্তবায়নের চেষ্টা করব।
ma08

প্রথম 2 লাইন কি করে? আমি যতদূর দেখতে পাচ্ছি, নির্ধারিত ভেরিয়েবলগুলি ব্যবহৃত হয় না এবং আমি যদি এই লাইনগুলি সরিয়ে ফেলি তবে এটি এখনও কার্যকর হয়।
মার্টিন টর্নোইজ

@ কার্পেটস্মোকার এই লাইনগুলি (এখন মুছে ফেলা হয়েছে) ভাল পুরানো ফ্যাশনের ক্রাফট ছিল। আপনি যদি আলোচনাটি দেখেন, আপনি দেখতে পাবেন যে কয়েকটি পুনরাবৃত্তির পরে কনভও এই সমাধানে এসে পৌঁছেছে। অপ্রয়োজনীয় ভেরিয়েবলগুলি পূর্বের বৈচিত্রগুলিতে ব্যবহৃত হত, তবে এটির মধ্যে নয়। আমি সত্যই ভিমস্ক্রিপ্ট শিখতে শুরু করার আগে আমি আমার .vimrc এ এটি অনুলিপি করেছিলাম এবং আমার উত্তরটিতে এটি আটকানোর পরেও কোডটি আবার কখনও দেখেনি! ভাল বিক্ষোভ.
ধনী

আমি সম্প্রতি এই স্নিপেটের সাথে
ভিমন

এটি শুনে @ ব্যাজার খুশী :)
রিচ

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

আপনি একটি ভাল রঙ চয়ন করতে পারেন। এটি কেবল আপনার ভিআরসিআর-এ রাখুন:

hi Cursor guifg=#121212 guibg=#afd700

এটি সর্বদা একটি বিকল্প, আমি কেবল প্রেক্ষাপট অনুযায়ী রঙ সেট করা সম্ভব কিনা তা সন্ধান করছি।
ma08

আমি মনে করি না এটি ব্যবহারযোগ্য, তবে আপনি সনাক্ত করতে পারেন সন্ধানের প্যাটার্নটি (/ অথবা #) কার্সারের শব্দের অনুরূপ এবং কার্সার হাইলাইট পরিবর্তন করে
অ্যাডেলার্স ২q

3

আমি CursorMovedএবং CursorMovedIঅটোমডিএস ব্যবহার করেই কেবল ভাবতে পারি these এগুলি প্রতিবার কার্সার সরানো হলে ...

এখানে এমন কিছু কোড রয়েছে যা হুবহু এটি করে:

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 এর জন্য কাজ করে, কারণ কার্সার রঙ পরিবর্তন করা টার্মিনাল ভিমে সম্ভব নয় (এটি আপনার টার্মিনাল এমুলেটরে কনফিগার করা এমন কিছু, এবং ভিম বেশিরভাগ টার্মিনালে নিয়ন্ত্রণ করতে পারে না)।

  • আমি যে চরিত্রটিতে রয়েছি তা বর্তমান অনুসন্ধান শব্দটির অংশ এবং / বা হাইলাইট করা হচ্ছে কিনা তা যাচাই করার কোনও সুস্পষ্ট উপায় আমি খুঁজে পাচ্ছি না; একমাত্র উপায় হ'ল লাইনটি পাওয়া এবং এটি দিয়ে (আবার) রিজেক্সপ করা @/। আপনার সেটিংস (দেখুন ) এর মধ্যে /এবং এর match()উপর নির্ভর করে রেজিপ্সপ ব্যাখ্যায় কিছু ছোট পার্থক্য থাকতে পারে :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, এটি আরো ovbious যখন শুধুমাত্র একটি একক চরিত্র ম্যাচ করতে ব্যবহার করা হয় অন্যথায় এটি মসৃণ এরIncSearch


0

আমি এখানে তালিকাবদ্ধ অন্যান্য উত্তর এবং সমাধান কিছু চেষ্টা এখানে কিন্তু তাদের বিক্ষেপী এবং ত্রুটিসূচক বার্তাগুলি প্রবণ পাওয়া যায় নি। টিমক্রো একটি প্লাগইন লিখেছেন যা সমস্যাটি সমাধান করে এবং আমার জন্য এ পর্যন্ত ভাল কাজ করছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.