मान लें कि हमारे पास एक पाठ है, और मैं दृश्य मोड में प्रवेश करता हूं और कुछ पाठ का चयन करता हूं। मैं हाइलाइट किए गए टेक्स्ट की खोज कैसे करूं और उसे किसी और चीज़ से बदल दूं?
मान लें कि हमारे पास एक पाठ है, और मैं दृश्य मोड में प्रवेश करता हूं और कुछ पाठ का चयन करता हूं। मैं हाइलाइट किए गए टेक्स्ट की खोज कैसे करूं और उसे किसी और चीज़ से बदल दूं?
जवाबों:
निम्नलिखित को निष्पादित करने का प्रयास करें या अपने में डालें .vimrc
vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>
ctrl+ rको विज़ुअल मोड में दबाकर , आपको बदलने के लिए टेक्स्ट दर्ज करने के लिए प्रेरित किया जाएगा। प्रेस करें enterऔर फिर प्रत्येक परिवर्तन की पुष्टि करें जिसके साथ आप सहमत हैं yया जिसके साथ गिरावट आई है n।
यह कमांड आपके रजिस्टर को ओवरराइड कर देगी hताकि आप दूसरे को चुन सकें ( hकमांड को दूसरे निचले केस लेटर में बदल कर) जिसे आप उपयोग नहीं करते हैं।
vmap * y:let @/ = @"<CR>चयनित को हाइलाइट किया गया है।
<left><left><left>?
cसे हटाने के बारे में @ नीलोक्ट का सुझाव लेते हैं gc, तो आपको <left>लाइन के अंत में से एक को भी हटाना होगा ।
नेत्रहीन हाइलाइट किए गए पाठ (एच रजिस्टर को ओवर-राइट किए बिना) और टर्मिनल आश्रित + रजिस्टर का उपयोग किए बिना यह त्वरित और सरल मैपिंग खोज:
" 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
यह एक भी काम करता है (कम से कम एक पंक्ति में चयन के लिए / चयन जिसमें कोई विशेष वर्ण नहीं है)
y:s/<C-r>0/0 yank रजिस्टर है।
जैसा कि अन्य लोगों ने उल्लेख किया है, ऐसा करने के तेज़ तरीके हैं, लेकिन अगर आपने अभी भी विम (मेरी तरह) सीखना शुरू किया है, तो यह 'सामान्य' तरीकों में से एक है।
// संपादित करें: मुझे अभी पता चला है कि /चयन में टैब या newlines या वर्ण जैसे वर्ण हैं, तो 'रजिस्टर' दृष्टिकोण विफल हो जाएगा (मुझे :sकमांड को काम करने के लिए किसी भी तरह से उन पात्रों को मैन्युअल रूप से संसाधित करना होगा):

जब तक आप अपने दृश्य चयन में विशेष वर्ण नहीं रखते, तब तक स्वीकृत उत्तर बहुत अच्छा काम करता है। मैंने एक साथ दो स्क्रिप्ट्स ( जेरेमी कैंटरेल की पोस्टिंग और पीटर ओडिंग की) को एक कमांड बनाने के लिए हैक किया, जो आपको एक स्ट्रिंग का चयन करने की अनुमति देगा, जिसे आप ढूंढना चाहते हैं, भले ही इसमें विशेष रेगेक्स अक्षर हों।
" 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 में शामिल किया है यदि यह किसी के लिए अधिक उपयोगी है।
vmap <C-r> <Esc>:%s/<c-r>=GetVisual()<cr>//g<left><left>(जो सिर्फ फ़ाइल में सभी को बदल देता है)
विम 7.4 से, आप उस gnगति का उपयोग कर सकते हैं जो पाठ के क्षेत्रों का चयन करती है जो वर्तमान खोज पैटर्न से मेल खाती है।
cgnवर्तमान में चयनित मैच (या dgnहटाने के लिए) में पाठ को बदलने के लिए उपयोग करने के बाद , सामान्य मोड में, आप .कमांड को दोहराने और अगले मैच पर काम करने के लिए उपयोग कर सकते हैं ।
इस फीचर को दिखाने वाला विमकास्ट का एक एपिसोड है ।
Mykola Golubyev, टिप के लिए धन्यवाद! निम्नलिखित "+" रजिस्टर का उपयोग करता है जो (आपके टर्मिनल के आधार पर) पहले से ही हाइलाइट किए गए पाठ को शामिल करता है, "एच" रजिस्टर का उपयोग करने से बचाता है।
vnoremap <C-r> <Esc>:%s/<C-r>+//gc<left><left><left>
से http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection :
जब पाठ नेत्रहीन रूप से चुना जाता है, तो एक कमांड दर्ज करने के लिए दबाएं। कमांड लाइन स्वचालित रूप से सीमा में प्रवेश करेगी:
:'<,'>
आप अंतिम दृश्य चयन की सभी पंक्तियों में हरे रंग के साथ प्रत्येक लाल को बदलने के लिए एक कमांड दर्ज कर सकते हैं जैसे कि s / red / green / g। कमांड के रूप में दिखाई देगा:
:'<,'>s/red/green/g
पूर्व चयनित ब्लॉक पर एक पूर्व कमांड दोहराने के लिए: इतिहास का उपयोग करें। यही है, प्रेस: फिर, फिर एक पिछले कमांड को संपादित करें।
मैं अपने 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 () को इसे वापस करने में कोई समस्या नहीं है, मुझे यकीन नहीं है कि इसे ठीक से कमांड लाइन में कैसे डाला जाए। अगर किसी के पास कोई सुझाव है कि मैं यह कैसे कर सकता हूं, तो कृपया टिप्पणी करें।
मुझे नहीं लगता कि आप इसे बॉक्स से बाहर कर सकते हैं। लेकिन बहुत से लोग इस सुविधा को पसंद करते हैं, इसलिए मैक्रो और इस तरह के टन हैं (मैंने इसे स्वयं जोड़ा है)। यहाँ एक है जिसे आप जोड़ सकते हैं, उदाहरण के लिए; बस *नेत्रहीन चयनित पाठ पर अगले मैच की खोज करने के लिए दबाएँ ।
अन्य उत्तर अच्छे हैं लेकिन वे विशेष पात्रों से नहीं बचते हैं। @Brian kennedy का उत्तर बचने की एक विधि दिखाता है लेकिन इसके लिए बहुत कोड की आवश्यकता होती है। उदाहरण के लिए URL के मामले में, पलायन अनिवार्य है या खोज ":" पर रुक जाएगी।
जैसा कि vim.fandom.com/wiki/Search_for_visually_selected_text में लिखा गया है , आप कुछ वर्णों की खोज और उनसे बचने के लिए एक ऑनलाइनर कर सकते हैं। आप अपने इच्छित पात्रों से बच सकते हैं, मैंने बचने के लिए चुना /\: :
vnoremap // y/\V<C-R>=escape(@",'/\:')<CR><CR>
इस नक्शे के साथ, मुझे //पूरे बफर पर वर्तमान में चयनित पाठ को खोजने के लिए दृश्य मोड में प्रेस करना होगा ।
मैं टिप्पणी करने के लिए प्रतिनिधि नहीं है, इसलिए मैं अभी तक एक और जवाब जोड़ रहा हूँ ...
vnoremap <C-r> "0y<Esc>:%s/<C-r>0//g<left><left>
@dmd और @dotancohen: इसने मेरे लिए काम किया है "h(स्पष्ट रूप से 0 का उपयोग करता है, जो वैसे भी अंतिम यान स्थान है) और पोटीन ssh -> टकसाल (lmde) के साथ काम करता है; प्रतिशत के बारे में नहीं जानते। पुष्टि को हटाने के लिए @Niloct और @ नथन मित्र टिप्पणियों का भी उपयोग करता है।
उदाहरण 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.
मैं उम्मीद कर रहा था कि एक शब्द को बदलने के लिए विम में एक तरह से बनाया गया था, पहली जगह में शब्द को फिर से लिखने के बिना। वहाँ है, हालांकि यह केवल शब्द सीमा चरित्र तक पाठ के लिए काम करेगा।
एक बार जब आप शब्द के ऊपर दबाव डालते हैं, तो शब्द को हाइलाइट करने के लिए दबाएं *या #उसके अगले / पिछले स्थान पर जाएं (यदि आप फ़ाइल में स्थान नहीं बदलना चाहते हैं, तो स्थान पर वापस जाने के लिए विपरीत कुंजी दबाएं तुम बस पर थे)।
फिर बस टाइप करें:
%s//<your-replacement-string>
जैसा कि किसी अन्य व्यक्ति के उत्तर में उल्लेख किया गया है, यदि %sस्लैश के बीच एक रिक्त प्रविष्टि प्राप्त होती है, तो यह पहले खोजे गए शब्द का उपयोग करता है। दबाकर *या #, आप शब्द को कर्सर के नीचे खोज रहे हैं जो इसे सबसे हाल ही में खोजा गया शब्द है।
अंत में इसे बदलने के लिए केवल छह या सात कीस्ट्रोक्स + रिप्लेसमेंट शब्द की लंबाई होती है और इसके लिए आपके किसी मैक्रो या एडिटिंग की आवश्यकता नहीं होती है .vimrc।
cमेंgc, की जगह पूरे बफर में एक बार में किया जाता है। यदि आपने कोई गलती की है और उसे वापस करना चाहते हैं, तो बसuकमांड मोड में टाइप करें। मैं इस दृष्टिकोण को प्रतिस्थापन में से प्रत्येक की पुष्टि करने से बेहतर पसंद करता हूं (जो किcसंशोधक के साथ होता है )।