रजिस्टरों की एक मनमानी संख्या के लिए पाठ को एक रजिस्टर से कैसे स्थानांतरित किया जा सकता है?


10

क्या एक रजिस्टर से दूसरे रजिस्टर या रजिस्टर के सेट में 'पाइप' पाठ करने का एक तरीका है? उदाहरण के लिए, "qरजिस्टरों के "1माध्यम से जाना "5

मैं अक्सर एक ही मैक्रो के थोड़े अलग संस्करण बनाना चाहता हूं, इसलिए कई रजिस्टरों के लिए 'टेम्प्लेट' मैक्रो को कॉपी करने में सक्षम होना और फिर उनमें से प्रत्येक को संशोधित करना उपयोगी है।

एक व्यावहारिक उदाहरण देने के लिए, यहाँ वह समस्या है जिसने इस प्रश्न को मेरे लिए प्रेरित किया।

मुझे बार-बार कई ब्लॉक में एक हार्डवेयर विवरण भाषा से निम्न पंक्ति को चालू करने की आवश्यकता है,

RAM64(in=in, load=load0, address=address[0..5], out=out1);

सेवा

RAM64(in=in, load=load1, address=address[0..5], out=out2);
RAM64(in=in, load=load2, address=address[0..5], out=out3);
RAM64(in=in, load=load3, address=address[0..5], out=out4);
RAM64(in=in, load=load4, address=address[0..5], out=out5);

मेरे पास एक मैक्रो है जो इसे बढ़ाता है, वेतन वृद्धि फ़ंक्शन का उपयोग करके, yypW^At)^Aजिसे मैंने रजिस्टर में संग्रहीत किया है "a

कभी-कभी, मुझे थोड़ा अलग होने के लिए वेतन वृद्धि के पैटर्न की आवश्यकता होती है, जैसे कि

RAM512(in=in, load=load1, address=address[0..8], out=out2);
RAM512(in=in, load=load2, address=address[0..8], out=out4);
RAM512(in=in, load=load3, address=address[0..8], out=out6);
RAM512(in=in, load=load4, address=address[0..8], out=out8);

जहां मैक्रो रजिस्टर में "bहोगा yypW^At)^A^A

मैं ऐसा करने के लिए एक रजिस्टर चाहता हूं, लेकिन 1-5 से प्रत्येक वेतन वृद्धि के लिए। रजिस्टर "aको किसी भी तरह ई के माध्यम से रजिस्टर बी में कॉपी किया जा सकता है। फिर मैं प्रत्येक रजिस्टर को बफर में पेस्ट करूँगा, आवश्यक संशोधन करूँगा (अधिक शर्तें जोड़ें, tगति का अनुसरण करने वाले वर्ण को बदल दें ) और संशोधित अभिव्यक्ति को वापस रजिस्टर में जमा करें। आदर्श रूप में यह अंतिम चरण रजिस्टर को कॉपी करने के लिए कमांड (एस) में भी शामिल किया जा सकता है

यह मुझे मैक्रो में सभी पात्रों को दोहराने से बचाता है जिन्हें बदलने की आवश्यकता नहीं है। मेरे उदाहरण के लिए यह तुच्छ हो सकता है, लेकिन मैं ऐसे समय की उम्मीद कर सकता हूं जब मैं जो पूछ रहा हूं उसे करने में बहुत मदद मिल सकती है।


5
एक तरफ के रूप में, मैं गिने रजिस्टरों का उपयोग करने की सलाह नहीं दूंगा। केवल "सुरक्षित" रजिस्टर वर्णमाला रजिस्टर हैं। अन्य सभी रजिस्टर स्वचालित रूप से विम द्वारा निर्धारित किए जाते हैं।
जामसेन

जवाबों:


7

मैक्रों सिर्फ पाठ हैं।

एक नया खाली बफ़र खोलें और वहां अपना मैक्रो डालें। आप लाइनों को डुप्लिकेट कर सकते हैं, यहां एक चीज़ को बदल सकते हैं और कुछ और कहीं और फिर एक लाइन को युकां कर सकते हैं और इसे तुरंत उपयोग कर सकते हैं @"

अपने रजिस्टरों को प्रदूषित करने की आवश्यकता नहीं है, विशेष रूप से संख्या रजिस्टर जो पूरी तरह से अलग उद्देश्य की सेवा करते हैं।

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

आपका प्रश्न अब समझना आसान है कि आपने कुछ स्पष्टीकरण जोड़ा है।

जैसा कि यह पता चला है, आपको केवल अपने लक्ष्य को प्राप्त करने के लिए अपनी प्रारंभिक रिकॉर्डिंग को बदलना होगा, रजिस्टरों के साथ खेले बिना जैसे कि वे चर थे:

:let i = 1                     " define variable i
qa                             " start recording in register a
yy                             " yank the line
p                              " paste it
W                              " move to next WORD
<C-v><C-a>                     " increment number
t)                             " jump to the other number to increment
:norm <C-r>=i<CR><C-v><C-a>    " increment the number by i
q                              " stop recording

वर्तमान संख्या की 5 प्रतियाँ बनाने के लिए अंतिम संख्या 2 से बढ़ाई गई:

:let i = 2|norm 5@a

या 12 प्रतियां, 23 द्वारा अंतिम संख्या में वृद्धि के साथ:

:let i = 23|norm 12@a

संख्यात्मक रजिस्टरों के बारे में सहमत - लेकिन क्या होगा यदि आप इसे एक कमांड में उपयोग करना चाहते हैं, और आपको रजिस्टरों की आवश्यकता है जो एक ही शुरू करते हैं लेकिन अलग हो जाते हैं?
21

@Chargin, कृपया समझाएं।
रोमेनिल

के रूप में, शायद मैं एक स्ट्रिंग की घुमाया प्रतियों के साथ कुछ करना चाहता हूँ, इसलिए यदि abcdeहै @q, तो मैं चाहता हूँ @x="bcdea", @y="abcde"और @z="eabcd"। मैं अनुमति से शुरू हो सकता है @x, @yऔर @zकरने के लिए सभी बराबर @qहैं और फिर उन्हें संशोधित रूप में की जरूरत। जाहिर है, मैंने अभी इसे बनाया है, लेकिन ऐसा लगता है कि ऐसे कुछ मामले हो सकते हैं जहां कुछ समान हो सकता है।
21

2
@ ठीक है, मैं आपके प्रश्न में व्यावहारिक उदाहरण की कमी से थोड़ा चिंतित हूं जो तुरंत इसे XY की तरह गंध देता है। मुझे लगभग निश्चित है कि आप रजिस्टरों का दुरुपयोग कर रहे हैं इसलिए मैं एक स्पष्टीकरण पढ़ना पसंद करूंगा कि आप क्या करने की कोशिश कर रहे हैं।
रोमेनिल

1
@ किट, यह XY समस्या qustions के साथ कई समस्याओं में से एक है। सबसे उत्कीर्ण उत्तर आपके प्रश्न का एक उच्च-गुणवत्ता वाला प्रत्यक्ष उत्तर है, लेकिन अंततः आपकी वास्तविक समस्या के संदर्भ में बेकार है जबकि मेरा कम उत्कीर्ण उत्तर आपकी अंतर्निहित समस्या का वास्तविक समाधान है। दोनों उत्तर सही हैं, लेकिन वे अलग-अलग प्रश्नों का उत्तर देते हैं जिससे आपके लिए निर्णय लेना कठिन हो जाता है। अगर यह मैं था, तो मैं उस उत्तर को स्वीकार करूंगा जो मेरे मूल मुद्दे को संबोधित करता है ... लेकिन यह सिर्फ मुझे है।
रोमेनिल

6

का उपयोग कर getregऔरsetreg

qरजिस्टर से कॉपी करने के लिए 1- 5:

let src=getreg('q', 1)
for i in range(1, 5)
    call setreg(i, src)
endfor

अधिक सामान्य सूची की प्रतिलिपि बनाने के लिए:

let src=getreg('q', 1)
for i in ['a', 'c', 'e']
    call setreg(i, src)
endfor

का उपयोग करते हुए execute

qरजिस्टर से कॉपी करने के लिए 1- 5:

for i in range(1, 5)
   execute 'let @' . i . '=@a'
endfor

अधिक सामान्य सूची की प्रतिलिपि बनाने के लिए:

for i in ['a', 'c', 'e']
    execute 'let @' . i . '=@a'
endfor

स्पष्टीकरण। कमांड letका उपयोग किया जा सकता है let @x=@y, जो प्रतियां रजिस्टर yकरने के लिए रजिस्टर करती हैं x। अनिवार्य रूप से, हम इन कमांडों को एक लूप में बना रहे हैं ( xउपरोक्त रूप में मूल्य बदल executeरहे हैं ) और उन्हें अंतर्ग्रहण कर रहे हैं।


1
:exeयहाँ उपयोग करने की कोई आवश्यकता नहीं है। getreg()और setreg()कार्यों क्लीनर होगा।
जामसेन

@jamessan अच्छा सुझाव, धन्यवाद-क्या मैं इनका सही उपयोग कर रहा हूँ?
21

मैंने इसे पाने के लिए वैकल्पिक दूसरे तर्क को जोड़ने के लिए संपादित किया है (क्योंकि यह रजिस्टर के कंटेंट को लौटाता है, बजाय इसके संभावित मूल्यांकन के।
जामसेन 21

1

प्रश्न का सीधे उत्तर देने के लिए, यदि आप एक रजिस्टर की सामग्री को जल्दी और आसानी से कॉपी करना चाहते हैं, तो आप अपने .vimrc में निम्नलिखित डाल सकते हैं। फिर आप <leader>rcabरजिस्टर aकरने के लिए रजिस्टर की सामग्री को कॉपी करने के लिए निष्पादित कर सकते हैं b। एक उदाहरण के रूप में मैंने <leader>rc'रजिस्टर कॉपी' के लिए खड़ा होना चुना

function! s:CopyRegister()
    let sourceReg = nr2char(getchar())

    if sourceReg !~# '\v^[a-z0-9]'
        echo "Invalid register given: " . sourceReg
        return
    endif

    let destinationReg = nr2char(getchar())

    if destinationReg !~# '\v^[a-z0-9]'
        echo "Invalid register given: " . destinationReg
        return
    endif

    call setreg(destinationReg, getreg(sourceReg, 1))
    echo "Replaced register '". destinationReg ."' with contents of register '". sourceReg ."'"
endfunction

" rc = register copy
nnoremap <leader>rc :call <sid>CopyRegister()<cr>

1
मैं सुझा दूंगा getreg(sourceReg, 1)
जामसन 21

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