সমস্ত ওপেন বাফারগুলির জন্য কীভাবে অনুসন্ধান ফলাফল দেখানো যায়


17

একটি জিনিস যা আমি প্রায়শই করি (তবে করার জন্য কমান্ড লাইনের উপর নির্ভর করে) একাধিক ফাইল অনুসন্ধান করা / গ্রেপিং করা হয়।

সমস্ত উন্মুক্ত বাফারগুলির জন্য অনুসন্ধানের ফলাফলগুলি প্রদর্শনের কোনও উপায় আছে?

আদর্শভাবে, আমি ফলাফলের অবস্থান এবং স্নিপেটের মতো একটি নতুন বিভক্ত বাফার চাই grep। উদাহরণস্বরূপ ( /statistics):

models/statistics.php: /*! \file   statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();

বোনাস হিসাবে, আমি কার্সারের অধীনে শব্দটি অনুসন্ধান করতে সক্ষম হতে চাই, অনেকটা পছন্দ gdকরে।


উত্তর:


15

আপনি :vimgrep /pattern/ {files}ম্যাচিং নিদর্শনগুলির সাথে কুইকফিক্স তালিকাটি জনপ্রিয় করতে ব্যবহার করতে পারেন । সমস্যাটি হ'ল :vimgrepফাইল বিকল্পটি সরাসরি বাফারদের জন্য অনুমতি দেয় না। তুমি ব্যবহার করতে পার:

%   Is replaced with the current file name.       *:_%* *c_%*
#   Is replaced with the alternate file name.     *:_#* *c_#*
#n  (where n is a number) is replaced with        *:_#0* *:_#n*
    the file name of buffer n.  "#0" is the same as "#".     *c_#n*
##  Is replaced with all names in the argument list   *:_##* *c_##*
    concatenated, separated by spaces.  Each space in a name
    is preceded with a backslash.
#<n (where n is a number > 0) is replaced with old    *:_#<* *c_#<*
    file name n.  See |:oldfiles| or |v:oldfiles| to get the
    number.                         *E809*
    {only when compiled with the |+eval| and |+viminfo| features}

আরেকটি বিকল্প হ'ল একটি স্ক্রিপ্ট লিখুন যা থেকে কোনও ফাইল তালিকা তৈরি করে :buffers। প্রতি এই তাই পোস্টে সামান্য tweek আমরা পেতে সাথে

function! BuffersList()
  let all = range(0, bufnr('$'))
  let res = []
  for b in all
    if buflisted(b)
      call add(res, bufname(b))
    endif
  endfor
  return res
endfunction

function! GrepBuffers (expression)
  exec 'vimgrep/'.a:expression.'/ '.join(BuffersList())
endfunction

command! -nargs=+ GrepBufs call GrepBuffers(<q-args>)

আপনি এখন কল করতে পারেন :GrepBufs <expression>এবং মান :vimgrepআউটপুট পেতে পারেন তবে পরিবর্তে বাফার ব্যবহার করে।

আপডেট আপনি যদি GrepBuffersকার্সারের নীচে মানটি ব্যবহার করে কল করতে চান তবে এই নতুন ম্যাপিংটি যুক্ত করুন।

nnoremap <leader>z :call GrepBuffers("<C-R><C-W>")<CR>

আপনি যখন সাধারন মোডে <leader>zথাকবেন :vimgrepএবং আপনার খোলা বাফারের উপর আপনি কার্সার শব্দটি ব্যবহার করবেন।


2
একক লাইন ফর্ম ইন: command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' ')। ব্যবহার::Bufgrep/foo/
পিটার রিনকার

8

কেবল খোলা বাফারগুলিতে অনুসন্ধান করা দুর্দান্ত, তবে এমন একটি সময় আসতে পারে যেখানে আপনি পুরো প্রকল্প জুড়ে অনুসন্ধান করতে চান। এটি আপনার ভাবার চেয়ে দ্রুত এবং সহজ হতে পারে!

একটি প্রকল্প জুড়ে অনুসন্ধান করা

  • grepইউনিক্স মানক অনুসন্ধান সরঞ্জাম is সর্বজনীনতার কারণে উল্লেখযোগ্য। :grepকমান্ডের মাধ্যমে ইতিমধ্যে ভিমে সংহত হয়েছে । যেমন :grep -r 'foo'। দেখুন :h :grep
  • আ্যাক নিয়মিত গ্রেপের তুলনায় দ্রুত কারণ এটি ভিসিএস ডিরেক্টরি, বাইনারি ফাইলগুলি এড়িয়ে যায় এবং নির্দিষ্ট ধরণের ফাইল টাইপের মতো অনুসন্ধান করতে পারে --perl। ভিম সংহতকরণের জন্য অ্যাক.ভিম দেখুন
  • Ag সিলভার সার্ফার হ'ল একটি কোড অনুসন্ধানের সরঞ্জাম যা এসির মতো, তবে দ্রুত। ভিম প্লাগইন: Ag.vim
  • git grepখুব দ্রুত একটি সংগ্রহস্থল অনুসন্ধান করে। পলাতক.ভিম সরবরাহ করে :Ggrep
  • রিপগ্রিপ এগ্র এবং এর চেয়ে আরও দ্রুত git grep:grepপাশাপাশি ব্যবহার করা যেতে পারে ।

আমি রিপগ্রিপ, এজি এবং উভয়ই git grepসুপার ফাস্ট হিসাবে সুপারিশ করি । আমি 1 সেকেন্ডেরও কম 4700+ এর বেশি অনুসন্ধান করেছি। রিপগ্রিপকে পরাস্ত করা বেশ শক্ত।

প্লাগইন ছাড়াই এই বিকল্পগুলির একটি পরীক্ষা করার জন্য বা আপনি কেবল প্লাগইন চান না আপনি 'grepprg'সেই অনুযায়ী আপনার বিকল্পটি সেট করতে পারেন । যেমন set grepprg=ag\ --vimgrepবা set grepprg=rg\ --vimgrep। আরও তথ্যের জন্য দেখুন :h 'grepprg'এবং :h 'grepformat'। এখন আপনি মাধ্যমে অনুসন্ধান করতে পারেন :grep। যেমন :grep 'foo'

চূড়ান্ত ফ্যালব্যাক হিসাবে আপনি ব্যবহার করতে পারেন :vimgrepএটি ভিম উপলভ্য সমস্ত সিস্টেমে উপলভ্য। দেখুন :h :vimgআরো সহায়তার জন্য।

কুইকফিক্স তালিকা

এই বিকল্পগুলির বেশিরভাগই কুইকফিক্স তালিকাটি ব্যবহার করার জন্য আমি আপনাকে পরামর্শ দিই যে আপনি কুইকফিক্স তালিকাটি অতিক্রম করতে আরও কিছু বন্ধুত্বপূর্ণ ম্যাপিং ব্যবহার করুন। আমি টিম পোপের অবিবাহিত প্লাগইন ব্যবহার করি যা যথাক্রমে ]qএবং এর [qজন্য :cnextএবং ব্যবহার :cprevকরে। পর একটি অনুসন্ধান তারপর আপনার নিম্নলিখিত যোগ সঞ্চালিত হয় quickfix মত কিছু মানুষ খুলতে ~/.vimrcফাইল: autocmd QuickFixCmdPost *grep* cwindow। আপনি নিজেই দিয়ে কুইকফিক্স তালিকাটি খুলতে পারেন :copen

আরও দ্রুত "অনুসন্ধান" চান?

আপনাকে এমন কিছু সরঞ্জাম ব্যবহার করতে হবে যা ctags , cscope , বা GNU গ্লোবাল যেমন প্রাক- বিল্ট ইনডেক্স ব্যবহার করে ।

  • তেজ মাধ্যমে ctag সমর্থনে গড়ে তুলেছে :tag, <c-]>, এবং অন্যান্য অনেক কমান্ড এবং অপশন। দেখুন :h tagsগিট সহ এফোর্টলেস সিট্যাগগুলি পড়তে বা গুয়ান্টেগস প্লাগইনটি সন্ধান করতে পারে
  • সিস্কোপ সমর্থনটি অন্তর্নির্মিত এবং :cscopeকমান্ডের মাধ্যমে ব্যবহার করা যেতে পারে । দেখা:h cscope

আরো সাহায্য

আমি এই দুর্দান্ত ভিমকাস্ট পর্বটি দিয়ে শুরু করব: এর সাথে একাধিক ফাইল অনুসন্ধান করব:vimgrep

আরও ভিম ​​সাহায্যের জন্য ডকুমেন্টেশনটি দেখুন:

:h grep
:h :vimgrep
:h :grep
:h 'grepprg'
:h 'grepformat'
:h quickfix
:h :cnext
:h tags
:h cscope

6

আমার গ্রেপকম্যান্ডস প্লাগইনটি বিল্ট-ইন :vimgrepকমান্ডের রূপগুলি সংজ্ঞায়িত করে যা বর্তমান অনুসন্ধান ট্যাব পৃষ্ঠায় সমস্ত আর্গুমেন্ট, তালিকাভুক্ত বাফার, উইন্ডো বা তার অনুসন্ধানের জন্য সমস্ত ট্যাব পৃষ্ঠা লক্ষ্য করে। মূলত, @ jecxjo এর উত্তরের একটি শক্তিশালী প্লাগইন বাস্তবায়ন।


1

কমান্ড :bufdoএবং:vimgrepadd

এই উত্তরটি /programming//a/11976158/1057593 এর উপর ভিত্তি করে ।

যাইহোক, আমি কয়েক বিট যোগ করতে চেয়েছিলাম। আবার বেসিক কমান্ড হল

:bufdo vimgrepadd pattern %

যদি আপনার কুইকফিক্স তালিকাটি খালি না থেকে থাকে তবে আপনি সম্ভবত এটি প্রথমে পরিষ্কার করতে চান ( /programming//q/27385970/1057593 দেখুন )। এটি দিয়ে করা যেতে পারে

:cexpr []

তেজ-অটুট ম্যাপিং প্রদান করে ]qএবং [qচক্র ম্যাচ মাধ্যমে।

cmdline- র ইতিহাসে

এটির সাথে আলাদাভাবে অনুসন্ধানের প্যাটার্ন প্রবেশ করানো ভাল ওয়ার্কফ্লো /pattern। এটি আপনাকে বর্তমান অনুসন্ধান প্যাটার্নটি ব্যবহার করে আপনার কমান্ডলাইন ইতিহাস থেকে জেনেরিক কমান্ড ব্যবহার করতে দেয়। এই মত দেখতে হবে

/pattern
:bufdo vimgrepadd // %

একটি সাধারণ নতুন বাফার প্রশস্ত অনুসন্ধান হবে

/pattern2
:bufdo<up><up>...

আমি ব্যবহারের আমার vimrc নিম্নলিখিত ম্যাপিং যোগ করেছেন <C-N>এবং <C-P>পরিবর্তে নির্দেশক তীরচিহ্নগুলি এর

cmap <C-P> <Up>
cmap <C-N> <Down>

কমান্ডের ইতিহাস অনুসন্ধান করতে ব্যবহার করুন এবং q:তারপরে /bufdo<CR>একটি কমান্ডের অনুরোধ করুন <CR>। আরও তথ্যের জন্য https://vim.fandom.com/wiki/Using_command-line_history এবং সহায়তা পৃষ্ঠা :h historyএবং দেখুন :h cmdline-window

:copenতাত্ক্ষণিকভাবে নিম্নলিখিত উপায়ে কুইকফিক্স তালিকাটি দেখতে আপনি পুনরায় ব্যবহারযোগ্য কমান্ডটিতে যুক্ত করতে পারেন:

:execute "bufdo vimgrepadd // %" | copen

স্ট্যাকওভারফ্লো থেকে প্রস্তাবটি :bufdo vimgrepadd // % | copenআমার ক্ষেত্রে বেশ কয়েকটি অনিচ্ছাকৃত উইন্ডো খুলেছে।

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