Vim: keluar jika daftar buffer kosong

3

saya ingin :bd dan :bw untuk benar-benar keluar dari sesi vim saya jika, setelah buffer saat ini dihapus, daftar buffer kosong (mis. jika, sebelum menjalankan :bd atau :bw, Saya hanya memiliki buffer saat ini dalam daftar buffer). Bagaimana saya bisa mencapai ini? Saya berasumsi itu seharusnya cukup mudah, tetapi googling belum benar-benar menghasilkan sesuatu yang bermanfaat, dan sejauh ini saya belum berhasil menulis autocmd untuk menyelesaikan ini.

Kyle Strand
sumber

Jawaban:

7

Untuk memeriksa buffer tunggal, Anda perlu mengulangi semua buffer potensial dan memeriksa apakah masih ada terdaftar (mis. dalam :ls ). Pemeriksaan dipicu setiap kali buffer dihapus:

:autocmd BufDelete * if len(filter(range(1, bufnr('$')), '! empty(bufname(v:val)) && buflisted(v:val)')) == 1 | quit | endif
Ingo Karkat
sumber
Saya berhasil meretas sesuatu bersama sendiri, tetapi terima kasih untuk versi satu baris. Namun, untuk mendapatkan perilaku yang saya inginkan, saya perlu berubah == 1 untuk == 2 (Hal yang sama berlaku dalam solusi saya juga). Adakah yang tahu mengapa ini terjadi? Apakah bufnr selalu sertakan buffer "kosong", dan lakukan buflisted mengembalikan true untuk buffer kosong?
Kyle Strand
Ya, buffer yang kosong juga diperhitungkan. Dalam solusi saya, karena itu Anda harus :bdelete itu juga, agar Vim berhenti. Menggunakan 2 mungkin gagal jika Anda memulai Vim dengan a file argumen; kemudian, tidak ada buffer kosong. Lebih baik tambahkan ! empty(bufname(v:val)) && buflisted(... ke filter.
Ingo Karkat
Maaf, satu hal lagi: sepertinya ini mencegah saya membuka jendela bantuan ketika saya memiliki satu item di daftar buffer saya. Adakah yang tahu mengapa itu terjadi? Saya bahkan tidak berharap acara BufDelete terjadi ketika membuka dokumen bantuan ...
Kyle Strand
Saya mempunyai masalah yang sama dan harus menambahkan cek kosong, yaitu: autocmd BufDelete * jika len (filter (range (1, bufnr ('$')), 'empty (bufname (v: val)) & amp; & amp; (v: val) ')) == 1 | berhenti | berakhir jika
Von
Dengan solusi ini, saya tidak dapat membuka bantuan ketika hanya satu buffer yang terbuka.
cdosborn
1

Solusi yang diusulkan mungkin bermasalah sehubungan dengan beberapa plugin. Ini adalah jalan pintas yang melakukannya untuk saya dan tampaknya lebih aman karena tidak bergantung pada autocmds:

nn q :if ((len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) == 1) && expand('%') == '')<Bar>exe 'q'<Bar>else<Bar>exe 'bd'<Bar>endif<cr>

Itu menggunakan bd kecuali ada buffer tunggal tanpa nama saat digunakan quit sebagai gantinya.

majkinetor
sumber
Saya tidak mengerti mengapa :e akan menyebabkan vim keluar menggunakan yang diusulkan QuitIfLastBuffer() fungsi dan BufDelete perintah otomatis, kecuali jika Anda memiliki sesuatu yang akan menyebabkan :e untuk memicu BufDelete. Selain itu, solusi Anda tidak persis sama - sepertinya Anda mengubah perilaku :q, sedangkan pertanyaan dan solusi sebelumnya adalah tentang mengubah perilaku :bd.
Kyle Strand
Anda benar, ini interaksi plugin dengan bersatu. Saya kira solusinya bermasalah dengan beberapa plugin. Saya mengubah info untuk mencatat ini.
majkinetor