কিভাবে প্রতি 4 লাইন বিপরীত?


13

প্রথমত, এখানে এটি আমার প্রথম পোস্ট হওয়ার সাথে আমি কেবল এটিই বলতে চাই যে ভিআইএমকে আমি একটি দুর্দান্ত সরঞ্জাম এবং এখানে ফোরামে প্রশ্নের উত্তর খুঁজে পেতে খুব সহায়ক হতে পেরেছি, প্রচুর সহায়ক লোক সরবরাহ করে অমূল্য সহায়তা। আমি এখনও ভিআইএম-তে খুব নতুন, তাই আমি এ সম্পর্কে যা কিছু শিখেছি তা এখান থেকে এসেছে।

আমার প্রশ্নটি: আমি জানি যে কোনও ফাইলের সমস্ত লাইনগুলি কীভাবে বিপরীত করতে হয় (: g / ^ / m0 অন্যান্য উপায়ে) তবে ফাইলটিতে প্রতি 4 টি লাইন বিপরীত করার উপায় আছে, যাতে

line1
line2
line3
line4
line5
line6
line7
line8
...

হয়ে

line4
line3
line2
line1
line8
line7
line6
line5
...

আপনি ধরে নিতে পারেন যে এই জাতীয় ফাইলগুলিতে সর্বদা 4 টি লাইনের নিখুঁত একাধিক থাকবে।


2
আপনার "পিএস" সম্পর্কে: আপনি যদি কোনও লাইনের সামনে 4 টি স্পেস সন্নিবেশ করেন তবে এটি কোড হিসাবে ব্যাখ্যা করা হবে (আপনি পাঠ্যটি নির্বাচন করতে পারেন এবং উপরের বিন্যাস বোতামগুলি ব্যবহার করতে পারেন)। আপনি শীর্ষে জিজ্ঞাসাবাদ আইকনটিতে আরও বিশদ জানতে পারেন ।
এম মন্টু

উত্তর:


15

কমান্ড :Reverseএ ব্যাখ্যা তেজ উইকি (আপনি এটা অন্তর্ভুক্ত হতে পারে আপনার এই জন্য ব্যবহার করা যেতে পারে .vimrcএটা স্থায়ী করতে):

command! -bar -range=% Reverse <line1>,<line2>g/^/m<line1>-1|nohl

তারপরে আপনি প্রতি চার লাইনে কমান্ড চালানোর জন্য ম্যাক্রো রেকর্ড করতে পারেন:

qmV3j:Reverse<cr>4jq
1000@m

ব্যাখ্যা:

  • qm: 'কিউ' স্বাভাবিক মোডে শুরু হয় (এবং থামবে) প্রদত্ত রেজিস্টারে ম্যাক্রো রেকর্ডিং করা (এই ক্ষেত্রে 'মি' রেজিস্টার করুন, তবে এটি অন্য কোনও চিঠিও হতে পারে)
  • V: ভিজ্যুয়াল মোডে প্রবেশ করুন এবং বর্তমান লাইনটি নির্বাচন করুন
  • 3j: ভিজ্যুয়াল নির্বাচনটি পরবর্তী 3 লাইনে প্রসারিত করুন
  • :Reverse<cr>: নির্বাচিত লাইনে বিপরীত কমান্ড চালান ( <cr>এখানে enterকীটির জন্য দাঁড়িয়ে আছে )
  • 4j: পরবর্তী অপরিবর্তিত লাইনে যান
  • q: ম্যাক্রো রেকর্ডিং বন্ধ
  • 1000@m: রেজিস্টার 'এম' তে রেকর্ড করা ম্যাক্রোটি 1000 বার চালান (আপনার ফাইলটি 4000 লাইনের চেয়ে বড় হলে আপনি এই সংখ্যাটি বাড়িয়ে তুলতে পারেন)

সম্পাদনা:

মন্তব্যে উল্লিখিত হিসাবে, আপনি একটি গণনা ব্যবহার না করে পুনরাবৃত্ত ম্যাক্রো ব্যবহার করতে পারেন:

qmV3j:Reverse<cr>4jq
qM@mq
@m
  • qM: যদি নির্দিষ্ট রেজিস্টারটির জন্য qবড় হাতের অক্ষর থাকে তবে ম্যাক্রোটিকে নিবন্ধটিতে সংযুক্ত করা হয় (এটি যখন আপনি যখন কোনও জটিল ম্যাক্রোর শেষ পদক্ষেপগুলি মিস করেন তখন বুঝতে পারেন)
  • @m: রেজিস্টারে ম্যাক্রো চালান m
  • q: ম্যাক্রো যুক্ত করা বন্ধ করুন stop

এটি ম্যাক্রো হিসাবে তৈরি করা সত্ত্বেও, এটি যদি আপনার কর্মপ্রবাহে সাধারণ কাজ হয় তবে আপনি এটির জন্য একটি কমান্ড তৈরি করতে পারেন:

function! Reverse4()
   let reg_m = @m
   let @m = '<c-r><c-r>m'
   normal! @m
   let @m = reg_m
endfunction
command! Reverse4 call Reverse4()
  • function! Reverse4()/ endfunction: একটি নতুন ফাংশন সংজ্ঞায়িত করে
  • let reg_m = @m: নিবন্ধকের বর্তমান বিষয়বস্তু সংরক্ষণ করে m
  • let @m = "<c-r><c-r>m": রেজিস্টারটিতে ম্যাক্রো sertোকান m- নোটটি <c-r>হ'ল Ctrl+ এর জন্য ভিম নোটেশন rএবং আপনার এটি টাইপ করা উচিত , অনুলিপি / পেস্ট করা উচিত নয়, সুতরাং আপনার লাইনটি অনুরূপ হবে let @m = 'V3j:Reverse^M4j@m'এবং এতে একটি বিশেষ অক্ষর থাকবে (^ এম)
  • normal! @m: সাধারন কমান্ডটি এটির মোডে টাইপ করার সাথে সাথে তার আর্গুমেন্টটি চালায়, সুতরাং এটি পুনরাবৃত্ত ম্যাক্রোটি চালাবে
  • let @m = reg_m: নিবন্ধকের বিষয়বস্তু পুনরুদ্ধার করে m, যাতে আপনার মনে রাখতে হবে না যে এই ফাংশনটিতে এই রেজিস্টারটি ব্যবহৃত হচ্ছে এবং এটি ব্যবহার করা এড়ানো উচিত

  • command! Reverse4 call Reverse4(): এই ফাংশনটির জন্য একটি নতুন কমান্ড তৈরি করুন

আপনার প্রয়োজনের উপর নির্ভর করে আপনি এটি বাড়িয়ে তুলতে পারেন, উদাহরণস্বরূপ: কমান্ডের সাথে একটি আর্গুমেন্ট পাস করুন এবং ফাংশন করুন যাতে এটি 4 টি লাইনের গ্রুপে স্থির না হয়ে যে কোনও লাইনগুলির জন্য কাজ করবে would


পরিবর্তে 1000@qহ্যাক, আপনার কাছে একটি recursive ম্যাক্রো ব্যবহার করতে পারেন: qmqqm ... @mq@m
ডুরকনব

আমি যখন "কিউএমভি 3 জ: বিপরীত <সিআর> 4 জিকি" চালানোর চেষ্টা করেছি, তখন এটি "E492: সম্পাদক কমান্ড নয়" বলেছিল। আমি অবশ্যই কিছু ভুল করছি। আমি ব্যবহার করছি - এবং কেবল কখনও ব্যবহার করেছি - জিভিআইএম, উপায় দ্বারা। আমার প্রথম কথাটি উল্লেখ করা উচিত ছিল।
সক্ষমওয়াসেরিসওয়েলবা

আহ, কিছু মনে করবেন না। আমি এটি বের করেছিলাম - "qmV3j: বিপরীত <cr> 4jq" অংশের আগে ":" টাইপ করার কথা আমার নেই। এটা কাজ করেছে! আপনাকে অনেক ধন্যবাদ, মন্টু। যদি আমি জিজ্ঞাসা করতে পারি - আমি আমার .vimrc এ ": বিপরীত" কমান্ডকে কীভাবে অন্তর্ভুক্ত করব?
وړওয়াসিরিসওয়েলবা

3
@ablewasiereisawelba কমান্ড স্থায়ীভাবে উপলভ্য করার জন্য, command! -bar -range=% Reverse <line1>,<line2>g/^/m<line1>-1|nohlআপনার ভিআইএমআরসি-র কোথাও লাইনটি লিখুন ।
saginaw

@ সাগিনা ওহ, আমি বুঝতে পারি নি যে এটি সোজা। ধন্যবাদ.
সক্ষমওয়াসেরিসওয়েলবা

9

সঙ্গে সব পুনরাবৃত্তিমূলক কর্ম , আপনি কিছু একবার মৌলিক অপারেশন সম্পাদন করা দিয়ে তারপর আপনি সহজেই এটি একটি ম্যাক্রো রেকর্ডিং দ্বারা বার প্রচুর করতে পারি না করতে পারেন, তবে।

(এই ক্ষেত্রে আমি একটি পুনরাবৃত্ত ম্যাক্রো ব্যবহার করব, তবে আপনি কেবল একটি পুনরাবৃত্তিযোগ্য রেকর্ড করতে পারেন এবং হাতুড়ি দিয়ে @@বা একটি গণনা ব্যবহার করে এটি একাধিকবার খেলতে পারেন ))

ggqqqqqddjjpkddkkPjddpjj@qq@q

ভেঙ্গে পড়া

  1. gg: ফাইলের শুরুতে সরান।
  2. qqq: রেজিস্টার সাফ করুন q। 5 তম পদক্ষেপে কেন এটি প্রয়োজনীয় তা আমরা দেখতে পাব।
  3. qq: কি রেজিস্ট্রেশন করতে একটি ম্যাক্রো রেকর্ডিং শুরু করুন
  4. ddjjpkddkkPjddpjj: ক্রিয়াকলাপের একটি সিরিজ যা ম্যানুয়ালি মুছে ফেলা এবং পেস্ট করে প্রথম চারটি লাইনের পুনঃক্রম করে। (এই এক নজরে জটিল পারে তাকান, কিন্তু প্রতারিত হবেন না এটি খুবই মৌলিক সামগ্রী আপনাকে প্রথমে 5 মিনিট শিখেছি আছে চাই যে বা তাই করুন। vimtutor: j, k, dd, p, P)
  5. @q: ম্যাক্রো ডাক! এই মুহুর্তে, qনিবন্ধটিতে কিছুই নেই (কারণ আমরা এটিকে দ্বিতীয় ধাপে সাফ করেছি), তাই কিছুই হবে না।
  6. q: ম্যাক্রো রেকর্ডিং বন্ধ করুন।
  7. @q: পুনরাবৃত্তির ম্যাক্রো যতবার প্রয়োজন ততবার পুনরায় খেলুন।

এনবি উপরোক্ত পছন্দসই ফলাফলগুলি তৈরি করতে পারে না যদি ফাইলে এমন অনেকগুলি লাইন থাকে যা চারটি দিয়ে একেবারে বিভাজ্য হয় না। চারটি লাইন না থাকলে তাড়াতাড়ি ম্যাক্রো বন্ধ করার জন্য, আমাদের ৪ র্থ ধাপে সম্পাদনাগুলি প্রয়োগ করা শুরু করার আগে , একটি ভিম নরমাল-মোড কমান্ডটি ব্যর্থ হবে যা ব্যর্থ হবে We আমরা নীচে নামার চেষ্টা করে এটি করতে পারি আমরা চারদিকে লাইন চলা শুরু করার আগে একটি লাইন তিনবার (এবং তারপরে ব্যাক আপ):jjj3k

এভাবে:

ggqqqqqjjj3kddjjpkddkkPjddpjj@qq@q

আপনি কেন রেজিস্ট্রার Q স্পষ্টভাবে সাফ করবেন? আপনি যদি কেবল এটির মধ্যে রেকর্ড করেন তবে সেখানে যা কিছু ছিল তা যেভাবেই হোক ওভাররাইট হয়ে যাবে ....
ওয়াইল্ডকার্ড

4
@ উইল্ডকার্ড যেহেতু এটি একটি পুনরাবৃত্ত ম্যাক্রো, আপনি যখন প্রথমবার নিবন্ধের সামগ্রীটি কল করবেন qএটি অবশ্যই খালি থাকবে, অন্যথায় এটি আপনার সংস্করণগুলিকে গোলমাল করবে।
saginaw

খুব সুন্দর. আমি আপনার আদেশের যথাযথ ক্রমটি টাইপ না করে এবং আন্তরিকভাবে এটি ব্যবহার করে ক্ষতিকারক চেষ্টা করেছি:qqqggqqjjjkddkkPjddjpkddkkPjjjj@qq@q
ওয়াইল্ডকার্ড

1
@ablewasiereisawelba where I can just use the one-line custom command each time I need to do this- নোট করুন যে প্রতিবার আপনার ম্যাক্রোটি ব্যবহার করার প্রয়োজন হবে তা পুনরায় তৈরি করতে হবে না, কারণ এটি আপনার ভিআইএমআরসিতে ফাংশন / কমান্ড হিসাবে সংরক্ষণ করা সম্ভব।
এমমন্টু

1
@ablewasiereisawelba আমি আপনাকে "সম্পাদনা" দরকারী বলে খুশি! এটি এখানে আপনার প্রথম পোস্ট হিসাবে সম্ভবত স্ট্যাক এক্সচেঞ্জ বিজ্ঞপ্তিগুলি কীভাবে কাজ করে তা সম্পর্কে আপনি অজানা; আপনি যখন কোনও মন্তব্য পোস্ট করেন, উত্তর / প্রশ্নগুলির লেখক একটি বিজ্ঞপ্তি পান; আপনি @ <নিক> অন্তর্ভুক্ত করলেই অন্য ব্যক্তিরা একটি বিজ্ঞপ্তি পাবেন receive এইভাবে শুধুমাত্র ধনী আপনার শেষ বার্তাগুলি সম্পর্কে বিজ্ঞপ্তি পেয়েছে।
এম মন্টু

7

আপনি একটি বহিরাগত ফিল্টার হিসাবে Exব্যবহার করে একটি কমান্ড দিয়ে এটি করতে পারেন sed:

:%!sed -n 'h;n;G;h;n;G;h;n;G;p'

এই সংস্করণটি 4 এরও বেশি কোনও অতিরিক্ত লাইন উপেক্ষা (মুছে ফেলবে) 4 টিরও কম লাইনের (বিপরীত) রাখতে রাখতে ব্যবহার করুন:

:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'

%এখানে "বাফারে প্রতিটি লাইন।" অর্থ

!কমান্ড মানে হলো "ইনপুট হিসাবে নির্দিষ্ট লাইনের নিম্নলিখিত কমান্ড চালানোর জন্য, এবং প্রতিস্থাপন কমান্ডের আউটপুট নিদিষ্ট লাইন।" (এটিকে একটি ফিল্টার বলা হয়; বাছাইকরণের মতো জিনিসগুলির জন্য খুব সহজ, উদাহরণস্বরূপ, :%!sortআপনার ফাইলের সমস্ত লাইন :2,8!sortবাছাই করবে ; লাইন 2-8 ইত্যাদি বাছাই করবে)

sedএটি স্ট্রিম এডিটর টুল এবং এটি ইউনিক্সের মতো সমস্ত সিস্টেমে পাওয়া যায়। sedএখানে ব্যবহৃত মূল ধারণাগুলি হ'ল "প্যাটার্ন স্পেস" (যা পূর্বনির্ধারিতভাবে ইনপুটটির প্রতিটি লাইন থাকে পরিবর্তিতভাবে) এবং "হোল্ড স্পেস" (যেখানে আপনি sedঅন্য প্রক্রিয়াকরণের সময় সংরক্ষণ করার সময় অতিরিক্ত পাঠ্য আটকে রাখতে পারেন ইনপুট লাইন)।

-nsedপ্যাটার্ন স্পেস মুদ্রণের এর ডিফল্ট ক্রিয়াগুলি দমন করার জন্য কমান্ডের একটি বিকল্প (কারণ এই ক্ষেত্রে আমরা কেবল তখনই প্রিন্ট করতে চাই যখন আমরা স্পষ্টভাবে এটি বলি)

$pমধ্যে sedকমান্ড মানে হলো "আপনি শেষ লাইনে হন sedএর ইনপুট, মুদ্রণ (প্যাটার্ন স্থান)।"

h "" প্যাটার্ন স্পেস "এর বর্তমান বিষয়বস্তুগুলিকে 'হোল্ড স্পেসে' আটকে দিন, যা কিছু আছে তা ওভাররাইট করে।"

n মানে "ইনপুট থেকে পরবর্তী পংক্তির সাথে 'প্যাটার্ন স্পেস'-এর সামগ্রীগুলি প্রতিস্থাপন করুন"

G এর অর্থ "'প্যাটার্ন স্পেসে সংযুক্ত করুন:' হোল্ড স্পেস 'এর বিষয়বস্তুগুলির পরে একটি নতুন লাইন।"

সমস্ত একসাথে sedনিয়ে গেলে, কমান্ড চারটি আউটপুট আউটপুট সংরক্ষণ করে, যেমন এটি সংরক্ষণ করে এবং তারপরে তাদের মুদ্রণ করে। $pকমান্ড দ্বিতীয় সংস্করণে যোগ করে নিশ্চিত করুন যে ফাইলটি শেষ লাইন 4 লাইনের একটি একাধিক উপর ছাড়া অন্য উপনিত, লাইন এখনও ছাপা হয়।


কোনও বিকল্প, নির্দিষ্ট কোনও বৈশিষ্ট্য ব্যবহার না করে এবং বাহ্যিক ফিল্টার ব্যবহার না করেই বিকল্পের জন্য ইন্টারেক্টিভ পদ্ধতির জন্য:

:4

চতুর্থ লাইনে যেতে।

:.m -4 | +3m . | +2m . | +5

পূর্ববর্তী চারটি লাইন বিপরীতে (1-4) এবং আপনার কার্সারটি 8 নং লাইনে রেখে দিন।

.m -4চার লাইন পিছনে রেখার ঠিক পরে বর্তমান রেখাটি সরানো হয় (সরানো লাইনে কার্সারটি রেখে)।

+3m .কার্সারকে সরানো লাইনে রেখে বর্তমান লাইনের পরে 3 রেখার রেখাটি বর্তমান লাইনের ঠিক পরে স্থানান্তরিত করে। +2m .অবশ্যই একই কাজ করে।

+5 কার্সারটি যেখানে রয়েছে সেখান থেকে পাঁচটি রেখা নীচে রাখে।

পছন্দসই হিসাবে পুনরাবৃত্তি।

ভিমে আপনি এই পুরো কমান্ডটি দিয়ে পুনরায় পুনরায় পুনরায় করতে পারেন @:, তারপরে আবার পুনরাবৃত্তি করুন @@। পসিক্সে viবা exআপনাকে পাঠ্যের একটি লাইন হিসাবে সন্নিবেশ করাতে হবে :.m -4 | +3m . | +2m . | +5, এটি একটি নামযুক্ত বাফার (নিবন্ধক) এ মুছুন এবং তারপরে সেই নামযুক্ত বাফার (নিবন্ধক) চালাবেন।

সুতরাং exমোডে, কেবল POSIX- নির্দিষ্ট বৈশিষ্ট্যগুলি ব্যবহার করে ইন্টারেক্টিভ লাইনে বিপরীত করা এবং পাঠ্যটির 17 টি লাইন দিয়ে শুরু করা:

Entering Ex mode.  Type "visual" to go to Normal mode.
:0a     # Append following text after "line 0" (i.e. insert at start of file).
.m -4 | +3m . | +2m . | +5
.       # End text insertion
:d k    # Delete that line to register k
line1   # This is a printout of the current line
:4      # Move to line 4
line4
:@k     # Execute register k to reverse lines 1-4
line8
:@@     # Execute register k again
line12
:@@     # Execute register k again
line16
:@@     # Execute register k again
line17
:%p     # Print the whole buffer (just to see what was done)
line4
line3
line2
line1
line8
line7
line6
line5
line12
line11
line10
line9
line16
line15
line14
line13
line17
:wq     # Save and quit

আরও পড়া:


আপনি কি আপনার সমাধানটি আরও কিছুটা ব্যাখ্যা করতে পারেন?
ভ্যাপ্পোলিনারিও

3
@ ভ্যাপোলিনারিও, আমি আরও কিছু ব্যাখ্যা যুক্ত করেছি। এটা কি সাহায্য করে? :)
ওয়াইল্ডকার্ড

বাহ, খুব দীর্ঘ উত্তর। :) আমি সত্যই ফেলেছি, তবে আমি এটি স্রেফ একটি সহজ স্ক্রিপ্ট দিয়ে ব্যবহার করেছি যা আমি কোথাও খুঁজে পেয়েছি - সম্ভবত এই বোর্ডে - এটি ছিল আমার সমস্যার সমাধান। তবে, আমি যখন আপনার প্রস্তাবিত লাইনটি চালানোর চেষ্টা করেছি, তখন এটি বলেছে "'সেড' কোনও অভ্যন্তরীণ বা বাহ্যিক কমান্ড, অপারেবল প্রোগ্রাম বা ব্যাচ ফাইল হিসাবে স্বীকৃত নয়।" আমি নিশ্চিত না যে আমার ভিআইএম ফোল্ডারে বা কী কী লাগবে তা দরকার।
وړওয়াসিরিসওয়েলবা

1
@ablewasiereisawelba, যদি আপনি একটি উইন্ডোজ বক্স চলমান করছি এবং Cygwin (অথবা MobaXterm বা অনুরূপ) ব্যবহার না হয়, আপনি অন্যান্য পদ্ধতি আমি দিয়েছিলাম চেষ্টা করে দেখতে পারেন: 4G:.m -4 | +3m . | +2m . | +5<Enter>@:তারপর @@পুনরাবৃত্তি না হওয়া পর্যন্ত আপনার ফাইল সম্পূর্ণরূপে প্রক্রিয়াভুক্ত করা। যদিও আমি মোবাএক্সটার্ম ইনস্টল করার পরামর্শ দিচ্ছি। :)
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড ওহ ঠিক আছে, আমি এখন মোবাএক্সটারম পরীক্ষা করছি। :)
وړওয়াসিরিসওয়েলবা

7
:g/^/exe 'm .-' . substitute(line('.') % 4, '^0$', '4', '')

সরল ইংলিশ: প্রতিটি লাইনের জন্য, বর্তমান লাইনটিকে উপরে সরিয়ে দিন lnum % 4, যদি না হয় lnum % 4 == 0সেক্ষেত্রে বর্তমান লাইনটিকে উপরে সরিয়ে দিন 4

এছাড়াও, প্রতিটি nলাইনের বিপরীতে , 4উপরের কমান্ডের সাথে এর সাথে প্রতিস্থাপন করুন n


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