Ini berfungsi untuk ketiga kasus Anda untuk saya:
function InsertIfEmpty()
if @% == ""
" No filename for current buffer
startinsert
elseif filereadable(@%) == 0
" File doesn't exist yet
startinsert
elseif line('$') == 1 && col('$') == 1
" File is empty
startinsert
endif
endfunction
au VimEnter * call InsertIfEmpty()
Ini mungkin bisa diringkas menjadi hanya pemeriksaan terakhir untuk file yang kosong, karena tidak ada nama file atau file yang tidak ada biasanya mulai sebagai buffer kosong. Namun, mungkin saja beberapa plugin lain mengisi beberapa hal dalam salah satu dari dua kasus pertama (seperti beberapa templat plugin), jadi yang terbaik adalah memeriksa ketiganya.
Tes pertama yang sudah Anda miliki.
Tes kedua perlu memeriksa filereadable
terhadap nilai nol (tidak ada) untuk memutuskan apakah itu baru (kebalikan dari apa yang Anda miliki).
Tes terakhir memeriksa bahwa jumlah baris terakhir dalam file adalah 1 (yang juga merupakan baris pertama, artinya hanya ada satu baris), dan bahwa jumlah kolom dari ujung baris (kolom setelah karakter terakhir dalam baris) adalah 1, yang berarti ada 0 karakter. Jika hanya ada 1 baris dengan 0 karakter di dalamnya, maka file tersebut harus kosong.
Satu catatan terakhir: Cara Anda menyampaikan pernyataan dalam pertanyaan dapat menghasilkan beberapa hasil yang mengejutkan. Yaitu, Anda menetapkan BufRead
dan BufNewFile
hanya jika kondisi dipenuhi pada saat startup, tetapi kemudian autocommands ada selama sisa sesi Anda. Jadi, jika Anda memulai pada file kosong, yang menetapkan perintah ini, setiap file berikutnya dibuka (baru atau tidak, kosong atau tidak) akan mulai dalam mode insert.
Perintah otomatis VimEnter
dijalankan pada akhir startup Vim dan hanya sekali untuk seluruh sesi. Dengan cara ini, tes Anda hanya berjalan ketika Anda memulai Vim dan tidak pada waktu lainnya.