इंटरला linesकग लाइनों द्वारा ब्लॉक मर्ज करें


15

क्या इस तरह से गुजरते हुए, लाइनों को इंटरलेयिंग लाइनों द्वारा पाठ के दो ब्लॉकों को मर्ज करने का एक समर्पित तरीका है:

a1
a2
a3
a4
  b1
  b2
  b3
  b4

उस से:

a1
  b1
a2
  b2
a3
  b3
a4
  b4

कुछ आदेशों में?

संपादित करें : मैं वास्तव में सातो कात्सुरा के समाधान को पसंद करता हूं, यहां बताया गया है कि मैंने इसे कैसे लागू किया है:

function! Interleave()
    " retrieve last selected area position and size
    let start = line(".")
    execute "normal! gvo\<esc>"
    let end = line(".")
    let [start, end] = sort([start, end], "n")
    let size = (end - start + 1) / 2
    " and interleave!
    for i in range(size - 1)
        execute (start + size + i). 'm' .(start + 2 * i)
    endfor
endfunction

" Select your two contiguous, same-sized blocks, and use it to Interleave ;)
vnoremap <pickYourMap> <esc>:call Interleave()<CR>

अब मैं उत्सुक हूं - आपका उपयोग मामला क्या है? क्या आप एक टीवी सत्र के लिए उपशीर्षक का नाम बदल रहे हैं?
VanLaser

@VanLaser हाहा, मैं नहीं। ज्यादातर, मैं एक प्रोग्राम से आंख-पार्सिंग आउटपुट हूं, जिसे मुझे सृजन के आदेश से संबंधित स्थिरता की जांच करने की आवश्यकता है / फिर वस्तुओं के पढ़ने में देरी हुई। इंटरलॉकिंग ब्लॉक विलंबित आउटपुट ब्लॉक में संगत लाइनों से मेल खाना आसान बनाता है। मुझे कभी-कभी बार-बार, लॉगिंग या बेंचमार्किंग के समान निर्देशों के साथ कोड की लाइनों को इंटरलेव करने की भी आवश्यकता होती है। उन निर्देशों को उत्पन्न करना मैक्रोज़ के साथ आसान है, फिर उन्हें वास्तविक कोड के साथ
इंटरलेक्ट

1
@ लागो-लिटो - उत्तर के लिए धन्यवाद! हाँ, विम काफी बहुमुखी है :) आपकी अभिव्यक्ति "आई-पार्सिंग" ने मुझे scroll-bindingदो विम खिड़कियों पर भी सोचा ।
VanLaser

मुझे इसका उपयोग करने में परेशानी हो रही है, आप लगातार दो ब्लॉकों का चयन कैसे कर रहे हैं? क्या उन्हें आसन्न होने की आवश्यकता है?
cbcoutinho

@cbcoutinho हां उनके पास :) मुझे यकीन नहीं है कि आप उन दोनों का चयन कर सकते हैं अन्यथा। मेरे द्वारा दिखाए गए उदाहरण में, मैंने अपना कर्सर (कहते हैं) रखा b1, फिर मैंने vipपूरे चंक को चुनने के लिए मारा , फिर ,itजो है <map-I've-Picked>। क्या यह आपकी तरफ से काम नहीं कर रहा है?
इगा-लिटो

जवाबों:


8

ऐसा करने के लिए कोई समर्पित तरीका नहीं है (जहाँ तक मुझे पता है), लेकिन हाँ, यह कुछ आदेशों के साथ किया जा सकता है:

function! Interleave(start, end, where)
    if a:start < a:where
        for i in range(0, a:end - a:start)
            execute a:start . 'm' . (a:where + i)
        endfor
    else
        for i in range(a:end - a:start, 0, -1)
            execute a:end . 'm' . (a:where + i)
        endfor
    endif
endfunction

आप इससे चला सकते हैं :call Interleave(5, 8, 1)। पहला पैरामीटर स्थानांतरित करने के लिए पहली पंक्ति है, दूसरा अंतिम पंक्ति है, और तीसरा जहां उन्हें स्थानांतरित करना है। आप शायद यह देखना चाहते हैं कि आप क्या कर रहे हैं :set number

यह मानता है कि ब्लॉक ओवरलैप नहीं हैं। देखें :help :moveऔर :help range()समझने के लिए कि फ़ंक्शन कैसे काम करता है।

दो ब्लॉक लेने के लिए शायद बेहतर तरीके हैं। वहाँ एक प्लगइन चल रहा है जो आपको दो ब्लॉक स्वैप करने वाला है। मुझे प्लगइन का नाम याद नहीं है, लेकिन लेखक (शायद प्रसिद्ध डॉ। चिप?) ने मेरे द्वारा किए गए इंटरफ़ेस को खोजने में अधिक सोचा है। :)


मिठाई! मुझे केवल दो तर्कों की आवश्यकता है क्योंकि दोनों ब्लॉक सन्निहित हैं और उनका आकार समान है: startऔर size। होमब्रेव फ़ंक्शन के साथ जो चयन से उन मानों को पुनर्प्राप्त करता है, यह सिर्फ सही होगा। मैं इस पर काम कर रहा हूँ। :)
iago-lito

दिलचस्प क्रॉसलिंक ? ;)
iago-lito

13

यहाँ एक और विकल्प है:

:g/^a/+4t .
:+,+5d 

पहले उन पंक्तियों को कॉपी करें जो करंट लाइन के बाद 4 लाइनें नीचे हैं ( :h :t) फिर लगातार बी लाइनों को हटा दें ( :h :d)

इससे भी बेहतर यह आदेश है:

 :g/^a//^\s*b/m .

जिसका अर्थ है, प्रत्येक पंक्ति के लिए शुरू करने वाली अगली पंक्ति 'बी' से शुरू होती है और इसे वर्तमान रेखा के नीचे ले जाती है।


1
मुझे दूसरी कमांड पर "E16: अमान्य श्रेणी" मिली। मैंने .+,$dइसके बजाय कोशिश की , और वह काम किया (जैसा किया .+,.+4d)।
पीटर लेविन

यकीन नहीं होता कि ऐसा क्यों होता है
क्रिश्चियन ब्रेबांट

1
नहीं, यह नहीं है। पढ़ें: ज: सीमा, आप हमेशा के बजाय एक regex खोज के प्रत्यक्ष नंबर का उपयोग कर सकते
ईसाई Brabandt

2
@ इगो-लिटो दूसरी चाल हमेशा काम करती है, लेकिन आपको /^\s*bदूसरे में बदलने की जरूरत है :range। उदाहरण: 1 ब्लॉक का चयन करें, निष्पादित करें'<,'>g/^/'>+1m.
dedowsdi

1
@ इगो-लिटो यह अनिवार्य रूप से ईसाई के उत्तर के समान है। यदि आप 1 ब्लॉक को नेत्रहीन रूप से चुनते हैं, तो कोई भी चीज़ हार्डकोड नहीं है, '>+12 ब्लॉक की शुरुआत।
समर्पण

3

यदि आप मैक्रोज़ और चिह्नों के साथ थोड़ी मस्ती करना चाहते हैं, तो आप कुछ इस तरह की कोशिश कर सकते हैं:

  • सबसे पहले aलाइन पर (यहां ) के a1साथ एक चिह्न लगाएंma

  • युक्त लाइन पर जाएं b1और इसे चिह्नित करेंmb

  • जिस रजिस्टर में आप चाहते हैं (यहाँ रजिस्टर q) के साथ मैक्रो रिकॉर्ड करना शुरू करेंqq

  • अपने मैक्रो में फ़ोलोइंग डालें: ddmb'apjma'b

  • साथ मैक्रो रिकॉर्डिंग बंद करो q

  • कई बार के रूप में यह प्ले के रूप में के साथ की जरूरत है X@q, जहां Xयह खेलने के लिए समय की संख्या है।

मैक्रो को विस्तृत करने के लिए:

dd mb 'a p j ma 'b
 |  |  | | |    |
 |  |  | | |    go back to line marked `b`
 |  |  | | |
 |  |  | | move of one line and replace the mark `a`
 |  |  | insert the deleted line under the line marked `a`
 |  |  go to line marked `a`
 |  mark the future line to move with `b`
 delete the line to move

संपादित करें लैगो-लिटो ने टिप्पणियों में इसका उल्लेख किया है कि यह विधि निशान और बफ़र्स को अधिलेखित कर देगी।

  • उन अंकों के लिए जो मुझे नहीं लगता कि यह एक वास्तविक समस्या है: मैं शायद ही कभी सभी 26 अंकों को एक बफर में उपयोग करता हूं और मुझे लगता है कि एक समय में 2 अंक के निशान को ढूंढना होगा।

  • बफर के लिए इसे एक अस्थायी चर में सहेजना संभव है: :let saveReg=getreg('"')रजिस्टर को बचाने के लिए मैक्रो उपयोग रिकॉर्ड करने से पहले और एक बार कार्रवाई :call setreg('"', saveReg)करने के बाद रजिस्टर को अपने पिछले राज्य में वापस लाने के लिए उपयोग किया जाता है ।

वैसे भी मुझे यह स्वीकार करना चाहिए कि यह समाधान सिर्फ एक त्वरित समाधान है और इष्टतम नहीं है: मेरी राय में क्रिस्टन का जवाब सबसे अच्छा है और इसे स्वीकार किया जाना चाहिए क्योंकि यह बफ़र्स और अंकों के साथ गड़बड़ नहीं करता है, उपयोगकर्ता को बनाने के लिए मजबूर नहीं करता है एक फ़ंक्शन और वैश्विक कमांड की शक्ति दिखाता है।


दिलचस्प। दुर्भाग्य से, यह निशान और रजिस्टर की सामग्री को अधिलेखित करता है, जिसका मैं उपयोग कर सकता हूं;)
iago-lito

@ लागो-लिटो: वास्तव में यह अंक और बफ़र्स को ओवरराइट करता है। अंकों के लिए मैं कभी भी अपने बफ़र्स में सभी 26 अंकों का उपयोग नहीं करता, इसलिए मुझे नहीं लगता कि यह वास्तव में एक समस्या है। बफ़र्स के लिए यह अधिक समस्या हो सकती है, मुझे लगता है कि आप अक्सर अप्रयुक्त बफर ढूंढ सकते हैं या यदि आप वास्तव में नहीं कर सकते हैं, तो एक अस्थायी चर और फ़ंक्शन का उपयोग करें getreg()और setreg()अपने बफर को बचाने के लिए। लेकिन मैं मानता हूँ कि यह एक इष्टतम समाधान :-) नहीं है
statox

1

मैंने एक और समान प्रश्न देखा है और समाधान में निम्न शामिल हैं:

बीच में कूदें प्लस एक:

Mj

और भाग खड़ा हुआ:

:,$g/./exe 'm' 2*line('.')-line('$')-1

दिलचस्प :) खबरदार कि यह आपकी पूरी फ़ाइल को इंटरलेव करता है, हालांकि, और चयनित पैराग्राफ ही नहीं!
इगा-लिटो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.