Pencereyi kapatmadan bir tamponu nasıl kapatabilirim?


120

Vim'in çok katmanlı görünümleri (Windows, Tamponlar ve Sekmeler) kafamı biraz karıştırdı. Diyelim ki ekranı (: sp) böldüm ve ardından her pencerede görüntülemek için farklı bir arabellek seçtim. Şimdi arabelleklerden birini kapatmak istiyorum, ancak pencerenin kapanmasını istemiyorum (Kapattıktan sonra listedeki sonraki arabelleği veya boş bir arabelleği görüntüleyebilir, önemli değil). Bunu nasıl yapabilirim?

Teşekkürler.


Artık orada görmemek yerine tamponu kapatmak istemenizin bir nedeni var mı?
rampion

9
Aslında bunu da merak ediyordum. Bir arabelleği silmek ve ardından bölünmelerimin herhangi bir parçası işlem sırasında tahrip olursa yeniden inşa etmek zorunda kalmak sinir bozucu.
brettkelly

3
Şimdiye kadar 29 artı oy. Bunun oldukça yaygın bir kullanım durumu olduğunu düşünüyorum. Çok fazla tamponla çalışırken buna ihtiyacım var. Bazen 2 pencere kullanıyorum ve bir tamponu kapatmak istiyorum. O pencerenin kaybolmasını istemiyorum. Sadece bir sonraki ara belleğin orada görüntülenmesini istiyorum.
Wilson Freitas


Yanıtlar:



145

Bunu biraz karıştırdım ve sonunda şunu buldum:

:bp | sp | bn | bd

Anahtar eşleme için kopyalama / yapıştırma sürümü:

:bp<bar>sp<bar>bn<bar>bd<CR>

Biraz test ettim ve çeşitli koşullarda tutarlı bir şekilde çalışıyor. Son tamponda kullanıldığında size yeni bir boş tampon bırakır.

Bunu .vimrc dosyanıza atın:

map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>

Vim'i yeniden başlatın veya sadece :source ~/.vimrcdeğişikliklerin etkili olması için. Bir dahaki sefere bir arabelleği kapatmak istediğinizde şunu yazın: \q( \lider anahtarınız ise)


1
Teşekkür ederim! Hoş ve basit, gördüğüm diğer tüm çözümlerin aksine.
2013

16
Acemi için, bu atmak .vimrc : map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>. \q
VIM'i

5
Dikey olarak bölünmüş bir pencereniz varsa, bunun beklenmedik bir sonucu olacaktır. Aslında, standart (tarafından oluşturulan sp) dışındaki herhangi bir pencere bölme yapılandırması .
hitzg

2
Sanırım .vimrc'ye ne koyacağıma dair pasajın sonunda nokta bulunmaması gerekiyor. Bunun dışında harika! Kabul edilen cevap bu olmalıdır.
Ernesto

3
bu zarif. Başkalarının söylediğimiz gibi çoğunlukla dikey böler kullanırsanız, geçiş spile vsp. .vimrc yazım şuna benziyor:cnoremap bd bp<bar>vsp<bar>bn<bar>bd
Connor

38

Bunu bugün aradım ve buldum

:b#|bd#

mevcut pencereyi önceden açık olan arabelleğe değiştirir ve yeni değiştirdiğiniz arabelleği siler / gizler.

Bu, bilinen en az iki tampon gerektirir.

Başka bir pencere ancak akım aynı tamponu gösteriyorsa, bu yine de bölünmeyi ortadan kaldıracaktır. Tüm pencereleri önceden açık olan arabelleğe değiştirebilirsiniz.

:windo b#

Benzer bir soruya yanıt olarak , onun için bir eşleştirmeyi (ve bazı tuzakları) tartışan eski komut hakkında daha fazla ayrıntı ekledim .


Ayrıca bu yapılabilir ... :#b|#bdSadece yukarıdaki tampon komutunu ve tampon numarasını değiştirerek.
Ashish

Bunu biraz kullandım ama daha önce kapatılmış bir arabellek açtığı için sinirlenmeye devam ettim.
pean

@pean Bağlantılı cevapta bahsettiğim şey bu - bkz. "Önemli notlar". Evet, bu başka bir açık ara belleğe geçerse daha iyi olur.
Geçerli

1
Ayrıca , en son eriştiğiniz arabellek (b #) yerine, sırasıyla önceki veya sonraki açık arabelleğe geçiş yapabilir :bn|bd#veya yapabilirsiniz :bp|bd#.
pavon

12
nmap <leader>d :bprevious<CR>:bdelete #<CR>

Birkaç pencerede bir arabellek açılana kadar olması gerektiği gibi çalışır. Orada daha büyük senaryoları kullanmak istemediğiniz sürece yeterince iyi.

Düzenleme: şu anda kullandığım şey bu:

function! BufferDelete()
    if &modified
        echohl ErrorMsg
        echomsg "No write since last change. Not closing buffer."
        echohl NONE
    else
        let s:total_nr_buffers = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))

        if s:total_nr_buffers == 1
            bdelete
            echo "Buffer deleted. Created new buffer."
        else
            bprevious
            bdelete #
            echo "Buffer deleted."
        endif
    endif
endfunction

2
Bu şekilde denedim, ancak birden fazla bölünmüş pencere kullanırken çok iyi çalışmadı. İşte birisi aynı sorunu yaşıyorsa benim çözümüm:nmap <leader>d :ene<CR>:bd #<CR>
caio

7

Sanırım aradığın bu

http://www.vim.org/htmldoc/windows.html#window-moving

Bunu dene:

Tampon kimliğinize bakın

:buffers

orada tamponların listesini göreceksiniz

1  a.cpp
2  b.py
3  c.php

b.py'yi arabellekten kaldırmak istiyorsanız

:2bw

hepsini tamponlardan kaldırmak / kapatmak istiyorsanız

:1,3bw

1
Pencereyi hareket ettirmek istemiyorum. Pencerenin konumuna, boyutuna veya varlığına dokunmadan tamponu kapatmak istiyorum.
Mosh

5

NERDTree kullananlar için.

Bunu https://github.com/jistr/vim-nerdtree-tabs eklentisini kullanarak düzeltiyorum ve şimdi pencereyi kapatmadan tek buff / file / tab'ı kapatabiliyorum.

Yukarıdaki eklentiyi yükledikten sonra aşağıdaki kodu .vimrc dosyama koyun:

let g:nerdtree_tabs_autoclose=0

Yukarıdaki değişkenin açıklaması şöyledir: İçinde yalnızca bir pencere varsa ve NERDTree ise (varsayılan 1) geçerli sekmeyi kapat

Daha fazla bilgi burada: https://github.com/jistr/vim-nerdtree-tabs#configuration


2

Bunu yapmanın tek bir yolu olduğunu sanmıyorum, ancak bunu yapabilir :enewveya :lstamponlarınızı listeleyebilir ve kullanarak farklı bir tanesine geçebilirsiniz :b [number].

Pencerede farklı bir arabelleğe sahip olduğunuzda, penceredeki :bd #önceki arabelleği silecek ve geçerli arabellek hala mevcut olduğundan, pencere kapatılmayacaktır.


2

Ben kullanıyordum:

:bp<bar>sp<bar>bn<bar>bd<CR>

Ama penceremi kapattığı bazı durumlar buldum.

Son zamanlarda, bir proje üzerinde çalışırken bunu her zaman kullandığımı ve .tmux.conf .zshrcişe geri dönmeden önce hızlıca açmam gerektiğini fark ettim .

Bu kullanım için şunları yapmayı daha iyi buluyorum:

  • daha önce üzerinde çalıştığım tampona geri dön C-6
  • tipi :bd#önceki tampon silmek için (böyle eşledikten var: nnoremap <leader>d :bd#<CR>)

Geri döndüğüm tamponu kontrol etmeme izin veriyor ve daha doğal geliyor.


1

Would

:enew

ne istiyorsan onu yap? mevcut pencerede yeni, isimsiz bir arabelleği düzenler ve mevcut dosyayı diğer pencerelerde açık bırakır.


Bu, yeni bir boş arabellek açacaktır. Pencereyi kapatmadan mevcut arabelleği kapatmak istiyorum.
Mosh

1

Bunun için en sevdiğim çözüm bufkill.vim eklentisi ( GitHub ). :bMuadilleriyle aynı şekilde çalışan, ancak pencereyi açık bırakan çeşitli önek komutlarının alternatif sürümlerini sağlar . İçerdiği son görünür arabelleği veya önceden arabellek yoksa boş / yeni bir arabelleği görüntülerler.

Belgelerden:

Bir arabelleği boşaltmak / silmek / silmek istediğinizde şunları kullanın:
  : bun /: bd /: bw pencereyi de kapatmak için (vim komutu) veya
  : BUN /: BD /: Pencere (ler) i olduğu gibi bırakmak için BW (bu komut dosyası).

1

Bir görünümü 'kapatmak' için kullanın :hid[e]. Görüntü alanını bölmeyi başardıysanız veya birden fazla dosya açtığınızda çalışır. Ekrandaki son arabelleği gizleyemezsiniz.

1 Bana yardımcı olan başka bir ipucu: :e ./path/to/file.workpencereyi bölmeden bir dosyayı görünüm alanında açmak için kullanın .

Not: Vim'in iki gününde hala kesin yardım komutlarını bulmakta güçlük çekiyorum. Umarım bu, bir başkasının vim'i anlamak için gerçekten zaman bulana kadar çalışmaya devam etmesine yardımcı olur.


1

İşte tüm durumları iyi bir şekilde ele alan çok okunabilir bir vimscript işlevi ,

  • yerleşik gibi davranır :bd(yalnızca bir pencere varsa, onu çağırın!),
    • bir uyarı verir ve arabellek değiştirilirse hiçbir şey yapmaz.
    • başka tampon yoksa, üzerinden bir tane oluşturun :enew.
    • alternatif arabellek varsa ve içinde ise buffer-list, ona geç, yoksa bir sonraki, üzerinden git :bn.
  • çoklu pencere düzeni için daha makul davranış
    • herhangi bir pencereyi kapatmamak,
    • her zaman orijinal pencerede kalın.
    • geçerli arabelleği görüntüleyen her pencere için yukarıda listelendiği gibi yapın, ardından eski geçerli arabelleği silin.
nnoremap <Leader> b: DeleteCurBufferNotCloseWindow () <CR> çağrısı

fonk! DeleteCurBufferNotCloseWindow () iptal
    değiştirildiyse
        echohl ErrorMsg
        echom "E89: son değişiklikten bu yana yazma yok"
        echohl Yok
    elseif winnr ('$') == 1
        bd
    başka "çoklu pencere
        let oldbuf = bufnr ('%')
        let oldwin = winnr ()
        1 "ise oldbuf'u görüntüleyen tüm pencereler açık kalacaktır
            buflisted ise (bufnr ('#'))
                b #
            Başka
                bn
                let curbuf = bufnr ('%')
                curbuf == oldbuf ise
                    enew "oldbuf tek tampon, bir tane oluştur
                endif
            endif
            hadi kazan = bufwinnr (oldbuf)
            kazanırsa == -1
                mola
            başka "oldbuf'u gösteren başka bir pencere var
                exec 'wincmd w' kazandı
            endif
        endwhile
        "oldbuf'u sil ve pencereyi oldwin'e geri yükle
        exec oldbuf 'bd'
        exec oldwin 'wincmd w'
    endif
EndFunc

0

Benim gibiyseniz ve buraya tam tersini yapmaya geldiyseniz , tamponu kapatmadan pencereyi kapatın, bunu şu yolla yapabilirsiniz:

:close


0

Kişisel olarak kullandığım basit bir versiyon

:bp|bd#

Önceki tampona gider ve diğer tamponu siler (aslında atladığımız orjinaldir). Bu, herhangi bir karmaşık komut dosyası olmadan vakaların% 99'unda beklediğiniz şeyi yapar.

Klavye kısayolu olarak aşağıdakileri kullanıyorum

nnoremap <silent> <Leader>c :bp<BAR>bd#<CR>

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.