Bagaimana cara menutup buffer tanpa menutup jendela?

120

Tampilan berlapis-lapis Vim (Windows, Buffer dan Tab) membuat saya sedikit bingung. Katakanlah saya membagi tampilan (: sp) dan kemudian memilih buffer yang berbeda untuk ditampilkan di setiap jendela. Sekarang saya ingin menutup salah satu buffer, namun saya tidak ingin jendelanya ditutup (Setelah menutupnya dapat menampilkan buffer berikutnya pada daftar atau buffer kosong, tidak masalah). Bagaimana saya bisa melakukan ini?

Terima kasih.

Mosh
sumber
Apakah ada alasan Anda ingin menutup buffer daripada hanya tidak melihatnya lagi di sana?
rampion
9
Saya sebenarnya juga bertanya-tanya tentang ini. Menghapus buffer dan harus membangun kembali bagian mana pun dari split saya yang dihancurkan dalam proses itu mengganggu.
brettkelly
3
29 suara sejauh ini. Saya pikir ini adalah kasus penggunaan yang cukup umum. Saya membutuhkan ini saat saya bekerja dengan banyak buffer. Terkadang saya menggunakan 2 jendela dan ingin menutup buffer. Saya tidak ingin jendela itu pergi. Saya hanya ingin buffer berikutnya ditampilkan di sana.
Wilson Freitas
kemungkinan duplikat Vim: Hapus buffer tanpa kehilangan jendela yang terbagi
George Hilliard

Jawaban:

145

Saya mengacaukan ini sedikit dan akhirnya muncul dengan:

:bp | sp | bn | bd

Berikut versi salin / tempel untuk pemetaan kunci:

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

Saya telah mengujinya sedikit dan berfungsi secara konsisten dalam berbagai kondisi. Jika digunakan pada buffer terakhir, Anda akan mendapatkan buffer kosong baru.

Lempar ini ke .vimrc Anda:

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

Mulai ulang Vim, atau hanya :source ~/.vimrcagar perubahan diterapkan. Lain kali Anda ingin menutup buffer ketik saja: \q(jika \adalah kunci pemimpin Anda)

Jonah Braun
sumber
1
Terima kasih! Bagus dan sederhana, tidak seperti hampir semua solusi lain yang pernah saya lihat.
jwd
16
Untuk pemula, membuang ini dalam vimrc : map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>. Mulai ulang VIM, lain kali Anda ingin menutup buffer ketik saja:\q
EasyCo
5
Ini akan memberikan hasil yang tidak diharapkan jika Anda memiliki jendela yang terbelah secara vertikal. Faktanya, konfigurasi pemisahan jendela apa pun selain standar (dibuat oleh sp).
hitzg
2
Saya pikir potongan dari apa yang harus dimasukkan ke dalam .vimrc tidak boleh menyertakan titik di akhir. Selain itu, luar biasa! Ini harus menjadi jawaban yang diterima.
Ernesto
3
ini elegan. seperti yang dikatakan orang lain, jika Anda kebanyakan menggunakan pemisahan vertikal, ganti spdengan vsp. entri .vimrc saya terlihat seperti ini:cnoremap bd bp<bar>vsp<bar>bn<bar>bd
Connor
38

Saya mencari hari ini dan menemukan

:b#|bd#

yang mengubah jendela saat ini ke buffer yang sebelumnya terbuka dan menghapus / menyembunyikan buffer yang baru saja Anda alihkan.

Ini membutuhkan setidaknya dua buffer yang diketahui.

Jika jendela lain tetapi arus menunjukkan buffer yang sama, ini masih akan merusak pemisahan. Anda dapat mengubah semua jendela ke buffer yang sebelumnya terbuka dengan

:windo b#

Saya menambahkan lebih banyak detail tentang perintah sebelumnya yang membahas pemetaan untuk itu (dan beberapa jebakan) dalam jawaban untuk pertanyaan serupa .

sah
sumber
Juga ini bisa dilakukan ... :#b|#bdHanya menukar perintah buffer & nomor buffer di atas.
Ashish
Saya telah menggunakan ini sedikit tetapi saya terus merasa kesal karena itu membuka kembali buffer yang sebelumnya ditutup.
kacang
@pean Itulah yang saya sebutkan dalam jawaban terkait - lihat "Catatan penting". Ya, akan lebih baik jika ini dialihkan ke buffer terbuka lainnya.
berlaku
1
Anda juga dapat melakukan :bn|bd#atau :bp|bd#beralih ke buffer terbuka sebelumnya atau berikutnya, masing-masing, daripada buffer yang terakhir Anda akses (b #).
pavon
12
nmap <leader>d :bprevious<CR>:bdelete #<CR>

Bekerja sebagaimana mestinya sampai satu buffer terbuka di beberapa jendela. Cukup baik kecuali Anda ingin menggunakan skrip yang lebih besar di luar sana.

Sunting: inilah yang saya gunakan sekarang:

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
ggustafsson.dll
sumber
1
Saya mencoba cara ini tetapi tidak berhasil dengan baik saat menggunakan beberapa jendela terpisah. Inilah solusi saya jika seseorang mengalami masalah yang sama:nmap <leader>d :ene<CR>:bd #<CR>
caio
7

Saya pikir inilah yang Anda cari

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

Coba ini:

Lihat apakah buffer id Anda menggunakan

:buffers

Anda akan melihat daftar buffer di sana seperti

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

jika Anda ingin menghapus b.py dari buffer

:2bw

jika Anda ingin menghapus / menutup semua dari buffer

:1,3bw
Nggak
sumber
1
Saya tidak ingin memindahkan jendela. Saya ingin menutup buffer tanpa menyentuh posisi, ukuran, atau keberadaan jendela.
Mosh
5

Bagi mereka yang menggunakan NERDTree.

Saya memperbaiki ini menggunakan plugin ini https://github.com/jistr/vim-nerdtree-tabs dan sekarang saya dapat menutup satu-satunya buff / file / tab tanpa menutup jendela.

Setelah plugin di atas diinstal, letakkan kode berikut di .vimrc saya:

let g:nerdtree_tabs_autoclose=0

Deskripsi untuk variabel di atas adalah: Tutup tab saat ini jika hanya ada satu jendela di dalamnya dan itu adalah NERDTree (default 1)

Info lebih lanjut di sini: https://github.com/jistr/vim-nerdtree-tabs#configuration

Lucas Serafim
sumber
2

Saya tidak berpikir ada satu cara untuk melakukan ini, tetapi Anda dapat melakukan :enewatau :lsmendaftar buffer Anda dan menukar ke yang lain menggunakan:b [number] .

Setelah Anda mendapatkan buffer yang berbeda di jendela :bd #akan menghapus buffer sebelumnya di jendela, dan karena buffer saat ini masih ada, jendela tidak akan ditutup.

Andrew Khosravian
sumber
2

Saya biasa menggunakan:

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

Tetapi saya menemukan kejadian-kejadian tertentu di mana itu menutup jendela saya.

Baru-baru ini saya perhatikan bahwa saya selalu menggunakan ini ketika saya mengerjakan sebuah proyek dan perlu segera membukanya .tmux.conf .zshrc sebelum kembali bekerja.

Untuk penggunaan ini, saya menemukan yang lebih baik untuk:

  • beralih kembali ke buffer yang sebelumnya saya kerjakan C-6
  • ketik :bd#untuk menghapus buffer sebelumnya (saya telah memetakannya seperti ini nnoremap <leader>d :bd#<CR>:)

Ini memungkinkan saya untuk mengontrol buffer tempat saya kembali dan terasa lebih alami.

DaftWooly
sumber
1

Akan

:enew

lakukan apa yang kamu inginkan? itu akan mengedit buffer baru tanpa nama di jendela saat ini membiarkan file yang ada terbuka di jendela lain.

mikej
sumber
Ini akan membuka buffer kosong baru. Saya ingin menutup buffer saat ini tanpa menutup jendela.
Mosh
1

Solusi favorit saya untuk ini adalah plugin bufkill.vim ( GitHub ). Ini memberikan versi alternatif dari berbagai:b perintah -prefix yang bekerja sama seperti rekannya, tetapi membiarkan jendela terbuka. Mereka menampilkan apa pun yang terkandung dalam buffer terakhir yang terlihat, atau buffer kosong / baru jika tidak ada buffer sebelumnya.

Dari dokumentasi:

Saat Anda ingin membongkar / menghapus / menghapus buffer, gunakan:
  : bun /: bd /: bw untuk menutup jendela juga (perintah vim), atau
  : BUN /: BD /: BW untuk membiarkan jendela tetap utuh (skrip ini).
Jim Stewart
sumber
1

Untuk 'menutup' tampilan, gunakan :hid[e]. Berfungsi jika Anda telah berhasil membagi viewport atau membuka banyak file. Anda tidak dapat menyembunyikan buffer terakhir yang ditampilkan.

1 Tip lebih lanjut yang membantu saya: gunakan :e ./path/to/file.workuntuk membuka file di viewport tanpa membelah jendela.

PS Pada dua hari setelah vim saya masih kesulitan menemukan perintah bantuan yang tepat. Mudah-mudahan ini akan membantu orang lain terus bekerja sampai mereka benar-benar mendapatkan waktu untuk memahami vim.

Sennekuyl
sumber
1

Ini adalah fungsi vimscript yang sangat mudah dibaca, yang menangani semua kasus dengan baik ,

  • berperilaku mirip dengan built-in :bd(jika hanya satu jendela, panggil saja!),
    • mengeluarkan peringatan dan tidak melakukan apa pun jika buffer dimodifikasi.
    • jika tidak ada buffer lain, buat satu, melalui :enew.
    • jika buffer alternatif ada dan masuk buffer-list, alihkan ke buffer , jika tidak lanjutkan berikutnya, melalui :bn.
  • perilaku yang lebih masuk akal untuk tata letak multi-jendela
    • tidak menutup jendela apa pun,
    • selalu tetap di jendela asli.
    • untuk setiap jendela yang menampilkan buffer saat ini, lakukan seperti yang tercantum di atas, lalu hapus buffer lama saat ini.
nnoremap <Leader> b: panggil DeleteCurBufferNotCloseWindow () <CR>

func! DeleteCurBufferNotCloseWindow () batalkan
    jika & dimodifikasi
        echohl ErrorMsg
        echom "E89: tidak ada penulisan sejak perubahan terakhir"
        echohl Tidak ada
    elseif winnr ('$') == 1
        bd
    lain "beberapa jendela
        biarkan oldbuf = bufnr ('%')
        biarkan oldwin = winnr ()
        sedangkan 1 "semua jendela yang menampilkan oldbuf akan tetap terbuka
            jika buflisted (bufnr ('#'))
                b #
            lain
                bn
                biarkan curbuf = bufnr ('%')
                jika curbuf == oldbuf
                    enew "oldbuf adalah satu-satunya buffer, buat satu
                berakhir jika
            berakhir jika
            biarkan menang = bufwinnr (oldbuf)
            jika menang == -1
                istirahat
            lain "ada jendela lain yang menampilkan oldbuf
                exec menang 'wincmd w'
            berakhir jika
        sementara
        "hapus oldbuf dan pulihkan jendela ke oldwin
        exec oldbuf 'bd'
        exec oldwin 'wincmd w'
    berakhir jika
fungsi akhir
qeatzy
sumber
0

Jika Anda seperti saya dan Anda datang ke sini mencoba melakukan yang sebaliknya , tutup jendela tanpa menutup buffer, Anda dapat melakukannya melalui:

:close

xdhmoore
sumber
0

Versi sederhana yang saya gunakan secara pribadi adalah

:bp|bd#

Ini pergi ke buffer sebelumnya dan menghapus buffer lain (yang sebenarnya adalah buffer asli tempat kita melompat). Ini melakukan apa yang Anda harapkan dalam 99% kasus tanpa skrip yang rumit.

Sebagai pintasan keyboard, saya menggunakan yang berikut ini

nnoremap <silent> <Leader>c :bp<BAR>bd#<CR>
Dorian B.
sumber
-5

gunakan ": bd" sebagai perintah.

Silvanus
sumber