2011-07-23 9 views
6

मैं एक उदाहरण के लिए एक उदाहरण के लिए एक उदाहरण के लिए खोज कर रहा हूं कि एक फ़ाइल के लिए बार-बार खोज करने के लिए एक विम स्क्रिप्ट में findfile फ़ंक्शन का उपयोग कैसे करें, विशेष रूप से वाइल्डकार्ड का उपयोग करना।विम findfile फ़ंक्शन उपयोग?

जब भी मैं पहले फ़ंक्शन पैरामीटर के हिस्से के रूप में वाइल्डकार्ड वर्ण शामिल करता हूं तो यह काम नहीं करता है।

उदाहरण के लिए

निम्न निर्देशिका संरचना के साथ:

~/MyProject/ 
    Test.sln 
    src/ 
     Test.cs 

अगर मैं, निम्नलिखित समारोह चलाने src को ~/MyProject/लोक निर्माण विभाग के सेट के साथ फ़ाइल Test.cs संपादित करते समय

function! Test() 
    let a = findfile("*.sln", ".;") 
    echo a 
endfunction 

findfile कुछ भी वापस नहीं प्रतीत होता है। हालांकि, यदि मैं विधवार्ड को निम्न प्रकार से हटाने के लिए फ़ंक्शन को संशोधित करता हूं:

function! Test() 
    let a = findfile("Test.sln", ".;") 
    echo a 
endfunction 

यह वही करता है जो मैं अपेक्षा करता हूं।

मैंने इसे उबंटू और विंडोज दोनों पर परीक्षण किया है और मैं दोनों पर एक ही व्यवहार देखता हूं। क्या मैं यहां कुछ गलत कर रहा हूं, या findfile सिर्फ वाइल्डकार्ड वर्णों का समर्थन नहीं करता है? वाइल्डकार्ड चरित्र के लिए समर्थन की कमी काफी अजीब चूक की तरह लगती है। ऐसा लगता है कि मुझे यहां कुछ गलत करना होगा। साथ बाहरी (तेज) यह करने के लिए

+0

: मदद फ़ाइल-खोज मुझे यह सोचने के लिए उधार देती है कि यह ग्लोबिंग का समर्थन करने का प्रयास करता है, लेकिन यह प्रैक्टिस में गलत लगता है। क्या यह विम में एक बग है? –

+0

'vim' से [दस्तावेज़ीकरण] (http://vimdoc.sourceforge.net/htmldoc/editing.html#file- खोज): *' \ * 'का उपयोग काफी सरल है: ** यह 0 या अधिक वर्णों से मेल खाता है **। एक खोज पैटर्न में यह "। \ *" होगा। ध्यान दें कि "।" फ़ाइल खोज के लिए उपयोग नहीं किया जाता है * –

उत्तर

5

आप वाइल्डकार्ड का उपयोग कर रहे हैं मुझे लगता है कि glob() और/या globpath() कार्यों के लिए आप क्या देख रहे हैं। :h glob() और :h globpath() देखें।

+0

मुझे लगता है कि आप सही हैं, ऐसा लगता है कि findfile वाइल्डकार्ड का समर्थन नहीं करता है, और ग्लोब वह है जिसे मैं ढूंढ रहा हूं। मैंने इस दृष्टिकोण को लिया है और माता-पिता निर्देशिकाओं के माध्यम से फिर से लिखने के लिए एक लूप लिखा है जब तक कि मुझे वह चीज़ न मिल जाए जो मैं ढूंढ रहा हूं। यह वही है जो मुझे चाहिए, धन्यवाद! – actf

+2

@actf क्या आप अपना अंतिम समाधान पोस्ट करना चाहते हैं? धन्यवाद! – Thomas

0

एक तरह से find

function! Test() 
    let l:list=system("find .. -maxdepth 1 -name \*.sln") 
    echo l:list 
endfunction 
+0

मैं उत्तर की सराहना करता हूं, लेकिन मुझे लगता है कि यह केवल उस मामले में काम करता है जहां * .sln फ़ाइल मूल निर्देशिका में है। मैं विशेष रूप से ऐसे समाधान की तलाश में था जो निर्देशिका संरचना को तब तक पुन: स्थापित करेगा जब तक कि यह एक मिलान फ़ाइल नहीं ढूंढता (जिसे मैंने सोचा था कि findfile व्यवहार करेगा)। उदाहरण के लिए यदि मैं निर्देशिका में फ़ाइल संपादित कर रहा था ~/MyProject/src/innersrc मुझे नहीं लगता कि यह समाधान काम करेगा। – actf

+0

@actf मैं देखता हूं, आपको लगता है कि लूपिंग के बारे में क्या लगता है, '..' फिर '../ ..' जब तक आप इसे प्राप्त नहीं करते? या उदा। 'विस्तार ('%: p: h ')' के साथ प्रयोग करें जो आपको वर्तमान फ़ाइल का पूरा पथ प्राप्त कर सकता है। –

+0

हाँ मुझे लगता है कि यह सबसे अच्छा तरीका है। ऐसा लगता है कि काम करने वाली निर्देशिका प्राप्त हो रही है, फिर मूल निर्देशिकाओं के माध्यम से लूपिंग और ग्लोबका के माध्यम से वाइल्डकार्ड के साथ खोज() जो मुझे चाहिए वह करता है। – actf