Tamponları kullanmanın daha etkili bir yolu nedir?


13

Son zamanlarda kullandığım eklenti sayısını önemli ölçüde azaltıyorum, bu yüzden sadece yerleşik Vim özelliklerini kullanarak cevap arıyorum.

Çok fazla arabellek düzenlerken iş akışımda bir kusur fark ettim: Bir arabellekteyim ve adını hatırlamadığım ve alternatif arabellek olmayan başka bir tanesine geçmek istiyorum . Bu nedenle kullanmak :b#mümkün değildir ve tamamlamayı komutla :bkullanmak da uygun değildir.

Bunu yapmak için aşağıdakileri yapıyordum:

  • :buffersAçık tamponların listesini almak için ilk kullanım
  • Kullanmak istediğim arabellek sayısını hatırla
  • EnterTampon listesini kapatmak için basın
  • Kullanım :bXile Xkullanım için tampon numarası.

Bu iş akışı benim için oldukça ağır görünüyordu, bu yüzden şu satırları ekledim .vimrc:

" Improve the navigation in the buffers 
nnoremap <Leader><S-b> :B<CR> 
command! B call Buffers() 

function! Buffers() 
    execute "buffers" 
    let buffer=input("Enter a buffer:") 
    execute "b" . buffer 
endfunction 

Bu bana bir komut :B(ve bir eşleme) işlevini çağıran :buffersbir girdi için beklemek ve son olarak da çağrıları :bgirdikten sonra çağırır .

İyi çalışıyor ama böyle bir işlev geliştirmem gerektiğine şaşırdım: genellikle Vim oldukça etkili bir varsayılan iş akışına sahiptir, bu yüzden istisnasız bir şey bilmediğim bir tampona geçmenin daha iyi bir yolu olup olmadığını merak ediyorum düzenleme oturumumda zaten açılmış gibi.


3
Bunu :lstakip ediyorum :b#(ilk önce geri dönmeye veya kaçmaya gerek yok, doğrudan 'ls' arabellek listesinden gidebilir.) (Yorum olarak yayınlama çünkü cevap olacak kadar önemli görünmüyor mu? bir şey eksik ve yanlış soruyu cevaplıyorum.)
LindaJeanne

2
@LindaJeanne: Dediğim gibi aradığım :b#şey değil, evet, daha önce :bbasmadan doğrudan girerek bir tuş vuruşunu kaydedebilmeniz enterilginç. (Aslında bu bir cevap olmak için çok hafif, ama bir yorum değdi :-))
statox

Sanırım LindaJeanne, #karakteri gerçek #karakter yerine bir (arabellek) numarası için bir stand-in anlamına geliyordu .
8bittree

Yanıtlar:


12

Çok fazla arabellek düzenlerken iş akışımda bir kusur fark ettim: Bir arabellekteyim ve adını hatırlamadığım ve alternatif arabellek olmayan başka bir tanesine geçmek istiyorum . Bu nedenle kullanmak :b#mümkün değildir ve tamamlamayı komutla :bkullanmak da uygun değildir.

Aksine, sekme tamamlamanın son derece uygun olduğunu düşünüyorum. Sizin için çalışan değerlere doğru seçenekleri ayarlamak çok yardımcı olabilir. Bunlar benim için ilgili satırlardır vimrc ( benim için çalışıyorlar, ancak sizin için çalışmayabilirler, bu yüzden sadece kopyalamayın) :

nnoremap ,b :buffer *
set wildmenu
set wildignore+=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=*/min/*,*/vendor/*,*/node_modules/*,*/bower_components/*
set wildignore+=tags,cscope.*
set wildignore+=*.tar.*
set wildignorecase
set wildmode=full

Bununla, sağ tampon nadiren beş veya altı tuş vuruşundan daha uzaktır:

sekme tamamlama


Bu bana bir komut :B(ve bir eşleme) işlevini çağıran :buffersbir girdi için beklemek ve son olarak da çağrıları :bgirdikten sonra çağırır .

Barry Arthur yıllar önce çok daha basit bir çözüm buldu:

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

Birkaç yıl önce biraz daha çok yönlü bir varyant önerdim:

nnoremap gb :ls<CR>:b

gb


Biz vimscript konuştuğumuzdan beri, burada ben gibi komutlar benzeri listesinden sonra sağ komut saplama ile o "otomatik olarak doldurulur" komut satırı yazdım güzel küçük bir fonksiyonudur :lsveya :ilist. Bu işlevin yukarıdaki eşleştirmelere göre avantajı, belirli eşlemeleri hatırlamak zorunda olmamamdır. Tıpkı Vim gibi çalışır, ancak biraz bükülme ile .

" smooth listing
cnoremap <expr> <CR> <SID>CCR()

function! s:CCR()
    if getcmdtype() == ":"
        let cmdline = getcmdline()
            if cmdline =~ '\v\C^(dli|il)' | return "\<CR>:" . cmdline[0] . "jump  " . split(cmdline, " ")[1] . "\<S-Left>\<Left>"
        elseif cmdline =~ '\v\C^(cli|lli)' | return "\<CR>:silent " . repeat(cmdline[0], 2) . "\<Space>"
        elseif cmdline =~ '\C^changes' | set nomore | return "\<CR>:sil se more|norm! g;\<S-Left>"
        elseif cmdline =~ '\C^ju' | set nomore | return "\<CR>:sil se more|norm! \<C-o>\<S-Left>"
        elseif cmdline =~ '\C^ol' | set nomore | return "\<CR>:sil se more|e #<"
        elseif cmdline =~ '\C^undol' | return "\<CR>:u "
        elseif cmdline =~ '\C^ls' | return "\<CR>:b"
        elseif cmdline =~ '/#$' | return "\<CR>:"
        else | return "\<CR>" | endif
    else | return "\<CR>" | endif
endfunction

ccr


Bununla birlikte, "dosya tabanlı navigasyon" üzerinde "sembol tabanlı navigasyon" un büyük bir savunucusuyum. Uygulanabilir olduğunda, sembol tabanlı navigasyon dosya tabanlı navigasyondan çok daha hızlı ve daha ekonomiktir.

Son GIF, bu arada, sembol tabanlı navigasyonun bir ortalamasını gösterir . Örnek aptalca ama… ah güzel.


Sanırım wild*seçeneklerle yeterince oynamadım , yolumu değiştirmeye çalışacağım. Barry Arthur çözümü hakkında @ nobe4'ün ilginç yanıtı oldukça yakın. Sonunda CCR()gerçekten almak için fonksiyonunuza daha derinlemesine bakmam gerekecek ama umut verici görünüyor. Cevabınız için teşekkürler.
statox

5
Bu cevabımı gör . Özellikle çizgi roman.
romainl

Bunlardan bazılarını kesinlikle çalacağım!
statox

7

Bir süre önce aynı problemle karşılaştım ve bir çözüm buldum:

nnoremap <leader>b :buffers<CR>:buffer<space>

Bu tampon listesini açın ve edecektir olmadan gizleyerek, size anahtar tampon seçeneği sunar.

Vim'in burada bir "liste ve seç" seçeneği bulunmaması mantıklı geliyor, bunlar iki ayrı eylem. Ancak Vim, komutanlığı bir araya getirecek kadar güçlü.

Bunu Unix felsefesi olarak düşünün: Bir şey yapın ve iyi yapın.

:buffersarabellekleri listeler ve :buffer xxxbirini seçmenizi sağlar.


1
Sorumda önerdiğim işlevi hafifletmenin iyi bir yolu, ilginç!
statox

1
Sondaki alanı daha görünür hale getirmek istiyorsanız, şunları yapabilirsiniz: nnoremap <leader> b: buffers <CR>: buffer <Space> |
Tyler Durden

1

Bir süredir böyle nobe4 tekniğini kullandım:

nnoremap <Leader>b :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>

Sonra Tab-tamamlamayı kullanmaya başladım (romainl'in önerdiği gibi)

Ancak daha yakın zamanda en az tuş vuruşuyla en hızlı yöntemi kullanıyorum:

{count} CTRL-^

Bu çok farklı değil :b#<Enter>ama dediğin gibi arabellek numarasını bilmelisin !

Bunun için , üstteki dosya adlarının bir listesini görüntüleyen MiniBufExplorer eklentisini çalıştırıyorum (neredeyse diğer tüm editörler gibi). Eminim çok sayıda alternatif vardır.

Son olarak, Ctrl-^parmaklarım için biraz gerginlik olduğundan ve bu çok yaygın bir işlem olduğundan, üzerine taşıdım Ctrl-E. Bunun uygulanması çok karmaşık değil:

nnoremap <C-E> :<C-U>call SwitchToBuffer()<CR>

function! SwitchToBuffer()
  if v:count > 0
    exec v:count . "b"
    return
  endif

  " Whatever you want to do if you didn't provide a count
  " In this case, fall back to nobe4's technique:
  call feedkeys(":ls\n:b ")
endfunction

Yani şu anki arabellek anahtarlama sürecim şöyle bir şey yapıyor:

  1. MiniBufExplorer'a bakın
  2. hit 3 Ctrl-E

Maalesef MBE ve yukarıdaki komut dosyası, istediğiniz gibi Vim yerleşik değildir. Yapılandırması olmayan uzak bir makinedeyken sadece :b [partial]Sekme ve Tamamlama işlevini kullanıyorum.

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.