Vim: Tutup Semua Buffer Tapi Yang Ini


196

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


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


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#

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

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#


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


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

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>

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



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.


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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.