Vim search and replace selected text

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


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.


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.


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.

Tags:

Vim