Bir tampon kümesini bir sekmeye nasıl bağlarsınız?


14

Aynı anda farklı projeler üzerinde çalışmam gerektiğinde aşağıdaki iş akışına sahibim:

  • Her proje için bir sekme oluşturuyorum.
  • Her sekmede düzenlemek istediğim dosyaları açıyorum, bu da birkaç arabellek oluşturuyor.
  • Ben aynı anda iki (veya daha fazla) dosyaları görmek gerekiyorsa Optionnaly ben bir arabellek gösteren farklı pencereler içeren bir sekme var bölünmüş pencereler oluşturun.

Tamponlarım arasında gezinmek için gerçekten kullanmıyorum :lsve :b [name or number of buffer]bunun yerine :bnextve ile tamponlar arasında geçiş yapmamı sağlayan bazı uygun eşlemeler oluşturdum.:bprevious

Bu şekilde çalışmak oldukça iyi ama bir şey beni rahatsız ediyor: tamponlar sekmeler arasında paylaşılıyor.

Ben açarsanız file1ve file2içinde tab1ve file3içinde tab2de eğer tab1ben birkaç defa kullanmak :bnextben göreceğim file3ben istemiyorum bu sekmede. Almak istediğim iş akışı şu :

  • Vim Başlat (içinde bir tampon ile ilk sekmesi var): $ vim foo
  • Bu sekmeye bir tampon ekle: :e bar
  • Yeni bir sekme açın ve sekmeye geçin: :tabnew
  • Bu sekmede yeni bir arabellek açın: :e baz
  • Bu tampon kalmak ve yaparsanız :bnextveya :bpreviousben kalacağım baz(bu sekmede tek olduğundan) tampon
  • Önceki sekmeye gidip :tabpreviousbirkaç kez :bnextyürütürsem, sadece foove bararabellekler arasında geçiş yaparım , ancak görmeyeceğimbaz

İşte sorum şu: Bir sekmeye bir dizi tampon bağlamak ve vim'in, olması gerekenden başka bir sekmeden bazı tamponlara erişmesine izin vermemek mümkün mü?

Not: Kullandığım farkındayım :b [myBuffer]bir yol olacak bir sekmede bir tampon tutmak ama düzenlemek için 3 ya da 4 dosya varsa ben gerçekten hızlı tampon adını yazarak daha benim eşleştirmeleri kullanılarak gibiyim (hatta eğer yapabilirsem arabellek adıyla eşleşen yalnızca bazı karakterler yazın) .


1
İşte pro ve con'ların böyle bir yaklaşımın altını çizen ve bunun yerine bugün şu şekilde çevrilebilecek bir şey öneren eski bir tartışma: çoklu vim örnekleri (proje / tampon listesi başına bir) + tmux: vim.1045645.n5.nabble.com/…
VanLaser

@ VanLaser: Bağlantı için teşekkürler ilginç bir tartışma! Kişisel makinemdeyken aslında tmux ve farklı vim örnekleri ekliyorum. Benim sorum profesyonel işim için pencereleri kullanmak zorunda olduğum gerçeğinden geliyor ve gerçekten pencerelerin nasıl kullanıldığını sevmiyorum: alt+tabvim içinde sekmeyi değiştirmek yerine (veya fareyi daha da kötüsü) kullanmak çok daha az kolay geliyor.
statox

1
Belki vim-ctrlspace yardımcı olabilir - tabpage arabellek listelerine göre reklam verir; Yine de kullanmıyorum.
VanLaser

Yanıtlar:


7

Mhh, orada herhangi bir eklenti bulamadım, ama kendin yazabilirsin. Bunun için vimscript öğrenmeniz gerekiyor. Sadece bir sekmede arabellekler arasında geçiş yapabileceğiniz işlevselliği uyguladım (henüz silinme yok). Bunu vimrc'nize kopyalayabilirsiniz:

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

Vimrc'nizi kapatın ve tekrar açın. Bir sonraki arabelleği bulmak için

:call WindowBufManagerNext()

veya kendi komutunuzu veya eşlemenizi tanımlayın. Bir sekmeyi veya arabelleği kapatmadığınız veya silmediğiniz sürece bu çalışır. Ayrıca birden çok arabellek için çalışmaz. Bu özellikleri eklemek için biraz daha çalışma gerektirecek, ancak kesinlikle yapılabilir.


Ben de bir eklenti bulamadım ve bunu yapmak için yerleşik bir özellik umuyordum ama haklı görünüyorsun muhtemelen bunu kendim yapmalıyım. Kodunuz için teşekkürler tam bir eklenti geliştirmek için bir üssü kullanabilirsiniz.
statox

6

Tamponlar globaldir ve sekme sayfalarının, pencerelerin ve tamponların üzerine kendi soyutlama katmanınızı yazmak dışında bu konuda yapabileceğiniz hiçbir şey yoktur. philolo1'in cevabı soruna makul bir yaklaşım gösterir, ancak böyle bir "çözümün" sınırlarını hızlı bir şekilde bulacaksınız :bufdove alternatif dosya veya alternatif dosya gibi birçok yerleşik özelliği çoğaltmanız gerekir ...

Öte yandan "bağımsız değişkenler", bir pencerede yerel olabilir, bu nedenle iş akışınızda "arabelleklerden" (kelimenin en katı anlamında) daha yararlı olabilirler:

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

Bağımsız değişkenler arabellekler kadar esnek değildir, ancak iş akışınız için daha güvenilir bir temel sağlayabilir.

Ancak her proje üzerinde kendi Vim örneğinde çalışmak bence tek pratik çözüm.


Bir terminalde kullanabileceğimde ayrı vim örnekleri kullanmanın daha iyi olduğu fikrine katılıyorum, başka bir yorumda söylediğim gibi profesyonel bilgisayarımda pencereler kullanmam ve gvim örnekleri arasında geçiş yapmanın bu işletim sistemi ile popodaki bir acı olduğunu düşünüyorum . Daha önce hiç kullanmadığım argümanlara bir göz atacağım ve bu iyi bir çözüm olabilir, teşekkürler!
statox

2

Yani, biraz gecikmeyle, tatmin edici (en azından benim için!) Bir cevap bulmuş olabileceğimi düşünüyorum . Shougo'nun iki eklentisine ihtiyacınız olacak:

:lsyalnızca geçerli sekmedeki arabellekleri görüntülemek (ve seçmek) yerine kullanmak için hızlı erişim haritası .

Örneğin, şöyle bir şey:

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

unite - sekme arabellekleri başına

Artık geçerli harfin sekme arabellek listesinde ( j, k) gezinebilir, bir ( CR) seçebilir , iptal edebilir ( q), arabellek seçimine hızlıca filtre uygulamak için "giriş" (ekleme) moduna girebilir veya hatta Tabeylem listesini açmak için tuşuna basabilirsiniz. seçili olan öğe için (örneğin , geçerli etkin olanın üstündeki arabelleği açmak için ) - kısacası, genel "Birleştir" şeklinde hareket edersiniz.

(ayrıca bkz. :h unite_default_key_mappingsve genel olarak Unite yardımı).


Ve şimdi son (yine de isteğe bağlı) hile için. Altercmd ile kendi sekme etkin lskomutunuzu oluşturabilirsiniz (yukarıdaki Unite işlevine göre):

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

... ve her vurduğunuz :lsVim gerçekte yayınlanacağı, senin yerine komutu.

Not Ayrıca gerek olmayacak :bnveya :bpsekmenin tamponlar inceleyen ve seçim artık aynı komut olduğundan,.


Ben de bu çözümü deneyeceğim. Şu an için VanLaser'ın bahsettiği ctrl-space'i denemeye çalışıyorum, ki bu oldukça iyi. Hangi çözümün en uygun olduğunu göreceğim. Ayrıca oldukça serin olan altercmd eklentisi için +1!
statox

2

Hesabım yeni olduğu için yorum yapamadım çünkü ctrl-space için ++++ 1.

Yardımın yarısında yaptığım zaman satıldım. Ctrlspace şöyle bir yapıya sahiptir:

workspaces --> contain tabs --> contain buffers

Böylece, üzerinde çalıştığınız her proje için bir çalışma alanı kaydedebilir ve istediğiniz zaman hemen yükleyebilirsiniz. Bu, vim'i her kapatışınızda tüm arabellek ve sekme bölümlerinizi kaydedebileceğiniz anlamına gelir.

Sekmelerinizi de adlandırabilirsiniz. Bu yeterli değilse, çalışma dizinlerini kolayca değiştirebilir ve sık kullandığınız dizinler için yer işaretleri oluşturabilirsiniz.

Bunu kullanırsanız nerdtree ile güzel bir şekilde arayüz oluşturur (dürüst olmak gerekirse, ctrlspace ile bir hafta sonra muhtemelen ihtiyacınız gibi hissetmeyeceksiniz)


Bu kullanım durumunu düşünün:

Bir projen var. Ağaç dikmeyi içerir. Meyve ağaçları ve para ağaçları var. Para ağaçları dolar ve sent içerirken, meyve ağaçları elma ve portakal içerir.

Bu örnekte elmalar, portakallar, dolarlar ve sentler "tamponlardır".

Ctrlspace, elma ve portakalları "meyve" olarak etiketleyebileceğiniz tek bir "sekmeye" ayırmanıza olanak tanır. Bu etiket, pencerenizin üst kısmındaki etiket satırında görünür. Aynı şekilde, dolar ve sentler de bir "para" sekmesine gider.

"Ağaçlar" çalışma alanı tüm yapılandırmayı kaydeder ve vim'i her açtığınızda hemen erişmenizi sağlar.


Şimdi bunun varlığından haberdar olduğuma göre, bu eklenti olmadan vim'de nesne odaklı geliştirme yaptığımı gerçekten hayal edemiyorum. Her ihtimale karşı, işte link: https://github.com/szw/vim-ctrlspace


2

Sonunda sorunumu çözmek için kendi eklentimi oluşturmaya karar verdim, github'da mevcut .

@ Philolo1 fikrini kullandım ve tamamlamaya çalıştım, bu cevabı yazdığım sırada hala devam eden bir çalışma.

EDIT Artık iş akışım geliştikçe eklentiyi sürdürmüyorum ve bir sekmeye ciltleme tamponlarının çözdüğünden daha fazla sorun eklediğini fark ettim.


Eklenti arabelleği sekmelere bağlar: Kullanıcı bir arabelleği açtığında, sekmede otomatik olarak "depolanır" ve başka bir sekmeden erişilemez.

Kurulum "eklenti yöneticisi dostu" olmalıdır (en azından Vim-Plug ve Vundle ile iyi çalışır )

Ana özelliklerden bazıları:

  • Tamponların bağlanmasını otomatik olarak yönetin (kullanıcı bunları daha önce olduğu gibi açabilir)
  • :NextBufve :PrevBufyerini :bnve :bNsekmelerin tutarlı bir devlet tutmak için
  • :ListBufarabellekleri :lssekmelerde ayrılmış olmaları dışında benzer şekilde listelemesine izin verir ve bir işaret kullanıcının şu anda hangi sekmede olduğunu kolayca görmesini sağlar.
  • :ChangeBuf arabelleği değiştirmek ve sekmeyi otomatik olarak değiştirmek için bir tampon numarası veya bir tampon adı kabul etmek
  • Bir tamponun kapatılması :CloseBuf
  • Bir sekmeyi kapatmak :CloseTab

Diğer işlemler için kullanıcı yerleşik özellikleri (ör :tabopen. :tabnext, Vb.) Kullanabilmelidir.

Her komutlar için bazı varsayılan eşleştirmeleri sağlanır ve bunlar kolayca ekleyerek devre dışı bırakılabilir let g:betterTabsVim_map_keys = 0adresinden Müşteri .vimrc.

Ayrıca açık bir yardım dosyası ( :h betterTabs.txt) yapmaya çalıştım : henüz tamamlanmadı, ancak kullanıcılar eklentiyi kullanmak için minimum bulmalı.

Eklentinin herhangi bir yerel davranışı bozmadığından emin olmak için hala çok fazla testim var.

Son olarak, herhangi biri yardım etmek isterse, github sayfasında sorunlar yaratmak veya çekme istekleri oluşturmak her zaman mümkündür .


1

Bu eklentiye göz atın. Bana öyle geliyor ki ihtiyaçlarınıza mükemmel bir şekilde uyuyor. https://github.com/szw/vim-ctrlspace


Gerçekten VanLaser yorumlarda bahsetti ve ilk başta yeterince yakından bakmadım ama gerçekten iyi görünüyor, birkaç gündür deniyorum.
statox
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.