2012-01-01 5 views
5

वीआईएम में, आप एक निर्दिष्ट स्ट्रिंग खोज सकते हैं। फिर आप अगले या पिछले मैच में नेविगेट करने के लिए n या एन दबा सकते हैं। जब आप n या एन दबाते हैं, तो कर्सर मिलान किए गए टेक्स्ट पर ले जाया जाएगा। मेरा सवाल है, कर्सर के नीचे मिलान किए गए पाठ को तुरंत कैसे कॉपी करें?वीआईएम वृद्धिशील खोज, कर्सर के नीचे मिलान की गई स्ट्रिंग को कैसे कॉपी करें?


संपादित करें:

क्या मैं जरूरत कर्सर के अंतर्गत वर्तमान मैच, दस्तावेज़ में सभी मैचों में नहीं है।

धन्यवाद,

+0

किसी को भी सवाल में रुचि हो सकती है "[वीआईएम में मिलान खोज पैटर्न हटाएं] (http://stackoverflow.com/q/7842333/254635)"। –

+0

[यह प्रविष्टि] (http://vim.wikia.com/wiki/Copy_the_search_results_into_clipboard) विम टिप्स FAQ में इस विषय को शामिल किया गया है। – eckes

उत्तर

3

कोई कर्सर के आस-पास के अंतिम खोज पैटर्न के मिलान को निकालने वाला फ़ंक्शन लिख सकता है, और इसे कॉल करने के लिए मैपिंग बना सकता है।

nnoremap <silent> <leader>y :call setreg('"', MatchAround(@/), 'c')<cr> 
function! MatchAround(pat) 
    let [sl, sc] = searchpos(a:pat, 'bcnW') 
    let [el, ec] = searchpos(a:pat, 'cenW') 
    let t = map(getline(sl ? sl : -1, el), 'v:val."\n"') 
    if len(t) > 0 
     let t[0] = t[0][sc-1:] 
     let ec -= len(t) == 1 ? sc-1 : 0 
     let t[-1] = t[-1][:matchend(t[-1], '.', ec-1)-1] 
    end 
    return join(t, '') 
endfunction 

समारोह ऊपर शुरू करने और मैच के समाप्त होने के पदों को निर्धारित करता है और ध्यान से मिलान पाठ बाहर ले जाता है, सही ढंग से बहु पैटर्न और multibyte वर्ण से निपटने।

दूसरा विकल्प टेक्स्ट ऑब्जेक्ट मैपिंग्स बनाने के लिए है (:help text-object देखें) कर्सर के नीचे अंतिम खोज पैटर्न मिलान पर चल रहा है।

vnoremap <silent> i/ :<c-u>call SelectMatch()<cr> 
onoremap <silent> i/ :call SelectMatch()<cr> 
function! SelectMatch() 
    if search(@/, 'bcW') 
     norm! v 
     call search(@/, 'ceW') 
    else 
     norm! gv 
    endif 
endfunction 

इन मैपिंग का उपयोग कर मौजूदा मैच कॉपी करने के yi/ का उपयोग करें। अन्य पाठ ऑब्जेक्ट्स के लिए, उदाहरण के लिए, vi/, का उपयोग करके इसे दृष्टि से चुनने के लिए या इसे di/ का उपयोग करके हटाएं।

+0

ध्यान दें कि उपरोक्त फ़ंक्शन सही ढंग से एक-वर्ण या मल्टीलाइन मैचों को संभालता है। मानचित्रण में register': –

+1

मैं 'का उपयोग कर v सुझाव है कि' nnoremap वाई ': चलो @'। वी: रजिस्टर '= MatchAroundCursor (@ /) ' ' – Benoit

+0

धन्यवाद आईबी।। मैंने आपके फ़ंक्शन को मेरे .vimrc पर चिपकाया है। उन्हें कैसे कॉल करें? मैं वीआईएम पर नौसिखिया हूँ। धन्यवाद। –

0

प्रेस y और कर्सर के नीचे पाठ unamed डिफ़ॉल्ट रजिस्टर में कॉपी किया जायेगा, तो आप को चिपकाने के लिए पी दबा सकते हैं।

6

आप निम्न

y//e 

अवलोकन पर अमल करना चाहते हैं: आप खोज या प्रेस n या N कर्सर मिलान वाला पाठ की शुरुआत में हो जाएगा के बाद

मूल विचार है। फिर आप आखिरी खोज के अंत तक पहुंच गए।

स्पष्टीकरण

  • y निम्नलिखित प्रस्ताव के माध्यम से
  • // खोजें अंतिम खोज पद्धति का उपयोग कर मौजूदा स्थिति से झटका होगा।
  • //e ई झंडा मिलान वाला पाठ

इस चेतावनी वर्तमान खोज पैटर्न बदल जाएगा का एक शब्द के रूप में के अंत में कर्सर भी स्थित हो जाएगा, क्योंकि यह /e झंडा कहते हैं। इसलिए n और/या N के बाद कर्सर को मैच के अंत में ले जाया जाएगा।

यह post के समान है।

+3

यह बुरा है। –

+0

झंडे बदलने के कष्टप्रद नुकसान के अलावा, यह दृष्टिकोण * काम * के रूप में कार्य नहीं करता है यदि वर्तमान मैच केवल एक वर्ण लंबा है! –

0

मुझे लगता है कि यह यह करना चाहिए:

command! -register CopyExactMatchUnderCursor call s:CopyExactMatchUnderCursor('<reg>') 

function! s:CopyExactMatchUnderCursor(reg) 
    let cpos = getpos('.') 
    let line = cpos[1] 
    let idx = cpos[2] - 1 
    let txt = getline(line) 

    let mend = matchend(txt, @/, idx) 

    if mend > idx 
     let sel = strpart(txt, idx, mend - idx) 

     let reg = empty(a:reg) ? '"' : a:reg 
     execute 'let @' . reg . ' = sel . "\n"' 
    end 
endfunction 

यह getpos के साथ पहली कर्सर की स्थिति पकड़ लेता है तो मैच के अंत के लिए खोज करता (स्तंभ जहां कर्सर matchend उपयोग कर रहा है के साथ शुरुआत) और फिर रिटर्न प्रदान किए गए रजिस्टर में सबस्ट्रिंग - डिफ़ॉल्ट रूप से " का उपयोग किया जाता है।

सभी आवश्यक विधियां मूल रूप से @eckes उत्तर में थीं।

+0

उपर्युक्त कार्य सामान्य रूप से समस्या को हल नहीं करता है: यदि वर्तमान मिलान एकाधिक लाइनों पर फैला हुआ है तो यह कुछ भी नहीं है। –

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