เท่าที่ฉันรู้ว่าไม่มีการตั้งค่าหรือบางอย่างเช่นการทำเช่นนี้ แต่ไม่ทั้งหมดหายไปแน่นอนเราสามารถใช้การเติมข้อความ
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 ...
) โดยใช้BufNewFile
autocmd BufWritePre
แทน
นอกจากนี้ยังมีปลั๊กอินที่เรียกว่าauto_mkdirซึ่งมีประสิทธิภาพเหมือนข้างต้น
ในหน้านี้
มีข้อมูลโค้ดที่ขยายออกเล็กน้อยซึ่งจะถามคุณว่าคุณต้องการสร้างไดเรกทอรีก่อนหรือไม่ซึ่งบางอันอาจถือว่ามีประโยชน์ นอกจากนี้ยังมีการแปลงชื่อไฟล์ของการเข้ารหัสก่อนที่จะเขียน:
call mkdir(iconv(expand("%:p:h"), &encoding, &termencoding), 'p')
ฉันไม่แน่ใจว่าจำเป็นต้องใช้สิ่งนี้จริงหรือไม่ แต่ถ้าคุณผสมการเข้ารหัสจำนวนมากและรับชื่อไฟล์แปลก ๆ คุณสามารถลองได้
ฉันใส่ทุกอย่างไว้ในauto_mkdir2.vim
ปลั๊กอินเพื่อการติดตั้งง่ายขึ้น