มีสามขั้นตอนหลักในการบรรลุสิ่งที่คุณขอ:
- รับชื่อไฟล์สำรอง
- เปิดไฟล์นั้นในหน้าต่างปัจจุบันหรือในหน้าต่างอื่นตามต้องการ
- คืนค่าตำแหน่งเคอร์เซอร์ภายในไฟล์นั้น
หากต้องการค้นหาชื่อไฟล์อื่นคุณต้องการแบ่งชื่อไฟล์ปัจจุบันเป็น "root" และ "นามสกุล" วิธีง่ายๆในการทำเช่นนี้คือ:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
หากคุณรู้ว่าคุณสลับไปมาระหว่าง.h
และ.cpp
ไฟล์คุณสามารถเปลี่ยนนามสกุลจากที่หนึ่งไปยังอีกที่หนึ่งได้อย่างง่ายดาย:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
อีกทางหนึ่งคือสร้างการแมปส่วนขยายที่รู้จักในพจนานุกรมเพื่อส่วนขยายอื่นที่ถูกต้อง หรือใช้globpath()
เพื่อรับตัวเลือกที่เป็นไปได้ทั้งหมดสำหรับไฟล์ปัจจุบัน:
let alternates = globpath(expand("%:h"), root . ".*")
และเลือกคนแรกหรืออะไรก็ตาม ฉันชอบglobpath
วิธีนี้มากขึ้นด้วยสมาร์ทพิเศษที่ฉันจะอธิบายในภายหลัง เมื่อคุณเลือกส่วนขยายเป้าหมายแล้วให้สร้างเส้นทางเป้าหมายแบบเต็ม:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
ตอนนี้คุณสามารถเปิดไฟล์ทางเลือกในหน้าต่างปัจจุบัน:
execute "edit " . target
หรือใช้winnr()
เพื่อรับหมายเลข "หน้าต่างอื่น" ( winnr("#")
เป็นหน้าต่างที่<C-W>p
จะข้ามไปหรือคุณสามารถกำหนดรหัสได้ยากหากคุณรู้ว่ามันจะเหมือนกันสำหรับการตั้งค่าของคุณ) และทำสิ่งที่ชอบ:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
นี่เป็นวิธีแก้ปัญหาพื้นฐานสำหรับเปิดไฟล์ทางเลือก มีข้อบกพร่องบางประการเกี่ยวกับวิธีการข้างต้นเนื่องจากฉันเขียนมันให้ตรงไปตรงมาและมันเป็นบิตนอกข้อมือ ฉันเขียนปลั๊กอินที่สลับไฟล์ "ในแบบที่ฉันต้องการ" (หมุนเวียนไปตามglobpath()
ผลลัพธ์ทั้งหมดที่มี) มันแก้ไขปัญหาบางอย่างด้วยความเรียบง่ายข้างต้นคุณสามารถตรวจสอบการใช้งานหากคุณสนใจที่จะสำรวจเพิ่มเติม
ในที่สุดจุด "กู้คืนตำแหน่งเคอร์เซอร์" ฉันบันทึกไว้เป็นครั้งสุดท้ายเพราะมันเป็นมุมฉากกับสิ่งที่สลับกัน (ปลั๊กอินของฉันไม่ได้จัดการตัวอย่าง) แต่คุณสามารถใส่มันลงไปในฟังก์ชั่นของคุณถ้าคุณจะม้วนตัวเอง :help line()
มีข้อความอัตโนมัติที่มีประโยชน์สำหรับการกู้คืนตำแหน่งเคอร์เซอร์ไปยังตำแหน่งที่เคยเป็นเมื่อไฟล์ถูกเปิดครั้งล่าสุด:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
ฉันแค่ใส่มันหรือสิ่งที่คล้ายกันมากในของฉัน.vimrc
ตั้งแต่ฉันชอบพฤติกรรมตลอดเวลา คุณสามารถใส่รหัสที่อื่นได้อย่างง่ายดาย
:h line()
(โซลูชันทั่วไป): "การทำสำเนาอัตโนมัตินี้ข้ามไปยังตำแหน่งสุดท้ายที่รู้จักในไฟล์หลังจากเปิดมันถ้าตั้งค่าเครื่องหมาย" ": au BufReadPost * if line (" ' \ "")> 1 && line ("'\" ") <= บรรทัด (" $ ") | exe "normal! g` \" "| endif