উত্তর:
সম্ভবত একটি সহজ পদ্ধতি আছে তবে আপনি নিম্নলিখিতটি চেষ্টা করতে পারেন।
ধরা যাক আপনি 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
qqq
নিবন্ধের বিষয়বস্তু পরিষ্কার করে q
যাতে ম্যাক্রোর সংজ্ঞা চলাকালীন আপনি যখন প্রাথমিকভাবে এটি কল করেন তখন এটি হস্তক্ষেপ করবে নাqq
রেকর্ডিং শুরু:let a=line('.')
ভেরিয়েবলের ভিতরে বর্তমান লাইন নম্বর সঞ্চয় করে a
w
কার্সারটি পরবর্তী সংখ্যাতে সরিয়ে দেয়:if line('.')==a|exe 'norm @q'|endif
ম্যাক্রোর স্মরণ করে তবে কেবল যদি লাইন নম্বরটি পরিবর্তন না হয়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
বর্তমানে রেজিস্টারে যে কী-স্ট্রোক রয়েছে তার পরে:
let @q =
নিবন্ধের বিষয়বস্তু পুনরায় সংজ্ঞা দেয় q
":let a=line('.')\r"
a
ম্যাক্রোর কাজ করার আগে ভেরিয়েবলের মধ্যে বর্তমান লাইন নম্বরটি সংরক্ষণ করে \r
ভিমকে এন্টার টিপুন এবং কমান্ডটি কার্যকর করতে বলা উচিত, :help expr-quote
অনুরূপ বিশেষ অক্ষরের একটি তালিকা দেখুন , . @q .
q
পূর্ববর্তী স্ট্রিং এবং পরবর্তীটির সাথে নিবন্ধকের বর্তমান বিষয়বস্তুগুলিকে সম্মতি জানায় ,":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
qq
অভ্যন্তরীণ রেজিস্টার একটি ম্যাক্রো রেকর্ডিং শুরু q
<C-a>
কার্সারের নীচে সংখ্যা বৃদ্ধি করেw
কার্সারটি পরবর্তী সংখ্যাতে সরিয়ে দেয়q
রেকর্ডিং শেষ:RecursiveMacro q 0
নিবন্ধের অভ্যন্তরে ম্যাক্রো q
সঞ্চারিত করে তবে কেবল রেখার শেষ না হওয়া পর্যন্ত (দ্বিতীয় যুক্তির কারণে 0
)3G
আপনার কার্সারটিকে একটি স্বেচ্ছাচারী লাইনে স্থানান্তরিত করে (উদাহরণস্বরূপ 3)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
1 2 3 4 5 6 7 8 9 10
পাই । আমি জানি না কেন, সম্ভবত আমি কিছু ভুল করে লিখেছি। যাইহোক এটি আমার সহজ পদ্ধতির চেয়ে আরও পরিশীলিত বলে মনে হয় এবং এতে ম্যাক্রোটি কার্সারটি কোথায় স্থানান্তরিত করতে হবে সেই সাথে বর্ণনা করার পাশাপাশি রেজিওকেসের সাথে জড়িত রয়েছে এবং সেইসাথে এমন কোনও অবস্থানের তালিকা যা আমি কখনও এভাবে ব্যবহার করি নি। আমি এটা প্রচুর পছন্দ করি! 2 3 4 5 6 7 8 9 10 12
2 3 4 5 6 7 8 9 10 11
\d\+
একাধিক অঙ্কের সংখ্যা বর্ণনা করতে হবে।
:lv ...
কমান্ডের পরে, কমান্ডটি :lla
শেষ ম্যাচে লাফাতে ব্যবহৃত হতে পারে এবং :lp
কমান্ডটি বিপরীত ক্রমে ম্যাচগুলির উপরে অগ্রসর হওয়ার জন্য ব্যবহার করা যেতে পারে।
একটি পুনরাবৃত্ত ম্যাক্রো ব্যর্থ হওয়া একটি কমান্ডের মুখোমুখি হওয়ার সাথে সাথেই বন্ধ হয়ে যাবে। সুতরাং, একটি লাইনের শেষে থামতে আপনার একটি কমান্ডের দরকার যা লাইনের শেষে ব্যর্থ হবে।
ডিফল্টরূপে *, l
কমান্ডটি এমন একটি আদেশ, সুতরাং আপনি এটি পুনরাবৃত্ত ম্যাক্রো বন্ধ করতে ব্যবহার করতে পারেন। কার্সারটি যদি লাইনের শেষে না থাকে তবে আপনাকে কেবল কমান্ডটি দিয়ে এটি আবার সরিয়ে নেওয়া উচিত h
।
সুতরাং, সাগিনো হিসাবে একই উদাহরণ ম্যাক্রো ব্যবহার করে :
qqqqq<c-a>lhw@qq
ভেঙ্গে পড়া:
qqq
: কিউ রেজিস্টার সাফ করুন,qq
: q
রেজিস্টারটিতে একটি ম্যাক্রো রেকর্ডিং শুরু করুন ,<c-a>
: কার্সারের অধীনে সংখ্যা বৃদ্ধি করুন,lh
: আমরা যদি লাইনের শেষে থাকি তবে ম্যাক্রোটি বাতিল করে দিন। নাহলে কিছুই করবেন না।w
: লাইনের পরবর্তী শব্দে অগ্রিম।@q
: পুনরাবৃত্তিq
: রেকর্ডিং বন্ধ করুন।তারপরে আপনি একই 0@q
কমান্ডের সাহায্যে ম্যাক্রো চালাতে পারবেন সাগিনো দ্বারা বর্ণিত।
* 'whichwrap'
বিকল্পটি আপনাকে সংজ্ঞায়িত করতে দেয় যে কোন লাইনের কীগুলি পরবর্তী লাইনে প্রায় আবৃত হবে যখন আপনি কোনও লাইনের শুরুতে বা শেষে থাকবেন (দেখুন :help 'whichwrap'
)। যদি আপনি l
এই বিকল্পটি সেট করে থাকেন তবে এটি উপরে বর্ণিত সমাধানটি ভেঙে দেবে।
যাইহোক, এটা সম্ভব যে আপনি শুধুমাত্র একটি একক অক্ষর আগুয়ান জন্য তিনটি ডিফল্ট স্বাভাবিক-মোড কমান্ড একটি ব্যবহার (হয় <Space>
, l
এবং <Right>
), তাই আপনি যদি আছে l
আপনার মধ্যে অন্তর্ভুক্ত 'whichwrap'
সেটিং তুমিই সেই আপনি অপসারণ করতে পারেন না থেকে ব্যবহার 'whichwrap'
বিকল্প, যেমন <Space>
:
:set whichwrap-=s
তারপরে আপনি l
ম্যাক্রোর 4 ধাপে <Space>
কমান্ডটি একটি আদেশ দিয়ে প্রতিস্থাপন করতে পারেন ।
virtualedit=onemore
ব্যবহারে হস্তক্ষেপ করবে l
, যদিও ততটা গুরুতর নয় whichwrap=l
।
've'
:lv /\%3l\d/g %<CR>qqqqq<C-a>:lne<CR>@qq@q
line. লাইনে সমস্ত সংখ্যা বৃদ্ধি করবে সম্ভবত এই সমাধানটি কম ভঙ্গুর করার উপায় আছে কি?