ভিমে সমস্ত খোলা ট্যাবগুলিতে কীভাবে বর্তমান শব্দটি অনুসন্ধান করবেন?


16

আমি ব্যবহার করে *এবং #কার্সারটি বর্তমান শব্দের উপরে থাকা অবস্থায় ভিম শব্দ-অনুসন্ধান শিখতে শুরু করেছি । তবে এই অনুসন্ধানটি বর্তমান ফাইল বাফারের মধ্যে সীমাবদ্ধ।

এই অনুসন্ধানটি এখানে প্রসারিত করার জন্য কোনও আদেশ বা শর্টকাট রয়েছে:

  1. সমস্ত খোলা ট্যাব?
  2. সব খোলা বাফার?

1
আপনি ট্যাব বনাম বাফারগুলির এই ব্যাখ্যাটি আকর্ষণীয় এবং সহায়ক বলে মনে করতে পারেন।
ওয়াইল্ডকার্ড

উত্তর:


4

আপনার সমস্যার সঠিক সমাধান আমার কাছে নেই, আশা করি আমার চেয়ে ভাল উত্তর আসবে। তবে এইভাবে আমি সমস্ত বাফারগুলিতে একটি শব্দ খুঁজে পাওয়ার সমস্যাটি মোকাবিলা করেছি।

" enables to search in all open buffers with :Search <pattern>
command! -nargs=1 Search call setqflist([]) | silent bufdo grepadd! <args> %

nnoremap <left>  :cprev<cr>zvzz
nnoremap <right> :cnext<cr>zvzz

প্রথম লাইনটি Searchআর্গুমেন্ট হিসাবে অনুসন্ধানের প্যাটার্ন সহ একটি কমান্ড তৈরি করে , যা একটি চটজলদি তালিকায় ফলাফল লিখে। অন্য দুটি লাইন দরকারী কিছুতে অকেজো কী (কমপক্ষে আমার জন্য) ম্যাপ করে; তারা পরবর্তী / পূর্ববর্তী অনুসন্ধানে বা পরবর্তী / পূর্ববর্তী সংকলন ত্রুটি ইত্যাদিতে লাফিয়ে ম্যাপ করা হয়, তারা কেবলমাত্র কুইকফিক্স তালিকাকে ফেলে দেয়। আপনি নিম্নলিখিত হিসাবে এটি ব্যবহার করতে পারেন:

:Search foobar
<right>
<right>
…

আমি এই আদেশটি পছন্দ করি, তবে কয়েকটি জিনিস যুক্ত করেছি যাতে এটি অনুসন্ধানের শব্দগুলি আরও ভালভাবে পালাতে পারে এবং পুনরায় চিত্রকে বাধ্য করতে পারে। (বিভাজন সহ নিঃশব্দ ব্যবহারের ফলে ভিআইএম ইউআই বিগ আউট হতে পারে)। কমান্ড! -nargs = 1 অনুসন্ধান কল setqflist ([]) | নীরব সম্পাদনা "বুফডো গ্রেপ্যাড! '<আরগস>'%" | পুনরায় আঁকুন!
ইগরিও

আপনি কেবল টাইপ করতে পারেন :cnবা :cpপরবর্তী নথিতে স্যুইচ করতে পারেন।
ফায়াত

7

এটি আসলে ডিফল্ট আচরণ যদিও এটি লক্ষ্য করা শক্ত হতে পারে: *এরপরে অন্য ট্যাবে পরিবর্তন করে চেষ্টা করুন এবং হিটগুলির মধ্যে পিছনে পিছনে যেতে কমান্ড মোডে nউত্তরগুলি ব্যবহার করুন N

প্রথমে আপনি যদি সমস্ত হিটগুলি হাইলাইট করা চালু করেন তবে এটি আরও অর্থবোধ করতে পারে:

:set hlsearch

1
কেবলমাত্র এটির জন্যই hlsearchআমি জানতাম না, এবং যা আমি একদিন বা অন্য :-) অনুসন্ধান করব। তবে, ডিফল্টরূপে আমি * #, এন এবং এন চেষ্টা করেছি এবং এটি অন্য ফাইল বাফারে ঝাঁপিয়ে পড়ে না ...
স্টিফেন রোল্যান্ড

না, nএবং Nবাফারগুলি লাফিয়ে উঠবেন না (তারা চারপাশে মোড়ানো), তবে তারা লক্ষ্যবস্তু শব্দটি সমস্ত ট্যাবে অনুসন্ধান করা হয়েছে; *আপনার ট্যাবগুলিতে চক্রের মাধ্যমে হাইলাইট করে হিট করুন - সেগুলি একই শব্দ দিয়ে হাইলাইট করা হবে, যাতে আপনি কোনও নতুন অনুসন্ধান ছাড়াই nএবং Nস্থানীয়ভাবে সেখানে ব্যবহার করতে পারেন ।
সোনারলোকস

2
সমস্ত পয়েন্ট খুঁজে পাওয়ার জন্য পুরো পয়েন্টটি আপনার ট্যাবগুলিতে ঘুরতে হবে না।
ম্যাগনাস

1
@ ম্যাগনাস যেহেতু এটি পছন্দনীয় হতে পারে, তবে আসলে প্রশ্নে এটি স্পষ্টভাবে বলা হয়নি, যা "এই অনুসন্ধানটি ... সমস্ত বাফারগুলিতে" কীভাবে প্রসারিত করতে হবে - -> এটি সমস্ত বাফার জুড়ে প্রসারিত। আমার উত্তরের বিষয়টি ছিল এটি পরিষ্কার করা, যেহেতু এটি নাও হতে পারে, বিশেষত যদি আপনি hlsearchসেট না করেন।
স্বর্ণলোকস


1

যেহেতু আমি নিজেকে প্রায়শই এই কাজটি করতে দেখলাম আমি একটি (অস্থাবর) স্ক্রিপ্টটি ছড়িয়ে দিয়েছি।

আপনি বা অন্য কেউ এটি দরকারী মনে হতে পারে।


সংক্ষিপ্ত ব্যাখ্যা:

মূলত এটি বাফার তালিকা অনুসন্ধান করে এবং কুইকফিক্স-উইন্ডোতে ফলাফল প্রদর্শন করে।

দুটি বেসিক কমান্ড যুক্ত করা হয়েছে।

  1. Search <pattern> : এর জন্য সমস্ত বাফার অনুসন্ধান করুন <pattern>
  2. Search1 <pattern>: এর জন্য সমস্ত বাফার অনুসন্ধান করুন <pattern>তবে প্রতিটি বাফারের জন্য কেবল প্রথম ফলাফল দেখান। সাধারণত সমস্ত বাফার যেখানে ফাংশন, ভেরিয়েবল তালিকাবদ্ধ জন্য দরকারীfoo ব্যবহৃত হয় (বা যা কখনও)।

ব্যাং ব্যবহার করুন (:Search! fooফলাফলগুলিতে সংযোজন করতে ) ।

উপরন্তু GSearchএবং GSearch1যোগ করা হয় যেখানে পার্থক্য সঙ্গে যে Searchস্ক্রিপ্ট অ্যাড Regex বিভেদক, যেমন:

foo -> /foo/

যেখানে হিসাবে GSearch এটি আবদ্ধ আশা।

দ্য jপতাকা সবসময় লাফ প্রতিরোধ যোগ করা হয়।


কোড:

একই সাথে কোডটি সংক্ষিপ্ত রাখার সময় ত্রুটি তালিকা রোধ করতে কিছু হ্যাক রয়েছে। try / catchকিছুটা কষ্টকর ছিল bufdo

let s:not_idents = split("/!#$%&\"`´¨'¯()*+,-.:;<=>?¿@[\]^{|}µ¶·¸~±×÷®©«»¬­ª°º¹²³¼½¾", '\zs')
" Create a delimited pattern. "
fun! s:Parse_pat(pat)
    for c in s:not_idents
        if stridx(a:pat, c) == -1
            return c . a:pat . c
        endif
    endfor
    echohl Error
    echom "Could not delimit pattern '". a:pat ."'"
    echohl None
    return ''
endfun

fun! s:AllBufSearch(pat, bang, uno, isg)
    if a:isg
        let pat = a:pat
    else
        let pat = s:Parse_pat(a:pat)
    endif
    if pat == ''
        return
    endif
    cclose
    let [_buf, _view] = [bufnr("%"), winsaveview()]
    let _foldenable = &foldenable
    set nofoldenable

    " Copy of current qflist. "
    let qfc = getqflist()
    " Hack to prevent error if no matches. "
    call setqflist([{}])
    silent execute "bufdo vimgrepadd! " . pat . "j %"
    " Restore "
    exec "buffer " . _buf
    let &foldenable = _foldenable
    call winrestview(_view)
    " Fix "
    let qf = getqflist()
    call remove(qf, 0)
    " Only one listing per buffer. "
    if a:uno
        let bn = {}
        let i  = 0
        for m in qf
            if has_key(bn, m["bufnr"])
                call remove(qf, i)
            else
                let bn[m["bufnr"]] = 1
                call remove(qf[i], "valid")
                let i += 1
            endif
        endfor
    endif
    if a:bang == "!"
        let qf = qfc + qf
    endif
    " If any matches, copen. "
    if len(qf)
        call setqflist(qf)
        copen
    endif
endfun

command! -nargs=1 -bang Search   call s:AllBufSearch(<q-args>, "<bang>", 0, 0)
command! -nargs=1 -bang Search1  call s:AllBufSearch(<q-args>, "<bang>", 1, 0)
command! -nargs=1 -bang GSearch  call s:AllBufSearch(<q-args>, "<bang>", 0, 1)
command! -nargs=1 -bang GSearch1 call s:AllBufSearch(<q-args>, "<bang>", 1, 1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.