पूरा करने में तीन मुख्य चरण हैं जो आप पूछ रहे हैं:
- वैकल्पिक फ़ाइल का नाम प्राप्त करना
- उस फ़ाइल को वर्तमान विंडो में या इच्छानुसार किसी अन्य विंडो में खोलना
- उस फ़ाइल के भीतर कर्सर स्थिति को बहाल करना
वैकल्पिक फ़ाइल नाम खोजने के लिए आप "रूट" और "एक्सटेंशन" में वर्तमान फ़ाइल नाम को तोड़ना चाहते हैं। ऐसा करने का एक सरल तरीका है:
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" यदि लाइन (") \ "")> 1 && लाइन ("'\" ") <= लाइन (" $ ") | exe "normal! g` \" "| endif