কীভাবে একটি নিবন্ধ থেকে পাঠ্যকে স্বেচ্ছাসেবী রেজিস্টারে স্থানান্তরিত করা যায়?


10

কোনও রেজিস্টার থেকে অন্য রেজিস্টার বা রেজিস্টারগুলির সেটটিতে কোনও পাইপ পাঠানোর কোনও উপায় আছে কি? উদাহরণস্বরূপ, "qরেজিস্টারগুলির "1মাধ্যমে সরান "5

আমি প্রায়শই একই ম্যাক্রোর কিছুটা ভিন্ন সংস্করণ তৈরি করতে চাই, তাই বেশ কয়েকটি রেজিস্টারে একটি 'টেমপ্লেট' ম্যাক্রো অনুলিপি করতে এবং তারপরে সেগুলির প্রতিটিকে সংশোধন করতে সক্ষম useful

একটি ব্যবহারিক উদাহরণ দেওয়ার জন্য, এখানে আমার কাছে এই প্রশ্নটি উত্সাহিত সমস্যা is

আমাকে নিম্নলিখিত রেখাটি একটি হার্ডওয়্যার বর্ণনামূলক ভাষা থেকে বহু বার বার ব্লক করা দরকার,

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গতি অনুসরণ করে এমন চরিত্র পরিবর্তন করবো) এবং পরিবর্তিত অভিব্যক্তিটিকে রেজিস্টারে ফিরে যেতে পারব। আদর্শভাবে এই শেষ পদক্ষেপটি এমনকি নিবন্ধগুলিতে অন্তর্ভুক্ত করা যেতে পারে নিবন্ধগুলি অনুলিপি করতে s

এটি আমাকে ম্যাক্রোর সমস্ত অক্ষর পুনরাবৃত্তি করা থেকে রক্ষা করে যা পরিবর্তনের প্রয়োজন হয় না। আমার উদাহরণের জন্য এটি তুচ্ছ হতে পারে তবে আমি এমন সময়গুলি আগে থেকেই বলতে পারি যখন আমি যা বলছি তা করতে এটি খুব সহায়ক হতে পারে।


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

2 দ্বারা বর্ধিত শেষ সংখ্যাটি সহ বর্তমান লাইনের 5 অনুলিপি তৈরি করতে:

:let i = 2|norm 5@a

অথবা 12 টি অনুলিপি, শেষ সংখ্যাটি 23 দ্বারা বর্ধিত:

:let i = 23|norm 12@a

সংখ্যার নিবন্ধগুলি সম্পর্কে সম্মত reed তবে আপনি যদি কোনও কমান্ডে এটি ব্যবহার করতে চান, এবং আপনার নিবন্ধগুলি প্রয়োজন যা একই শুরু হয় তবে আলাদা হয়ে যায়?
wchargin

@ ডাব্লুচারগিন, দয়া করে ব্যাখ্যা করুন।
রোমেনেল

হিসাবে, সম্ভবত আমি একটা স্ট্রিং এর আবর্তিত কপি কিছু করতে চান, তাই যদি abcdeহয় @q, তাহলে আমি চাই @x="bcdea", @y="abcde"@z="eabcd"। আমি লেট @x, @yএবং @zসমস্ত সমান @qএবং তারপরে প্রয়োজনীয় হিসাবে তাদের সংশোধন করে শুরু করতে পারি। স্পষ্টতই, আমি সবেমাত্র এটি তৈরি করেছি, তবে মনে হচ্ছে এমন কিছু ঘটনা ঘটতে পারে যেখানে অনুরূপ কিছু কার্যকর হতে পারে।
wchargin

2
@ কিট, আমি আপনার প্রশ্নে ব্যবহারিক উদাহরণের অভাব নিয়ে কিছুটা উদ্বিগ্ন যা অবিলম্বে এটি এক্সওয়াইয়ের মতো গন্ধ পাচ্ছে। আমি প্রায় নিশ্চিত আপনি রেজিস্টরের অপব্যবহার করছেন তাই আপনি যা করার চেষ্টা করছেন তার একটি ব্যাখ্যা পড়তে আমি পছন্দ করি।
রোমেনেল

1
@ কিট, এক্সওয়াই সমস্যা সম্পর্কিত প্রশ্নগুলির সাথে এটি অন্যতম সমস্যা। সর্বাধিক উত্সাহিত উত্তর হ'ল আপনার প্রশ্নের উচ্চমানের প্রত্যক্ষ উত্তর তবে শেষ পর্যন্ত আপনার আসল সমস্যার প্রসঙ্গে নিরর্থক যখন আমার কম আপোভোটেড উত্তরটি আপনার অন্তর্নিহিত সমস্যার প্রকৃত সমাধান। উভয় উত্তর সঠিক তবে তারা বিভিন্ন প্রশ্নের উত্তর দেয় যা আপনাকে সিদ্ধান্ত নেওয়া শক্ত করে তোলে। যদি এটি আমি হয় তবে আমি যে উত্তরটি আমার মূল সমস্যাটির সাথে সম্বোধন করব তা গ্রহণ করব ... তবে এটি কেবল আমারই।
রোমেনেল

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()ফাংশন ক্লিনার হবে।
জামেসান

@ জামেসান চমৎকার পরামর্শ, ধন্যবাদ - আমি কি এগুলি সঠিকভাবে ব্যবহার করছি?
wchargin

আমি এটিকে সম্পাদনা করে getচ্ছিক দ্বিতীয় আর্গুমেন্টটি getreg () এ যুক্ত করতে চাইছি যেহেতু এটি নিবন্ধের সামগ্রীর সম্ভাব্য মূল্যায়নের পরিবর্তে ফিরিয়ে দেয়।
জামেসান

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)
জামেসান

হ্যাঁ, সত্য। সংশোধন করা হয়েছে।
স্টিভ ভার্মিউলেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.