ฉันจะเรียกใช้ autocmd ได้อย่างไรเมื่อเริ่ม Vim โดยไม่มีไฟล์, ไฟล์ที่ไม่มีอยู่หรือไฟล์เปล่า (แต่ไม่ใช่เมื่อเริ่มต้นด้วยไฟล์ที่มีอยู่)


11

ฉันต้องการเรียกใช้ autocmd ในสถานการณ์ต่อไปนี้เมื่อฉันเริ่ม Vim:

  • โดยไม่ได้ระบุชื่อไฟล์
  • เมื่อไฟล์ใหม่
  • เมื่อไฟล์มีอยู่ แต่ว่างเปล่าทั้งหมด

ในสามกรณีข้างต้นทั้งหมดฉันต้องการเรียกใช้ autocmd โดยเฉพาะฉันต้องการเริ่มโหมดแทรกโดยอัตโนมัติสำหรับสถานการณ์ข้างต้นเท่านั้น (ไม่ใช่เมื่อฉันเปิดไฟล์ที่มีอยู่แล้ว & ไม่ว่าง)


UPDATE:

ฉันได้ลองทำสิ่งต่อไปนี้ในของฉัน_vimrcแต่ไม่มีโชค (บวกด้วยฉันไม่แน่ใจว่ามีฟังก์ชั่นในกลุ่มที่นับจำนวนตัวอักษรในไฟล์ (เพื่อดูว่ามันเป็นศูนย์) ก่อนเปิดหรือไม่:

if @% == "" || filereadable(@%)
  autocmd BufRead,BufNewFile * startinsert
endif

ไม่มันไม่ซ้ำกัน ฉันต้องการให้ vi เริ่มต้นในโหมดแทรกเท่านั้นสำหรับสถานการณ์ที่สามที่ฉันได้กล่าวถึง
John Sonderson

3
โอเคฉันเสียใจ แต่จริงๆแล้วมองเหมือนซ้ำ ๆ ;-) ฉันได้แก้ไขคำถามของคุณสักเล็กน้อยเพื่อให้ความแตกต่างชัดเจนขึ้น
Martin Tournoij


2
@JohnSonderson ลิงค์แรกบอกถึงวิธีการหาถ้าไม่มีชื่อไฟล์จะได้รับสองสามารถปรับโดยใช้แทนnormal exec
muru

1
ไฟล์ vimrc อ่านได้เพียงครั้งเดียว : เมื่อ Vim เริ่มทำงาน เนื้อหาของ autocmd ทำงานทุกครั้งที่มีการเรียกใช้ ดังนั้นifคำสั่งไม่ควรอยู่รอบ ๆ autocmd หากควรอยู่ใน autocmd ดังนั้นมันจะถูกเรียกใช้ทุกครั้งที่ autocmd ถูกเรียกใช้
Martin Tournoij

คำตอบ:


10

สิ่งนี้ใช้ได้กับทั้ง 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 และเพียงครั้งเดียวสำหรับเซสชันทั้งหมด ด้วยวิธีนี้การทดสอบของคุณจะทำงานเฉพาะเมื่อคุณเริ่มต้นเป็นกลุ่มและไม่ใช่เวลาอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.