ভিম: এস একটি লাইনে প্রথম এন <g টি ইভেন্টগুলি প্রতিস্থাপন করুন


13

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

a a a a a

প্রতি

b b b a a

আমি জানি আমি ব্যবহার করতে পারি :s/a/b/[enter]:[up][enter]:[up][enter], তবে এটি তিনটি পুনরাবৃত্তিতে যথেষ্ট ক্লান্তিকর, আমার সম্ভাব্য 10+ বিকল্পের সাথে লাইন রয়েছে।
আমি চেষ্টা করেছিলাম:

  • :s/a/b/3g: ভিম অনুশীলনের চরিত্রগুলির অভিযোগ করেছে।
  • :s/a/b/3: এটি এবং নিম্নলিখিত দুটি লাইনে প্রথম উপস্থিতি পরিবর্তন করে।
  • 3:s/a/b: আগের মত
  • :s/a/b/g3: এটি এবং পরবর্তী দুটি লাইনে সমস্ত উপস্থিতি পরিবর্তন করে।
  • :3s/a/b: লাইন 3 এ প্রথম ঘটনাটি পরিবর্তন করে।
  • :/a/,3/a/s/a/b: ফাইলটিতে থাকা পরবর্তী aএবং তৃতীয় লাইনের মধ্যে প্রতিটি লাইনের প্রথম উপস্থিতি পরিবর্তন করে a(প্রয়োজনীয় হলে বিপরীতে প্ররোচিত)।
  • :/a/,/\([^a]*a\)\{3\}/s/a/b/: প্রতিটি লাইনটির মধ্যে প্রথমটি উপস্থিতি পরিবর্তিত aকরে এটির পরবর্তী লাইনটিতে 3 টি দিয়ে (এবং এটি কোনও বহু-চরিত্রের অনুসন্ধানে সহজেই বর্ধিত হত না)।

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

কেউ কি করতে পারে জানেন?

(নির্দিষ্ট পরিসরের জন্য বোনাস পয়েন্ট, যেমন চতুর্থ ঘটনার মধ্য দিয়ে দ্বিতীয়)


2
আমি নিশ্চিত যে আপনি এটি ভিমে করতে পারবেন না, তবে এটিকে কম ক্লান্তিকর করতে, আপনি কি "এন" এবং "সম্পর্কে জানেন?" ভিজ্যুয়াল মোডে? এটি হ'ল, আপনি / প্যাটার্ন / জিনিসটি পরিবর্তন করতে সন্ধান করতে, "সিডাব্লু" ব্যবহার করে এটি পরিবর্তন করুন বা যাই হোক না কেন, পরবর্তী প্যাটার্নটি সন্ধান করতে "এন" (শুধু এন, কোনও উদ্ধৃতি) ব্যবহার করুন এবং "চাপুন"। (কেবলমাত্র সময়কাল, কোনও উদ্ধৃতি) শেষ সম্পাদনাটি সম্পাদন করতে।
ব্রুস এডিগার

@ ব্রুসএইডিগার সম্পর্কে আমি জানতাম nএবং .যদিও আমি সেগুলি এখানে ব্যবহার করার কথা ভাবিনি। অবশ্যই একটি উন্নতি, ধন্যবাদ।
কেভিন

s/a/=something/কৌশলটি করা উচিত ( :help sub-replace-=)। আমি somethingব্যাটে ডানদিকে লিখতে যথেষ্ট সাবলীল নই ।
গিলস 'দু: খিত হওয়া বন্ধ করুন'

দ্রষ্টব্য: এর :[up][enter]সাথে প্রতিস্থাপন করা যেতে পারে &, যা এখনও আদর্শ নয় তবে অন্তত কম বেদনাদায়ক is
কোহ

উত্তর:


10

উপর নির্মাণের :s/pattern/replacement/gc ধারণা Samus_ থেকে , একটি একক লাইন 4 র্থ ঘটনার মাধ্যমে 2nd প্রতিস্থাপন (যা মনে হয় সহজ উপায় সঠিক অপারেশন যখন প্যাটার্ন প্রতিস্থাপন স্ট্রিং মধ্যে অন্তর্ভুক্ত করা হয় তা নিশ্চিত হতে):

:call feedkeys("nyyyq") | s/pat/string/gc

feedkeys()একটি ফাংশন যা ইনপুট স্ট্রিংটি কীবোর্ড ইনপুট কাতারে স্টাফ করে। মোদ্দা কথাটি হল গণনাটি সামনে করা যাতে আপনাকে গণনা হারাতে বা বাধাগ্রস্ত হওয়ার বিষয়ে চিন্তা করতে হবে না।

আরও সাধারণ ক্ষেত্রে, একটি বৃহত্তর এম এর চেয়ে বড় বা তার সমান N এর জন্য একটি এক লাইনে Nth সংঘটনগুলির মাধ্যমে Mth প্রতিস্থাপন করতে :

:call feedkeys(repeat("n", M-1) . repeat("y", N-M+1) . "q") | s/pat/string/gc

এম এবং এনকে আপনার যে মানগুলি চান তা প্রতিস্থাপন করুন (আপনি vimনিজেরাই না করতে চাইলে আপনি তুচ্ছ মানসিক পাটিগণিতও করতে দিতে পারেন)। দ্রষ্টব্য যে .VimL এর স্ট্রিং কনক্যাটেনশন অপারেটর। স্পষ্টতই এটি কেবল বড় এম এর জন্য কীস্ট্রোকগুলি সংরক্ষণ করে । আপনি যদি এই ঘন ঘন কার্যকারিতাটি ব্যবহার করেন তবে এটি টাইপ করা বেশ কিছুটা হওয়ায় আপনার উপরের কোনও কাস্টম কমান্ড বা কোনও ধরণের ক্রিয়াকলাপে রাখতে সময় সাশ্রয় করতে পারে।


হুম। আমার এটা ভাল লেগেছে. আমারও এটির জন্য একটি ফাংশন লিখতে সক্ষম হওয়া উচিত।
কেভিন

8

প্রথম প্রশ্নের জন্য আমি করব:

:s/a/b
&&

দ্বিতীয়টি কৌতুকপূর্ণ, এটি স্বয়ংক্রিয়ভাবে করার কোনও উপায় আমি জানি না তবে আপনি প্রতিটি ম্যাচে ভিএম আপনাকে অনুরোধ করতে পারেন:

:s/a/b/gc

তারপরে আপনি প্রথম এন ম্যাচে "না" এবং অন্যকে "হ্যাঁ" জবাব দিন।


হুম, আমি ভুলে গিয়েছিলাম c, এটি এখনও প্রস্তাবিত সেরা সমাধান হতে পারে। আমার এখনও গণনা করতে হবে তবে আমি মনে করি এটি প্রথম বিকল্প যা প্রতিস্থাপনের সাথে কাজ করবে যা অনুসন্ধানের স্ট্রিং রয়েছে।
কেভিন

6
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a

:3,6g/^/let i=0 | while i<3 | s/a/b/ | let i+=1 | endwhile

a a a a a
a a a a a
b b b a a
b b b a a
b b b a a
b b b a a
a a a a a

1
এটি ভাল, তবে এটি এখনও গিলস নির্দেশিত সমস্যাটি সহ্য করে (অন্য পোস্টে, যা সম্ভবত মুছে ফেলা হয়েছে বলে মনে হয়) যে প্রতিস্থাপনের প্যাটার্নটি না থাকলে কেবল এটিই কাজ করে। যদিও আমি স্ক্রিপ্টিং ধারণাটি পছন্দ করি।
কেভিন

সৌন্দর্যের জিনিস!
বিশপ

1

আমি মনে করি এটি কাজ করে, প্রথমে প্রতিস্থাপন করতে পারে, এবং ২ বার পুনরাবৃত্তি করবে:

:s/a/b/
2@:
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.