Tutorial :Vim search and replace selected text



Question:

Let's say we have a text, and I enter visual mode and select some text. How do I quickly do a search for the highlighted text and replace it with something else?


Solution:1

Try execute the following or put in into your .vimrc

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

By pressing ctrl+r in visual mode, you will be prompted to enter text to replace with. Press enter and then confirm each change you agree with y or decline with n.

This command will override your register h so you can choose other one (by changing h in the command above to another lower case letter) that you don't use.


Solution:2

This quick and simple mapping search for visually highlighted text (without over-writing the h register) and without using the terminal dependant + register:

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

If you dont like the ctrl-f change it to your preference

Once the text is highlighted you can always do a substitution simply by typing:

%s//<your-replacement-string>  

... because a blank search on the s command uses the last searched for string.


Solution:3

The accepted answer works great unless you have special characters in your visual selection. I hacked together two scripts (Jeremy Cantrell's posted here & Peter Odding's) to make a command that will allow you to visual select a string that you want to find even if it has special regex characters in it.

" 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 - https://stackoverflow.com/questions/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>/  

I've included this in my vimrc if that's more useful to anyone.


Solution:4

This one works also (at least for selections in a single line / selections that don't contain any special characters)

  • select the text in visual mode
  • yank the text with y
  • :s/<C-r>0/

0 is the yank register.

As other people mentioned, there are faster ways to do this, but if you've just started learning Vim (like me), this is one of the 'generic' ways.

//edit: I've just realized that the 'register' approach will fail if there are characters like tabs or newlines or / characters in the selection (I'd have to manually process those characters somehow in order for the :s command to work):

enter image description here


Solution:5

From http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection:

When text is visually selected, press : to enter a command. The command line will automatically enter the range:

:'<,'>  

You can enter a command such as s/red/green/g to replace each red with green in all lines of the last visual selection. The command will appear as:

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

To repeat an Ex command over a previously selected block, use the : history. That is, press : then , then edit a previous command.


Solution:6

Mykola Golubyev, Thanks for the tip! Following uses the "+" register which (depending on your terminal) already contains the highlighted text, saving from using the "h" register.

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


Solution:7

I have this in my 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>/  

This will grab the visual selection and start a substitution command with it.

EDIT: I should point out that this does not work with multiline visual selections. While GetVisual() doesn't have a problem returning it, I'm not sure how to properly put it into the command line. If anyone has any tips on how I might do this, please comment.


Solution:8

I don't think you can do this out of the box. But lots of people like this feature, so there's tons of macros and such (I've added it myself). Here is one you can add, for example; just press * to search for the next match on the visually selected text.


Solution:9

From Vim 7.4, you can use the gn motion which selects regions of text that match the current search pattern.

After using cgn to change the text in currently selected match (or dgn to delete), in normal mode, you can use . to repeat the command and operate on the next match.

There's an episode of Vimcast showing this feature.


Solution:10

My favorite short version of this is

vnoremap s/ y:s/"/

Then you can highlight a selection and just hit s/ to start a substitution command for it.


Solution:11

I don't have the rep to comment, so I'm adding yet another answer...

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

@dmd and @dotancohen: this worked for me without using up "h (explicitly uses 0, which is the last yank position anyway) and works with putty ssh -> mint (lmde); don't know about cent. Also uses @Niloct and @Nathan Friend comments to remove confirmation.


Solution:12

Quote selection with stars, keep cursor at start of selection.

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

Replace selected text with base64:

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

Explanation LHS:

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

Explanation RHS:

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

Not sure, the \%V is the best way to do this.


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »