Bukti
Karena tidak ada file alternatif, Anda sebenarnya hanya menjalankan file biasa :bd
, menghapus buffer saat ini ... coba tanpa #
dan Anda akan melihat hasilnya sama. Hal serupa terjadi dengan :buffer
, :sbuffer
dan setidaknya beberapa perintah lain yang menerima #
sebagai argumen: mereka diam-diam berperilaku seolah-olah tidak ada argumen yang disampaikan.
Sepanjang baris yang sama, jika Anda mencoba :bunload #
Anda mendapatkan error ini: E90: Cannot unload last buffer
. Jalankan :bunload
tanpa argumen dan, sekali lagi, Anda akan mendapatkan hasil yang sama.
The Documents
Jadi kami memiliki bukti yang #
digantikan oleh "tidak ada" (mungkin string kosong). Kemana kita pergi dari sini? Saya mencari-cari file bantuan untuk sementara waktu berusaha menemukan penyebutan perilaku ini. Tidak ada yang eksplisit kecuali :h cmdline-lines
mengatakan (gulir ke bawah satu atau dua halaman) ...
Ketika karakter '%' atau '#' digunakan di mana nama file diharapkan, mereka diperluas ke nama file saat ini dan alternatif.
Saya membaca bahwa sebagai Vim #
melalui expand()
fungsi (yaitu expand('#')
) atau setidaknya kode dasar yang digunakan di sana.
:h expand()
mengatakan:
Luaskan .. kata kunci khusus. .. Saat menggunakan '%' atau '#', dan nama file alternatif atau saat ini tidak ditentukan, string kosong digunakan.
Kedengarannya familiar.
Kode
Sekarang tidak satu pun di atas yang definitif atau memberikan petunjuk mengapa? jadi saya menghabiskan lebih banyak waktu untuk menggali ... kali ini dalam kode. C saya sangat berkarat dan saya tidak memiliki alat yang bagus diinstal tetapi saya berhasil menemukan fungsi yang melakukan beberapa pengaturan untuk :bdelete
dipanggil do_bufdel()
. Ini mengirimkan argumen baris perintah buflist_findpat()
yang melaluinya , jika #
ditemui, mengembalikan nilai curwin->w_alt_fnum
. Itu adalah "nomor buffer" dari buffer alternatif ... yang tidak dapat menjadi nilai positif dalam skenario kami. (Tidak ada pemeriksaan apakah file alt valid / ada sebelum nilai pengembalian dipilih.)
Kembali dalam do_bufdel()
pemeriksaan dibuat terhadap nilai kembali untuk nomor penyangga kurang dari 0 dalam hal loop pemrosesan parameter putus. Itu tidak akan menghasilkan parameter yang disajikan ke :bdelete
kode inti ... yang sesuai dengan intuisi saya sebelumnya.
Apa berikutnya?
Tampaknya berfungsi sebagaimana dirancang dalam bahwa saya tidak melihat apa pun yang tampak seperti bug yang jelas. Mungkin dosa kelalaian, meskipun ... kasus sudut yang telah diabaikan dan dengan demikian tidak memiliki penanganan yang anggun. Tetapi hanya pengembang yang menulis ini yang tahu pasti. Jadi langkah terakhir adalah mencoba mendapatkan masukan dari mereka. Seperti kata Christian B. bertanya pada daftar vim-dev adalah jalan yang harus ditempuh.
(Perhatikan bahwa buflist_findpat()
adalah fungsi utilitas sehingga tidak akan memerlukan imajinasi untuk mengasumsikan bahwa :bunload
, :buffer
, dll menggunakannya, juga ... yang akan menjelaskan perilaku umum mereka sehubungan dengan #
.)
NVIM v0.3.0-dev
, saya memeriksa.