কীভাবে ভিমে ভেরিয়েবলের নাম দ্রুত পরিবর্তন করবেন?


97

আমি প্রচুর সি এবং পার্ল কোডের একাধিক একক বর্ণের ভেরিয়েবলের নাম সহ পড়তে ভিম ব্যবহার করছি।

কোডটি পড়ার প্রক্রিয়া চলাকালীন কোনও ভেরিয়েবলের নামটি আরও অর্থবহ কিছুতে পরিবর্তন করার জন্য কিছু আদেশ দেওয়া ভাল হবে, যাতে আমি এর বাকীগুলি আরও দ্রুত পড়তে পারি।

ভিমে কিছু আদেশ আছে যা আমাকে তাড়াতাড়ি করতে দেয়?

আমি মনে করি না রেজেক্সিসগুলি কাজ করবে কারণ:

  1. একই একক বর্ণের নামের বিভিন্ন স্কোপিং ব্লকে বিভিন্ন উদ্দেশ্য থাকতে পারে; এবং

  2. অক্ষরের একই সংমিশ্রণটি আর কোনও চলক নাম, একটি স্ট্রিং আক্ষরিক বা কোনও মন্তব্যের অংশ হতে পারে।

কোন জ্ঞাত সমাধান আছে?

উত্তর:


200

নিম্নলিখিত সুযোগটি কীভাবে কোনও চলকের নাম পরিবর্তন করতে হয় যা বর্তমান স্কোপে সংজ্ঞায়িত হয় {}

আপনার কার্সারটি ভেরিয়েবল ব্যবহারে সরান। টিপুন gd। যার অর্থ - সংজ্ঞাটি সংজ্ঞাটিতে সরান। এখন টিপুন [{- এটি আপনাকে সুযোগের দিকে নিয়ে আসবে। টিপুন V- ভিজ্যুয়াল লাইন নির্বাচন চালু হবে। টিপুন %- বিপরীতে লাফিয়ে যাবে }এইভাবে পুরো সুযোগটি নির্বাচন করবে। :s/বিকল্প কমান্ড শুরু - টিপুন । <C-R>/- পরিবর্তনশীল নামের সাথে মেলে এমন প্যাটার্নটি প্রবেশ করানো হবে (চাপ দেওয়ার আগে আপনি সেই নামটি রেখেছিলেন gd)। /newname/gc<CR>- অনুসন্ধান শুরু করবে এবং প্রতিটি ম্যাচে নিশ্চিতকরণের সাথে প্রতিস্থাপন করবে।

এখন আপনাকে একটি ম্যাক্রো বা আরও ভাল রেকর্ড করতে হবে - একটি কী মানচিত্র করুন।

এখানে চূড়ান্ত ম্যাপিংস রয়েছে:

" For local replace
nnoremap gr gd[{V%::s/<C-R>///gc<left><left><left>

" For global replace
nnoremap gR gD:%s/<C-R>///gc<left><left><left>

.vimrcএটি আপনার রাখুন বা কেবল সম্পাদন করুন। এর পরে grস্থানীয় ভেরিয়েবলের উপর চাপ দেওয়ার পরে আপনাকে :sকমান্ড এনে দেওয়া হবে যেখানে আপনাকে কেবল প্রবেশ করতে হবে new_variable_nameএবং টিপতে হবে Enter


40
আমার আরও আগে জানা উচিত ছিল 5 টিরও বেশি নতুন ভিম ট্রিকস শেখার জন্য +1। ধন্যবাদ
কেনি মায়ার

6
দ্রষ্টব্য: জিডি ম্যাকভিমে জাভাস্ক্রিপ্ট মোডে সংজ্ঞাটির তাত্ক্ষণিক স্কোপটিতে ভেরিয়েবলটি সনাক্ত করতে কাজ করে না। এটি ফাইলের কোনও ফাংশনে ভেরিয়েবল নামের প্রথম ব্যবহারে আমাকে নিয়ে যায় :( আপনি যদি কিছু স্কোপের মধ্যে থাকেন এবং সেই সুযোগটি নির্বাচন করতে চান তবে "ভ্যা {" - "ভিজ্যুয়াল নির্বাচন প্রায় around" - যাওয়ার উপায় আমি ভাবি।
শ্রীকুমার

4
কিছুটা উন্নত সংস্করণ: gist.github.com/048616a2e3f5d1b5a9ad ব্যবহারকারীকে অনুরোধ জানায়, পুরানো নাম দেখায়, প্রতিস্থাপনের পরে কার্সারের অবস্থান পুনরুদ্ধার করে
অ্যান্ডি রে

7
+1 খুব ভাল ভিমিনিনিয়ারিং (আমার মনে হয় আমি একটি নতুন শব্দটি তৈরি করেছি)। দ্রষ্টব্য: আমার আসলে :দুটি বার কোলন ( ) চাপতে হবে । আমি প্রথমবার এটি চাপলাম, আমি দেখলাম :'<,'>। আমি যদি s/সেখান থেকে টাইপ করি তবে এটি কার্যকর হয়নি; আমাকে এর আগে আরেকটি কোলন টাইপ করতে হয়েছিল s/
কেলভিন

6
নোট করুন আপনার <C-R>বিকল্প কমান্ডে দরকার নেই, সন্ধানটি বাদ দেওয়া কেবলমাত্র ভিএমকে সর্বশেষ অনুসন্ধান করা প্যাটার্নটি ব্যবহার করবে, যা এই ক্ষেত্রে gdকমান্ড থেকে তৈরি হয়েছিল । সুতরাং সহজভাবে করা :s//<newname>/gcযথেষ্ট হবে।
শানজিশিয়াও

12

আমি জানি এটি একটি পুরানো প্রশ্ন, এবং @ মাইকোলা-গোলুয়েভের উপায়টি অবশ্যই ওপি প্রশ্নের নির্দিষ্ট মামলার সেরা উত্তর (যা আমি ধারণা করি যে অবিকৃত কোডের মধ্য দিয়ে চলছে যেখানে আপনার একই বর্ণের একাধিক ব্লক থাকার সম্ভাবনা রয়েছে) ; তবে গুগল অনুসন্ধান থেকে এখানে আসা অনেক লোক সম্ভবত ভিআইএম-এ ভেরিয়েবলের নাম পরিবর্তন করার জন্য খুব কম পরিস্থিতি-নির্দিষ্ট উপায়গুলির সন্ধান করে - এবং এগুলি আরও সংক্ষিপ্ত হতে পারে

কেউ এ জাতীয় পরামর্শ দেয় না:

* :s// নতুন নাম /gc

*একই হিসাবে gnএটা কার্সার অধীনে শব্দের পরবর্তী occurence জন্য অনুসন্ধান এবং গত অনুসন্ধান প্যাটার্ন হয়ে সুতরাং যখন আপনি বিকল্প কমান্ড এ অনুসন্ধান প্যাটার্ন বর্জন, VIM অনুমান এই প্যাটার্ন জন্য অনুসন্ধান করতে হয়, -।

স্বল্প পরিমাণে কপির জন্য, আরও তত দ্রুত:

* cw NEWNAME <esc> এরপরে n.অন্যান্য উপস্থিতির জন্য পুনরাবৃত্তি করুন

উপস্থিতি অনুসন্ধান করুন, শব্দ পরিবর্তনেরcw জন্য আদেশ হ'ল , সর্বশেষ অনুসন্ধানকৃত শব্দটির পরবর্তী ঘটনাতে গিয়ে শেষ কমান্ডটি পুনরাবৃত্তি করে (যা শব্দটিকে নতুন নাম পরিবর্তন করে )n.

(এই সমস্ত কিছু জানতে পেরে আমার ক্রেডিটগুলি রেডডিতে @ ডুমডবুনিগুলিতে যায় )

আর একটি দুর্দান্ত কৌশলটি হ'ল ( ক্রেডিটগুলি @ নোবে ৪ )

* cgn NEWNAME <esc> এরপরে .অন্যান্য উপস্থিতির জন্য পুনরাবৃত্তি করুন

cgn"" ফলাফল যা হয় পরিবর্তন করুন (পরবর্তী ঘটনাটি সন্ধান করুন) "। এখন এটি সর্বশেষ আদেশ হ'ল , আপনার nপরবর্তী ইভেন্টে যাওয়ার দরকার নেই, আবার কম স্ট্রোক করা উচিত এবং আরও গুরুত্বপূর্ণ, বিকল্প nএবং করার দরকার নেই .। তবে, স্পষ্টতই, এই ঘটনাকে এড়িয়ে যাওয়ার কোনও উপায় না রাখার একটি অপূর্ণতা রয়েছে।

এখানে কিছু সুবিধা রয়েছে:

  • কোনও ম্যাপিং, কোনও .vimrc (বা init.vim) নেই, তাই আপনি যে কোনও ভিআইএম অনুলিপিটি ব্যবহার করতে পারেন তা ব্যবহার করতে পারেন (উদাহরণস্বরূপ কিছু ভিপিএস বা আপনার বন্ধুর মেশিনে একটি দ্রুত কাজ যেখানে ভিআইএমকে আপনার উপায়টি কনফিগার করা 'চটজলদি' উদ্দেশ্যকে পরাভূত করবে) )
  • শব্দ নির্বাচন *বা ব্যবহারের gnজন্য নির্বাচন খুব দ্রুত - কেবল একটি কীস্ট্রোক (ভাল, আসুন 1.5 বলুন)
  • ব্যবহার করে *বা gnনিশ্চিত করে যে আপনি অন্য শব্দের মধ্যে কোনও মিল খুঁজে পাবেন না ঠিক :%s/<C-R>//gcতেমনভাবে। :%s/\<OLDNAME\>/NEWNAME/gcহাত দিয়ে টাইপ করা বেটস : আমি ব্যক্তিগতভাবে \<কেবল শব্দগুলিতে ম্যাচগুলিকে সীমাবদ্ধ করতে জিনিসগুলি ব্যবহার করতে ভুলে যাই ।
  • সুযোগ ব্যবহার না করার ফলে nঅযাচিত ম্যাচগুলি এড়াতে কেবল কয়েকটি অতিরিক্ত স্ট্রোক হবে - সুযোগটি সীমাবদ্ধ করার জন্য অতিরিক্ত স্ট্রোকের চেয়ে সম্ভবত কম। সাধারণ ত্রুটিযুক্ত পরিস্থিতিতে, আপনার ভেরিয়েবলগুলি সম্ভবত কিছুটা হলেও কোনও নির্দিষ্ট কোড ব্লকে স্থানীয়ভাবে স্থানান্তরিত হয়।

10

আফাইক, ভিআইএম-তে সত্যিকারের রিফ্যাক্টরিং সমর্থন নেই। রিফ্যাক্টরের অভিপ্রায় নিয়ে পুনর্নামকরণ করার সময় আমি সাধারণত নিম্নলিখিত সতর্কতা অবলম্বন করি:

  1. আমার ব্যবহার চিহ্নগুলি পরিবর্তনের সুযোগ সীমাবদ্ধ করুন।
  2. রেজেক্সে প্রবেশের সময়, \ <এবং> দিয়ে নামটি বন্ধন করুন। এটি একে পুরো শব্দের সাথে মিলিয়ে দেবে যা ঘটে যাওয়া ভুল নামগুলির প্রকারকে হ্রাস করে।
  3. খারাপ প্রতিস্থাপনের সম্ভাবনা কমাতে মাল্টলাইন প্রতিস্থাপন করবেন না
  4. কোডটি যদি খুব ছোট পরিবর্তন ব্যতীত অন্য কিছু হয় তবে সাবধানতার সাথে দেখুন।

আমার শেষ পরিবর্তনটি এরকম দেখাচ্ছে

:'a,'bs/\<foo\>/bar

আমি ভিআইএমের জন্য একটি রিফ্যাক্টরিং সরঞ্জাম না হওয়া সম্পর্কে ভুল হতে চাই তবে এটি আমি দেখিনি।


পার্লে আপনি অনুসন্ধানের ধরণে প্রকারটি যুক্ত করতে পারেন। যেমন sc স্কেলারের জন্য, @ অ্যারেগুলির জন্য, হ্যাশগুলির জন্য%
নাথান ফেলম্যান

@ নাথান: দুর্ভাগ্যক্রমে, পার্ল (5.X) এ এটি আরও কিছুটা জটিল, কারণ ব্যবহারের সাথে অ্যারে এবং হ্যাশগুলির পরিবর্তন রয়েছে:% হ্যাশ -> পুরো হ্যাশ, $ হ্যাশ {কী} -> একক মান, @ হ্যাশ { qw / ab /} হ্যাশ স্লাইস sl
ব্যবহারকারী 55400

9

এটি আপনার .vimrc এ রাখুন

" Function to rename the variable under the cursor
function! Rnvar()
  let word_to_replace = expand("<cword>")
  let replacement = input("new name: ")
  execute '%s/\(\W\)' . word_to_replace . '\(\W\)/\1' . replacement . '\2/gc'
endfunction

সাথে কল :call Rnvar()

expand("<cword>")শব্দটি কার্সারের নিচে পেয়ে যায়। অনুসন্ধান স্ট্রিং ব্যবহার %ফাইল-স্কোপ জন্য, এবং \(\W\)নিদর্শন শব্দ প্রতিস্থাপন করতে সীমানা অ শব্দ অক্ষরের জন্য চেহারা এবং তাদের ভেরিয়েবল সংরক্ষণ \1এবং \2তাই হিসাবে প্রতিস্থাপন প্যাটার্ন পুনরায় ঢোকানো যাবে।


3

আপনি বিশ্বব্যাপী অনুসন্ধানে 'সি' সংশোধক ব্যবহার করতে পারেন এবং প্রতিস্থাপন করতে পারেন যা প্রতিটি প্রতিস্থাপনের জন্য আপনাকে নিশ্চিত করার জন্য জিজ্ঞাসা করবে। এটি বেশি সময় নিতে পারে তবে এটি অ-হুমংস কোড ফাইলের জন্য কাজ করতে পারে:

%s/\$var/\$foo/gc

সি নিশ্চিতকরণের জন্য দাঁড়িয়েছে।


আমি উপেক্ষা-কেস জন্য দাঁড়িয়েছে। আপনি সি চান, প্রতিটি পরিবর্তন নিশ্চিত করুন।
মাইকেল ক্রিস্টোফিক

ওহো .. সে সম্পর্কে দুঃখিত .. উত্তর স্থির করে
আদনান

উত্তর এখনও সম্পূর্ণরূপে স্থির হয়নি;)
ব্যবহারকারী 55400

তুমি কি পালিয়ে এসেছ? এটি এমন কিছু যা আমার ব্যক্তিগত পছন্দ। escape রেহেক্স ওয়ার্ল্ডে এবং ভিআই এর সাথে এবং এর থেকে এবং রেহেক্স ছাড়াও কাজ করে এবং এর বিশেষ অর্থ রয়েছে, আমি কেবল স্পষ্টতার জন্য এড়াতে চাই।
আদনান

0

সি তে, আপনি সিস্কোপ ব্যবহার করে কিছু অগ্রগতি করতে সক্ষম হতে পারেন। এটি সিনট্যাক্স বোঝার চেষ্টা করে, তাই চিঠিটি কখন পরিবর্তনশীল ছিল তা জানার সুযোগ থাকবে।


0

এটি যদি একাধিক ফাইল জুড়ে থাকে তবে আপনি সেডের দিকে নজর দিতে পারেন। প্রতিস্থাপনের জন্য আপনার ফাইল এবং xargs প্লাস সেড দখল করতে অনুসন্ধান ব্যবহার করুন। বলুন যে আপনি সমস্ত ফাইল *। সি এর সাথে a_better_name দিয়ে একটি প্রতিস্থাপন করতে চান, আপনি এটি করতে পারেন

অনুসন্ধান . -নাম "* .সি" | xargs sed -i -e 's / a / a_better_name / g'

মনে রাখবেন যে এটি একটি এর সমস্ত উপস্থিতি প্রতিস্থাপন করবে, তাই আপনি আরও শক্তিশালী রেজেক্স চাইতে পারেন।

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