Điều này làm việc cho cả 3 trường hợp của bạn cho tôi:
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()
Chúng có thể được cô đọng thành chỉ kiểm tra lần cuối cho một tệp trống, vì không có tên tệp hoặc tệp không tồn tại thường bắt đầu dưới dạng bộ đệm trống. Tuy nhiên, có thể một số plugin khác điền trước một số nội dung vào một trong hai trường hợp đầu tiên (như một số plugin mẫu), vì vậy tốt nhất là kiểm tra cả ba.
Bài kiểm tra đầu tiên bạn đã có.
Thử nghiệm thứ hai cần kiểm tra filereadable
giá trị bằng 0 (không tồn tại) để quyết định xem nó có mới không (ngược lại với những gì bạn đã có).
Thử nghiệm cuối cùng kiểm tra số lượng dòng cuối cùng trong tệp là 1 (cũng là dòng đầu tiên, có nghĩa là chỉ có một dòng) và số cột của cuối dòng (cột sau ký tự cuối cùng trong dòng) là 1, có nghĩa là có 0 ký tự. Nếu chỉ có 1 dòng có 0 ký tự trong đó thì tệp phải trống.
Một lưu ý cuối cùng: Cách bạn có câu phát biểu của mình trong câu hỏi có thể dẫn đến một số kết quả đáng ngạc nhiên. Cụ thể, bạn đang thiết lập BufRead
và BufNewFile
chỉ khi các điều kiện được đáp ứng khi khởi động, nhưng sau đó những autocommands đó tồn tại trong phần còn lại của phiên của bạn. Vì vậy, nếu bạn bắt đầu với một tệp trống, thiết lập các lệnh này, mọi tệp tiếp theo được mở (mới hay không, trống hay không) sẽ bắt đầu ở chế độ chèn.
Chế độ tự động VimEnter
được chạy vào cuối khởi động của Vim và chỉ một lần cho toàn bộ phiên. Bằng cách này, các bài kiểm tra của bạn chỉ chạy khi bạn khởi động Vim chứ không phải bất kỳ lúc nào khác.