सबसे तेज़ तरीका एक बफर में स्विच करने के लिए?


43

Vim में बफर का चयन करने का एक तरीका बफ़र सूची को ब्राउज़ करने के लिए हो सकता है, एक विंडो में सूची ब्राउज़ करने के लिए मानक कमांड के रूप :lsमें या कुछ बाहरी प्लगइन / विम्सस्क्रिप्ट कोड के साथ

मान लीजिए कि मैं सीधे एक बफर में कूदना चाहता हूं, जितनी जल्दी हो सके।

अनुक्रमिक मोड में बफर सूची को पार करने के लिए, मैं अब <C-J> <C-K>शॉर्टकट का उपयोग करता हूं , मेरे .vimrc में सेट किया गया है:

" move among buffers with CTRL
map <C-J> :bnext<CR>
map <C-K> :bprev<CR>

दूसरा तरीका (डायरेक्ट एक्सेस) नंबर द्वारा स्विच किया जा सकता है : बफर नंबर को जानना, इसके बाद बफर नंबर दर्ज करके सीधे स्विच करना संभव है <C-^>। इसलिए अगर मैं बफर नंबर 5 पर स्विच करना चाहता हूं, तो मैं प्रेस करूंगा 5<C-^>

लेकिन यह मेरे लिए काम नहीं कर रहा है (मैं विंडोज़ कीबोर्ड से इतालवी कीबोर्ड के साथ ubuntu बॉक्स पर vim 7.4 का उपयोग करता हूं )। मुझे संदेह है कि क्योंकि ^चरित्र इतालवी कीबोर्ड में ऊपरी मामले की कुंजी में है, इसलिए वास्तव में ^मुझे प्रेस करने की आवश्यकता हैSHIFT-^

कोई विचार?


2
आप के <c-6>बजाय दबा सकते हैं <c-^>?
पीटर रिंकेर

क्या आपका मतलब है Ctrl-1 बफर नंबर 1 पर जाने के लिए? दुर्भाग्य से काम नहीं करता है। कुछ भी नहीं
जियोर्जियो रॉबिनो

1
नहीं। कुछ टर्मिनल्स Ctrl-6 को समझ सकते हैं जो यूएस कीबोर्ड पर Ctrl- ^ के समान है।
पीटर रिनेकर

2
+1 महान, यह काम करता है! मैं एक इतालवी कीबोर्ड लेआउट (पोटीन टर्मिनल एमुलेटर का उपयोग करके) का उपयोग करता हूं। तो: 1<C-6>बफर नंबर 1 पर स्विच करता है। धन्यवाद!
जियोर्जियो रॉबिनो

आप Ctrlस्पेस का उपयोग करने का प्रयास कर सकते हैं ।
हॉन्बो लियू

जवाबों:


51

:bआदेश भी एक ले जा सकते हैं -स्ट्रिंग बफर जो आप के लिए यात्रा करना चाहते हैं, जो बहुत सुविधाजनक है की फ़ाइल का नाम की।

उदाहरण के लिए, आप तीन बफ़र्स अगर foo, barहै, और baz, फिर

  • :b barbarफ़ाइल पर स्विच करेगा ।

  • :b ofooफ़ाइल पर स्विच करेगा ।

  • :b aयदि आपको कोई त्रुटि दे देंगे तो इसका मतलब यह है क्योंकि सकता है या तो barया baz, लेकिन आप नाम ठीक कर सकते हैं के साथ और अधिक विशिष्ट, उदाहरण के लिए हो सकता है, : r Enter

यह बहुत उपयोगी हो सकता है, क्योंकि इसका मतलब इसके बजाय है

:buffer very/very/long/path/to/a/veryVeryLongFileName.txt

आप कुछ ऐसा कर सकते हैं

:b LongFileName

जो बहुत छोटा और आसान है।

यदि आप इसका उपयोग करना चाहते हैं तो यह कमांड एक नंबर भी ले सकती है:

:b 5

8
आंशिक बफर नामों का उपयोग करने के बारे में एक चेतावनी: यदि आंशिक बफर नाम कुछ बफ़र पथ में शब्द सीमा की शुरुआत में प्रकट होता है, तो शब्द के बीच में आंशिक नाम के साथ कोई भी बफर :bकमांड द्वारा सुलभ नहीं होगा । उदाहरण के लिए, यदि आपके पास दो बफ़र हैं path/to/fooऔर path/to/tofu, कमांड :b f<Tab>कभी भी मेल नहीं खाएगा path/to/tofu, क्योंकि यह एक शब्द की शुरुआत में मेल खाता है path/to/foo
tommcdo

2
:5bतब थोड़ा छोटा होता है :b 5 ;-)
joeytwield

15

यही है वह जो मेरे द्वारा उपयोग किया जाता है:

nnoremap <Leader>b :ls<CR>:b<Space>

अब दबाने पर उपलब्ध बफ़र्स\b को सूचीबद्ध किया जाएगा और :bआपके लिए तैयारी की जाएगी ।

तब आप बस बफर नंबर टाइप कर सकते हैं , और एंटर दबा सकते हैं।

या आप फ़ाइल नाम का हिस्सा टाइप कर सकते हैं , और एंटर दबा सकते हैं। (हालांकि, मैं आमतौर पर दर्ज करने से पहले टैब को हिट करता हूं, यह जांचने के लिए कि मुझे सही बफर मिला है। यदि नहीं, तो मैं तब तक टैब के साथ साइकिल चलाना जारी रखता हूं जब तक कि मुझे वह नहीं मिल जाता जो मैं चाहता था।)


वास्तव में, मैं ऊपर के थोड़े थोड़े संस्करण का उपयोग करता हूं:

nnoremap <C-e> :set nomore <Bar> :ls <Bar> :set more <CR>:b<Space>

यह -- More --संकेत को प्रकट होने से रोकेगा जब आपके पास प्रदर्शित करने के लिए उपलब्ध लाइनों की तुलना में अधिक बफ़र्स हों।

लेकिन यदि आपके पास आमतौर पर 'more'विकल्प अक्षम है, तो यह मैपिंग आपको वास्तव में परेशान करेगी, क्योंकि यह 'more'करने के बाद विकल्प को फिर से सक्षम करता है ls!


1
सच कहा जाए, मैं वास्तव में उन दोनों में से किसी का भी उपयोग नहीं करता, मैं अपने छोटे प्लगइन का उपयोग करता हूं , लेकिन कार्यक्षमता बहुत समान है। प्लगइन के साथ, मैं बिना खोले बफ़र्स के फ़ाइलनाम पर टैब-पूर्ण भी कर सकता हूं।
joeytwiddle

1
हालाँकि यह तकनीक उतनी तेजी से उपयोग नहीं होती है [count]<C-^>जब आप बफर नंबर को जानते हैं, यह बहुत उपयोगी है जब आप नहीं जानते हैं।
joeytwiddle

2
अपने नोट्स के लिए धन्यवाद joeytwiddle। मैं आपके प्लगइन की जाँच करूँगा। मेरे मामले में (ऊपर कीबोर्ड का मुद्दा देखें) [count]<C-6>मुझे ज्ञात बफर में स्विच करने का सबसे तेज़ तरीका दिखाई देता है
जियोर्जियो रॉबिनो

हाँ, मैं भी [count]<C-^>इन दिनों का उपयोग कर रहा हूँ । लेकिन इसका मतलब है कि मुझे मिनीब्यूफ्लॉपर या कुछ समान चलाने की ज़रूरत है, ताकि यह पता चल सके कि बफर नंबर क्या हैं!
joeytwiddle

आपको <CR> और <SPACE> की आवश्यकता क्यों है? सबसे पहले यह मेरे लिए प्रतीत होता है, जैसे कि यह उनके बिना ठीक काम करता है ...
फेलिक्स Crazzolara

9

:CtrlPBufferप्लगइन CtrlP (4k ★) से

इस प्लगइन की मुख्य विशेषता दृश्य प्रतिक्रिया के साथ एक अलग बफर को आसानी से खोलने के लिए एक फजी मिलान प्रदान करना है।

मोड के साथ बदलने के लिए :CtrlPBufferया <C-p>उसके बाद फजी बफर लिस्टिंग खोलें ।<C-b>buffer

जिस बफर को आप खोलना चाहते हैं, उसे निर्दिष्ट करने के लिए पर्याप्त संख्या में वर्ण दर्ज करें।
आप सूची के माध्यम से उपयोग कर सकते हैं <C-j>और <C-k>मैन्युअल रूप से बफर का चयन कर सकते हैं ।

यहाँ छवि विवरण दर्ज करें

अनुकूलन

यदि आप बफर सूची को तुरंत खोलना चाहते हैं <C-p>, तो अपने vimrc में निम्न पंक्ति जोड़ें:

let g:ctrlp_cmd = 'CtrlPBuffer'

आप उपयोग कर सकते हैं <C-f/b>ctrlp विंडो के मोड स्विच करने के लिए।

मैं व्यक्तिगत रूप से उपयोग करता हूं let g:ctrlp_cmd = 'CtrlPMRU'। सबसे हाल ही में उपयोग की गई (mru) सूची में खोले गए बफ़र्स भी शामिल हैं। यदि आप विभिन्न ctrlp मोड का उपयोग करते हैं और अपने अंतिम मोड पर रहना चाहते हैं, तो आप सेट कर सकते हैं let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'

समान प्लगइन्स

अधिक प्लगइन्स हैं जो फ़ज़ी मैचिंग के साथ एक इंटरैक्टिव प्रॉम्प्ट के साथ एक बफर सूची प्रदान करते हैं, जैसे

  • fzf.vim (4k ★) जूनगुन द्वारा (+ टर्मिनल, गो)
  • Wincent द्वारा कमांड-टी (+ माणिक)
  • denite.nvim Shougo द्वारा (+ python3, vim8 या neovim)

अंधेरे पक्ष बनाम प्रकाश पक्ष

(यानी प्लगइन-भारी विम सेटअप बनाम विम तरीका)

इससे पहले कि आप इन अधिक जटिल प्लगइन्स का उपयोग करने का निर्णय लें, @Doorknob और @joeytwiddle द्वारा उत्तरों का अध्ययन करें । विशेष रूप से, वन-लाइनर की जांच करें यदि उनमें से एक पहले से ही आपकी आवश्यकताओं को पूरा करता है।

  1. nnoremap <Leader>b :b <C-d>
  2. nnoremap <Leader>b :ls<Cr>:b<Space>

केवल बफर स्विचिंग के लिए प्लगइन्स इंस्टॉल करना एक ओवरकिल हो सकता है। Https://www.vi-improved.org/recommendations पर टिप्पणी और ड्रू नील के लेख 'आरी को तेज करते हुए' भी देखें


हाँ Hotschke, मैं कबूल करता हूं कि मैं अक्सर उपयोग करता हूं: CtrlPBuffer
जियोर्जियो रॉबिनो

मैं map <leader>a <ESC>:CtrlPBuffer<CR><CR>पहले खोले गए बफर के साथ कूदने का उपयोग कर रहा हूं <leader>a(जबकि <leader>bसिर्फ मेरे लिए बफर सूची खोलता है)
रॉल्फ

@ रॉल्फ: क्या आप जानते हैं <C-^>(= <C-6>)? देखते हैं :h CTRL-^। Afaik, यह सिर्फ वही करता है जो आपकी मैपिंग करता <leader>aहै। इसलिए मुझे लगता है कि आप सिर्फ एक उदाहरण लाए हैं कि क्यों लोग प्लगइन्स का उपयोग करते हुए विम उपयोगकर्ता को बता सकते हैं जो नहीं जानते कि विम पहले से ही अपने आप क्या कर सकता है।
होट्सचेक

@ हत्शके: नहीं, मुझे नहीं पता था। सीखा कुछ पता था, धन्यवाद! हालांकि मैं रीमैप करने जा रहा हूं <C - ^>।
रॉल्फ

वेनिला विम के साथ <Cd> का उत्कृष्ट संदर्भ। मैंने वह संदर्भ कहीं और नहीं देखा है।
राड

8

Joeytwiddle और Doorknob द्वारा वास्तव में उपयोगी जवाब के अलावा :b#, जो हाल ही में उपयोग किए गए बफर पर स्विच नहीं करता है। यह भी बस के साथ किया जा सकता है <C-^>। जब आपके पास बहुत सारे बफ़र्स होते हैं और आप उनके बीच लगातार स्विच करते हैं, तो सबसे हाल का बफर आमतौर पर सबसे आम गंतव्य होता है।

व्यक्तिगत रूप से मैं कई तरीकों के संयोजन का उपयोग करता हूं। जब मैं मुख्य रूप से दो बफ़र्स के साथ काम कर रहा हूं और बाकी को कभी-कभी संदर्भ के लिए खोला जाता है, तो मैं उनके साथ :b#या उनके बीच स्विच करता हूं <C-^>। जब मुझे उनमें से अधिक के साथ काम करना होता है और अधिक बार स्विच करना होता है, तो मैं उन्हें पूरा करने के लिए TAB के साथ या तो संख्याओं का उपयोग करता हूं (जैसे कि joeytwield टिप में) या नामों का एक हिस्सा (Doorknob टिप में)। जब नाम भ्रामक होते हैं, और कई बफ़र्स खोले जाते हैं (आमतौर पर 10 से अधिक), मैं अधिक बार Ctrl-P प्लगइन का उपयोग करता हूं ( https://github.com/kien/ctrlp.vim ) दो तेज कीस्ट्रोक्स के साथ मुझे सूची मिली उन सभी को और मैं जल्दी से उन्हें खोजने के लिए शक्तिशाली फजी खोज का उपयोग करने में सक्षम हूं जो मैं चाहता हूं।


2
<C - ^> अकेले (<C-6> मेरे मामले में, जैसा कि पीटर रेंकर ने सुझाव दिया था) सिर्फ 2 बफ़र्स के मामले में एक अच्छी चाल है :-)
जियोर्जियो रॉबिनो

5

[bऔर ]bप्लगइन से vim-unimpaired(> 2k ★)

यदि आप स्थापित हैं vim-unimpaired, तो आप उपयोग कर सकते हैं

  • [b( :bp[revious]) और
  • ]b( :bn[ext])

ओपन बफ़र्स के माध्यम से साइकिल चलाने के लिए। समान आदेशों के लिए अधिक कीमती मैपिंग को परिभाषित करने की आवश्यकता नहीं है। इसके अलावा, पहले और आखिरी बफ़र पर कूद कर किया जा सकता है

  • [B( :bf[irst]) और
  • ]B( :bl[ast])।

इसमें बहुत अधिक ब्रैकेट-मैपिंग निहित हैं, vim-unimpairedजो आपको उपयोगी लग सकते हैं। वे सभी एक ही योजना का पालन करते हैं जिससे उन्हें याद रखना आसान हो जाता है।

अंधेरे पक्ष बनाम प्रकाश पक्ष

इस प्लगइन को हल्का और 'विमिश' माना जा सकता है। इसे #vim समुदाय द्वारा "नुकसान नहीं पहुंचाता" प्लगइन के रूप में दर्शाया गया है ।


+1 यह भी ध्यान देने योग्य है कि आप एक गिनती प्रदान कर सकते हैं। 3[bतीन बफ़र्स वापस कूदने के लिए।
joeytwiddle

1

वर्तमान में मैं स्विच करने के लिए <Leader>+ numberकुंजी का उपयोग कर रहा हूं । नेता कुंजी मेरी <space>कुंजी है। मैं विंडो के ऊपर बफर एनआर दिखाने के लिए विम-एयरलाइन का भी उपयोग करता हूं ।

" airline settings
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#tabline#enabled = 1

जबकि bufnr अक्सर 10 से अधिक होता है, इसलिए मैं अपनी खुद की मैपिंग को ट्वीक करता हूं, यदि numberएकमात्र मैच है, तो बफर को तुरंत स्विच करें, अन्यथा <space>पुष्टि के लिए अधिक नंबर इनपुट या कुंजी की प्रतीक्षा करें:

nnoremap <expr> <Leader>1 tweak#wtb_switch#key_leader_bufnum(1)
nnoremap <expr> <Leader>2 tweak#wtb_switch#key_leader_bufnum(2)
nnoremap <expr> <Leader>3 tweak#wtb_switch#key_leader_bufnum(3)
nnoremap <expr> <Leader>4 tweak#wtb_switch#key_leader_bufnum(4)
nnoremap <expr> <Leader>5 tweak#wtb_switch#key_leader_bufnum(5)
nnoremap <expr> <Leader>6 tweak#wtb_switch#key_leader_bufnum(6)
nnoremap <expr> <Leader>7 tweak#wtb_switch#key_leader_bufnum(7)
nnoremap <expr> <Leader>8 tweak#wtb_switch#key_leader_bufnum(8)
nnoremap <expr> <Leader>9 tweak#wtb_switch#key_leader_bufnum(9)




func! tweak#wtb_switch#key_leader_bufnum(num)
    let l:buffers = tweak#wtb_switch#buflisted()
    let l:input = a:num . ""

    while 1

        let l:cnt = 0
        let l:i=0
        " count matches
        while l:i<len(l:buffers)
            let l:bn = l:buffers[l:i] . ""
            if l:input==l:bn[0:len(l:input)-1]
                let l:cnt+=1
            endif
            let l:i+=1
        endwhile

        " no matches
        if l:cnt==0 && len(l:input)>0
            echo "no buffer [" . l:input . "]"
            return ''
        elseif l:cnt==1
            return ":b " . l:input . "\<CR>"
        endif

        echo ":b " . l:input

        let l:n = getchar()

        if l:n==char2nr("\<BS>") ||  l:n==char2nr("\<C-h>")
            " delete one word
            if len(l:input)>=2
                let l:input = l:input[0:len(l:input)-2]
            else
                let l:input = ""
            endif
        elseif l:n==char2nr("\<CR>") || (l:n<char2nr('0') || l:n>char2nr('9'))
            return ":b " . l:input . "\<CR>"
        else
            let l:input = l:input . nr2char(l:n)
        endif

        let g:n = l:n

    endwhile
endfunc

func! tweak#wtb_switch#buflisted()
  return filter(range(1, bufnr('$')), 'buflisted(v:val)')
endfunc

यहां से कोड चिपकाया जाता है

वैसे, मैं भी उपयोग करें <S-h>और <S-l>के लिए :bpऔर :bn, या :tabpऔर :tabnएक से अधिक tabpage वर्तमान में खोला गया है। यह मेरे लिए काफी सहज है।


1

इन दिनों मैं [buffer_number]<Ctrl-^>बफ़र्स को स्विच करने के लिए उपयोग कर रहा हूं क्योंकि यह बहुत तेज़ है।

लेकिन बफर नंबर कैसे पता करें? मैं MiniBufExplorer का उपयोग करता हूं ताकि मैं हमेशा Vim के शीर्ष पर बफ़र नंबर देख सकूं

मैं निम्नलिखित मैपिंग का भी उपयोग करता हूं, क्योंकि <C-^>एक हाथ से पहुंचने के लिए थोड़ा मुश्किल है।

:nmap <C-E> <C-^>

बिना किसी कॉन्फ़िगरेशन वाली एक ताज़ा मशीन पर, मैं वापस आ जाता हूं :b [part_of_filename]<Tab><Enter>

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