কীভাবে ভিমে একাধিক বাফার মুছবেন?


120

ধরে নিচ্ছি আমার ভিমে একাধিক ফাইল বাফার হিসাবে খোলা আছে। ফাইল আছে *.cpp, *.hএবং কিছু আছে *.xml। আমি এর সাথে সমস্ত এক্সএমএল ফাইলগুলি বন্ধ করতে চাই :bd *.xml। তবে, ভিম এটির অনুমতি দেয় না (E93: একাধিক ম্যাচ ...)।

এই কাজ করতে কোন উপায় আছে কি?

পিএস আমি জানি যে :bd file1 file2 file3কাজ করে। সুতরাং আমি কি কোনওভাবে মূল্যায়ন *.xmlকরতে file1.xml file2.xml file3.xmlপারি?

উত্তর:


194

আপনি <C-a>সমস্ত ম্যাচ সম্পূর্ণ করতে ব্যবহার করতে পারেন । সুতরাং আপনি যদি টাইপ করেন :bd *.xmlএবং তারপরে হিট করেন <C-a>, ভিম এর আদেশটি সম্পূর্ণ করবে :bd file1.xml file2.xml file3.xml


8
@ ফ্লোরিয়ান আপনাকে <tab>কেবল কমান্ড লাইনে একক এন্ট্রি রেখে ম্যাচগুলি ঘুরে দেখার অনুমতি দেয় এবং <C-a>একই সাথে সমস্ত ম্যাচ যুক্ত করে।
বুজর্ন স্টেইনব্রিঙ্ক

আমার you'reশ্বর আপনি ঠিক বলেছেন! দুঃখিত। ট্যাব কেবল তখনই কাজ করে যখন কেবলমাত্র একটি সম্ভাব্য ফলাফল থাকে।
ফ্লোরিয়ান ক্লেইন

আপনি কীভাবে টিএমউজে ভিএম সহ <সিসিও ব্যবহার করবেন?

4
tmux ডিফল্টরূপে <Ca> বেঁধে রাখে না, তবে আপনি যদি এটিটি কনফিগার করেছেন যেমন পর্দা অনুকরণ করার জন্য <সিবিএসের পরিবর্তে <CQL ব্যবহার করুন, তবে আপনাকে এটি মানচিত্রেও কনফিগার করতে হবে, উদাহরণস্বরূপ <সিসিএল a পাস করার জন্য < সিএ> টিএমউক্সের ভিতরে চলমান প্রোগ্রামটি to Tmux এর সাথে আসা স্ক্রিন-কী.কনফ এটি করে।
বিজার্ন স্টেইনব্রীঙ্ক 26'15

7
জেএফটিআর, যদি আপনি vim-rsiইনস্টল করেছেন (আমার মনে হয়, <C-a>কমান্ড লাইনে কাজটি আসল উপায়ে পাওয়ার জন্য এটি * নিক্সের প্রত্যেকের জন্য অবশ্যই হওয়া উচিত) আপনার <C-x> <C-a>পরিবর্তে ব্যবহার করা উচিত ।
kostix

43
:3,5bd[elete]   

বাফার রেঞ্জটি 3 থেকে 5 পর্যন্ত মুছবে।


19

আপনি বিকল্পভাবে ব্যবহার করতে পারেন:

    :.,$-bd[elete]    " to delete buffers from the current one to last but one
    :%bd[elete]       " to delete all buffers

1
এটি দুর্দান্ত কাজ করে। আমি একটি করলাম : বাফার নম্বরগুলি এবং সেগুলি দেখতে : ক, বিবিডি নম্বর থেকে বিতে বিফার্স মুছতে
Neaţu Ovidiu Gabriel

5

আপনি এটি ব্যবহার করতে পারেন।

:exe 'bd '. join(filter(map(copy(range(1, bufnr('$'))), 'bufname(v:val)'), 'v:val =~ "\.xml$"'), ' ')

এটি কমান্ডে যুক্ত করা বেশ সহজ হওয়া উচিত।

function! s:BDExt(ext)
  let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && bufname(v:val) =~ "\.'.a:ext.'$"')
  if empty(buffers) |throw "no *.".a:ext." buffer" | endif
  exe 'bd '.join(buffers, ' ')
endfunction

command! -nargs=1 BDExt :call s:BDExt(<f-args>)

আমি ভিমস্ক্রিপ্ট সম্পর্কে কিছুই জানি না, তবে গ্লোব () ফাংশন সম্পর্কে কীভাবে?
থানহ ডি কে

1
glob()কেবলমাত্র বিদ্যমান ফাইলগুলি (আপনার হার্ড ড্রাইভে) দেবে, এবং খোলা বাফারগুলি দেবে না।
লুক হার্মিটে

আপনি fnameescape()নাম বাফার করতে ভুলে গেছেন ।
জাইএক্স

আমি সবেমাত্র চেক করেছি c:/Program files/foo.barএবং এমনকি foo.bar.fooএটি পুরোপুরি কার্যকর হয়েছে। fnameescape()যদি আমি বাফার নামগুলি ব্যবহার করি তবে প্রয়োজনীয় হতে পারে। তবে আমি কেবল যাচ্ছি বাফারের নামগুলি একটি প্রদত্ত অভিব্যক্তিটির সাথে মেলে কিনা তা যাচাই করছি: \.{ext}$- আমি বাফার নম্বরগুলি দিই: বিডি b ` রেজেক্সের মিলের জন্য আমি কিছু থেকে বাঁচার কোনও কারণ নেই।
লুক হার্মিট

5

নীচের স্ক্রিপ্ট চেষ্টা করুন। উদাহরণটি "txt" এর জন্য, এটি প্রয়োজন হিসাবে এটি পরিবর্তন করুন, যেমন "xML" তে। পরিবর্তিত বাফার মুছে ফেলা হয় না। বাফারগুলি মুছতে \ বিডি টিপুন।

map <Leader>bd :bufdo call <SID>DeleteBufferByExtension("txt")

function!  <SID>DeleteBufferByExtension(strExt)
   if (matchstr(bufname("%"), ".".a:strExt."$") == ".".a:strExt )
      if (! &modified)
         bd
      endif
   endif
endfunction

[সম্পাদনা] ছাড়াই একই: বুফডো (লুস হার্মিটের অনুরোধ অনুসারে, নীচে মন্তব্য দেখুন)

map <Leader>bd :call <SID>DeleteBufferByExtension("txt")

function!  <SID>DeleteBufferByExtension(strExt)
   let s:bufNr = bufnr("$")
   while s:bufNr > 0
       if buflisted(s:bufNr)
           if (matchstr(bufname(s:bufNr), ".".a:strExt."$") == ".".a:strExt )
              if getbufvar(s:bufNr, '&modified') == 0
                 execute "bd ".s:bufNr
              endif
           endif
       endif
       let s:bufNr = s:bufNr-1
   endwhile
endfunction

1
:bufdoএটি বর্তমান উইন্ডোতে গণ্ডগোলের মতো পছন্দ করে না ।
লুক হার্মিটে

3

আমারও সবসময় এই কার্যকারিতাটির প্রয়োজন ছিল। আমার ভিএমআরসি-তে আমার এই সমাধান।

function! GetBufferList()
    return filter(range(1,bufnr('$')), 'buflisted(v:val)')
endfunction

function! GetMatchingBuffers(pattern)
    return filter(GetBufferList(), 'bufname(v:val) =~ a:pattern')
endfunction

function! WipeMatchingBuffers(pattern)
    let l:matchList = GetMatchingBuffers(a:pattern)

    let l:count = len(l:matchList)
    if l:count < 1
        echo 'No buffers found matching pattern ' . a:pattern
        return
    endif

    if l:count == 1
        let l:suffix = ''
    else
        let l:suffix = 's'
    endif

    exec 'bw ' . join(l:matchList, ' ')

    echo 'Wiped ' . l:count . ' buffer' . l:suffix . '.'
endfunction

command! -nargs=1 BW call WipeMatchingBuffers('<args>')

এখন, আমি ঠিক করতে পারি :BW regex(উদাহরণস্বরূপ :BW \.cpp$এবং তাদের প্যাথনামে এই প্যাটার্নটি মিলেছে এমন সমস্ত মিলে যাওয়া বাফারগুলি মুছুন।

আপনি বরং মুছে ফেলতে মুছা চান, আপনি অবশ্যই প্রতিস্থাপন করতে পারেন exec 'bw ' . join(l:matchList, ' ')সঙ্গেexec 'bd ' . join(l:matchList, ' ')


আমি কখনও কখনও ভাবছি কেন তেজ রেগুলার এক্সপ্রেশনের সর্বত্র (সমর্থন করে না :badd, :bdelete, :bufdo, :bn...)
PUK

1

খুব সহজভাবে: :bd[elete]কমান্ডটি ব্যবহার করুন । উদাহরণস্বরূপ, :bd[elete] buf#1 buf#5 buf#31, 3 এবং 5 টি বাফার মুছবে।


1

TABসমস্ত ফাইল স্বয়ংক্রিয়ভাবে পূর্ণ
করার <c-a>জন্য ভিএম im.৪.২82২ ব্যবহার করে কেবল আপনার জন্য একটি ফাইল স্বয়ংক্রিয়ভাবে পূরণ করবে ।

আপনি কেবল ব্যবহার করতে পারেন:

bd filetype

তারপরে <c-a>নির্দিষ্ট ফাইল টাইপের সমস্ত খোলা ফাইলের সমাপ্তির সুবিধার্থে কেবল ব্যবহার করুন ।

উদাহরণস্বরূপ, আপনার কাছে 1.xML, 2.xML, 3.xML এবং 4.xML রয়েছে, আপনি এটি করতে পারেন:

bd xml

তারপরে টিপুন <c-a>

ভিম নিম্নলিখিত হিসাবে আপনার জন্য স্বয়ংক্রিয়ভাবে সম্পূর্ণ হবে:

bd 1.xml 2.xml 3.xml 4.xml

কমান্ডটি সম্পূর্ণ করতে আপনি কেবল এন্টার টিপুন।

আপনি যদি উপরে উল্লিখিত ফাইলগুলির মধ্যে একটিতে পরিবর্তন করে থাকেন তবে তা করতে ভুলবেন না:

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