সমস্যার সম্ভাব্য ব্যাখ্যা
আমি মনে করি যে :g/;/j
কাজ না করার কারণ হ'ল :g
আদেশটি 2-পাসের অ্যালগরিদম দিয়ে পরিচালনা করে:
- প্রথম পাসের সময় এটি প্যাটার্নযুক্ত লাইনগুলি চিহ্নিত করে
;
- দ্বিতীয় পাসের সময় এটি চিহ্নিত লাইনগুলিতে কাজ করে
দ্বিতীয় পাসের সময়, :g
লাইনের 1;
সাথে লাইনে যোগ দেয় 2;
কারণ 1;
প্রথম পাসের সময় চিহ্নিত ছিল। তবে আমার সন্দেহ (নিশ্চিত নয়) যে এটির 1; 2;
সাথে যোগ হয় না 3;
কারণ লাইনটি 2;
আর বিদ্যমান নেই, এর সামগ্রীটি 1;
ইতিমধ্যে প্রক্রিয়াভুক্ত হওয়া লাইনের সাথে মিশে গেছে।
সুতরাং :g
পরবর্তী পংক্তির সন্ধান করুন যা প্রথম পাসের সময় চিহ্নিত হয়েছিল ( 3;
) এবং নিম্নলিখিত একটি ( 4;
) এর সাথে এটি যোগ দেয় । এরপর সমস্যা পুনরাবৃত্তি, এটা যোগ দিতে পারবেন না 3; 4;
সঙ্গে 5;
কারণ লাইন 4;
আর বিদ্যমান নেই।
সমাধান 1 (ভিমস্ক্রিপ্ট সহ)
;
পূর্ববর্তী লাইনে একটি সেমিকোলন রয়েছে কিনা তা পরীক্ষা করতে আপনি যখনই কোনও ফাংশন কল করতে পারেন :
function! JoinLines()
if getline(line('.')-1) =~ ';'
.-1join
endif
endfunction
তারপরে নিম্নলিখিত গ্লোবাল কমান্ডটি ব্যবহার করুন:
:g/;/call JoinLines()
বা একটি ফাংশন ছাড়াই:
:g/;/if getline(line('.')-1) =~ ';' | -j | endif
সমাধান 2 (বিন্যাস ছাড়াই)
:g/;/.,/^[^;]*$/-1j
যখনই বিশ্বব্যাপী কমান্ড :g
প্যাটার্নটি আবিষ্কার ;
করে এটি কমান্ডটি কার্যকর করে: .,/^[^;]*$/-1j
এটি এভাবে ভেঙে যেতে পারে:
:g/pattern/a,bj
কোথায় :
pattern = ;
a = . = number of current line
b = /^[^;]*$/-1 = number of next line without any semicolon minus one
b
আরও এভাবে ভেঙে যেতে পারে:
/ = look for the number of the next line matching the following pattern
^ = a beginning of line
[^;] = then any character except a semicolon
* = the last character can be repeated 0 or more times
$ = an end of line
/ = end of pattern
-1 = removes one to the number you just got
j
প্রাক্তন কমান্ডের সংক্ষিপ্ত রূপটি :join
যা অন্যান্য প্রাক্তন কমান্ডের মতো একটি রেঞ্জের আগেও করা যেতে পারে।
: এখানে পরিসর পূর্বে এর .,/^[^;]*$/-1
( a,b
)
একটি পরিসর ফর্ম অনুসরণ a,b
যেখানে a
এবং b
সাধারণভাবে 2 লাইন সংখ্যা আছে, এবং আপনি লাইন যার সংখ্যা মধ্যে একটি গ্রুপ কাজ করতে পারবেন a
এবং b
পরিবর্তে শুধু একটা।
সুতরাং j
কমান্ডটি বর্তমান ( a
) এবং পরেরটির মধ্যবর্তী সমস্ত রেখার সাথে মিলিত হয় যার মধ্যে কোন সেমিকোলন বিয়োগ একটি ( b
) নেই।
আরও তথ্যের জন্য, দেখুন:
:help :global
:help :join
:help :range
:g/;/j
কাজ করে না কারণ এটি দুটি পাসে করা হয়: প্রথমে বাফারটি স্ক্যান করা হয়, তারপরে কমান্ডটি ম্যাচিং লাইনে প্রয়োগ করা হয়।