Vim অনুসন্ধান করুন এবং নির্বাচিত পাঠ্য প্রতিস্থাপন করুন


109

ধরা যাক আমাদের একটি পাঠ্য রয়েছে এবং আমি ভিজ্যুয়াল মোডে প্রবেশ করি এবং কিছু পাঠ্য নির্বাচন করি। আমি কীভাবে দ্রুত হাইলাইট করা পাঠ্যের জন্য অনুসন্ধান করব এবং এটিকে অন্য কিছু দিয়ে প্রতিস্থাপন করব?

উত্তর:


135

নিম্নলিখিতগুলি সম্পাদন করার চেষ্টা করুন বা আপনার মধ্যে প্রবেশ করান .vimrc

vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>

ভিজ্যুয়াল মোডে ctrl+ টিপে rআপনি প্রতিস্থাপন করতে পাঠ্য প্রবেশের অনুরোধ জানানো হবে। enterআপনি যে প্রতিটি পরিবর্তনের সাথে সম্মত হন yবা স্বীকার করেন তার প্রতিটি টিপুন এবং তারপরে নিশ্চিত করুনn

এই কমান্ডটি আপনার নিবন্ধকে ওভাররাইড করবে hযাতে আপনি অন্যটি বেছে নিতে পারেন ( hউপরের কমান্ডটি অন্য ছোট কেস লেটারে পরিবর্তন করে) যা আপনি ব্যবহার করেন না।


13
আপনি বাদ তাহলে cমধ্যে gc, রিপ্লেস পুরো বাফারে একযোগে সম্পন্ন করা হয়। আপনি যদি ভুল করে থাকেন এবং এটিকে ফিরিয়ে দিতে চান তবে uকমান্ড মোডে টাইপ করুন। প্রতিস্থাপনের প্রতিটি নিশ্চিত করার চেয়ে আমি এই পদ্ধতির পছন্দ করি (এটি সংশোধকটির সাথে ঘটে c)।
নিলোকট

3
vmap * y:let @/ = @"<CR>নির্বাচিত হাইলাইট করা হয়।
কেভ

8
এর লক্ষ্য কী <left><left><left>?
aymericbeaumet

7
দুটি ফরোয়ার্ড স্ল্যাশের মধ্যে কার্সার পেতে @ayemericbeaumet, এইভাবে প্রতিস্থাপন শব্দটি সহজেই টাইপ করা যায়।
এমক্যাব্রামগুলি

5
মনে রাখবেন যে আপনি যদি নিলোক্টের পরামর্শগুলি cথেকে অপসারণ সম্পর্কে পরামর্শ গ্রহণ করেন তবে আপনাকে লাইনের শেষ থেকে ' গুলি'র একটি সরিয়ে gcফেলতে হবে <left>
নাথান বন্ধু

36

চাক্ষুষরূপে হাইলাইট করা পাঠ্যের জন্য এইচ এবং সহজ ম্যাপিং অনুসন্ধান (এইচ রেজিস্টার অতিরিক্ত লিখিত না করে) এবং টার্মিনাল নির্ভর + নিবন্ধ ব্যবহার না করে:

" search for visually hightlighted text
vnoremap <c-f> y<ESC>/<c-r>"<CR>   

আপনি যদি সিটিআরএল-এ পছন্দ করেন না তবে এটি আপনার পছন্দকে পরিবর্তন করুন

একবার পাঠ্যটি হাইলাইট হয়ে গেলে আপনি সর্বদা sসহজ টাইপ করে একটি প্রতিস্থাপন করতে পারেন :

%s//<your-replacement-string>

... কারণ sকমান্ডের একটি ফাঁকা অনুসন্ধান স্ট্রিংয়ের জন্য সর্বশেষ অনুসন্ধান করা স্ট্রিং ব্যবহার করে।


আমি যখন এটি আমার ভিএম কনফিগারেশনে ব্যবহার করি তখন control+fসর্বদা পরবর্তী অক্ষরটি পাশাপাশি যা আমি দৃষ্টিভঙ্গি দ্বারা নির্বাচন করি তা নির্বাচন করে। কোন ধারনা?
রবার্ট মার্ক ব্রাম

%s//<your-replacement-string>এর মতো কিছু হাইলাইট করার জন্য কাজ করছে বলে মনে হয় না /tmp/file। এটি কেবল হয়ে যায়<your-replacement-string>/tmp/file
নায়সানজা

28

এটি একটিতেও কাজ করে (কমপক্ষে একটি একক লাইন / নির্বাচনের জন্য যা কোনও বিশেষ অক্ষর ধারণ করে না)

  • ভিজ্যুয়াল মোডে পাঠ্যটি নির্বাচন করুন
  • এর সাথে পাঠ্যটি ইয়াঙ্ক করুন y
  • :s/<C-r>0/

0 ইয়াঙ্ক রেজিস্টার।

অন্যান্য লোকেরা যেমন উল্লেখ করেছে, এর জন্য আরও দ্রুততর উপায় রয়েছে তবে আপনি যদি সবেমাত্র আমার (আমার মতো) ভিম শিখতে শুরু করেন তবে এটি 'জেনেরিক' উপায়গুলির মধ্যে একটি।

// সম্পাদনা: আমি ঠিক বুঝতে পেরেছি যে /নির্বাচনের ট্যাব বা নিউলাইন বা অক্ষরগুলির মতো অক্ষর থাকলে ( :sকমান্ডটি কাজ করার জন্য আমাকে এই অক্ষরগুলিকে ম্যানুয়ালি প্রসেস করতে হবে): 'রেজিস্টার' পদ্ধতিটি ব্যর্থ হবে :

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


2
এটা খুবই সাধারণ. ওহ Godশ্বর, কেন এটি উইকিতে আচ্ছাদিত নয়। আসুন ... উত্তরের জন্য আপনাকে ধন্যবাদ!
বেনিয়ামিন লিমেন্টো

2
এটি এখনও আমাদের ভীম শেখার বক্ররেখার প্রাথমিক অংশে তাদের জন্য আদর্শ উত্তর answer আমি জানি কাস্টমাইজেশন একটি শক্তি, তবে আমি কোনও জটিল স্ক্রিপ্টটি আমার ভিআইএমআরসিতে কপি-পেস্ট করতে চাই না এবং এর মতো সহজ সমস্যার জন্য এটি কীভাবে একসাথে ফিট করে। এই উত্তরটি আমাকে শিখিয়েছে যে সিটিআরএল-আর একটি নিবন্ধক নিক্ষেপ করে, যা অন্যান্য প্রসঙ্গে মনে রাখা সহজ হবে।
নিভেক

26

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

" Escape special characters in a string for exact matching.
" This is useful to copying strings from the file to the search tool
" Based on this - http://peterodding.com/code/vim/profile/autoload/xolox/escape.vim
function! EscapeString (string)
  let string=a:string
  " Escape regex characters
  let string = escape(string, '^$.*\/~[]')
  " Escape the line endings
  let string = substitute(string, '\n', '\\n', 'g')
  return string
endfunction

" Get the current visual block for search and replaces
" This function passed the visual block through a string escape function
" Based on this - /programming/676600/vim-replace-selected-text/677918#677918
function! GetVisual() range
  " Save the current register and clipboard
  let reg_save = getreg('"')
  let regtype_save = getregtype('"')
  let cb_save = &clipboard
  set clipboard&

  " Put the current visual selection in the " register
  normal! ""gvy
  let selection = getreg('"')

  " Put the saved registers and clipboards back
  call setreg('"', reg_save, regtype_save)
  let &clipboard = cb_save

  "Escape any special characters in the selection
  let escaped_selection = EscapeString(selection)

  return escaped_selection
endfunction

" Start the find and replace command across the entire file
vmap <leader>z <Esc>:%s/<c-r>=GetVisual()<cr>/

এটি কারও বেশি উপকারী হলে আমি এটি আমার ভিআরসিআর- এ অন্তর্ভুক্ত করেছি ।


2
সমাধানের জন্য ধন্যবাদ, একাধিক প্রস্তাব একত্রিত করে, আমি নিম্নলিখিতটি দিয়ে শেষ করেছি: vmap <C-r> <Esc>:%s/<c-r>=GetVisual()<cr>//g<left><left>(যা কেবলমাত্র ফাইলের মধ্যে সবগুলি প্রতিস্থাপন করে)
পিটার বাটকোভিক

13

ভিম .4.৪ থেকে আপনি gnমোশনটি ব্যবহার করতে পারেন যা বর্তমান অনুসন্ধানের ধরণের সাথে মেলে এমন পাঠ্য অঞ্চল নির্বাচন করে।

সাধারণ মোডে cgnবর্তমানে নির্বাচিত ম্যাচে (বা dgnমুছতে) পাঠ্য পরিবর্তন করার পরে , আপনি ব্যবহার করতে পারেন. আদেশটি পুনরাবৃত্তি করতে এবং পরবর্তী ম্যাচে পরিচালনা ।

আছে Vimcast একটি পর্বে এই বৈশিষ্ট্য দেখাচ্ছে।


3
এটি একটি দুর্দান্ত উত্তর!
mauriciojost

এটিও দুর্দান্ত। কোলেমিক উত্তরের পাশে। ভাল একটা!
বেনিয়ামিন লিমেন্টো

বাহ, আপনি যখন একটি ভাল সমাধান খুঁজতে গভীর ব্রাউজ করেন তখন সেই গোপনীয়তাগুলির মধ্যে এটি একটির মতোই, ধন্যবাদ!
vdegenne

8

মাইকোলা গোলুয়েভ, টিপটির জন্য ধন্যবাদ! নীচে "+" নিবন্ধ ব্যবহার করে যা (আপনার টার্মিনালের উপর নির্ভর করে) "হ" রেজিস্টার ব্যবহার করে সংরক্ষণ করে ইতিমধ্যে হাইলাইট করা পাঠ্য রয়েছে।

vnoremap <C-r> <Esc>:%s/<C-r>+//gc<left><left><left>

CentOS 5.x এ আমার ভিআইএম 7.0 এর কাছে + নিবন্ধ আছে বলে মনে হয় না। এটি কি একটি আদর্শ বৈশিষ্ট্য?
dotancohen

3
আমি নোট করেছি যে আমি পুট্টির মাধ্যমে সেন্টোস মেশিনটি অ্যাক্সেস করেছি এবং গুগলিংয়ের পরে আমি দেখতে পাই যে + ক্লিপবোর্ডের রেজিস্টার। মনে হয় না পুট্টি! সুতরাং এই উত্তরটি আসলে টার্মিনাল নির্ভর।
dotancohen

হাই, আমি আপনার আদেশটি চেষ্টা করেছি কিন্তু এটি আমাকে সমস্ত ফাইল জুড়ে নির্দিষ্ট পাঠ্যের উপস্থিতিগুলি প্রতিস্থাপন করতে বলছে, এবং কেবলমাত্র নির্বাচিত পাঠ্য নয়
solalito

7

Http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection থেকে :

পাঠ্যটি চাক্ষুষভাবে নির্বাচন করা হলে, একটি কমান্ড প্রবেশ করতে টিপুন: কমান্ড লাইনটি স্বয়ংক্রিয়ভাবে সীমাতে প্রবেশ করবে:

:'<,'>

শেষ ভিজ্যুয়াল নির্বাচনের সমস্ত লাইনে প্রতিটি লালকে সবুজ রঙের সাথে প্রতিস্থাপন করতে আপনি s / red / সবুজ / g এর মতো একটি কমান্ড লিখতে পারেন। কমান্ডটি প্রদর্শিত হবে:

:'<,'>s/red/green/g

পূর্ববর্তী নির্বাচিত ব্লকের উপর একটি প্রাক্তন কমান্ড পুনরাবৃত্তি করতে: ইতিহাসটি ব্যবহার করুন। এটি, টিপুন: তারপরে একটি পূর্ববর্তী কমান্ড সম্পাদনা করুন edit


4
হ্যাঁ এটি নির্বাচিত অঞ্চলে সবুজ রঙের সাথে লাল প্রতিস্থাপন করে - খুব দরকারী, তবে বিকল্পটি যা চেয়েছিল তা নয়।
এরিচবিচচলজ

@ এরিকবিএসচুল্জ এটি নির্বাচিত সমস্ত লাইনে আসলে এটি করে। সুতরাং, এমনকি যদি একটি লাইনের কেবলমাত্র অংশটি নির্বাচিত হয় তবে এটি এটি সম্পূর্ণ লাইনের সাথে করে।
সাথী

1
সম্ভবত এটি ওপি প্রশ্নের উত্তর দেয় না, তবে এটি আমার সন্ধানটির ঠিক উত্তর দেয় "ভিএম অনুসন্ধান এবং ভিজ্যুয়াল নির্বাচনের সাথে প্রতিস্থাপন করুন", যেখানে আমি অনুসন্ধান সীমাবদ্ধ করতে এবং কেবলমাত্র ভিজ্যুয়াল নির্বাচনের প্রতিস্থাপন করতে চাই, যা এই প্রশ্নটি নিয়ে আসে
আইসিসি ৯9

5

এটি আমার ভিএমআরসি-তে রয়েছে:

function! GetVisual() range
    let reg_save = getreg('"')
    let regtype_save = getregtype('"')
    let cb_save = &clipboard
    set clipboard&
    normal! ""gvy
    let selection = getreg('"')
    call setreg('"', reg_save, regtype_save)
    let &clipboard = cb_save
    return selection
endfunction

vmap <leader>z :%s/<c-r>=GetVisual()<cr>/

এটি ভিজ্যুয়াল নির্বাচন দখল করবে এবং এটির সাথে একটি বিকল্প কমান্ড শুরু করবে।

সম্পাদনা: আমার উল্লেখ করা উচিত যে এটি মাল্টলাইন ভিজ্যুয়াল নির্বাচনের সাথে কাজ করে না। গেটভিজুয়াল () এর এটি ফিরে আসার ক্ষেত্রে সমস্যা না থাকলেও কীভাবে এটি কমান্ড লাইনে সঠিকভাবে স্থাপন করবেন তা আমি নিশ্চিত নই। আমি কীভাবে এটি করতে পারি তার যদি কারও কাছে কোনও টিপস থাকে তবে মন্তব্য করুন।


2

আমি মনে করি না আপনি এটি বাক্সের বাইরে করতে পারেন। তবে প্রচুর লোক এই বৈশিষ্ট্যটি পছন্দ করে, তাই এখানে প্রচুর পরিমাণে ম্যাক্রো এবং এই জাতীয় আছে (আমি নিজে এটি যুক্ত করেছি)। এখানে আপনি যুক্ত করতে পারেন এমন একটি এখানে রয়েছে; *দর্শনীয়ভাবে নির্বাচিত পাঠ্যে পরবর্তী ম্যাচের জন্য অনুসন্ধান করতে টিপুন ।


2

অন্যান্য উত্তরগুলি ভাল তবে তারা বিশেষ অক্ষরগুলি থেকে রেহাই পায় না। @ ব্রায়ান কেনেডি এর উত্তর পালাতে একটি পদ্ধতি দেখায় তবে এর জন্য অনেক কোড দরকার much উদাহরণস্বরূপ কোনও ইউআরএল'র ক্ষেত্রে, পালানো বাধ্যতামূলক বা অনুসন্ধানটি ":" এ থামবে।

Vim.fandom.com/wiki/Search_for_visually_selected_text এ যেমন লেখা আছে , আপনি কিছু অক্ষর অনুসন্ধান করতে এবং এড়াতে অনলাইনার করতে পারেন। আপনি যে চরিত্রগুলি চান তা থেকে বাঁচতে পারবেন, আমি পালাতে বেছে নিয়েছি /\: :

vnoremap // y/\V<C-R>=escape(@",'/\:')<CR><CR>

এই মানচিত্রটি দিয়ে, আমাকে অবশ্যই টিপতে হবে // সাহায্যে পুরো বাফারে বর্তমানে নির্বাচিত পাঠ্যটি অনুসন্ধান করতে ভিজ্যুয়াল মোডে ।


1

এটির আমার প্রিয় সংক্ষিপ্ত সংস্করণটি

ভেনোরেম্যাপ এস / ওয়াই: এস / "/

তারপরে আপনি একটি নির্বাচন হাইলাইট করতে পারেন এবং এর জন্য প্রতিস্থাপন কমান্ড শুরু করতে কেবল এস / টি চাপুন।


"আক্ষরিক হিসাবে বিবেচিত, আমার পক্ষে কাজ করেনি । <c-r>"যদিও কাজ করেছেন
জোশ বোদহ

1

আমার কাছে মন্তব্য করার জবাব নেই, তাই আমি আরও একটি উত্তর যুক্ত করছি ...

vnoremap <C-r> "0y<Esc>:%s/<C-r>0//g<left><left>

@ ডিএমডি এবং @ ডোটানকোহেন: এটি ব্যবহার না করেই আমার পক্ষে কাজ করেছে "h(স্পষ্টভাবে 0 ব্যবহার করে, যা যাইহোক শেষ ইয়াঙ্ক অবস্থান) এবং পুটি এসএস -> পুদিনা (এলএমডি) নিয়ে কাজ করে; শতক সম্পর্কে জানেন না। নিশ্চিতকরণ অপসারণ করতে @ নীলোকট এবং @ নাথান ফ্রেন্ডের মন্তব্যগুলিও ব্যবহার করে।


1

উদাহরণ 1. তারার সাথে উদ্ধৃতি নির্বাচন, নির্বাচনের শুরুতে কার্সার রাখুন।

:%s,\%#\%V\_.*\%V/,**&**,c 

উদাহরণ 2. বেস 64 সহ পাইপ নির্বাচিত পাঠ্য:

:%s!\%#\%V\_.*\%V!\=system("base64 -w 0",@")!c

ব্যাখ্যা এলএইচএস:

\%# matches cursor 
\%V matches inside the selection only
\_. matches any character.
\_.* matches beginning to end of selection.

ব্যাখ্যা আরএইচএস:

\=expr()  Replace match with result of expr() for each substitution.

0

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

একবার আপনি শব্দটি ছাপিয়ে গেলে, টিপুন *বা #শব্দটি হাইলাইট করতে এবং এর পরবর্তী / পূর্ববর্তী অবস্থানটিতে ঝাঁপিয়ে পড়ুন (আপনি যদি ফাইলটিতে অবস্থান পরিবর্তন করতে চান না, তবে অবস্থানটিতে ফিরে যাওয়ার জন্য বিপরীত কীটি টিপুন আপনি ঠিক ছিল)

তারপরে কেবল টাইপ করুন:

%s//<your-replacement-string>

অন্য ব্যক্তির উত্তরে উল্লিখিত হিসাবে, যদি %sস্ল্যাশগুলির মধ্যে একটি ফাঁকা এন্ট্রি পাওয়া যায়, তবে এটি পূর্বে অনুসন্ধান করা শব্দটি ব্যবহার করে। টিপে *বা# , আপনি কার্সারের নীচে শব্দটি সন্ধান করছেন যা এটি সর্বাধিক সন্ধান করা শব্দ।

শেষ পর্যন্ত এটি সম্পাদন করতে কেবল ছয় বা সাতটি কীস্ট্রোক + প্রতিস্থাপন শব্দের দৈর্ঘ্য এবং এটিতে আপনার কোনও ম্যাক্রো বা সম্পাদনা প্রয়োজন .vimrc

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