Vim'deki bir tampon belleğe geçmenin en hızlı yolu?


43

Vim'de bir tampon seçmenin bir yolu , bir penceredeki listeye göz atmak için standart komutları kullanarak :lsveya bazı harici eklenti / vimscript kodlarıyla tampon listesine göz atmak olabilir .

Diyelim ki mümkün olduğunca hızlı bir şekilde bir tampon belleğe doğrudan atlamak istiyorum.

Tampon listesini sıralı modda hareket ettirmek için, şimdi <C-J> <C-K>.vimrc dosyamda ayarlanmış olan kısayolları kullanıyorum :

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

Başka bir yol (doğrudan erişim) sayıya göre değişiyor olabilir : arabellek numarasını bilmek, ardından arabellek numarasını girerek doğrudan geçiş yapmak mümkündür <C-^>. Bu yüzden 5 numaralı tampon belleğe geçmek istersem basardım 5<C-^>.

Fakat bu benim için işe yaramıyor gibi görünüyor (ubuntu kutusunda vim 7.4 kullanıyorum, bir Windows misafirinden İtalyan klavyesi ile ). Ben bunun nedeni şüpheli ^karakter büyük harf anahtarında ise İtalyan klavyede var bu yüzden aslında, ^ben basına ihtiyaçSHIFT-^

Herhangi bir fikir?


2
Yükleme sırasında <c-6>yerine <c-^>?
Peter Rincker

1 numaralı tampon belleğe gitmek için Ctrl-1'i kastediyor musunuz? Maalesef çalışmıyor. hiçbir şey olmuyor
Giorgio Robino

1
Hayır. Bazı terminaller, ABD klavyesinde Ctrl- ^ ile aynı olan Ctrl-6'yı anlayabilir.
Peter Rincker

2
+1 Harika, Çalışıyor! İtalyanca klavye düzeni kullanıyorum (macun terminali emülatörü kullanarak). Yani: 1<C-6>1 numaralı tampon belleğe geçer. Teşekkürler!
Giorgio Robino

Yanıtlar:


51

:bKomut ayrıca alabilir alt dizeyi çok uygundur size seyahat istediğiniz tampon ait dosyanın adının.

Örneğin, üç tampon varsa foo, barve bazdaha sonra,

  • :b barbardosyaya geçecektir .

  • :b ofoodosyaya geçecektir .

  • :b aya bir hata verecekti , ya barda olabilir baz, ya da örneğin ismiyle daha belirgin olması için adı düzeltebilirsiniz : r Enter.

Bu çok faydalı olabilir, çünkü bunun yerine

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

gibi bir şey yapabilirsin

:b LongFileName

çok daha kısa ve daha kolay.

Bunu kullanmak istiyorsanız, bu komut da bir sayı alabilir:

:b 5

8
Kısmi arabellek adlarını kullanma hakkında bir uyarı: Kısmi arabellek adı, bazı arabellek yolundaki bir kelime sınırının başında görünüyorsa, kelimenin ortasında kısmi ada sahip arabellek :bkomutuna erişilemez . Örneğin, iki arabellekiniz varsa path/to/foove path/to/tofukomut :b f<Tab>, path/to/tofuiçinde bir kelimenin başında eşleştiği için hiçbir zaman eşleşmeyecektir path/to/foo.
tommcdo

2
:5bo zaman biraz daha kısa :b 5 ;-)
joeytwiddle

15

Kullandığım şey bu:

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

Şimdi basarak \bolacaktır mevcut tamponlarını listelemek ve hazırlamak :bsizin için.

Sonra sadece arabellek numarasını yazıp Enter tuşuna basabilirsiniz .

Veya dosya adının bir kısmını yazıp Enter tuşuna basabilirsiniz . (Ancak genellikle Enter tuşuna basmadan önce Tab tuşuna basarım, kontrol etmek için doğru arabelleği aldım. Olmazsa, istediğim kişiyi alana kadar Tab ile bisiklete devam ediyorum.)


Aslında, yukarıdakilerin biraz ince bir versiyonunu kullanıyorum:

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

Bu, -- More --görüntülemek için kullanılabilir satırlardan daha fazla arabellek olduğunda istemin görünmesini önler .

Ancak 'more', yine de genellikle seçeneği devre dışı bıraktıysanız, bu haritalama sizi gerçekten sinirlendirir, çünkü bunu 'more'yaptıktan sonra seçeneği tekrar etkinleştirir ls!


1
Gerçeği söylemek gerekirse, aslında ikisini de kullanmıyorum, kendi küçük eklentimi kullanıyorum , ancak işlevsellik çok benzer. Eklentiyle, açılmamış arabelleklerin dosya adlarında Tab-complete da yapabilirim.
joeytwiddle

1
Bu teknik, [count]<C-^>arabellek numarasını bildiğiniz kadar hızlı olmasa da, bilmediğiniz zaman oldukça kullanışlıdır.
joeytwiddle

2
notlarınız için teşekkürler joeytwiddle. Eklentinizi en kısa zamanda kontrol edeceğim. Benim durumumda (yukarıdaki klavye sorununa bakın) [count]<C-6>bana bilinen tampon belleğe geçmenin en hızlı yolunu gösteriyor
Giorgio Robino

Evet [count]<C-^>bu günleri de kullanıyorum . Ancak bu, arabellek numaralarının ne olduğunu bilmek için MiniBufExplorer veya benzeri bir şey çalıştırmam gerektiği anlamına geliyor!
joeytwiddle

neden <CR> ve <SPACE> 'e ihtiyacınız var? İlk başta bana geliyor, sanki onlarsız çalışıyormuş gibi ...
Felix Crazzolara

9

:CtrlPBufferEklenti CtrlP'den (4k ★)

Bu eklentinin ana özelliği görsel geri bildirimle farklı bir tamponu uygun bir şekilde açmak için bulanık bir eşleştirme sağlamaktır.

Modu değiştirmek için bulanık tampon listesini açın :CtrlPBufferveya tuşuna ve <C-p>ardından tuşuna basın .<C-b>buffer

Açmak istediğiniz arabellek belirtmek için yeterli sayıda karakter girin.
Ayrıca kullanabilirsiniz <C-j>ve <C-k>döngüsüne listeyi elle tampon seçin.

görüntü tanımını buraya girin

Özelleştirme

Tampon listesini hemen açmak isterseniz <C-p>, vimrc'nize aşağıdaki satırı ekleyin:

let g:ctrlp_cmd = 'CtrlPBuffer'

<C-f/b>Ctrlp penceresinin modunu değiştirmek için kullanabilirsiniz .

Ben şahsen kullanırım let g:ctrlp_cmd = 'CtrlPMRU'. En son kullanılanlar (mru) listesi ayrıca açılan arabellekleri içerir. Farklı ctrlp modları kullanıyorsanız ve son modunuza bağlı kalmak istiyorsanız, ayarlayabilirsiniz let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'.

Benzer eklentiler

Bulanık eşleme ile etkileşimli bilgi istemi içeren bir tampon listesi sağlayan daha fazla eklenti var, örn.

  • fzf.vim (4k ★) Junegunn (+ terminal, go)
  • wincent tarafından komut-t (+ yakut)
  • denu.nvim Shougo (+ python3, vim8 veya neovim) tarafından

Karanlık taraf, aydınlık tarafa karşı

(yani eklenti ağırlıklı vim kurulumu vs. vim yolu)

Bu daha karmaşık eklentileri kullanmaya karar vermeden önce, @Doorknob ve @ joeytwiddle'ın cevaplarını inceleyin . Özellikle, birisinin ihtiyaçlarınızı zaten karşılayıp karşılamadığını kontrol edin.

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

Eklentileri sadece tampon geçişi için kurmak bir engel olabilir. Ayrıca https://www.vi-improved.org/recommendations ve Drew Neil'in 'Testereyi keskinleştirme üzerine' adlı makalesine de bakın .


evet Hotschke, sık kullandığımı itiraf ediyorum: CtrlPBuffer
Giorgio

Daha map <leader>a <ESC>:CtrlPBuffer<CR><CR>önce açılmış olan ara belleğe atlamak için kullanıyorum <leader>a( <leader>bsadece benim için arabellek listesini açarken )
Rolf

@Rolf: biliyor musunuz <C-^>(= <C-6>)? bkz :h CTRL-^. Afaik, bu sadece senin haritan ne <leader>ayapıyorsa onu yapıyor. Bu yüzden, insanların neden eklentileri kullandıklarını, neden zaten vimin kendi başına yapabileceğini bilmeyen vim kullanıcısına yol açabileceğini söylediklerini söyledim.
Hotschke

@Hotschke: Hayır, bunu bilmiyordum. Bildiği bir şey öğrendim, teşekkürler! Yine de <C - ^> remap yapacağım.
Rolf,

Vanilya vim ile <Cd> için mükemmel referans. Bu referansı başka hiçbir yerde görmedim.
radke

8

Joeytwiddle ve Doorknob'un gerçekten faydalı cevaplarına ek olarak :b#, en son kullanılan tampon belleğe geçişi de unutma . Ayrıca sadece yapılabilir <C-^>. Çok fazla arabellekiniz olduğunda ve aralarında sürekli geçiş yaptığınızda, en son arabellek genellikle en yaygın varış noktasıdır.

Şahsen ben birçok yöntemin kombinasyonunu kullanıyorum. Çoğunlukla iki tamponla çalıştığım zaman ve gerisi sadece ara sıra referans olması için açıldığında, :b#ya da ile arasında geçiş yapma eğilimindeyim <C-^>. Onlarla çalışmak ve daha sık çalışmak zorunda kaldığımda, onları tamamlamak için ya sayıları (joeytwiddle ucunda olduğu gibi) ya da adların bir kısmını (Doorknob ucunda olduğu gibi) TAB ile kullanıyorum. İsimler kafa karıştırıcıyken ve çok fazla arabellek açıldığında (genellikle 10'dan fazla), Ctrl-P eklentisini daha sık kullanıyorum ( https://github.com/kien/ctrlp.vim ) İki hızlı tuş vuruşuyla hepsini ve hızlı bir şekilde istediklerimi bulmak için üzerlerinde güçlü bulanık arama kullanabilirsiniz.


2
<C - ^> yalnız (<C-6> benim durumumda, Peter Rincker'ın önerdiği gibi) sadece 2 arabellek durumunda iyi bir püf noktası :-)
Giorgio Robino

5

[bve ]beklentiden vim-unimpaired(> 2k ★)

Eğer yüklediyseniz vim-unimpairedkullanabilirsiniz.

  • [b( :bp[revious]) ve
  • ]b( :bn[ext])

Açık tamponlarda bisiklet sürmek için. Aynı komutlar için daha değerli eşlemeler tanımlamanıza gerek yok. Ayrıca, ilk ve son arabellek atlayarak yapılabilir

  • [B( :bf[irst]) ve
  • ]B( :bl[ast]).

Orada daha braket-eşleştirmeleri bol bulunan vim-unimpairedbu konuda yararlı olabilir. Hepsi onları ezberlemeyi kolaylaştıran aynı şemaları takip ediyorlar.

Karanlık taraf, aydınlık tarafa karşı

Bu eklenti hafif ve 'korkak' olarak kabul edilebilir. #Vim topluluğu tarafından "zarar vermez" eklentisi olarak gösterilir.


+1 Ayrıca bir sayı sağlayabileceğinizi de unutmayın. 3[büç tampon geri atlamak için.
joeytwiddle

1

Şu anda geçiş yapmak için <Leader>+ numbertuşunu kullanıyorum . Lider anahtar benim <space>anahtarımdır. Ayrıca vim-airline'ı tamponun nr penceresinin üstünde göstermek için kullanıyorum.

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

Bufnr sık ​​sık 10'u aştığı için, kendi eşlememi ince ayarlıyorum, eğer numbersadece uyuşuyorsa, tamponu hemen değiştir, aksi halde <space>onaylamak için daha fazla sayı girişi veya tuşu bekle :

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

Kod buradan yapıştırılır

Bu arada, ben de kullanmak <S-h>ve <S-l>için :bpve :bnya :tabpve :tabnbirden fazla TabPage anda açılırsa. Bu benim için oldukça sezgisel.


1

Bu gün [buffer_number]<Ctrl-^>arabellek değiştirmek için kullanıyorum çünkü çok hızlı.

Ancak arabellek numarasını bilmek nasıl? Kullandığım MiniBufExplorer hep Vim üstündeki tampon numaralarını görebilirsiniz.

Ayrıca aşağıdaki haritalamayı da kullanıyorum, çünkü <C-^>bir eliyle ulaşmak biraz zor.

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

Yapılandırılmamış yeni bir makineye geri dönüyorum :b [part_of_filename]<Tab><Enter>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.