เท่าที่ฉันรู้ว่าไม่มีการตั้งค่าหรือบางอย่างเช่นการทำเช่นนี้ แต่ไม่ทั้งหมดหายไปแน่นอนเราสามารถใช้การเติมข้อความ
BufWritePreอัตโนมัติได้
สิ่งนี้ถูกดำเนินการก่อนที่บัฟเฟอร์จะถูกเขียนไปยังดิสก์ ดังนั้นเราสามารถสร้างไดเรกทอรีที่นั่นถ้ามันยังไม่มี
ตัวอย่างเช่น:
augroup Mkdir
autocmd!
autocmd BufWritePre *
\ if !isdirectory(expand("<afile>:p:h")) |
\ call mkdir(expand("<afile>:p:h"), "p") |
\ endif
augroup END
- ก่อนอื่นเราตรวจสอบว่ามีไดเรกทอรีอยู่ด้วย
isdirectoryมิฉะนั้นmkdirจะทำให้เกิดข้อผิดพลาด
<afile>หมายถึงไฟล์ที่เราพยายามบันทึก :pเป็นตัวดัดแปลงเพื่อขยายเป็นชื่อพา ธ แบบเต็ม (แทนที่จะเป็นแบบสัมพัทธ์) และ:hลบส่วนประกอบพา ธ สุดท้าย (ไฟล์)
- จากนั้นเราโทร
mkdir()ถ้าจำเป็น เราจำเป็นต้องpธงmkdir()เพื่อให้ทุกไดเรกทอรีพ่อแม่ (ie. nonexistent/more_nonexisting/fileในกรณีของ
แน่นอนคุณสามารถเรียกใช้mkdir()คำสั่งจาก commandline Vim หรือผูกกับ keybind เช่น:
nnoremap <Leader>m :call mkdir(expand("%:p:h"), "p")<CR>
ที่นี่ฉันใช้%แทน<afile>เนื่องจากใช้ได้เฉพาะจากภายใน autocommand ( %หมายถึงบัฟเฟอร์ที่ใช้งานอยู่ในปัจจุบันซึ่งจะไม่ทำงานด้วย:waเช่น<afile>อ้างถึงชื่อไฟล์ของบัฟเฟอร์ที่เรียก autocmd)
คุณยังสามารถขอคำยืนยันก่อนที่จะเขียนไดเรกทอรีถ้าคุณต้องการ ดูคำถามนี้สำหรับรายละเอียดเพิ่มเติม: ฉันจะหยุด Vim จากการเขียนไฟล์ใน Autocommand ของ BufWritePre ได้อย่างไร
ตัวอย่างด้านบนจะสร้างไดเรกทอรีในการเขียนครั้งแรก ( :w) คุณสามารถถ้าคุณต้องการยังสร้างไดเรกทอรีเมื่อคุณเปิด (เช่นหลังการพิมพ์vim ...) โดยใช้BufNewFileautocmd BufWritePreแทน
นอกจากนี้ยังมีปลั๊กอินที่เรียกว่าauto_mkdirซึ่งมีประสิทธิภาพเหมือนข้างต้น
ในหน้านี้
มีข้อมูลโค้ดที่ขยายออกเล็กน้อยซึ่งจะถามคุณว่าคุณต้องการสร้างไดเรกทอรีก่อนหรือไม่ซึ่งบางอันอาจถือว่ามีประโยชน์ นอกจากนี้ยังมีการแปลงชื่อไฟล์ของการเข้ารหัสก่อนที่จะเขียน:
call mkdir(iconv(expand("%:p:h"), &encoding, &termencoding), 'p')
ฉันไม่แน่ใจว่าจำเป็นต้องใช้สิ่งนี้จริงหรือไม่ แต่ถ้าคุณผสมการเข้ารหัสจำนวนมากและรับชื่อไฟล์แปลก ๆ คุณสามารถลองได้
ฉันใส่ทุกอย่างไว้ในauto_mkdir2.vimปลั๊กอินเพื่อการติดตั้งง่ายขึ้น