Bagaimana cara menutup buffer tunggal (dari banyak) di Vim?

445

Saya membuka beberapa file di Vim dengan, misalnya, berjalan

vim a/*.php

yang membuka 23 file.

Saya kemudian mengedit dan menjalankan yang berikut ini dua kali

:q

yang menutup semua buffer saya.

Bagaimana Anda bisa menutup hanya satu buffer di Vim?

Léo Léopold Hertz 준영
sumber
9
Perhatikan bahwa Anda dapat membuka file di jendela Vim terpisah menggunakan vim -o a/*.php(atau -Omenggunakan jendela vertikal) dan menghindari navigasi buffer - ini adalah metode yang bagus untuk hanya beberapa file, tetapi dengan 23 file mereka hanya akan memiliki beberapa baris / kolom setiap.
Cascabel
1
@ Jeffromi: Terima kasih telah menunjukkan itu! Saya belum pernah menggunakan opsi -o sebelumnya.
Léo Léopold Hertz 준영
Tentang masalah window split. Jika Anda sudah di Vim dan ingin membuka file lain di split: esp untuk horizontal: evsp untuk vertikal.
Lanzafame

Jawaban:

558

Kata hati-hati: "w dalam bw tidak berdiri untuk menulis tetapi untuk penghapusan!"

Lebih banyak dari manual:

: bd

Bongkar buffer [N] (default: buffer sekarang) dan hapus dari daftar buffer. Jika buffer diubah, ini gagal, kecuali ketika [!] Ditentukan, dalam hal ini perubahan hilang. File tetap tidak terpengaruh.

Jika Anda tahu apa yang Anda lakukan, Anda juga dapat menggunakan: bw

: bw

Seperti |: bdelete |, tetapi benar-benar menghapus buffer.

hhh
sumber
4
Juga kemungkinan melakukan ': M, Nbd' untuk menutup nomor penyangga M ke N. Atau ': bd N1 N2 ...' di mana N # adalah nomor penyangga
snowbound
61
Manual mengatakan hanya digunakan :bwjika "Anda tahu apa yang Anda lakukan", yang tidak saya lakukan, jadi saya kira saya akan menggunakannya :bd.
jberryman
1
Saya bingung dengan ini pada awalnya - saya membuka tab baru untuk menutup buffer ... tapi menutup buffer di tab (menggunakan garis lurus :bd) juga menutup tab. Apa yang mungkin Anda inginkan adalah :bd n .. [m]atau :n,mbduntuk nomor tertentu atau kisaran angka untuk ditutup, yang dapat Anda lakukan tanpa melihat buffer
JonnyRaa
5
wkependekan dari writeperintah menurut Vim manual, ada juga tidak menyebutkan "penghapusan". Deskripsi perintah ( help write) dimulai dengan "Tulis seluruh buffer ke file saat ini."
amn
3
@ am saya juga bingung, tapi maksudnya wdi bwperintah berarti penghapusan dia tidak berbicara tentang wperintah. Ia menaruh peringatan ini di sana sehingga orang tidak mengira bwperintah itu berarti buffer write (yang tidak berarti buffer wipeout.)
John
351

Jika ini tidak diperjelas oleh jawaban sebelumnya:

: bd akan menutup buffer saat ini. Jika Anda tidak ingin mengambil daftar buffer.

RedBlueThing
sumber
4
Sebelum menemukan: bd tidak masuk akal bagi saya bahwa orang tidak memiliki masalah melakukan: ls -> memindai nomor doc -> membongkar buffer dengan nomor. Apakah orang benar-benar menganggap ini efektif?
Svend
3
@svend untuk berbagai buffer tentu, tetapi untuk satu saja a: bd mungkin lebih efektif
Firaun
10
:bdhanya menutup buffer sedangkan (apa pun artinya) sedangkan :bwjuga akan menghapus semua variabel dan BENAR-BENAR menghilangkannya dari lsbuffer.
RedX
1
jawaban hhh di bawah ini lebih lengkap…
103

Periksa id buffer Anda menggunakan: buffer

Anda akan melihat daftar buffer di sana suka

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

jika Anda ingin menghapus b.php dari buffer

:2bw

jika Anda ingin menghapus / menutup semua dari buffer

:1,3bw
nightingale2k1
sumber
4
Anda juga dapat menghapus semua buffer dengan:% bw
cdleonard
7
jalan pintas untuk memeriksa id buffer: 2 CTRL-G
snowbound
43

Daripada menelusuri ouput dari perintah: ls dan menghapus (unload, wipe ..) buffer dengan menentukan nomornya, saya menemukan bahwa menggunakan nama file seringkali lebih efektif.

Sebagai contoh, setelah saya membuka beberapa file .txt untuk menyegarkan kembali ingatan saya tentang beberapa hal yang bagus .. salin dan tempel beberapa baris teks untuk digunakan sebagai semacam template .. dll. Saya akan mengetik yang berikut ini:

:bd txt <Tab>

Perhatikan bahwa string yang cocok tidak harus berada di awal nama file.

Di atas menampilkan daftar nama file yang cocok dengan 'txt' di bagian bawah layar dan menjaga: perintah bd Awalnya saya ketik tidak tersentuh, siap untuk diselesaikan.

Ini sebuah contoh:

doc1.txt doc2.txt
:bd txt 

Saya bisa mundur lebih dari bit 'txt' dan mengetikkan nama file yang ingin saya hapus, tetapi di mana ini menjadi sangat nyaman adalah saya tidak perlu: jika saya menekan tombol Tab untuk kedua kalinya, Vim secara otomatis menyelesaikan perintah saya dengan pertandingan pertama:

:bd doc1.txt

Jika saya ingin menyingkirkan buffer khusus ini, saya hanya perlu menekan Enter.

Dan jika buffer yang ingin saya hapus kebetulan adalah kecocokan kedua (ketiga .. dll), saya hanya perlu terus menekan tombol Tab untuk membuat siklus perintah saya: bd melalui daftar kecocokan.

Secara alami, metode ini juga dapat digunakan untuk beralih ke buffer yang diberikan melalui perintah seperti: b ..: sb .. etc.

Pendekatan ini sangat berguna ketika opsi Vim 'tersembunyi' diatur, karena daftar buffer dapat dengan cepat menjadi cukup besar, mencakup beberapa layar, dan membuatnya sulit untuk menemukan buffer tertentu yang saya cari.

Untuk memanfaatkan fitur ini sebaik mungkin, sebaiknya baca file bantuan Vim berikut ini dan sesuaikan perilaku penyelesaian baris perintah Tab yang sesuai sehingga paling sesuai dengan alur kerja Anda:

:help wildmode

Perilaku yang saya jelaskan di atas dihasilkan dari pengaturan berikut, yang saya pilih demi konsistensi untuk meniru penyelesaian bash:

:set wildmode=list:longest,full

Berbeda dengan menggunakan nomor buffer, manfaat dari pendekatan ini adalah bahwa saya biasanya ingat setidaknya sebagian dari nama file yang diberikan membiarkan saya menargetkan buffer secara langsung daripada harus terlebih dahulu mencari nomornya melalui perintah: ls.

guv '
sumber
40

Menggunakan:

  • :ls - untuk membuat daftar buffer
  • :bd#n- untuk menutup buffer di mana #n adalah nomor buffer (gunakan lsuntuk mendapatkannya)

Contoh:

  • untuk menghapus buffer 2:

    :bd2
    
Shaun
sumber
16

Anda dapat memetakan berikutnya dan sebelumnya ke tombol fungsi juga, membuat bersepeda melalui buffer menjadi mudah

map <F2> :bprevious<CR>
map <F3> :bnext<CR>

dari vimrc saya

Ravi
sumber
2

Bagaimana tentang

vim -O a a

Dengan begitu Anda dapat mengedit satu file di kiri Anda dan menavigasi seluruh dir di kanan Anda ... Hanya sebuah pemikiran, bukan solusi ...

Santi
sumber
2

[EDIT: ini adalah saran bodoh dari waktu saya tidak cukup mengenal Vim. Harap jangan gunakan tab alih-alih buffer; tab adalah "tata letak jendela" Vim]

Mungkin beralih menggunakan tab?

vim -p a/*.php membuka file yang sama di tab

gtdan gTberalih tab bolak-balik

:q hanya menutup tab saat ini

:qa menutup semuanya dan keluar

:tabo menutup semuanya kecuali tab saat ini

Leonid Shevtsov
sumber
2
Mengapa Anda mengatakan bahwa menggunakan tab adalah saran yang bodoh? Saya hanya bertanya karena saya menggunakan tab setiap saat ...: ^ /
Nate
2
@Nate: Saya memutuskan untuk menguraikan leonid.shevtsov.me/en/… itu
Leonid Shevtsov
1
Itu adalah pos yang bagus - itu mengilhami saya untuk menggali lebih dalam lagi - sudahkah Anda melihatnya wildmenu? Ini mirip dengan lustyjuggler (meskipun lebih sederhana) tetapi ini sudah built in (yang bagus untuk saya, karena kebutuhan lustyjuggler +ruby, dan vim default untuk kapal oneiric ubuntu -ruby).
Nate
@Nate: ya, saya menggunakan wildmenu untuk membuka file, tetapi ketika Anda memiliki banyak file di proyek, itu tidak skala. Juga, vim-noxpaket dari Ubuntu memiliki dukungan Ruby.
Leonid Shevtsov
1

Mereka yang menggunakan penyangga atau plugin navigasi pohon, seperti Buffergator atau NERDTree, akan perlu untuk beralih pemisahan ini sebelum menghancurkan buffer saat ini - jika tidak Anda akan mengirim pemisahan Anda ke wonkyville

Saya menggunakan:

"" Buffer Navigation                                                                                                                                                                                        
" Toggle left sidebar: NERDTree and BufferGator                                                                                                                                                             
fu! UiToggle()                                                                                                                                                                                              
  let b = bufnr("%")                                                                                                                                                                                        
  execute "NERDTreeToggle | BuffergatorToggle"                                                                                                                                                              
  execute ( bufwinnr(b) . "wincmd w" )                                                                                                                                                                      
  execute ":set number!"                                                                                                                                                                                    
endf                                                                                                                                                                                                        
map  <silent> <Leader>w  <esc>:call UiToggle()<cr>   

Di mana " NERDTreeToggle" dalam daftar itu sama dengan mengetik :NERDTreeToggle. Anda dapat memodifikasi fungsi ini untuk diintegrasikan dengan konfigurasi Anda sendiri.

Alexandria Baru
sumber
untuk ini, plugin bbye sempurna yang mempertahankan tata letak jendela Anda saat menggunakan :bdeleteatau :bwipeout. Lihat jawaban saya .
Wolfson
0

Tutup penyangga tanpa menutup jendela

Jika Anda ingin menutup penyangga tanpa merusak tata letak jendela Anda (tata letak saat ini berdasarkan pemisahan), Anda dapat menggunakan Plugin seperti bbye . Berdasarkan ini, Anda bisa menggunakannya

:Bdelete (instead of :bdelete)
:Bwipeout (instead of :bwipeout)

Atau hanya membuat pemetaan di Anda .vimrcuntuk akses yang lebih mudah

:nnoremap <Leader>q :Bdelete<CR>

Keuntungan lebih dari vim: bdelete dan: bwipeout

Dari dokumentasi plugin :

  • Tutup dan hapus buffer.
  • Perlihatkan file lain di jendela itu.
  • Tampilkan file kosong jika Anda tidak punya file lain yang terbuka.
  • Jangan tinggalkan buffer [tidak ada file] yang tidak berguna jika Anda memutuskan untuk mengedit file lain di jendela itu.
  • Bekerja bahkan jika file terbuka di banyak jendela.
  • Bekerja dengan baik-baik saja dengan berbagai penjelajah penjelajah dan tabbars.

: bdelete vs: bwipeout

Dari dokumentasi plugin :

Vim memiliki dua perintah untuk menutup buffer: :bdeletedan :bwipeout. Yang pertama menghapus file dari daftar buffer, menghapus opsi, variabel, dan pemetaannya. Namun, tetap di jumplist, jadi Ctrl-omembawa Anda kembali dan membuka kembali file tersebut. Jika itu bukan yang Anda inginkan, gunakan :bwipeoutatau setara Bbye di :Bwipeoutmana Anda akan pernah menggunakannya :bdelete.

Wolfson
sumber