Vim: Tutup Semua Buffer Tapi Yang Ini

196

Bagaimana saya bisa menutup semua buffer di Vim kecuali yang sedang saya edit?

Rafid
sumber
1
Saya menemukan tautan ini
klokop

Jawaban:

171

Coba ini

bufdo bd

bufdo menjalankan perintah untuk semua buffer

http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers

gayavat
sumber
Ini tidak menutup buffer NERDTree.
Uri
NERDTree ditutup jika fokus ada di panel kutu buku
gayavat
2
Anda mungkin ingin menutup NERDTree sebelum melakukan ini untuk mencegah bdperintah menutup vim itu sendiri; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
lvarayut
11
Dokumentasi memperingatkan bahwa argumen untuk :bufdo'tidak boleh menghapus buffer atau menambah buffer ke daftar buffer'. Jadi jika solusi ini bekerja, ini bekerja secara tidak sengaja ... dan sering kali tidak berhasil untuk saya (beralih ke buffer yang berbeda).
glts
10
Ini menutup semua penyangga untuk saya, dan bukan itu pertanyaannya. (MacVim versi 8.0.1207)
Michael Leonard
143

Saya dapat melakukan ini dengan cukup mudah seperti ini:

:%bd|e#
OldTimeGuitarGuy
sumber
4
Ini jawaban yang bagus. Itu membuat BufOnly merasa sedikit berlebihan (maksud saya, seluruh plugin?) Kecuali Anda menggunakan fitur passing argumen dari BufOnly. Yang ingin saya lakukan hanyalah:%bd|e#
shmup
41
@jorgeh %bd= hapus semua buffer. e#= buka buffer terakhir untuk diedit. Pipa di antara hanya melakukan satu perintah demi satu.
OldTimeGuitarGuy
20
@ Jared Anda dapat menggunakan %bd|e#|bd#untuk menghapus [No Name]buffer yang dibuat.
kshenoy
12
Hebat. Maka di sini Anda memiliki satu-satunya hal yang pernah saya gunakan untuk plugin BufOnly, disaring menjadi satu perintah:command! BufOnly silent! execute "%bd|e#|bd#"
shmup
4
@Finn, Anda perlu melarikan diri |:map <leader>o :%bd\|e#<cr>
Halil Özgür
57

Jika Anda tidak peduli yang sekarang, lebih mudah untuk melakukan sesuatu seperti (tidak perlu skrip):

1,100bd
juananruiz
sumber
4
Ini akan menutup buffer nerdtree juga.
Afshin Mehrabani
Saya menghadapi beberapa masalah menggunakan perintah ini ketika NERDTree diaktifkan. Saya sarankan menggunakan plugin BufOnly.vim seperti yang disebutkan oleh @VoY.
moeabdol
1
Saya membuat pemetaan berikut yang menjelaskan penghapusan buffer NERDTree:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri
5
Saya menggunakan ini untuk waktu yang lama, tetapi sekarang saya dapatkan E16: Invalid rangekarena beberapa buffer dalam jangkauan sebenarnya tidak ada. Itu mengabaikan itu sampai saat ini.
Jon
3
@Jon Periksa :lsuntuk melihat buffer terbesar yang sebenarnya Anda buka, dan atur rentang Anda ke itu (yaitu jika buffer tertinggi Anda adalah 22, maka :1,22bd). Saya mendapat kesalahan yang sama sampai saya melakukan itu.
Nairou
51

saya melakukan ini

:w | %bd | e#

Favorit saya jika saya ingin buffer saya saat ini membuka dan menutup semua yang lain.

Cara kerjanya: pertama tulis perubahan buffer saat ini, lalu tutup semua buffer terbuka, kemudian buka kembali buffer yang saya gunakan saat ini. Di Vim, |rantai eksekusi perintah bersama. Jika buffer Anda terkini, di atas dapat disingkat menjadi:%bd | e#

iamnotsam
sumber
Sebagian besar berfungsi dengan baik. tapi kadang %- kadang tidak bisa bekerja karena semua pemilih. Bisakah Anda menebak sesuatu?
Jinyoung Kim
@JinyoungKim (dari [1]) Dalam perintah ":% bd", rentang '%' akan diganti dengan nomor baris awal dan akhir dalam buffer saat ini. Alih-alih menggunakan '%' sebagai rentang, Anda harus menentukan angka untuk rentang. Misalnya, untuk menghapus semua buffer, Anda dapat menggunakan perintah ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam
Saya baru saja memeriksa dokumen. Jadi, rentang '%' bergantung pada sejumlah baris file saat ini?
Jinyoung Kim
2
Saya menemukan fungsi bufnr("$")bawaan yang mengembalikan nomor buffer terakhir. tapi saya tidak punya ide untuk menyisipkan ke string ketika saya menggunakan seperti ini :1,bufnr("$")bd. Mungkin .. solusi terbaik :1,9999bd.
Jinyoung Kim
2
:help :bdmenunjukkan :%bdelete " delete all buffers. Jadi %itulah yang Anda inginkan. Saya menggunakan varian dari solusi Anda: :%bd<CR><C-O>:bd#<CR>Ini akan menghapus semua buffer, kemudian gunakan <C-O>untuk memulihkan posisi pada file saat ini, kemudian :bd#untuk menghapus buffer yang tidak dikenal. Ini menutup semua buffer dan membuat Anda berada di lokasi yang sama dalam file.
Alejandro
25

Membangun jawaban juananruiz.

Buat perubahan kecil di buffer yang ingin Anda simpan, lalu

:1,1000bd

Perintah bd (buffer delete) tidak akan menghapus buffer dengan perubahan yang belum disimpan. Dengan cara ini Anda dapat menyimpan file saat ini (diubah) dalam daftar buffer.

Sunting: Harap perhatikan bahwa ini juga akan menghapus NERDTreeBuffer Anda. Anda bisa mendapatkannya kembali dengan: NERDTree

Cutemachine
sumber
Sempurna, pendek dan sederhana! :)
arkod
49
:% bd sebenarnya "semua", bukan 1-1000.
John Tyree
Apakah ini bergantung set nohiddenuntuk diatur?
Felipe Alvarez
15

Dengan menggunakan

:on[ly][!]

dan

:h only
klokop
sumber
27
Ini menutup jendela, bukan buffer.
ZyX
13
Masih bermanfaat, karena orang mungkin mencari Google untuk istilah yang salah, dan akan menemukannya. Jadi terima kasih untuk kalian berdua. :)
Archgoon
1
@ bangsawan ya, tetapi harus ditentukan dalam jawabannya.
andho
10

Menutup semua buffer terbuka:

silent! execute "1,".bufnr("$")."bd"

Menutup semua buffer terbuka kecuali untuk yang sekarang :

function! CloseAllBuffersButCurrent()
  let curr = bufnr("%")
  let last = bufnr("$")

  if curr > 1    | silent! execute "1,".(curr-1)."bd"     | endif
  if curr < last | silent! execute (curr+1).",".last."bd" | endif
endfunction

Tambahkan fungsi ini ke .vimrcdan panggil menggunakan :call CloseAllBuffersButCurrent().

Peta kenyamanan:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
mynyml
sumber
Saya perhatikan bahwa ketika melanjutkan sesi vim, yang mengembalikan buffer, saya tidak dapat menghapus buffer lagi menggunakan di atas. Sebagai gantinya, saya harus menggunakan:%bd|e#|bd#
shmup
Solusi terbaik. Saya menambahkan perintah untuk membuka kembali NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa
5

Saya memasukkan ini ke file .vimrc saya

nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>

lalu milikmu leader + ca (tutup semua) tutup semua buffer kecuali yang sekarang.

Apa yang dilakukannya adalah

: w - simpan buffer saat ini

% bd - tutup semua buffer

e # - buka file yang terakhir diedit

bd # - tutup buffer tanpa nama

Yulin
sumber
4

Ada sebuah plugin yang melakukan ini dan sedikit lebih banyak!

Lihat close-buffer.vim

Niko Bellic
sumber
1

Inilah yang saya lakukan. Jadi saya ingin mempertahankan posisi kursor setelah menghapus semua buffer dan sebagian besar solusi di atas mengabaikan fakta ini. Saya juga berpikir bahwa mem-remapping perintah lebih baik daripada mengetiknya jadi di sini saya gunakan <leader>bduntuk menghapus semua buffer dan melompat kembali ke posisi kursor asli saya.

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"

%bd = hapus semua buffer.

e# = buka buffer terakhir untuk diedit (Yang merupakan buffer saya kerjakan).

bd# untuk menghapus buffer [No Name] yang dibuat saat Anda menggunakan %bd .

Pipa di antara hanya melakukan satu perintah demi satu. Anda harus menghindarinya meskipun menggunakan\|

'" = pertahankan posisi kursor saya.

0xMH
sumber
0

Saya suka 1,100bd( disarankan oleh juananruiz ) yang sepertinya bekerja untuk saya.

Saya menambahkan quit!ke pemetaan untuk memberi saya

nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>

Ini membunuh semua buffer dan mematikan Vim, yang paling saya cari.

LazyRiverYogi
sumber
1
Tidak ada alasan bagi Anda untuk memiliki bdqpemetaan yang menutup semua buffer dan keluar dari vim :q!, padahal Anda hanya bisa menggunakannya :qa!. Kecuali saya sedang menghadap sesuatu
shmup