विम में कई बफ़र्स को हटाने के लिए कैसे?


120

मान लें कि मेरे पास विम में बफ़र्स के रूप में कई फाइलें खुली हैं। फाइलें हैं *.cpp, *.hऔर कुछ हैं *.xml। मैं सभी XML फाइलों को बंद करना चाहता हूं :bd *.xml। हालाँकि, विम इसकी अनुमति नहीं देता है (E93: एक से अधिक मैच ...)।

क्या इसे करने का कोई तरीका है?

PS मुझे पता है कि :bd file1 file2 file3काम करता है। तो मैं किसी भी तरह का मूल्यांकन कर सकते *.xmlकरने के लिए file1.xml file2.xml file3.xml?

जवाबों:


194

आप <C-a>सभी मैचों को पूरा करने के लिए उपयोग कर सकते हैं । इसलिए यदि आप टाइप करते हैं :bd *.xmlऔर फिर हिट करते हैं <C-a>, तो vim कमांड को पूरा करेगा :bd file1.xml file2.xml file3.xml


8
@ फ़्लोरियन आपको <tab>केवल मैचों के माध्यम से साइकिल चलाने की अनुमति देता है, कमांड लाइन पर एकल प्रविष्टि डालते हुए, <C-a>सभी मैचों को एक साथ जोड़ता है।
ब्योर्न स्टीनब्रिंक

मेरे भगवान तुम सही हो! माफ़ करना। टैब केवल तभी काम करता है जब केवल एक ही संभव परिणाम हो।
फ्लोरियन क्लेन

आप tmux पर vim के साथ <Ca> का उपयोग कैसे करते हैं?
नबं

4
tmux डिफ़ॉल्ट रूप से <Ca> बाइंड नहीं करता है, लेकिन यदि आपने स्क्रीन को अनुकरण करने के लिए <Ca> के बजाय <Ca> का उपयोग करने के लिए इसे कॉन्फ़िगर किया है, तो आपको इसे मैप करने के लिए भी कॉन्फ़िगर करना चाहिए, उदाहरण के लिए, <Ca> a पास करने के लिए < कार्यक्रम> tmux के अंदर चल रहे कार्यक्रम के माध्यम से। स्क्रीन- keys.conf जो tmux के साथ आता है वह करता है।
ब्योर्न स्टीनब्रिंक

7
JFTR, यदि आपने vim-rsiस्थापित किया है (मुझे लगता है, यह * nix पर सभी के लिए होना चाहिए), <C-a>कमांड लाइन में मूल तरीके से काम पाने के लिए , आपको <C-x> <C-a>इसके बजाय उपयोग करना चाहिए ।
kostix


19

आप वैकल्पिक रूप से उपयोग भी कर सकते हैं:

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

1
यह अच्छा काम करता है। मैं a : ls को बफ़र नंबर और उन्हें देखने के लिए करता हूं : a, bbd को बफ़र्स को संख्या से b तक हटाने के लिए
Neaiu 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()बफ़र नामों को भूल गए ।
ZyX

मैं बस के साथ जाँच की है c:/Program files/foo.bar, और यहां तक ​​कि foo.bar.fooयह पूरी तरह से काम किया है। fnameescape()यदि मुझे बफ़र नामों का उपयोग करने की आवश्यकता होती है। लेकिन मैं केवल जाँच कर रहा हूं कि क्या बफ़र नाम किसी दिए गए एक्सप्रेशन से मेल खाते हैं: \.{ext}$- मैं बफ़र नंबर देता हूँ: bd`। मैं regex मिलान के लिए कुछ भी बचने का कोई कारण नहीं है।
ल्यूक हरमिट्टे

5

नीचे स्क्रिप्ट का प्रयास करें। उदाहरण "txt" के लिए है, इसे आवश्यकतानुसार बदलें, जैसे "xml"। संशोधित बफ़र्स हटाए नहीं गए हैं। बफ़र्स को हटाने के लिए \ bd दबाएँ।

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

[संपादित करें] उसी के बिना: bufdo (ल्यूक हर्मिट्टे द्वारा अनुरोधित, नीचे टिप्पणी देखें)

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क्योंकि यह वर्तमान विंडो को गड़बड़ करता है।
ल्यूक हरमिट 11

3

मुझे भी हर समय इस कार्यक्षमता की आवश्यकता थी। यह समाधान मैं अपने vimrc में है।

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, ' ')


मैं कभी कभी आश्चर्य क्यों vim नियमित अभिव्यक्ति हर जगह (का समर्थन नहीं करता :badd, :bdelete, :bufdo, :bn...)
PUK

1

बहुत सरलता से: :bd[elete]कमांड का उपयोग करें । उदाहरण के लिए, :bd[elete] buf#1 buf#5 buf#3बफ़र्स 1, 3 और 5 को हटा देगा।


1

TABआपके लिए केवल एक फाइल स्वतः पूर्ण होगी जो विम 7.4.282 के रूप में सभी फाइलों को स्वतः पूर्ण
करने के <c-a>लिए उपयोग करती है।

आप बस उपयोग कर सकते हैं:

bd filetype

तो बस <c-a>निर्दिष्ट filetype की सभी खुली फाइलों के पूरा होने की सुविधा के लिए उपयोग करें।

उदाहरण के लिए, आपके पास 1.xml, 2.xml, 3.xml और 4.xml है, आप कर सकते हैं:

bd xml

फिर दबायें <c-a>

vim आपके लिए निम्नलिखित के रूप में स्वत: पूर्ण होगा:

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

आप केवल कमांड को पूरा करने के लिए एंटर दबा सकते हैं।

यदि आपने ऊपर बताई गई फ़ाइलों में से किसी एक में परिवर्तन किया है, तो याद रखें:

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