मैं खिड़की बंद किए बिना एक बफर को कैसे बंद कर सकता हूं?


120

विम के बहुस्तरीय विचारों (विंडोज, बफ़र्स और टैब्स) ने मुझे थोड़ा भ्रमित कर दिया। मान लें कि मैंने डिस्प्ले (: sp) को विभाजित किया है और फिर प्रत्येक विंडो में प्रदर्शित करने के लिए एक अलग बफर का चयन करें। अब मैं बफ़र्स में से एक को बंद करना चाहता हूं, फिर भी मैं खिड़की को बंद नहीं करना चाहता (समापन के बाद यह सूची में अगला बफर या एक खाली बफर प्रदर्शित कर सकता है, इससे कोई फर्क नहीं पड़ता)। मैं यह कैसे कर सकता हूँ?

धन्यवाद।


क्या ऐसा कोई कारण है जो आप बफर को बंद करना चाहते हैं बजाय इसके कि आप इसे वहां नहीं देखते?
रैंपियन

9
मैं वास्तव में इस बारे में सोच रहा था। एक बफर को हटाना और बाद में मेरे विभाजन के जो भी हिस्से को नष्ट कर दिया गया था उसका पुनर्निर्माण करना कष्टप्रद है।
ब्रेटकेली

3
अब तक 29 वोट। मुझे लगता है कि यह एक बहुत ही सामान्य उपयोग का मामला है। मुझे इसकी जरूरत है जब मैं बहुत सारे बफ़र्स के साथ काम कर रहा हूं। कभी-कभी मैं 2 विंडो का उपयोग कर रहा हूं और एक बफर को बंद करना चाहता हूं। मैं नहीं चाहता कि वह खिड़की चली जाए। मैं बस चाहता हूं कि अगला बफर वहां प्रदर्शित हो।
विल्सन फ्रीटस


जवाबों:


31

ऐसा करने के लिए विम विकी पर एक स्क्रिप्ट है । मुझे नहीं लगता कि कोई बिल्ट है जो आपको चाहिए।

Vim-bufkill के नवीनतम संस्करण GitHub पर है


4
शानदार उत्तर, इसने मुझे स्क्रिप्ट के अंतिम संस्करण तक पहुँचाया
Mosh

145

मैंने इसे थोड़ा गड़बड़ कर दिया और आखिरकार साथ आया:

:bp | sp | bn | bd

यहां कुंजी मानचित्रण के लिए प्रतिलिपि / पेस्ट संस्करण दिया गया है:

:bp<bar>sp<bar>bn<bar>bd<CR>

मैंने इसे एक उचित सा परीक्षण किया है और यह विभिन्न परिस्थितियों में लगातार काम करता है। अंतिम बफर पर उपयोग किए जाने पर यह आपको एक नए रिक्त बफर के साथ छोड़ देगा।

इसे अपने .vimrc में फेंक दें:

map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>

विम को पुन: प्रारंभ करें, या केवल :source ~/.vimrcपरिवर्तनों को प्रभावी करने के लिए। अगली बार जब आप किसी बफ़र को बस बंद करना चाहते हैं: \q(यदि \आपकी लीडर की है तो )


1
धन्यवाद! अच्छा और सरल, मैंने देखा है हर दूसरे समाधान के विपरीत।
jwd

16
शुरुआत के लिए, अपने में इस फेंक .vimrc : map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>। VIM को पुनरारंभ करें, अगली बार जब आप किसी बफ़र को बस बंद करना चाहते हैं:\q
EasyCo

5
यदि आपके पास लंबवत रूप से विभाजित विंडो थी, तो इसका अप्रत्याशित परिणाम होगा। वास्तव में, मानक (द्वारा निर्मित sp) के अलावा कोई भी विंडो विभाजन कॉन्फ़िगरेशन ।
हिटजग

2
मुझे लगता है कि .vimrc में क्या रखा जाना चाहिए, इसका स्निपेट अंत में अवधि को शामिल नहीं करना चाहिए। इसके अलावा, कमाल! यह स्वीकृत उत्तर होना चाहिए।
अर्नेस्टो

3
यह सुरुचिपूर्ण है। जैसा कि अन्य लोगों ने कहा है, यदि आप ज्यादातर ऊर्ध्वाधर विभाजन का उपयोग करते हैं, तो स्विच spकरें vsp। मेरी .vimrc प्रविष्टि इस तरह दिखती है:cnoremap bd bp<bar>vsp<bar>bn<bar>bd
कॉनर

38

मैंने आज इसके लिए खोज की और साथ आया

:b#|bd#

जो वर्तमान विंडो को पहले खुले बफ़र में बदलता है और आपके द्वारा अभी-अभी स्विच किए गए बफ़र को हटाता / छिपाता है।

इसके लिए कम से कम दो ज्ञात बफ़र्स की आवश्यकता होती है।

यदि एक और खिड़की लेकिन वर्तमान समान बफर दिखाता है तो यह अभी भी विभाजन को नष्ट कर देगा। आप सभी विंडो को पहले खुले बफर में बदल सकते हैं

:windo b#

मैंने एक समान प्रश्न के उत्तर में पूर्व कमांड के बारे में और (और कुछ नुकसान के लिए) मैपिंग पर चर्चा की ।


यह भी किया जा सकता है ... :#b|#bdबस ऊपर में बफर कमांड और बफर नंबर को इंटरचेंज करें।
आशीष

मैंने इसका थोड़ा उपयोग किया है, लेकिन मैं परेशान हो रहा हूं कि इसने पहले से बंद बफर को फिर से खोला।
मटर

@pean जो मैंने लिंक किए गए उत्तर में उल्लेख किया है - "महत्वपूर्ण नोट्स" देखें। यदि यह दूसरे खुले बफ़र पर जाता है, तो हाँ, अच्छा होगा।
वैध

1
आप हाल ही में एक्सेस किए गए बफर (b #) के बजाय क्रमशः पिछले या अगले खुले बफ़र पर जा सकते हैं :bn|bd#या कर सकते हैं :bp|bd#
पावन

12
nmap <leader>d :bprevious<CR>:bdelete #<CR>

तब तक काम करता है जब तक कि कई विंडो में एक बफर खुला न हो। जब तक आप वहां से बड़ी स्क्रिप्ट का उपयोग नहीं करना चाहते, तब तक काफी अच्छा है।

संपादित करें: यह वही है जो मैं अभी उपयोग करता हूं:

function! BufferDelete()
    if &modified
        echohl ErrorMsg
        echomsg "No write since last change. Not closing buffer."
        echohl NONE
    else
        let s:total_nr_buffers = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))

        if s:total_nr_buffers == 1
            bdelete
            echo "Buffer deleted. Created new buffer."
        else
            bprevious
            bdelete #
            echo "Buffer deleted."
        endif
    endif
endfunction

1
मैं इस तरह की कोशिश की, लेकिन यह कई विभाजन खिड़कियों का उपयोग करते समय बहुत अच्छी तरह से काम नहीं किया। यहाँ मेरा समाधान है अगर किसी को एक ही समस्या हो रही है:nmap <leader>d :ene<CR>:bd #<CR>
caio

7

मुझे लगता है कि आप यही देख रहे हैं

http://www.vim.org/htmldoc/windows.html#window-moving

इसे इस्तेमाल करे:

अपने बफ़र आईडी का उपयोग करके देखें

:buffers

आपको वहां बफ़र्स की सूची दिखाई देगी

1  a.cpp
2  b.py
3  c.php

यदि आप बफर से b.py को हटाना चाहते हैं

:2bw

यदि आप बफ़र्स से सभी को निकालना / बंद करना चाहते हैं

:1,3bw

1
मैं खिड़की को हिलाना नहीं चाहता। मैं खिड़की की स्थिति, आकार या अस्तित्व को छूने के बिना बफर को बंद करना चाहता हूं।
मॉस

5

उन लोगों के लिए जो NERDTree का उपयोग करते हैं।

मैं इस प्लगइन https://github.com/jistr/vim-nerdtree-tabs का उपयोग करके इसे ठीक करता हूं और अब मैं खिड़की बंद किए बिना केवल बफ़ / फ़ाइल / टैब बंद कर सकता हूं।

ऊपर प्लगइन स्थापित होने के बाद मेरे .vimrc पर निम्न कोड डालें:

let g:nerdtree_tabs_autoclose=0

उपरोक्त चर का वर्णन है: वर्तमान टैब बंद करें यदि इसमें केवल एक ही विंडो है और यह NERDTree है (डिफ़ॉल्ट 1)

अधिक जानकारी यहाँ: https://github.com/jistr/vim-nerdtree-tabs#configuration


2

मुझे नहीं लगता कि ऐसा करने के लिए एक शॉट तरीका है, लेकिन आप अपने बफ़र्स को सूचीबद्ध करने :enewया :lsउपयोग करने के लिए एक अलग स्वैप कर सकते हैं :b [number]

एक बार जब आपको विंडो में एक अलग बफर मिल जाता है तो वह विंडो :bd #में पिछले बफर को हटा देगा, और चूंकि वर्तमान बफर अभी भी मौजूद है इसलिए विंडो बंद नहीं होगी।


2

मैं उपयोग करता था:

:bp<bar>sp<bar>bn<bar>bd<CR>

लेकिन मुझे कुछ ऐसे मौके मिले जहां इसने मेरी खिड़की बंद कर दी।

हाल ही में मैंने देखा कि मैं हमेशा इसका उपयोग तब करता हूं जब मैं किसी प्रोजेक्ट पर काम कर रहा होता हूं और काम पर .tmux.conf .zshrcवापस जाने से पहले जल्दी से खोलने की जरूरत होती है ।

इस उपयोग के लिए, मुझे यह बेहतर लगता है:

  • मैं जिस बफर पर पहले काम कर रहा था, उस पर वापस लौटें C-6
  • टाइप :bd#पिछले बफर हटाने के लिए (मैं इसे इस तरह से मैप किया है nnoremap <leader>d :bd#<CR>)

यह मुझे उस बफर को नियंत्रित करने की अनुमति देता है जिसे मैं वापस जा रहा हूं और अधिक प्राकृतिक महसूस करता हूं।


1

चाहेंगे

:enew

तुम्हें जो करना है करो? यह मौजूदा विंडो में एक नया, अनाम बफ़र संपादित करेगा, जो मौजूदा फ़ाइल को किसी अन्य विंडो में खुला छोड़ देगा।


यह एक नया खाली बफर खोलेगा। मैं खिड़की बंद किए बिना वर्तमान बफर को बंद करना चाहता हूं।
मॉस

1

इसके लिए मेरा पसंदीदा समाधान bufkill.vim प्लगइन ( GitHub ) है। यह विभिन्न :b-विभिन्न कमांडों के वैकल्पिक संस्करण प्रदान करता है जो उनके समकक्षों के समान काम करते हैं, लेकिन खिड़की को खुला छोड़ देते हैं। यदि पिछले बफर दिखाई देते हैं, तो वे खाली या नए बफर को दिखाते हैं, अगर कोई पूर्व बफर नहीं था।

प्रलेखन से:

जब आप किसी बफर को अनलोड / डिलीट / वाइप करना चाहते हैं, तो उपयोग करें:
  : बन /: bd /: bw विंडो बंद करने के साथ ही (vim कमांड), या
  : BUN /: BD /: BW खिड़की (ओं) को छोड़ने के लिए बरकरार (यह स्क्रिप्ट)।

1

किसी दृश्य को 'बंद' करने के लिए, उपयोग करें :hid[e]। यदि आप व्यूपोर्ट को विभाजित करने या एकाधिक फ़ाइलों को खोलने में कामयाब रहे हैं तो काम करता है। आप अंतिम बफर को डिस्प्ले पर नहीं छिपा सकते।

1 आगे की टिप जिसने मेरी मदद की: :e ./path/to/file.workविंडो को विभाजित किए बिना व्यूपोर्ट में एक फ़ाइल खोलने के लिए उपयोग करें।

PS दो दिनों में विम में मुझे अभी भी सटीक मदद कमांड खोजने में परेशानी होती है। उम्मीद है कि यह किसी और को तब तक काम करने में मदद करेगा जब तक उन्हें वास्तव में समझने का समय नहीं मिल जाता।


1

यहाँ एक बहुत ही पठनीय vimscript फ़ंक्शन है, जो सभी मामलों को अच्छी तरह से संभालता है ,

  • बिल्ट-इन के समान व्यवहार करें :bd(यदि केवल एक खिड़की है, तो बस इसे लागू करें!);
    • एक चेतावनी जारी करें और बफर मॉडिफ़ाइड होने पर कुछ न करें।
    • यदि कोई अन्य बफर नहीं है, तो एक के माध्यम से बनाएं :enew
    • यदि वैकल्पिक बफर मौजूद है और buffer-list, उस पर स्विच करें, तो आगे जाएं, के माध्यम से :bn
  • कई-खिड़की लेआउट के लिए अधिक उचित व्यवहार
    • कोई विंडो बंद नहीं कर रहा है,
    • हमेशा मूल विंडो पर रहें।
    • प्रत्येक विंडो के लिए जो वर्तमान बफ़र प्रदर्शित करता है, जैसा ऊपर सूचीबद्ध है, फिर पुराने वर्तमान बफ़र को हटा दें।
nnoremap <नेता> b: कॉल DeleteCurBufferNotCloseWindow () <CR>

समारोह! DeleteCurBufferNotCloseWindow () गर्भपात
    यदि और संशोधित
        इकोहल ErrorMsg
        Echom "E89: अंतिम परिवर्तन के बाद से कोई लिखना नहीं"
        ईकोहल कोई नहीं
    फारस विन्नर ('$') == १
        bd
    और "कई विंडो
        बता दें कि बूबुफ = बूफर ('%')
        चलो पुराने = winnr ()
        जबकि 1 "सभी विंडो जो पुराने रूप में प्रदर्शित होती हैं, खुली रहेंगी
            अगर buflisted (bufnr ('#'))
                ख #
            अन्य
                अरब
                आज्ञा देना curbuf = bufnr ('%')
                if curbuf == oldbuf
                    enew "ओल्डबुफ एकमात्र बफर है, एक बनाएं
                अगर अंत
            अगर अंत
            जीतने दो = bufwinnr (oldbuf)
            अगर जीत == -1
                टूटना
            और "वहाँ अन्य खिड़की है कि पुराने प्रदर्शित करता है
                'wincmd w' पर अमल करें
            अगर अंत
        endwhile
        "पुराने शब्द को हटा दें और विंडो को ओल्डविन में पुनर्स्थापित करें
        निष्पादित पुराने शब्द 'बीडी'
        पुराने 'wincmd w' पर अमल करें
    अगर अंत
endfunc

0

यदि आप मेरे जैसे हैं और आप यहां विपरीत करने की कोशिश कर रहे हैं , तो बफर को बंद किए बिना विंडो बंद करें, आप ऐसा कर सकते हैं:

:close


0

एक साधारण संस्करण जिसका मैं व्यक्तिगत रूप से उपयोग करता हूं

:bp|bd#

यह पिछले बफ़र पर जाता है और दूसरे बफ़र को डिलीट कर देता है (जो वास्तव में मूल है जहाँ से हमने छलांग लगाई थी)। यह वह करता है जो आप बिना किसी जटिल स्क्रिप्ट के 99% मामलों में उम्मीद करेंगे।

एक कीबोर्ड शॉर्टकट के रूप में मैं निम्नलिखित का उपयोग करता हूं

nnoremap <silent> <Leader>c :bp<BAR>bd#<CR>

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