चयनित पाठ को खोजें और बदलें


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
@aymericbeaumet को दो फ़ॉरवर्ड स्लैश के बीच कर्सर लाने के लिए, इस तरह से प्रतिस्थापित शब्द आसानी से टाइप किया जा सकता है।
mcabrams

5
ध्यान दें कि यदि आप cसे हटाने के बारे में @ नीलोक्ट का सुझाव लेते हैं gc, तो आपको <left>लाइन के अंत में से एक को भी हटाना होगा ।
नाथन फ्रेंड

36

नेत्रहीन हाइलाइट किए गए पाठ (एच रजिस्टर को ओवर-राइट किए बिना) और टर्मिनल आश्रित + रजिस्टर का उपयोग किए बिना यह त्वरित और सरल मैपिंग खोज:

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

यदि आप ctrl-f को पसंद नहीं करते हैं तो इसे अपनी पसंद में बदल दें

एक बार पाठ हाइलाइट होने के बाद, आप हमेशा sकेवल टाइप करके एक ऑबस्ट्रेशन कर सकते हैं :

%s//<your-replacement-string>

... क्योंकि sकमांड पर एक रिक्त खोज स्ट्रिंग के लिए अंतिम खोज का उपयोग करता है।


जब मैं अपने विम कॉन्फ़िगरेशन में इसका उपयोग control+fकरता हूं, तो हमेशा बहुत ही अगले चरित्र का चयन करता हूं और साथ ही साथ जो मैं नेत्रहीन रूप से चयनित करता हूं। कोई विचार?
रॉबर्ट मार्क ब्रैम

%s//<your-replacement-string>ऐसा कुछ हाइलाइट करने के लिए काम नहीं करता है /tmp/file। यह बस बन जाता है<your-replacement-string>/tmp/file
naisanza

28

यह एक भी काम करता है (कम से कम एक पंक्ति में चयन के लिए / चयन जिसमें कोई विशेष वर्ण नहीं है)

  • दृश्य मोड में पाठ का चयन करें
  • के साथ पाठ yank y
  • :s/<C-r>0/

0 yank रजिस्टर है।

जैसा कि अन्य लोगों ने उल्लेख किया है, ऐसा करने के तेज़ तरीके हैं, लेकिन अगर आपने अभी भी विम (मेरी तरह) सीखना शुरू किया है, तो यह 'सामान्य' तरीकों में से एक है।

// संपादित करें: मुझे अभी पता चला है कि /चयन में टैब या newlines या वर्ण जैसे वर्ण हैं, तो 'रजिस्टर' दृष्टिकोण विफल हो जाएगा (मुझे :sकमांड को काम करने के लिए किसी भी तरह से उन पात्रों को मैन्युअल रूप से संसाधित करना होगा):

यहां छवि विवरण दर्ज करें


2
यह बहुत सरल है। हे भगवान, यह विकी पर क्यों नहीं ढंका है। चलो ... उत्तर के लिए धन्यवाद!
बेनामिन लिमांतो

2
यह हम में से उन लोगों के लिए आदर्श उत्तर है जो अभी भी विम लर्निंग कर्व के शुरुआती हिस्से पर हैं। मुझे पता है कि अनुकूलन एक ताकत है, लेकिन मैं अपने vimrc और पहेली में एक जटिल स्क्रिप्ट को कॉपी-पेस्ट नहीं करना चाहता हूं कि यह कैसे एक समस्या के लिए एक साथ फिट बैठता है। इस उत्तर ने मुझे सिखाया कि ctrl-R एक रजिस्टर को डंप करता है, जिसे अन्य संदर्भों में याद रखना आसान होगा।
nivek

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>/

मैंने इसे अपने vimrc में शामिल किया है यदि यह किसी के लिए अधिक उपयोगी है।


2
समाधान के लिए धन्यवाद, कई प्रस्तावों के संयोजन, मैं निम्नलिखित के साथ समाप्त हो गया: vmap <C-r> <Esc>:%s/<c-r>=GetVisual()<cr>//g<left><left>(जो सिर्फ फ़ाइल में सभी को बदल देता है)
पीटर बटकोविक 29'13

13

विम 7.4 से, आप उस gnगति का उपयोग कर सकते हैं जो पाठ के क्षेत्रों का चयन करती है जो वर्तमान खोज पैटर्न से मेल खाती है।

cgnवर्तमान में चयनित मैच (या dgnहटाने के लिए) में पाठ को बदलने के लिए उपयोग करने के बाद , सामान्य मोड में, आप .कमांड को दोहराने और अगले मैच पर काम करने के लिए उपयोग कर सकते हैं ।

इस फीचर को दिखाने वाला विमकास्ट का एक एपिसोड है


3
यह एक महान जवाब है!
मौरिसिओजॉस्ट

यह भी कमाल है। एक तरफ से कोलिमिक उत्तर। महान एक!
बेनीमिन लिमांतो

वाह, यह उन रहस्यों में से एक है जो आपको तब मिलते हैं जब आप एक अच्छा समाधान खोजने के लिए गहराई से ब्राउज़ करते हैं, धन्यवाद!
vdegenne

8

Mykola Golubyev, टिप के लिए धन्यवाद! निम्नलिखित "+" रजिस्टर का उपयोग करता है जो (आपके टर्मिनल के आधार पर) पहले से ही हाइलाइट किए गए पाठ को शामिल करता है, "एच" रजिस्टर का उपयोग करने से बचाता है।

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

CentOS 5.x पर मेरा VIM 7.0 + रजिस्टर नहीं लगता है। क्या यह एक मानक विशेषता है?
डॉटनचेन १२'१२

3
मैं ध्यान देता हूं कि मैं सेंटी मशीन को पुट्टी के माध्यम से एक्सेस करता हूं, और गुग्लिंग पर मैं देखता हूं कि क्लिपबोर्ड रजिस्टर है। पोटीन का समर्थन करने के लिए प्रतीत नहीं होता है! तो यह जवाब वास्तव में टर्मिनल-निर्भर है।
dotancohen

नमस्ते, मैंने आपकी आज्ञा की कोशिश की, लेकिन यह मुझे निर्दिष्ट फ़ाइल की घटनाओं को सभी फ़ाइल में बदलने के लिए कह रहा है, और न केवल चयनित पाठ
सोलालिटो

7

से http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection :

जब पाठ नेत्रहीन रूप से चुना जाता है, तो एक कमांड दर्ज करने के लिए दबाएं। कमांड लाइन स्वचालित रूप से सीमा में प्रवेश करेगी:

:'<,'>

आप अंतिम दृश्य चयन की सभी पंक्तियों में हरे रंग के साथ प्रत्येक लाल को बदलने के लिए एक कमांड दर्ज कर सकते हैं जैसे कि s / red / green / g। कमांड के रूप में दिखाई देगा:

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

पूर्व चयनित ब्लॉक पर एक पूर्व कमांड दोहराने के लिए: इतिहास का उपयोग करें। यही है, प्रेस: ​​फिर, फिर एक पिछले कमांड को संपादित करें।


4
हाँ, यह चयनित क्षेत्र में हरे रंग के साथ लाल की जगह लेता है - बहुत उपयोगी है, लेकिन ऑप ने जो मांगा नहीं है।
ErichBSchulz

@ErichBSchulz यह वास्तव में सभी चयनित लाइनों पर करता है। इसलिए, भले ही किसी लाइन का केवल एक हिस्सा चुना गया हो, यह पूरी लाइन को करेगा।
कली

1
शायद यह ओपी प्रश्न का उत्तर नहीं देता है, लेकिन यह मेरी खोज "दृश्य खोज और दृश्य चयन के साथ बदलने" का बिल्कुल जवाब देता है, जहां मैं खोज को सीमित करना चाहता हूं और केवल दृश्य चयन को प्रतिस्थापित करना चाहता हूं, जो इस प्रश्न को लाता है
icc97

5

मैं अपने vimrc में यह है:

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>/

यह दृश्य चयन को पकड़ लेगा और इसके साथ एक प्रतिस्थापन कमांड शुरू करेगा।

संपादित करें: मुझे यह इंगित करना चाहिए कि यह मल्टीलाइन दृश्य चयन के साथ काम नहीं करता है। जबकि GetVisual () को इसे वापस करने में कोई समस्या नहीं है, मुझे यकीन नहीं है कि इसे ठीक से कमांड लाइन में कैसे डाला जाए। अगर किसी के पास कोई सुझाव है कि मैं यह कैसे कर सकता हूं, तो कृपया टिप्पणी करें।


2

मुझे नहीं लगता कि आप इसे बॉक्स से बाहर कर सकते हैं। लेकिन बहुत से लोग इस सुविधा को पसंद करते हैं, इसलिए मैक्रो और इस तरह के टन हैं (मैंने इसे स्वयं जोड़ा है)। यहाँ एक है जिसे आप जोड़ सकते हैं, उदाहरण के लिए; बस *नेत्रहीन चयनित पाठ पर अगले मैच की खोज करने के लिए दबाएँ ।


2

अन्य उत्तर अच्छे हैं लेकिन वे विशेष पात्रों से नहीं बचते हैं। @Brian kennedy का उत्तर बचने की एक विधि दिखाता है लेकिन इसके लिए बहुत कोड की आवश्यकता होती है। उदाहरण के लिए URL के मामले में, पलायन अनिवार्य है या खोज ":" पर रुक जाएगी।

जैसा कि vim.fandom.com/wiki/Search_for_visually_selected_text में लिखा गया है , आप कुछ वर्णों की खोज और उनसे बचने के लिए एक ऑनलाइनर कर सकते हैं। आप अपने इच्छित पात्रों से बच सकते हैं, मैंने बचने के लिए चुना /\: :

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

इस नक्शे के साथ, मुझे //पूरे बफर पर वर्तमान में चयनित पाठ को खोजने के लिए दृश्य मोड में प्रेस करना होगा ।


1

मेरा यह पसंदीदा संस्करण है

vnoremap s / y: s / "/

फिर आप एक चयन पर प्रकाश डाल सकते हैं और इसके लिए एक प्रतिस्थापन कमांड शुरू करने के लिए सिर्फ हिट एस / कर सकते हैं।


मेरे लिए काम नहीं किया, "एक शाब्दिक के रूप में व्यवहार किया । <c-r>"हालांकि काम किया
जोश बोध

1

मैं टिप्पणी करने के लिए प्रतिनिधि नहीं है, इसलिए मैं अभी तक एक और जवाब जोड़ रहा हूँ ...

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

@dmd और @dotancohen: इसने मेरे लिए काम किया है "h(स्पष्ट रूप से 0 का उपयोग करता है, जो वैसे भी अंतिम यान स्थान है) और पोटीन ssh -> टकसाल (lmde) के साथ काम करता है; प्रतिशत के बारे में नहीं जानते। पुष्टि को हटाने के लिए @Niloct और @ नथन मित्र टिप्पणियों का भी उपयोग करता है।


1

उदाहरण 1. सितारों के साथ उद्धरण का चयन, चयन की शुरुआत में कर्सर रखें।

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

उदाहरण 2. आधार के साथ पाइप चयनित पाठ:

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

स्पष्टीकरण LHS:

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

स्पष्टीकरण RHS:

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

0

मैं उम्मीद कर रहा था कि एक शब्द को बदलने के लिए विम में एक तरह से बनाया गया था, पहली जगह में शब्द को फिर से लिखने के बिना। वहाँ है, हालांकि यह केवल शब्द सीमा चरित्र तक पाठ के लिए काम करेगा।

एक बार जब आप शब्द के ऊपर दबाव डालते हैं, तो शब्द को हाइलाइट करने के लिए दबाएं *या #उसके अगले / पिछले स्थान पर जाएं (यदि आप फ़ाइल में स्थान नहीं बदलना चाहते हैं, तो स्थान पर वापस जाने के लिए विपरीत कुंजी दबाएं तुम बस पर थे)।

फिर बस टाइप करें:

%s//<your-replacement-string>

जैसा कि किसी अन्य व्यक्ति के उत्तर में उल्लेख किया गया है, यदि %sस्लैश के बीच एक रिक्त प्रविष्टि प्राप्त होती है, तो यह पहले खोजे गए शब्द का उपयोग करता है। दबाकर *या #, आप शब्द को कर्सर के नीचे खोज रहे हैं जो इसे सबसे हाल ही में खोजा गया शब्द है।

अंत में इसे बदलने के लिए केवल छह या सात कीस्ट्रोक्स + रिप्लेसमेंट शब्द की लंबाई होती है और इसके लिए आपके किसी मैक्रो या एडिटिंग की आवश्यकता नहीं होती है .vimrc

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.