สิ่งนี้ใช้ได้กับทั้ง 3 กรณีของคุณสำหรับฉัน:
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()
สิ่งเหล่านี้อาจจะรวมตัวเป็นเพียงการตรวจสอบล่าสุดสำหรับไฟล์ที่ว่างเปล่าเนื่องจากไม่มีชื่อไฟล์หรือไฟล์ที่ไม่มีอยู่โดยทั่วไปจะเริ่มเป็นบัฟเฟอร์ที่ว่างเปล่า อย่างไรก็ตามอาจเป็นไปได้ว่าบางปลั๊กอินอื่นเติมข้อมูลบางอย่างไว้ล่วงหน้าในหนึ่งในสองกรณีแรก (เช่นปลั๊กอินเทมเพลตบางส่วน) ดังนั้นจึงควรตรวจสอบทั้งสามอย่าง
การทดสอบครั้งแรกที่คุณมีอยู่แล้ว
การทดสอบครั้งที่สองจำเป็นต้องตรวจสอบfilereadable
กับค่าศูนย์ (ไม่มีอยู่) เพื่อตัดสินใจว่าเป็นการทดสอบใหม่ (ตรงข้ามกับสิ่งที่คุณมี)
การทดสอบครั้งสุดท้ายตรวจสอบว่าจำนวนบรรทัดสุดท้ายในไฟล์คือ 1 (ซึ่งเป็นบรรทัดแรกซึ่งหมายความว่ามีเพียงหนึ่งบรรทัด) และหมายเลขคอลัมน์ของจุดสิ้นสุดบรรทัด (คอลัมน์หลังจากอักขระสุดท้ายใน บรรทัด) คือ 1 ซึ่งหมายความว่ามี 0 อักขระ หากมีเพียง 1 บรรทัดที่มี 0 อักขระอยู่ภายในไฟล์นั้นจะต้องว่างเปล่า
หมายเหตุสุดท้ายประการหนึ่ง: วิธีที่คุณมีงบของคุณในคำถามอาจส่งผลให้เกิดผลลัพธ์ที่น่าประหลาดใจ กล่าวคือคุณกำลังตั้งค่าBufRead
และBufNewFile
เฉพาะเมื่อตรงกับเงื่อนไขเมื่อเริ่มต้น แต่จากนั้นข้อความอัตโนมัติเหล่านั้นจะมีอยู่ในเซสชันที่เหลือของคุณ ดังนั้นหากคุณต้องเริ่มต้นในไฟล์ว่างซึ่งตั้งค่าคำสั่งเหล่านี้ทุกไฟล์ที่เปิดขึ้นมา (ใหม่หรือไม่ว่างหรือไม่) จะเริ่มในโหมดแทรก
การเติมข้อความอัตโนมัติVimEnter
จะทำงานเมื่อสิ้นสุดการเริ่มต้นของ Vim และเพียงครั้งเดียวสำหรับเซสชันทั้งหมด ด้วยวิธีนี้การทดสอบของคุณจะทำงานเฉพาะเมื่อคุณเริ่มต้นเป็นกลุ่มและไม่ใช่เวลาอื่น