আমি কীভাবে চালাতে পারি: লাইনটির কেবলমাত্র অংশে প্রতিস্থাপন করতে হবে এবং এর সবগুলিই নয়?


15

আমার এই মত একটি লাইন আছে:

function my_function(argument, another argument, but there are spaces)

আমি স্পেস অক্ষরগুলি (আর্গুমেন্টের নামের ভিতরে) আন্ডারস্কোর দিয়ে প্রতিস্থাপন করতে চাই। আমি এইভাবে ব্যবহার করতে চাই:

:s/\ /_/g

তবে আমি কীভাবে এটি পুরো লাইনে প্রয়োগ না করে বেছে নিতে পারি, তবে বলুন, কার্সারের অবস্থান থেকে শুরু করে? (বা তৃতীয় শব্দ)?


4
একটি রেজেক্সে, বর্তমান কার্সার অবস্থানটি বর্ণনা করতে আপনি পরমাণুটি ব্যবহার করতে পারেন \%#। সুতরাং, আপনি ব্যবহার করতে পারে: :s/\v(%#.*)@<= /_/g। যা @<=কার্সার অবস্থানের পরে ( ) অক্ষরের পূর্বে স্থান হিসাবে বর্ণনা করা যেতে পারে ।
ব্যবহারকারী 9433424

1
আপনি এবং স্ট্যাটক্স দুজনেই কৌশলটির প্রস্তাব করেছিলেন \%#, আপনি যদি একটি উত্তর না লিখে থাকেন তবে আমি তার উত্তরটি মেনে নেব ... তবে আপনি উভয়েই কি আরও কিছুটা স্পষ্ট করে রেজিএক্সএক্সকে ব্যাখ্যা করতে পারবেন?
ফেফ

উত্তর:


15

আপনি নিম্নলিখিত সমাধানটি ব্যবহার করতে পারেন:

v$কার্সার থেকে রেখার শেষ পর্যন্ত পাঠ্য নির্বাচন করতে প্রথমে ব্যবহার করুন। তারপরে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

:s/\%V\ /_/g

\%Vপূর্বে চাক্ষুষরূপে নির্বাচিত এলাকার টেক্সট পরিবর্তন করতে নির্দেশ দেখুন :h /\%V

আমি যদি আপনার উদাহরণ নিই:

function my_function(argument, another argument, but there are spaces)

যদি আমার কার্সারটি 40 তম কলামে থাকে এবং আমি সবে লিখেছিলাম যে কমান্ডটি পেয়েছি তা ব্যবহার করি:

function my_function(argument, another argument,_but_there_are_spaces)

আপনার মন্তব্যের উত্তরে আপনিও ব্যবহার করতে পারেন

  • \%# যা কার্সার অবস্থান থেকে মেলে
  • \%>23c যা 23 তম কলামের পরে মেলে।
  • \%>'m যা একটি চিহ্নের অবস্থানের পরে মেলে

দেখুন :h /\%#, :h /\%>cএবং :h /\%>'m

@ User9433424 \%#তার মন্তব্যে ব্যবহারের জন্য একটি উপায় দিয়েছেন । চিহ্নযুক্ত প্যাটার্নের জন্য আপনি এটি বুদ্ধি সেট করতে পারেন maএবং তারপরে ব্যবহার করতে পারেন:

:s/\%>'a /_/g

@ ব্যবহারকারী9433424 দ্বারা প্রদত্ত প্যাটার্নটির ব্যাখ্যা নিম্নলিখিত:

:s/\v(%#.*)@<= /_/
:s/                    substitution command
   \v                  Enable the very magic mode
      %#.*             Any characters from the cursor position
           @<=         Check for matches just before what follows
              space    Followed by a space
               /_/     Substitute the matches by underscores

আপনি দেখতে চান :h \vএবং:h /\@<=


এটা ঠিক কাজ করে! তবে আমি ভিজ্যুয়াল নির্বাচনের ক্ষেত্রে সত্যিই অভ্যস্ত নই এবং পুরো প্রক্রিয়াটি কিছুটা "ভারী" বলে মনে হচ্ছে ... আপনি কি মনে করেন যে আরও দ্রুত কিছু হতে পারে?
ফেফ

হ্যাঁ আমাকে আমার উত্তরটি আপডেট করতে দিন :)
স্ট্যাটক্স

User9433424 এই ইঙ্গিতটি আপনার ঠিক আগে দিয়েছিল, তবে আপনি উত্তর দিয়েছিলেন তাই আমি যদি আপনার উত্তরটি গ্রহণ করতে যাচ্ছি তবে তা ঠিক আছে - আপনি কি সম্ভবত আরও কিছু ব্যবহার করেছেন এমন রেজপ্লেক্স প্যাটার্নটি ব্যাখ্যা করতে পারেন? আমি এখনও এ নিয়ে লড়াই করছি ...
ফেফ

আমি উত্তরটি যথাসম্ভব স্পষ্ট করার চেষ্টা করেছি তবে @ ব্যবহারকারী9433424 যদি নিজের উত্তরটি লিখেন তবে তা গ্রহণ করতে দ্বিধা করবেন না।
স্ট্যাটক্স

1
Regexp খুব সুন্দর ব্যাখ্যা, আপনাকে ধন্যবাদ! এবং যার উত্তর গ্রহণ করতে হবে সে সম্পর্কে আপনার মন্তব্যের জন্য ধন্যবাদ :)
ফেফ

5

:h \@<=পূর্ববর্তী '(', এবং একটি শব্দ-শেষ সীমানা ( :h \>) রয়েছে তা নিশ্চিত করতে আপনি যেখানে চান সেখানে প্রতিস্থাপন হয়েছে কিনা তা নিশ্চিত করতে আপনি পিছনে ( ) দেখুন ব্যবহার করতে পারেন ।

সুতরাং, পাঠ্য সহ:

function my_function(argument, another argument, but there are spaces)

কমান্ড চালাচ্ছি:

:s/\((.*\)\@<=\> /_/g

উত্পাদন করবে:

function my_function(argument, another_argument, but_there_are_spaces)

প্রতিবার কার্সারের অবস্থানের চেয়ে এটি আরও সহজ হতে পারে, তবে প্রতিস্থাপনের ক্ষেত্রে সর্বদা একটি পরিচিত পয়েন্ট থাকে।


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