2012-02-19 14 views
8

मेरे पास एक विम स्क्रिप्ट है जो बाहरी शेल स्क्रिप्ट को कॉल करती है और आउटपुट को वर्तमान बफर में पढ़ती है। यह यूनिक्स सिस्टम में ठीक काम करता है। मैं स्क्रिप्ट ओएस-अज्ञेयवादी बनाने की कोशिश कर रहा हूं, इसलिए मैं इसे विंडोज उपयोगकर्ताओं के लिए भी काम करना चाहता हूं। यहाँ स्क्रिप्ट से प्रासंगिक लाइन है:विम स्क्रिप्ट में विंडोज वातावरण चर का उपयोग कैसे करें?

:exe ":0r !$HOME/bin/shell_script" 

विम के डॉक्स के अनुसार, $HOME भी विंडोज उपयोगकर्ताओं के लिए ठीक का अनुवाद करना चाहिए। आदेश मोड में विन XP पर जाँचने का उपयोग करना,

:echo $HOME 

कर वास्तव में "C: \ दस्तावेज़ और सेटिंग्स \ my_user" उत्पादन करता है।

लेकिन, मेरा विम लिपि (बैकस्लैश के लिए समायोजित) डॉस cmd.exe खिड़की में एक संदेश कह

$ HOME \ बिन \ shell_script "नहीं मिला साथ Windows मशीन पर विफल रहता है।

दूसरे शब्दों में, विम यह cmd.exe को पार करने से पहले $HOME का मूल्य का विस्तार करने के लिए नहीं दिखाई देता है।

मैं %APPDATA% उपयोग नहीं कर सकते, क्योंकि या तो विम वर्तमान मुद्दों के रूप में % की व्याख्या एनटी फ़ाइल और फ़ाइल नाम को APPDATA पर पूर्व/संलग्न करता है। अजीब है कि विम % का विस्तार करता है लेकिन $HOME का विस्तार नहीं करता है।

मुझे $HOME कैसे सही तरीके से विस्तारित किया जा सकता है? क्या ऐसा इसलिए है क्योंकि मैं विम स्क्रिप्ट में exe का उपयोग कर रहा हूं?

उत्तर

0

यहाँ आप vim में स्लैश और बैकस्लैश के बारे में कुछ जानकारी है:

http://vimdoc.sourceforge.net/htmldoc/os_dos.html

जब आप स्लैश आगे उपयोग करने के लिए पसंद करते हैं, 'shellslash' विकल्प निर्धारित किया है। फ़ाइल नामों का विस्तार करते समय विम आगे की स्लैश के साथ बैकस्लाश को प्रतिस्थापित करेगा। यूनिक्स-जैसे 'खोल' का उपयोग करते समय यह विशेष रूप से उपयोगी होता है।

+0

यह प्रश्न (पीछे) स्लेश के बारे में नहीं है।यहां समस्या यह है कि खोल सिर्फ '$ HOME' – doubleDown

6

आपको फ़ाइल पढ़ने के लिए ! की आवश्यकता नहीं है।

:exe ":0r $HOME/bin/shell_script" 

या Windows (जैसे लिनक्स में cat) में type आदेश पढ़ें:

:exe '0r !type "'. $HOME . '\bin\shell_script"' 

नोट:

  • type खिड़कियों में मार डाला है, शैल ताकि आप \ जरूरत है (बैकस्लैश) पथ
  • यदि $HOMEspace रों होता है, आप " (दोहरे-उद्धरण) की जरूरत के वस्तुतः मान को बरकरार रखता है के लिए space रों
+1

को समझ में नहीं आता है, मैं बाहरी स्क्रिप्ट निष्पादित करना चाहता हूं और आउटपुट को बफर में डालना चाहता हूं। –

+0

@ निककोलमैन बस 'टाइप' हटाएं, और फिर से चलाएं। – kev

+0

मुझे याद आया कि आपने उद्धरण के बाहर $ HOME स्थानांतरित कर दिया था। यह तय है। उत्तर के लिए धन्यवाद। –

4

जवाब कीव द्वारा दिए गए स्पष्ट करने के लिए:

खिड़कियों पर $ HOME चर का विस्तार नहीं है ठीक है जब आप कंसोल से बचते हैं। उदाहरण के लिए, इस कोड पर विचार करें:

:e $HOME/myscript 

यह काम करता है क्योंकि vim सामान्य रूप से $ HOME का विस्तार करता है। दूसरी ओर यह काम नहीं करेगा:

:%! $HOME/myscript 

क्यों? क्योंकि vim ! के बाद अंतर्निहित खोल में सबकुछ पास करता है, जो विंडोज पर cmd.exe है जो पर्यावरण चर %LIKE_THIS% करता है। यदि आप उस नोटेशन का उपयोग करने का प्रयास करते हैं, तो vim वर्तमान फ़ाइल के नाम पर % पर कूद जाएगा और विस्तार करेगा - आंकड़ा पर जाएं।

इसके आसपास कैसे प्राप्त करें? exe कीवर्ड का प्रयोग करें:

:exe "%! ".$HOME."\myscript" 

के विश्लेषण करते हैं:

  • :exe एक आदेश है कि एक स्ट्रिंग लेता है और यह मूल्यांकन करता है (अधिकांश भाषाओं में eval लगता है)
  • "!% " भागने आदेश शेल है। ध्यान दें कि यह उद्धृत किया गया है ताकि exe इसका मूल्यांकन कर सके। यह भी ध्यान दें कि वहां एक अतिरिक्त जगह कैसे है ताकि जब हम घर var जोड़ते हैं तो यह इसके विपरीत नहीं है
  • .$HOME डॉट एक स्ट्रिंग कॉन्सटेनेशन प्रतीक है। $HOME यह उद्धरण के बाहर है, लेकिन concatenated ताकि vim यह विस्तार कर सकते हैं ठीक से
  • ."/myscript" स्क्रिप्ट और संभव तर्क (यह भी उद्धृत)

    यहां महत्वपूर्ण बात यह उद्धरण चिह्न के $HOME बाहर रखने के लिए पथ है, अन्यथा विंडोज़ पर ठीक से विस्तार नहीं किया जा सकता है।

1

आपको शायद expand फ़ंक्शन की तरह कुछ चाहिए। उदाहरण के लिए:

:echo expand("$HOME/hello") 
/home/amir/hello 

आप :help expand के साथ विस्तार() के बारे में अधिक जानकारी प्राप्त कर सकते हैं।