আমি কীভাবে লাইনের শেষে একটি পুনরাবৃত্ত ম্যাক্রো বন্ধ করব?


13

আমি কীভাবে পুনরাবৃত্তির ম্যাক্রো তৈরি করতে পারি যাতে এটি কেবল লাইনের শেষ অবধি চলে?

অথবা কেবলমাত্র রেখার শেষ না হওয়া পর্যন্ত কীভাবে পুনরাবৃত্ত ম্যাক্রো চালাবেন?

উত্তর:


11

সম্ভবত একটি সহজ পদ্ধতি আছে তবে আপনি নিম্নলিখিতটি চেষ্টা করতে পারেন।

ধরা যাক আপনি qআপনার পুনরাবৃত্ত ম্যাক্রো রেকর্ড করতে রেজিস্টার ব্যবহার করবেন ।

রেকর্ডিংয়ের একেবারে শুরুতে, টাইপ করুন:

:let a = line('.')

তারপরে, রেকর্ডিংয়ের একেবারে শেষে, @qম্যাক্রোকে পুনরাবৃত্ত করতে হিট না করে নিম্নলিখিত কমান্ডটি টাইপ করুন:

:if line('.') == a | exe 'norm @q' | endif

অবশেষে ম্যাক্রোর রেকর্ডিংটি শেষ করুন q

আপনার টাইপ করা সর্বশেষ আদেশটি ম্যাক্রো q( exe 'norm @q') পুনরায় খেলবে তবে কেবলমাত্র বর্তমান লাইন নম্বর ( line('.')) প্রাথমিকভাবে ভেরিয়েবলের মধ্যে সঞ্চিত হিসাবে সমান হয় a

:normalকমান্ড আপনাকে (যেমন স্বাভাবিক কমান্ড টাইপ করতে পারবেন @qপ্রাক্তন মোড থেকে)।
এবং কমান্ডটি একটি স্ট্রিংয়ের মধ্যে আবৃত এবং কমান্ড দ্বারা সম্পাদিত হওয়ার কারণ হ'ল বাকী কমান্ড ( ) টাইপ করা () টাইপ করা থেকে :executeবিরত রাখা ।:normal|endif


ব্যবহারের উদাহরণ।

ধরা যাক আপনার নীচের বাফারটি রয়েছে:

1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4

এবং আপনি একটি পুনরাবৃত্ত ম্যাক্রো সহ একটি স্বেচ্ছাচারী লাইন থেকে সমস্ত সংখ্যা বৃদ্ধি করতে চান।

আপনি 0আপনার কার্সারটিকে একটি লাইনের শুরুতে সরানোর জন্য ম্যাক্রোর রেকর্ডিং শুরু করতে টাইপ করতে পারেন :

qqq
qq
:let a=line('.')
<C-a>
w
:if line('.')==a|exe 'norm @q'|endif
q
  1. qqqনিবন্ধের বিষয়বস্তু পরিষ্কার করে qযাতে ম্যাক্রোর সংজ্ঞা চলাকালীন আপনি যখন প্রাথমিকভাবে এটি কল করেন তখন এটি হস্তক্ষেপ করবে না
  2. qq রেকর্ডিং শুরু
  3. :let a=line('.') ভেরিয়েবলের ভিতরে বর্তমান লাইন নম্বর সঞ্চয় করে a
  4. Ctrl+ + aকার্সার অধীনে সংখ্যা বৃদ্ধি
  5. w কার্সারটি পরবর্তী সংখ্যাতে সরিয়ে দেয়
  6. :if line('.')==a|exe 'norm @q'|endif ম্যাক্রোর স্মরণ করে তবে কেবল যদি লাইন নম্বরটি পরিবর্তন না হয়
  7. q রেকর্ডিং বন্ধ করে দেয়

একবার আপনি যদি আপনার ম্যাক্রো সংজ্ঞায়িত করেন, আপনি যদি তৃতীয় লাইনে আপনার কার্সারটি অবস্থান করেন, লাইনের 0শুরুতে সরাতে আঘাত করুন, তারপরে @qম্যাক্রোকে পুনরায় খেলতে চাপ দিন q, এটি কেবলমাত্র বর্তমান লাইনেই প্রভাব ফেলবে এবং অন্যকে নয়:

1 2 3 4
1 2 3 4
2 3 4 5
1 2 3 4

রেকর্ডিংয়ের পরে একটি ম্যাক্রো পুনরাবৃত্ত করুন

আপনি যদি চান, আপনি এটি রেকর্ডারের অভ্যন্তরে একটি স্ট্রিংয়ে সংরক্ষণ করেছেন এবং আপনি ডট .অপারেটরের সাথে দুটি স্ট্রিং সংযুক্ত করতে পারেন তা ব্যবহার করে আপনি আপনার ম্যাক্রোটিকে রেকর্ডিংয়ের পরে পুনরাবৃত্ত করতে পারেন ।

এটি আপনাকে বেশ কয়েকটি সুবিধা দেয়:

  • রেকর্ডিংয়ের পূর্বে রেজিস্টারটি সাফ করার দরকার নেই, কারণ অক্ষরগুলি @qম্যাক্রোতে সংজ্ঞায়িত হওয়ার পরে যুক্ত করা হবে এবং পুরানো বিষয়বস্তু যা ছিল তা মুছে ফেলার পরে
  • রেকর্ডিংয়ের সময় অস্বাভাবিক কিছু টাইপ করার দরকার নেই, আপনি একটি সাধারণ, কার্যক্ষম ম্যাক্রো তৈরির দিকে মনোনিবেশ করতে পারেন
  • এটি কীভাবে আচরণ করে তা দেখার জন্য এটি পুনরাবৃত্ত করার আগে এটি পরীক্ষার সম্ভাবনা

যদি আপনি আপনার ম্যাক্রোটিকে যথারীতি রেকর্ড করেন (অ-পুনরাবৃত্তভাবে), আপনি নীচের কমান্ডটি পরে এটি পুনরাবৃত্ত করতে পারেন:

let @q = @q . "@q"

বা এমনকি ছোট: let @q .= "@q"
.=একটি অপারেটর যা অন্যটিতে স্ট্রিং যুক্ত করতে দেয়।

@qএটিতে নিবন্ধের অভ্যন্তরে সঞ্চিত কীস্ট্রোকগুলির ক্রমের একেবারে শেষে 2 টি অক্ষর যুক্ত করা উচিত q। আপনি একটি কাস্টম কমান্ডও নির্ধারণ করতে পারেন:

command! -register RecursiveMacro let @<reg> .= "@<reg>"

এটা তোলে কমান্ড সংজ্ঞায়িত :RecursiveMacroযা (কারণ একজন আর্গুমেন্ট হিসাবে একটি নিবন্ধন নামের জন্য অপেক্ষা -registerঅ্যাট্রিবিউট প্রেরণ :command)।
এটা তোলে আগের মতই কমান্ড আছে, শুধু পার্থক্য আমি তোমাদের প্রত্যেককে সংঘটন প্রতিস্থাপন হয় qসঙ্গে <reg>। কমান্ডটি কার্যকর করা হলে, ভিম <reg>আপনার সরবরাহ করা নিবন্ধের নাম সহ প্রতিটি ঘটনা স্বয়ংক্রিয়ভাবে প্রসারিত করবে ।

এখন, আপনাকে যা করতে হবে তা হ'ল আপনার ম্যাক্রোটি যথারীতি রেকর্ড করা (অ-পুনরাবৃত্তভাবে), তারপরে :RecursiveMacro qম্যাক্রোটি সঞ্চিত ম্যাক্রোটিকে qপুনরাবৃত্তির জন্য পুনরাবৃত্তি করতে টাইপ করুন ।


আপনি বর্তমান লাইনে থাকা শর্তটিতে ম্যাক্রোকে পুনরাবৃত্ত করতে একই জিনিস করতে পারেন:

let @q = ":let a=line('.')\r" . @q . ":if line('.')==a|exe 'norm @q'|endif\r"

এটি পোস্টের শুরুতে বর্ণিত ঠিক একই জিনিস, রেকর্ডিংয়ের পরে আপনি এটি না করেই। আপনি কেবল দু'টি স্ট্রিংকে একত্রীকরণ করতে পারেন, একটিতে তার আগে এবং একটিতে qবর্তমানে রেজিস্টারে যে কী-স্ট্রোক রয়েছে তার পরে:

  1. let @q = নিবন্ধের বিষয়বস্তু পুনরায় সংজ্ঞা দেয় q
  2. ":let a=line('.')\r"aম্যাক্রোর কাজ করার আগে ভেরিয়েবলের মধ্যে বর্তমান লাইন নম্বরটি সংরক্ষণ করে
    \rভিমকে এন্টার টিপুন এবং কমান্ডটি কার্যকর করতে বলা উচিত, :help expr-quoteঅনুরূপ বিশেষ অক্ষরের একটি তালিকা দেখুন ,
  3. . @q .qপূর্ববর্তী স্ট্রিং এবং পরবর্তীটির সাথে নিবন্ধকের বর্তমান বিষয়বস্তুগুলিকে সম্মতি জানায় ,
  4. ":if line('.')==a|exe 'norm @q'|endif\r"qলাইনটি পরিবর্তন হয়নি এমন অবস্থায় ম্যাক্রোটিকে স্মরণ করে

আবার কিছু কীস্ট্রোক সংরক্ষণ করতে, আপনি নিম্নলিখিত কাস্টম কমান্ডটি সংজ্ঞায়িত করে প্রক্রিয়াটি স্বয়ংক্রিয় করতে পারেন:

command! -register RecursiveMacroOnLine let @<reg> = ":let a=line('.')\r" . @<reg> . ":if line('.')==a|exe 'norm @<reg>'|endif\r"

এবং আবার, আপনাকে যা করতে হবে তা হল আপনার ম্যাক্রোটিকে যথারীতি রেকর্ড করা (অ-পুনরাবৃত্তভাবে), তারপরে টাইপ :RecursiveMacroOnLine qকরুন ম্যাক্রোটিকে qবর্তমান রেখায় থাকা অবস্থায় শর্ত অনুসারে রিক্সারসিভ করতে হবে।


2 কমান্ড একত্রিত করুন

আপনি টুইঙ্ক করতে পারেন :RecursiveMacroযাতে এটি 2 টি কেসকে কভার করে:

  • নিঃশর্ত ম্যাক্রো পুনরাবৃত্ত করতে,
  • এটি বর্তমান লাইনে থাকা শর্তে একটি ম্যাক্রো পুনরাবৃত্ত করুন

এটি করার জন্য, আপনি এতে দ্বিতীয় তর্কটি পাস করতে পারেন :RecursiveMacro। পরেরটি কেবল তার মানটি পরীক্ষা করে এবং মানের উপর নির্ভর করে পূর্ববর্তী 2 টি কমান্ডের মধ্যে একটি কার্যকর করে। এটি এমন কিছু দেবে:

command! -register -nargs=1 RecursiveMacro if <args> | let @<reg> .= "@<reg>" | else | let @<reg> = ":let a=line('.')\r" . @<reg> . ":if line('.')==a|exe 'norm @<reg>'|endif\r" | endif

অথবা (একে আরও বেশি পাঠযোগ্য করে তোলার জন্য লাইনের ধারাবাহিকতা / ব্যাকস্ল্যাশ ব্যবহার করে):

command! -register -nargs=1 RecursiveMacro
           \ if <args> |
           \     let @<reg> .= "@<reg>" |
           \ else |
           \     let @<reg> = ":let a = line('.')\r" .
           \                  @<reg> .
           \                  ":if line('.')==a | exe 'norm @<reg>' | endif\r" |
           \ endif

এটি আগের মতই, এই সময়টি বাদ দিয়ে আপনাকে দ্বিতীয় বৈশিষ্ট্য সরবরাহ করতে হবে :RecursiveMacro( -nargs=1বৈশিষ্ট্যের কারণে )।
যখন এই নতুন কমান্ড কার্যকর করা হবে, তখন ভিম <args>আপনার সরবরাহিত মানটির সাথে স্বয়ংক্রিয়ভাবে প্রসারিত হবে ।
যদি এই দ্বিতীয় আর্গুমেন্টটি শূন্য / সত্য ( if <args>) হয় তবে কমান্ডের প্রথম সংস্করণটি কার্যকর করা হবে (যা ম্যাক্রোকে নিঃশর্ত পুনরাবৃত্তি করে তোলে) অন্যথায় যদি এটি শূন্য / মিথ্যা হয় তবে দ্বিতীয় সংস্করণটি কার্যকর করা হবে (যা তৈরি করে একটি ম্যাক্রো এটি বর্তমান লাইনে থাকা শর্তে পুনরাবৃত্ত)।

পূর্ববর্তী উদাহরণে ফিরে যাওয়া, এটি নিম্নলিখিত জিনিসটি দেবে:

qq
<C-a>
w
q
:RecursiveMacro q 0
3G
0@q
  1. qq অভ্যন্তরীণ রেজিস্টার একটি ম্যাক্রো রেকর্ডিং শুরু q
  2. <C-a> কার্সারের নীচে সংখ্যা বৃদ্ধি করে
  3. w কার্সারটি পরবর্তী সংখ্যাতে সরিয়ে দেয়
  4. q রেকর্ডিং শেষ
  5. :RecursiveMacro q 0নিবন্ধের অভ্যন্তরে ম্যাক্রো q সঞ্চারিত করে তবে কেবল রেখার শেষ না হওয়া পর্যন্ত (দ্বিতীয় যুক্তির কারণে 0)
  6. 3G আপনার কার্সারটিকে একটি স্বেচ্ছাচারী লাইনে স্থানান্তরিত করে (উদাহরণস্বরূপ 3)
  7. 0@q লাইনের শুরু থেকে পুনরাবৃত্ত ম্যাক্রো পুনরায় প্রদর্শন করে

এটি আগের মত একই ফলাফল দেওয়া উচিত:

1 2 3 4
1 2 3 4
2 3 4 5
1 2 3 4

তবে এবার আপনার ম্যাক্রোর রেকর্ডিংয়ের সময় আপনাকে বিভ্রান্তিকর কমান্ডগুলি টাইপ করতে হবে না, আপনি কেবল একটি কার্যকারী তৈরির দিকে মনোনিবেশ করতে পারেন।

এবং 5 ধাপের সময়, আপনি যদি আদেশটির অ-শূন্য যুক্তিটি পাস করে থাকেন, তবে আপনি যদি :RecursiveMacro q 1পরিবর্তে টাইপ করেন :RecursiveMacro q 0, ম্যাক্রো qনিঃশর্তভাবে পুনরাবৃত্ত হয়ে উঠত, যা নিম্নলিখিত বাফারটি দিত:

1 2 3 4
1 2 3 4
2 3 4 5
2 3 4 5

এবার ম্যাক্রোটি ২ য় লাইনের শেষে বাফারের শেষে থামবে না।


আরও তথ্যের জন্য, দেখুন:

:help line()
:help :normal
:help :execute
:help :command-nargs
:help :command-register

2
অবস্থানের তালিকাটি ম্যাক্রোতে অনুসন্ধানের মিলগুলির উপরে অগ্রসর হওয়ার জন্য ব্যবহার করা যেতে পারে, যতক্ষণ না ম্যাক্রো ম্যাচের অবস্থান পরিবর্তন করে না, উদাহরণস্বরূপ :lv /\%3l\d/g %<CR>qqqqq<C-a>:lne<CR>@qq@qline. লাইনে সমস্ত সংখ্যা বৃদ্ধি করবে সম্ভবত এই সমাধানটি কম ভঙ্গুর করার উপায় আছে কি?
djjcast

@ ডিজেজেস্ট আপনি উত্তর হিসাবে পোস্ট করতে পারেন, আমি এটি চেষ্টা করেছি এবং এটি সত্যিই দুর্দান্ত কাজ করে। একটি মাত্র কেস আমি বুঝতে পারি না, যখন আমি নিম্নলিখিত লাইনে ম্যাক্রো কার্যকর করি তখন আমি তার পরিবর্তে 1 2 3 4 5 6 7 8 9 10পাই । আমি জানি না কেন, সম্ভবত আমি কিছু ভুল করে লিখেছি। যাইহোক এটি আমার সহজ পদ্ধতির চেয়ে আরও পরিশীলিত বলে মনে হয় এবং এতে ম্যাক্রোটি কার্সারটি কোথায় স্থানান্তরিত করতে হবে সেই সাথে বর্ণনা করার পাশাপাশি রেজিওকেসের সাথে জড়িত রয়েছে এবং সেইসাথে এমন কোনও অবস্থানের তালিকা যা আমি কখনও এভাবে ব্যবহার করি নি। আমি এটা প্রচুর পছন্দ করি! 2 3 4 5 6 7 8 9 10 122 3 4 5 6 7 8 9 10 11
saginaw

@ ডিজেজকাস্ট দুঃখিত, আমি ঠিক বুঝতে পেরেছি, সমস্যাটি কেবল আমার রেজেক্স থেকে এসেছে, আমার \d\+একাধিক অঙ্কের সংখ্যা বর্ণনা করতে হবে।
saginaw

@ ডিজেজেকাস্ট আহ এখন আমি বুঝতে পেরেছি আপনি যখন বলেছিলেন তখন ম্যাক্রোর ম্যাচের অবস্থান পরিবর্তন করা উচিত নয়। তবে আমি জানি না কীভাবে এই সমস্যাটি সমাধান করা যায়। আমার একমাত্র ধারণাটি হ'ল ম্যাক্রোর ভিতরে থেকে অবস্থানের তালিকাটি আপডেট করা হবে তবে আমি অবস্থানের তালিকার সাথে অভ্যস্ত নই, এটি আমার পক্ষে খুব জটিল, সত্যই দুঃখিত।
saginaw

1
@ সাগিনাউ বিপরীত ক্রমে ম্যাচগুলি নিয়ে ইটরেটেটিং করা দেখে মনে হচ্ছে এটি বেশিরভাগ ক্ষেত্রেই সমস্যাটি সমাধান করবে কারণ মনে হচ্ছে যে আগের ম্যাচের অবস্থানগুলি পরিবর্তন করতে কোনও ম্যাক্রোর পক্ষে সম্ভাবনা কম। :lv ...কমান্ডের পরে, কমান্ডটি :llaশেষ ম্যাচে লাফাতে ব্যবহৃত হতে পারে এবং :lpকমান্ডটি বিপরীত ক্রমে ম্যাচগুলির উপরে অগ্রসর হওয়ার জন্য ব্যবহার করা যেতে পারে।
djjcast

9

একটি পুনরাবৃত্ত ম্যাক্রো ব্যর্থ হওয়া একটি কমান্ডের মুখোমুখি হওয়ার সাথে সাথেই বন্ধ হয়ে যাবে। সুতরাং, একটি লাইনের শেষে থামতে আপনার একটি কমান্ডের দরকার যা লাইনের শেষে ব্যর্থ হবে।

ডিফল্টরূপে *, lকমান্ডটি এমন একটি আদেশ, সুতরাং আপনি এটি পুনরাবৃত্ত ম্যাক্রো বন্ধ করতে ব্যবহার করতে পারেন। কার্সারটি যদি লাইনের শেষে না থাকে তবে আপনাকে কেবল কমান্ডটি দিয়ে এটি আবার সরিয়ে নেওয়া উচিত h

সুতরাং, সাগিনো হিসাবে একই উদাহরণ ম্যাক্রো ব্যবহার করে :

qqqqq<c-a>lhw@qq

ভেঙ্গে পড়া:

  1. qqq: কিউ রেজিস্টার সাফ করুন,
  2. qq: qরেজিস্টারটিতে একটি ম্যাক্রো রেকর্ডিং শুরু করুন ,
  3. <c-a>: কার্সারের অধীনে সংখ্যা বৃদ্ধি করুন,
  4. lh: আমরা যদি লাইনের শেষে থাকি তবে ম্যাক্রোটি বাতিল করে দিন। নাহলে কিছুই করবেন না।
  5. w: লাইনের পরবর্তী শব্দে অগ্রিম।
  6. @q: পুনরাবৃত্তি
  7. q: রেকর্ডিং বন্ধ করুন।

তারপরে আপনি একই 0@qকমান্ডের সাহায্যে ম্যাক্রো চালাতে পারবেন সাগিনো দ্বারা বর্ণিত।


* 'whichwrap'বিকল্পটি আপনাকে সংজ্ঞায়িত করতে দেয় যে কোন লাইনের কীগুলি পরবর্তী লাইনে প্রায় আবৃত হবে যখন আপনি কোনও লাইনের শুরুতে বা শেষে থাকবেন (দেখুন :help 'whichwrap')। যদি আপনি lএই বিকল্পটি সেট করে থাকেন তবে এটি উপরে বর্ণিত সমাধানটি ভেঙে দেবে।

যাইহোক, এটা সম্ভব যে আপনি শুধুমাত্র একটি একক অক্ষর আগুয়ান জন্য তিনটি ডিফল্ট স্বাভাবিক-মোড কমান্ড একটি ব্যবহার (হয় <Space>, lএবং <Right>), তাই আপনি যদি আছে lআপনার মধ্যে অন্তর্ভুক্ত 'whichwrap'সেটিং তুমিই সেই আপনি অপসারণ করতে পারেন না থেকে ব্যবহার 'whichwrap'বিকল্প, যেমন <Space>:

:set whichwrap-=s

তারপরে আপনি lম্যাক্রোর 4 ধাপে <Space>কমান্ডটি একটি আদেশ দিয়ে প্রতিস্থাপন করতে পারেন ।


1
এও নোট করুন যে সেটিংসটি শেষের-লাইনটি সনাক্ত করতে virtualedit=onemoreব্যবহারে হস্তক্ষেপ করবে l, যদিও ততটা গুরুতর নয় whichwrap=l
কেভিন

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