विम: ऑल बफ़र्स बट दिस दिस


198

मैं वर्तमान में जो संपादन कर रहा हूं, उसे छोड़कर मैं सभी बफ़र्स को विम में कैसे बंद कर सकता हूं?


जवाबों:


62

आप इस स्क्रिप्ट का उपयोग vim.org से कर सकते हैं:

http://www.vim.org/scripts/script.php?script_id=1071

बस इसे अपनी .vim/pluginनिर्देशिका में रखें और फिर :BufOnlyसभी बफ़र्स को सक्रिय करने के लिए कमांड का उपयोग करें । आप इसे अपनी पसंद के अनुसार कहीं और भी मैप कर सकते हैं .vimrc

गितुब पर स्रोत (vim-script दर्पण के माध्यम से): https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim


171

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

bufdo bd

bufdo सभी बफ़र्स के लिए कमांड चलाता है

http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers


यह NERDTree बफर को बंद नहीं करता है।
उड़ी

2
आप bdकमांड को रोकने के लिए ऐसा करने से पहले NERDTree को बंद करना चाह सकते हैं ; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>
लवरात्रि

11
प्रलेखन चेतावनी देता है कि :bufdo'बफ़र्स को हटाने या बफर सूची में बफ़र्स को जोड़ने के लिए ' तर्क नहीं दिया जाना चाहिए। तो अगर यह समाधान काम करता है, तो यह दुर्घटना से काम करता है ... और यह अक्सर मेरे लिए काम नहीं करता है (एक अलग बफर में स्विच)।
8

10
यह मेरे लिए सभी बफ़र्स को बंद कर देता है, जो कि सवाल नहीं पूछता है। (मैकविम संस्करण 8.0.1207)
माइकल लियोनार्ड

1
यह आदेश सभी बफ़र्स को बंद कर देता है। मैं वर्तमान को खुला कैसे छोड़ सकता हूं?
h-rai

143

मैं इस तरह से बहुत आसानी से कर पा रहा था:

:%bd|e#

4
यह एक अच्छा जवाब है। यह BufOnly को थोड़ा ओवरकिल महसूस करता है (मेरा मतलब है, एक पूरी प्लगइन?) जब तक कि आप Bufonly के तर्क पासिंग फीचर का उपयोग नहीं कर रहे हैं। मैं कभी भी वास्तव में करना चाहता हूँ:%bd|e#
shmup

41
@ जोर्जह %bd= सभी बफ़र्स को हटा दें। e#= संपादन के लिए अंतिम बफर खोलें। बीच में पाइप एक के बाद एक कमांड करता है।
OldTimeGuitarGuy

20
@Jared आप बनाए %bd|e#|bd#गए [No Name]बफर को हटाने के लिए उपयोग कर सकते हैं ।
kshenoy

12
आश्चर्यजनक। फिर यहाँ आपके पास एक ही चीज़ है जिसके लिए मैंने कभी भी BufOnly प्लगइन का उपयोग किया है, जो एक कमांड में डिस्टिल्ड है:command! BufOnly silent! execute "%bd|e#|bd#"
shmup

4
@Finn आप से बचने के लिए की जरूरत है |:map <leader>o :%bd\|e#<cr>
हलील Özgür

57

यदि आप वर्तमान की परवाह नहीं करते हैं, तो कुछ करना आसान है जैसे (कोई स्क्रिप्ट की जरूरत नहीं):

1,100bd

4
यह nddtree बफर को भी बंद कर देगा।
अफशीन मेहरबानी

NERDTree सक्षम होने पर मुझे इस कमांड का उपयोग करते हुए कुछ समस्याओं का सामना करना पड़ा। मैं BufOnly.vim प्लगइन का उपयोग करके पुनर्मिलन @VoY द्वारा उल्लिखित है।
मुहबेदोल

1
मैंने निम्नलिखित मैपिंग की जिसमें NERDTree बफर को हटाने का हिसाब है:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri

5
मैंने लंबे समय तक इसका इस्तेमाल किया, लेकिन अब मुझे मिलता है E16: Invalid rangeक्योंकि रेंज में कुछ बफ़र्स वास्तव में मौजूद नहीं हैं। यह अनदेखी थी कि हाल तक।
जॉन

3
@Jon :lsवास्तव में आपके द्वारा खोले गए सबसे बड़े बफर को देखने के लिए जांचें , और अपनी सीमा को उस पर सेट करें (यानी यदि आपका उच्चतम बफर 22 है, तो :1,22bd)। जब तक मैंने ऐसा नहीं किया मुझे वही त्रुटि मिली।
नायरौ

51

मैं यह करता हूँ

:w | %bd | e#

मेरा पसंदीदा अगर मैं सिर्फ अपने वर्तमान बफर को खोलना चाहता हूं और अन्य सभी को बंद करना चाहता हूं।

यह कैसे काम करता है: पहले वर्तमान बफ़र के परिवर्तनों को लिखें, फिर सभी खुले बफ़र्स को बंद करें, फिर उस बफर को फिर से खोलें जो मैं वर्तमान में था। विम में, |जंजीरों को एक साथ आज्ञाओं का निष्पादन। यदि आपका बफ़र अप टू डेट है तो उपरोक्त को छोटा किया जा सकता है:%bd | e#


यह ज्यादातर ठीक काम करता है। लेकिन कभी-कभी %सभी चयनकर्ता के रूप में काम नहीं कर सकते हैं। क्या आप कुछ अनुमान लगा सकते हैं?
जिनयुंग किम

@JinyoungKim ([1] से): ":% bd" कमांड में, '%' श्रेणी को वर्तमान बफ़र में शुरू और समाप्त होने वाली लाइन नंबरों से बदल दिया जाएगा। सीमा के रूप में '%' का उपयोग करने के बजाय, आपको सीमा के लिए संख्या निर्दिष्ट करनी चाहिए। उदाहरण के लिए, सभी बफ़र्स को हटाने के लिए, आप कमांड का उपयोग कर सकते हैं ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
innotsam

मैंने अभी दस्तावेज़ की जाँच की। तो, '%' रेंज कई मौजूदा फ़ाइल लाइनों पर निर्भर है?
जियानगॉन्ग किम

2
मुझे बिल्ट-इन फ़ंक्शन मिला bufnr("$")जो अंतिम बफर नंबर देता है। लेकिन मैं जब मैं इस तरह का उपयोग करने के लिए स्ट्रिंग को प्रक्षेपित करने का कोई विचार नहीं है :1,bufnr("$")bd। शायद .. सबसे अच्छा समाधान होगा :1,9999bd
जिनेगू किम

2
:help :bdदिखाता है :%bdelete " delete all buffers। तो %वास्तव में आप क्या चाहते हैं। मैं आपके समाधान के एक प्रकार का उपयोग करता हूं: :%bd<CR><C-O>:bd#<CR>यह सभी बफ़र्स को हटा देगा, फिर <C-O>वर्तमान फ़ाइल में स्थिति को पुनर्स्थापित करने के लिए उपयोग करें, फिर :bd#अनमैन्ड बफर को हटाने के लिए। यह सभी बफ़र्स को बंद कर देता है और आपको फ़ाइल में उसी स्थान पर छोड़ देता है।
अलेजांद्रो

26

जुआनानुइज़ के उत्तर पर निर्माण।

आप जिस बफर को रखना चाहते हैं, उसमें एक छोटा सा बदलाव करें

:1,1000bd

कमांड bd(बफर डिलीट) किसी भी बफ़र्स को बिना सहेजे बदलावों से नहीं हटाएगा। इस तरह आप करंट (बदली हुई) फाइल को बफर लिस्ट में रख सकते हैं।

संपादित करें: कृपया ध्यान दें कि यह आपके NERDTreeBuffer को भी हटा देगा। आप इसे वापस प्राप्त कर सकते हैं: NERDTree


बिल्कुल सही, छोटा और सरल! :)
सन्दूक

50
:% bd वास्तव में 1-1000 के बजाय "ऑल" है।
जॉन टायर्री

क्या यह set nohiddenसेट होने पर निर्भर करता है ?
फेलिप अल्वारेज़

15

का उपयोग करके

:on[ly][!]

तथा

:h only

29
यह विंडो बंद करता है, बफ़र्स नहीं।
ZyX

13
फिर भी उपयोगी है, क्योंकि लोग गलत शब्द के लिए Googling कर सकते हैं, और यह पाएंगे। तो आप दोनों को धन्यवाद। :)
आर्कगून

1
@ राजगृह हाँ, लेकिन उत्तर में निर्दिष्ट किया जाना चाहिए।
औरो

10

सभी खुले बफ़र्स को बंद करना:

silent! execute "1,".bufnr("$")."bd"

वर्तमान के अलावा सभी खुले बफ़र्स को बंद करना :

function! CloseAllBuffersButCurrent()
  let curr = bufnr("%")
  let last = bufnr("$")

  if curr > 1    | silent! execute "1,".(curr-1)."bd"     | endif
  if curr < last | silent! execute (curr+1).",".last."bd" | endif
endfunction

इस फ़ंक्शन को इसमें जोड़ें .vimrcऔर इसका उपयोग करके कॉल करें :call CloseAllBuffersButCurrent()

सुविधा का नक्शा:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>

मैंने देखा कि जब vim सत्रों को फिर से शुरू किया जाता है, जो बफ़र्स को पुनर्स्थापित करता है, तो मैं अब उपरोक्त का उपयोग करके बफ़र्स को निकालने में सक्षम नहीं था। इसके बजाय, मैं का इस्तेमाल किया था:%bd|e#|bd#
shmup

सबसे अच्छा उपाय। मैंने NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa

5

मैंने इसे अपनी .vimrc फाइल में डाला

nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>

तब आपका leader + ca(सभी को बंद करें) करंट को छोड़कर सभी बफ़र्स को बंद कर दें।

यह क्या करता है

: w - करंट बफर सेव करें

% bd - सभी बफ़र्स को बंद करें

ई # - अंतिम संपादित फ़ाइल खोलें

bd # - अनाम बफ़र को बंद करें



1

यहाँ मैं क्या कर रहा हूँ। इसलिए मैं सभी बफ़र्स को हटाने के बाद अपने कर्सर की स्थिति को रखना पसंद करता हूं और ऊपर दिए गए अधिकांश समाधान इस तथ्य को अनदेखा करता है। मुझे यह भी लगता है कि कमांड को रीमेक करना टाइप करने से बेहतर है, इसलिए मैं <leader>bdसभी बफ़र्स को हटाने और अपने मूल कर्सर स्थिति पर वापस जाने के लिए उपयोग करता हूं।

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"

%bd = सभी बफ़र्स को हटा दें।

e# = संपादन के लिए अंतिम बफर खोलें (मैं जिस बफर पर काम कर रहा हूं)।

bd#आपके द्वारा उपयोग किए जाने पर [नहीं नाम] बफर को हटाने के लिए %bd

बीच में पाइप एक के बाद एक कमांड करता है। आप का उपयोग करके हालांकि यह बच जाएगा\|

'" = मेरी कर्सर स्थिति रखें।


0

मुझे पसंद है 1,100bd( juananruiz द्वारा सुझाया गया ) जो मेरे लिए काम करता है।

मुझे quit!देने के लिए मैंने अपनी मैपिंग में एक जोड़ा

nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>

यह सभी बफ़र्स को मारता है और विम को नीचे गिरा देता है, जो कि मैं ज्यादातर देख रहा था।


1
वास्तव में आपके पास bdqमैपिंग करने का कोई कारण नहीं है जो सभी बफ़र्स को बंद कर देता है और :q!जब आप सिर्फ उपयोग कर सकते हैं, तो इसके साथ विम बाहर निकलता है :qa!। जब तक मैं कुछ देख रहा हूँ
shmup

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