Tutup dan keluarkan buffer tanpa keluar dari Vim

55

Seringkali, saya akan memuat beberapa informasi ke dalam buffer sementara, dan kemudian menutupnya :clo!. Tapi ini menyembunyikan buffer daripada membongkar seluruhnya, meskipun saya telah nohiddenmengaturnya. Saya menemukan ini melelahkan karena saya mendapatkan konfirmasi tambahan ketika saya berhenti Vim, tentang konten saya sudah (saya pikir saya) dibuang.

Saya bisa menggunakan :q!saja, tapi itu kebiasaan buruk untuk masuk karena akan keluar sepenuhnya dari Vim jika hanya ada satu buffer yang tersisa, yang juga menjengkelkan. Lebih buruk lagi, jika saya salah ketik :qa!, saya bisa kehilangan banyak pekerjaan.

Apakah ada jalan tengah? Saya sangat suka beberapa perintah yang membunuh buffer saat ini tetapi tidak keluar Vim. Saya tidak menentang untuk menulisnya di Vimscript, tetapi saya lebih suka menghindarinya jika perintah sudah ada.

Kevin
sumber

Jawaban:

70

Ada perintah untuk melakukan hal itu: :bdeleteatau adil :bd. Secara default akan menurunkan buffer saat ini. Untuk membongkar buffer lain, pertama dapatkan daftar semua buffer dengan :buffersperintah, dan setelah itu Anda dapat menentukan nomor setelah :bduntuk menghapusnya. Juga :bd+ space+ tabmemungkinkan penyelesaian menggunakan nama buffer.

tivn
sumber
1
Ini akan beroperasi pada buffer terbuka terakhir, yang tidak persis seperti yang saya inginkan, tetapi karena itu tidak berhenti, itu cukup baik untuk tujuan saya.
Kevin
Plugin vim-bbye mungkin yang Anda cari: github.com/moll/vim-bbye
alxndr
1
Ini tidak berfungsi dalam vi
redolent
Juga, built-in alias :lslebih mudah (imo) untuk diingat dan melakukan hal yang sama seperti:buffers
kuzyn
Ini tidak membongkar buffer. Bahkan sebenarnya tidak menutupnya. Ini hanya menghapus 'buflisted'. vim.wikia.com/wiki/Vim_buffer_FAQ
BTRUE
27

Anda dapat menghapus buffer sepenuhnya menggunakan perintah: bwipeout (atau: bw). Ini sepenuhnya menghapus buffer dari memori, termasuk tanda, pengaturan opsi, dll. Yang telah Anda tambahkan padanya. Demikian pula,: bdelete (atau: bd) menghapus buffer, tetapi membiarkannya dalam memori dan menyimpan tanda dan pengaturan opsi.

Sesuai komentar oleh Tom Hale, dokumentasi Vim merekomendasikan penggunaan: bd over: bw kecuali Anda tahu apa yang Anda lakukan. Saya cenderung menggunakan: bw karena seperti ide untuk sepenuhnya menghapus buffer dari memori, dan saya tidak menggunakan banyak tanda, pengaturan opsi buffer-spesifik, dll, sampai membutuhkan mereka untuk tetap setelah menutup buffer saya.

Seperti perintah: quit (: q), Vim akan memberikan kesalahan jika buffer telah berubah. Untuk mengatasinya, Anda dapat menambahkan tanda seru setelah perintah untuk menekan prompt. Opsi lain, alih-alih menambahkan tanda seru ke semuanya, adalah menambahkan "atur konfirmasi" ke vimrc Anda. Dengan set ini, vim akan meminta Anda untuk menyimpan perubahan file saat tutup.

: bufdo adalah perintah yang berguna yang melakukan perintah lain pada semua buffer aktif. Menggabungkan perintah: bufdo dengan perintah: bw /: bd memungkinkan Anda menghapus semua buffer aktif sekaligus. Anda masih dapat menggunakan tanda seru untuk menekan kesalahan, tetapi apakah Anda menempatkannya setelah: bufdo, after: bw, atau setelah keduanya menyebabkan hasil yang berbeda untuk masing-masing:

:bd          - deletes the current buffer, error if there are unwritten changes
:bd!         - deletes the current buffer, no error if unwritten changes
:bufdo bd    - deletes all buffers, stops at first error (unwritten changes)
:bufdo! bd   - deletes all buffers except those with unwritten changes
:bufdo! bd!  - deletes all buffers, no error on any unwritten changes

:bw          - completely deletes the current buffer, error if there are unwritten changes
:bw!         - completely deletes the current buffer, no error if unwritten changes
:bufdo bw    - completely deletes all buffers, stops at first error (unwritten changes)
:bufdo! bw   - completely deletes all buffers except those with unwritten changes
:bufdo! bw!  - completely deletes all buffers, no error on any unwritten changes

:set confirm - confirm changes (Yes, No, Cancel) instead of error

Berikut adalah beberapa perintah buffer berguna lainnya:

:ls          - list open buffers
:b N         - open buffer number N (as shown in ls)
:tabe +Nbuf  - open buffer number N in new tab
:bnext       - go to the next buffer (:bn also)
:bprevious   - go to the previous buffer (:bp also)

Ada banyak lagi penanganan buffer yang berada di luar cakupan pertanyaan ini. Lihat:
http://vim.wikia.com/wiki/Vim_buffer_FAQ http://vimdoc.sourceforge.net/htmldoc/windows.html#buffers

Kedelai17
sumber
Bisakah Anda menambahkan penjelasan pada jawaban ini?
EvergreenTree
Bantuan mengatakan "jangan gunakan ini kecuali Anda tahu apa yang Anda lakukan", menunjukkan bahwa :bdlebih disukai dalam banyak kasus
Tom Hale
1
@ TomHale Akan menyenangkan untuk mengetahui apa lagi yang :bwdilakukan di luar "Semua yang terkait dengan buffer hilang. Semua tanda dalam buffer ini menjadi tidak valid, pengaturan opsi hilang, dll.". Tampaknya masuk akal bagi saya jika saya ingin 'menutup' buffer seperti itu jika saya keluar sepenuhnya dari Vim.
Kenny Evitt
Saya lebih suka: bw lebih: bd karena jika Anda menggunakan: bd dan kemudian tekan <ctrl - ^> untuk pergi ke buffer yang terakhir digunakan, itu akan membawanya dari memori. : bw memberi saya lebih banyak kontrol dan melakukan apa yang saya inginkan ^^
eli
ini bagus! terima kasih @ Soylent17!
apollo