2011-12-13 13 views
7

उदाहरण :%y+ बाहरी + क्लिपबोर्ड पर yanks। अब मुझे ^\S\+ जैसे बाहरी + क्लिपबोर्ड पर रेगेक्स द्वारा परिणाम चाहिए। कैसे?विम: यंक रेगेक्स मैच + क्लिपबोर्ड

ट्रायल 1. [विफल]:[email protected]^\S\[email protected]+

ट्रायल 2. [विफल]:^\S\+y+

उत्तर

4

यहाँ http://vim.wikia.com/wiki/Copy_the_search_results_into_clipboard, खंड 'खोज हिट युक्त लाइनों प्रतिलिपि बनाई जा रही' एक नज़र डालें।

यह मेरे लिए काम किया (स्पष्ट रजिस्टर a, इसे में झटका pattern परिणाम, क्लिपबोर्ड में पर कॉपी):

qaq 
:g/pattern/y A 
:let @+ = @a 

जब मैं :g/pattern/y+ की कोशिश की है कि यह केवल पहली पंक्ति की नकल की।

लिंक पर वह अनुभाग भी एक फ़ंक्शन देता है जिसे आप सभी पंक्तियों की प्रतिलिपि बनाने के लिए लिख सकते हैं, लेकिन यह अभी भी 2-चरणीय प्रक्रिया की तरह दिखता है (/pattern करें और फिर फ़ंक्शन को कॉल करें): लेकिन आप शायद अपना स्वयं का मैक्रो/अनुक्रम में दोनों करने के लिए शॉर्टकट।

+0

यह प्रत्यक्ष उत्तर प्रतिलिपि पूरी लाइनें जहां regex निहित है। लेकिन ऊपर दिए गए लिंक में, CopyMatches नामक एक स्क्रिप्ट केवल मिलान किए गए हिस्सों की प्रतिलिपि बनाती है। – squid

1

निम्नलिखित का प्रयास करें। सबसे पहले अपनी मिलान किए गए regexps को एक सूची (: सहायता सूची) में सहेजने के लिए फ़ंक्शन को परिभाषित करें।

:fun Add(list, item) 
: call add(a:list, a:item) 
: return a:item 
:endfun 

ध्यान दें कि यह अतिरिक्त आइटम भी लौटाता है। यह आवश्यक नहीं है, लेकिन आप यहां जो भी लौटते हैं वह में प्रतिस्थापन टेक्स्ट बन जाता है: विकल्प जो नीचे आता है।

अगला, एक खाली सूची बनाएं।

:let list=[] 

फिर अपना regexp चलाएं।

:%s/^\S\+/\=Add(list, submatch(0))/ 

ध्यान दें कि प्रतिस्थापन के साथ \ = शुरू होता है (देखें: मदद उप की जगह-विशेष)। नतीजा यह है कि हम मिलान अभिव्यक्ति को स्वयं के साथ प्रतिस्थापित करते हैं, लेकिन साथ ही परिणाम में परिणाम को कैप्चर करते हैं।

सबमिशन() फ़ंक्शन मिलान के हिस्सों को वापस करता है: विकल्प कमांड। सबमिच (0) पूरे मैच को लौटाता है।

ध्यान दें कि एक दुष्प्रभाव के रूप में बफर को बदलने के रूप में चिह्नित किया गया है। यदि आपने प्रतिस्थापन निष्पादित करने से पहले बफर को सहेजा है तो आप इसे पूर्ववत करने के लिए बस मारकर या 'संलग्न करने के द्वारा इसे ठीक कर सकते हैं। आप ' कमांड पर। (आप कार्रवाई को वापस ला करने जा रहे हैं तो यह कोई प्रभाव नहीं पड़ेगा कि हम क्या हमारे समारोह जोड़ें से लौटने।)

आप

:echo list 

के साथ अपने मैचों को देख सकते हैं या आप अपने बफर करने के लिए उन्हें जोड़ सकते हैं

:$put=list 

मुझे उम्मीद है कि इससे मदद मिलती है।एक बार जब आप जानते हैं कि यह सीधा है, लेकिन वहां पचाने के लिए काफी कुछ है।

ओह, मैं लगभग भूल गया! आप अपने मैचों को क्लिपबोर्ड पर

:let @+ = join(list, '^@') 

फिर आपके मैचों क्लिपबोर्ड में होंगे, प्रत्येक एक अलग लाइन पर होंगे।

^@ एक NUL चरित्र का प्रतिनिधित्व करता है, और < सी वी > < सी जे > साथ उत्पन्न होता है, जिसका अर्थ है प्रेस नियंत्रण V, नियंत्रण-जे के बाद। (क्यों आप उपयोग करना^@ यहाँ अपने आप में एक पूरे विषय है।)

+0

अच्छा जवाब। मुझे लगता है कि आप सीधे @ + में जोड़कर सूची के बिना कर सकते हैं। मुझे संदेह है कि आपका जवाब सामान्य मामले में बेहतर प्रदर्शन करेगा, हालांकि – sehe

+0

हां जो भी काम करेगा, धन्यवाद।ओपी इसे पसंद कर सकता है, हालांकि सूची में शब्दों को संग्रहीत करने से आपको विकल्प भी मिलते हैं। – 1983

+0

आप क्लिपबोर्ड को बाद में सूची में भी स्टोर कर सकते हैं: 'सूची = =] // चलो सूची = विभाजन (@ +,' \ n ') ' – Reman

2

शायद आप निम्नलिखित में कुछ प्रेरणा पा सकते हैं:

:saveas %.tmp 

एक प्रति पर काम शुरू करने के

:v//d 
:exec '%s/^.\{-\}\(' . @/ . '\).*$/\1/g' 
उदाहरण के लिए

तो निम्न पाठ पर एक खोज /word\d कर:

एंड्रॉयड। Proin sagittis2। Curabitur ऑक्टर मेटस गैर मॉरीस। Nunc condimentum nisl non augue। डोनेक लियो urna, dignissim vitae, porttitor ut, iaculis amet, sem।

कक्षा aptent taciti sociosqu3 विज्ञापन litora torquent प्रति conubia नोस्ट्रा, प्रति inceptos himenaeos। Suspendisse potenti। Quisque augue metus, hendrerit sit amet, कमोडो vel, scelerisque ut, ante। प्रेजेंट यूसुस्मोड यूसुस्मोड रिसास। मॉरीस मेट्स मीस सेल्स कमोडो के लिए मेट्रस बैठे हैं। मोरबी congue मॉरीस एसी sapien congue। डोनेक जस्टो। सेड congue nunc vel mauris0। Pellentesque वाहन ऑर्सी आईडी मुक्त। एचएसी habitasse platea dictumst में। Nulla sollicitudin, purus1 id elementum dictum, dolor augue hendrerit ante, vel semper metus enim et dolor। Pellentesque molestie9

दिखाए गए शब्दों को हाइलाइट करेगा। reg X (अपरकेस) न्यू लाइन से अलग

sagittis2 
sociosqu3 
mauris0 
purus1 
molestie9 
+0

ओपी को ध्यान में रखना चाहिए कि आपको प्रति पंक्ति केवल एक मैच मिलना चाहिए इस। यदि आप प्रति पंक्ति एकाधिक मिलान चाहते हैं तो ':% s/MYREGEXP/\ r & \ r/g | v // d'। – 1983

1

संलग्न सभी खोज परिणाम: कर निम्नलिखित बफर में

:v//d|exec '%s/^.\{-\}\(' . @/ . '\).*$/\1/g' 

परिणाम

:g/^/call setreg('X', matchstr(getline('.'), '^\S\+') . "\n") 

reg x स्पष्ट करने के लिए:

qxq 
संबंधित मुद्दे