Inilah cara saya mereproduksi perilaku yang saya amati.
Pertama, saya masukkan perintah ini:
echo aaaaa > a
vim a
Di Vim, saya memasukkan perintah ini:
:ls
:e #
:echo bufname('#')
Ini adalah output dari tiga perintah di atas:
:ls
1 %a "a" line 1
:e #
E194: No alternate file name to substitute for '#'
:echo bufname('#')
The bufname('#')
perintah tidak menghasilkan output.
Sekarang saya memasukkan perintah ini:
:bd #
Buffer saat ini dihapus dan diganti dengan buffer "[No Name]":
:ls
2 %a "[No Name]" line 1
Saya mengharapkan untuk mendapatkan E194
kesalahan pada eksekusi :bd #
. Mengapa ia menghapus buffer saat ini?
Saya menggunakan VIM - Vi IMproved 8.0
.
buffers
vim-windows
Lone Learner
sumber
sumber
NVIM v0.3.0-dev
, saya memeriksa.Jawaban:
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) ...Saya membaca bahwa sebagai Vim
#
melaluiexpand()
fungsi (yaituexpand('#')
) atau setidaknya kode dasar yang digunakan di sana.:h expand()
mengatakan: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
dipanggildo_bufdel()
. Ini mengirimkan argumen baris perintahbuflist_findpat()
yang melaluinya , jika#
ditemui, mengembalikan nilaicurwin->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#
.)sumber