ভিম অনুসন্ধান বর্তমান (প্রকল্প) ফোল্ডারে সমস্ত ফাইল প্রতিস্থাপন করে


37

ভিম সম্পর্কে আমার একটি উন্মুক্ত প্রশ্ন হ'ল যদি বর্তমান প্রকল্পে কোনও অনুসন্ধান / প্রতিস্থাপন করার উপায় থাকে (অন্য সম্পাদকদের কাছ থেকে উত্তরাধিকার সূত্রে আমি এই ধারণাটি ব্যবহার করি তবে আমাকে সহ্য করুন)।

উদাহরণস্বরূপ, ধরে নেওয়া যাক যে আমি আমার প্রকল্পের ফাইলগুলি একটি পদ্ধতির নামের জন্য অনুসন্ধান করতে চাই এবং সেই পদ্ধতি কলের সমস্ত দৃষ্টান্তের নাম পরিবর্তন করে দিতে চাই।

এভাবেই আমি সাব্লাইমের সাথে এগিয়ে যেতে পারি।

এখানে চিত্র বর্ণনা লিখুন

ackবা অন্যান্য প্রোগ্রামের উপর নির্ভর না করে আপনি কীভাবে ভিমে (সম্ভবত ম্যাকভিম) এটি করবেন sed?

উত্তর:


35

এই কাজ করার বিভিন্ন উপায় আছে।

ভিতরে বর্তমান ডিরেক্টরি

আপনি যদি কোনও প্রকল্প ট্রিতে অনুসন্ধান / প্রতিস্থাপন করতে চান তবে আপনি ভিমের যুক্তি তালিকাটি ব্যবহার করতে পারেন ।

কেবলমাত্র Vim খুলুন এবং তারপরে :argsআর্গুমেন্টের তালিকাটি জনপ্রিয় করতে কমান্ডটি ব্যবহার করুন । আপনি একাধিক ফাইলের নাম বা এমনকি গ্লোবগুলিতে পাস করতে পারেন।

উদাহরণস্বরূপ, :args **/*.rbরুবি ফাইলগুলির জন্য বর্তমান ডিরেক্টরিটি পুনরাবৃত্তভাবে অনুসন্ধান করবে। লক্ষ্য করুন যে এটি ভিমের সাথে খোলার মতো vim **/*.rb। আপনি findচালিয়ে চালিয়ে বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের একটি তালিকা পেতে শেল কমান্ডটি ব্যবহার করতে পারেন :

:args `find . -type f`

আপনি :argsনিজেই চালিয়ে বর্তমান আরগস তালিকাটি দেখতে পারেন । আপনি যদি তালিকা থেকে ফাইলগুলি যুক্ত বা মুছতে চান তবে আপনি যথাক্রমে কমান্ডগুলি :argaddবা :argdeleteকমান্ডগুলি ব্যবহার করতে পারেন ।

একবার আপনি তালিকায় খুশি হয়ে গেলে এখন আপনি ভিমের শক্তিশালী :argdoকমান্ড ব্যবহার করতে পারেন যা আর্গুমেন্ট তালিকার প্রতিটি ফাইলের জন্য একটি কমান্ড চালায়::argdo %s/search/replace/g

এখানে অনুসন্ধানের জন্য কিছু টিপস (কয়েকটি মন্তব্যের ভিত্তিতে):

  1. আপনি যদি "foo" অনুসন্ধান করতে চান তবে "foo_bar" না চাইলে একটি শব্দ সীমা ব্যবহার করুন। সন্ধানী প্যাটার্নের আশেপাশে যেমন \<এবং নির্মাণগুলি ব্যবহার করুন \>::argdo %s/\<search\>/foobar/g
  2. /cআপনি যদি অনুসন্ধানের শব্দটি প্রতিস্থাপনের আগে ভিমকে নিশ্চিতকরণের জন্য জিজ্ঞাসা করতে চান তবে একটি অনুসন্ধান পতাকা ব্যবহার করুন ।
  3. /eআপনি যদি "প্যাটার্নটি খুঁজে পাইনি" ত্রুটিগুলি এড়িয়ে যেতে চান তবে একটি অনুসন্ধান পতাকা ব্যবহার করুন ।
  4. এছাড়াও আপনি অনুসন্ধান সম্পাদন পরে ফাইল সংরক্ষণ করার জন্য চয়ন করতে পারেন: :argdo %s/search/replace/g | update। এখানে, :updateব্যবহৃত হয় কারণ এটি কেবল যদি ফাইলটি পরিবর্তন করে তবে এটি সংরক্ষণ করবে।

ওপেন বাফার

আপনার যদি ইতিমধ্যে বাফার খোলা থাকে আপনি সন্ধান করতে / প্রতিস্থাপন করতে চান, আপনি ব্যবহার করতে পারেন :bufdo, যা আপনার বাফার তালিকার প্রতিটি ফাইলে ( :ls) তালিকা চালায় ।

কমান্ডটি খুব অনুরূপ :argdo: :bufdo %s/search/replace/g

অনুরূপ :argdoএবং উইন্ডো এবং ট্যাবগুলিতে যথাক্রমে :bufdoরয়েছে :windoএবং :tabdoএটি কাজ করে। সেগুলি প্রায়শই ব্যবহৃত হয় তবে এটি এখনও দরকারী।


4
/cবিকল্পগুলি নিশ্চিত করার জন্য পতাকাটি ব্যবহার করা সম্ভবত একটি ভাল ধারণা হতে পারে ।
রোমেনেল

3
আমি আংশিক শব্দ প্রতিস্থাপন এড়ানোর জন্য শব্দ সীমানা \<এবং এর \>আশেপাশে ব্যবহার করার পরামর্শ দেব recommend search
tommcdo

1
অন্য একটি মন্তব্য হ'ল ভিআইএম এর কার্যকরী ডিরেক্টরিটি ডিফল্টরূপে যেখানে আপনি ভিএম শুরু করেছিলেন বর্তমান ফাইলের ডিরেক্টরি নয়। আপনি ব্যবহার করে বর্তমান ফাইলে ওয়ার্কিং ডিরেক্টরিটি সেট করতে পারেন :cd %:p:h। অন্যান্য কর্মক্ষম ডিরেক্টরি বিকল্পগুলি vim.wikia.com/wiki/Set_working_directory_to_t__current_file এ তালিকাভুক্ত করা হয়েছে ।
স্টাডিজিক

30

ধরা যাক আমাদের মতো একটি সাধারণ প্রকল্প কাঠামো রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

ग्रीटिंग.টেক্সট দেখে মনে হচ্ছে

এখানে চিত্র বর্ণনা লিখুন

এবং তথ্য / age.txt এর মত দেখাচ্ছে

এখানে চিত্র বর্ণনা লিখুন

ধরা যাক আমরা বমের সাথে স্যামের সমস্ত ঘটনা প্রতিস্থাপন করতে চাই। এখানে আমরা কী করব:

  1. কাজের ডিরেক্টরি সেট করুন

    নিশ্চিত করুন যে ভিমের বর্তমান চলমান ডিরেক্টরিটি প্রকল্পের মূল (এটি কীভাবে এটি করবেন তা আপনাকে দেখায় না)।

  2. 'স্যাম' যুক্ত ফাইলগুলি সন্ধান করুন

    প্রকল্পের মধ্যে স্যামের সমস্ত উপস্থিতি সন্ধান করতে ভিমের ভিমগ্রিপ কমান্ডটি ব্যবহার করুন (দ্রষ্টব্য: **/*সমস্ত ফাইলগুলিতে পুনরাবৃত্তভাবে অনুসন্ধানগুলি)

    :vimgrep /Sam/gj **/*
    

    এটি স্যামের সমস্ত দৃষ্টান্ত সহ কুইকফিক্স তালিকাটি তৈরি করবে। আপনি যদি কুইকফিক্স তালিকাটি দেখতে চান তবে আপনি Vim কমান্ডটি ব্যবহার করতে পারেন:copen এখানে চিত্র বর্ণনা লিখুন

  3. 'স্যাম' ধারণ করে এমন সমস্ত ফাইলের পরিবর্তে

    এখন আমরা কুইকফিক্স তালিকার প্রতিটি ফাইলের মধ্যে ভিমের বিকল্প কমান্ডটি চালাতে চাই। আমরা :cfdo {cmd}কমান্ডটি ব্যবহার করে এটি করতে পারি যা কুইকফিক্স তালিকার প্রতিটি ফাইলের {সেমিডি} নির্বাহ করে। আমরা যে নির্দিষ্ট {সেমিডি use ব্যবহার করতে চাই তা হ'ল substituteবা sসংক্ষেপে। সম্পূর্ণ লাইন দেখতে হবে:

    :cfdo %s/Sam/Bob/g
    

    আপনি যদি চান তবে সমস্ত প্রতিস্থাপনের বিষয়টি নিশ্চিত করতে আপনি সি পতাকা যুক্ত করতে পারেন:

    :cfdo %s/Sam/Bob/gc
    
  4. সমস্ত ফাইল সংরক্ষণ করুন

    :cfdo update
    

2
আমি এই আরও পছন্দ করি। এটি সহজ, এবং আ্যাক (বা কোনও প্লাগইন যা কুইকফিক্স উইন্ডোকে জনপ্রিয় করে) এর সাথে কাজ করে।
জুহাইব

1
এটি দুর্দান্ত উত্তর
17

2
"শেষ পরিবর্তনের পর থেকে কোনও cfdo %s/Sam/Bob/g | update
লেখাই

@ হাকুনিন আমি ইতিমধ্যে এটি না করে থাকলে hiddenবিকল্পটি সেট করার পরামর্শ দেব :set hidden
নিকো বেলিক

3

ভিআইএম সমাধান না হলেও, আপনি যদি ষষ্ঠ / ভিআইএম ব্যবহার করে থাকেন তবে আপনার পক্ষে সিএলআই সমাধান ব্যবহার করা আরও সহজ হতে পারে। বর্তমান ডিরেক্টরিতে সমস্ত ফাইল পরিবর্তন করতে, perlএটি যেমন পরিস্থিতির জন্য তৈরি হয়েছিল তেমনটি ব্যবহার করুন:

$ perl -pi -e 's/foo/bar/g' *

আপনি সাবডিরেক্টরি খুব এটা করতে প্রয়োজন হয়, তাহলে আমি সাধারণত পেয়ার perlসঙ্গে find:

$ find . -name '*' -print0 | xargs -0 perl -pi -e 's/foo/bar/g'

এটি সম্পর্কে দুর্দান্ত জিনিসটি হ'ল আপনি সহজেই তালিকাটিকে নির্দিষ্ট ফাইল প্রকারে আরও পরিমার্জন করতে পারেন। উদাহরণস্বরূপ, পাইথন ফাইলগুলিতে সীমাবদ্ধ রাখার জন্য:

$ perl -pi -e 's/foo/bar/g' *.py
$ find . -name '*.py' -print0 | xargs -0 perl -pi -e 's/foo/bar/g'

1

অন্যটির সাথে বাক্যাংশটি প্রতিস্থাপন করতে আপনি ভিম এক্স মোড ব্যবহার করতে পারেন।

উদাহরণস্বরূপ ( exএটির নাম vim -E):

$ ex -s +'bufdo!%s/foo/bar/g' -cxa *.*

পুনরাবৃত্তভাবে ব্যাশ / জেডএসে ( globstarসেট সহ, যেমন shopt -s globstar):

$ ex -s +'bufdo!%s/foo/bar/g' -cxa **/*.*
$ ex -s +'n **/*.*' +'bufdo!%s/foo/bar/g' -cxa

পুনরাবৃত্তির সাথে ( findলুকানো ফাইলগুলি যেমন ফাইল ব্যবহার এবং উপেক্ষা করুন .git):

$ find . -type f -not -path '*/\.*' -exec ex -s +'bufdo!%s/foo/bar/g' -cxa {} "+"

দ্রষ্টব্য: :bufdoকমান্ডটি পসিক্স নয় ।

দ্রষ্টব্য: সিনট্যাক্স -not -path '*/\.*'লুকানো ফাইলগুলি উপেক্ষা করতে ব্যবহৃত হয় (যেমন .git)।



0

এখানে শেল কমান্ডটি ব্যবহার করে findএবং exসম্পাদক ( ব্যবহার:bufdo না করে ):

find . -name '*.rb' -exec ex +'%s/foo/bar/ge' -V1 -scwq! {} ';'

এই ইচ্ছার সম্পাদন করা সব জায়গা *.rbবর্তমান ফোল্ডার (যাও recursively) ফাইল ও প্রতিস্থাপন fooসঙ্গে bar

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