Скажем, у нас есть текст, и я вхожу в визуальный режим и выбираю какой-то текст. Как быстро выполнить поиск выделенного текста и заменить его на что-то еще?
Поиск и замена Vim выбранного текста
Ответ 1
Попробуйте выполнить следующее или ввести в свой .vimrc
vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>
При нажатии ctrl + r в визуальном режиме вам будет предложено ввести текст для замены. Нажмите enter, а затем подтвердите каждое изменение, которое вы согласны с y, или уменьшите с помощью n.
Эта команда переопределит ваш регистр h, чтобы вы могли выбрать другое (изменив h в приведенной выше команде на другую строчную букву), которую вы не используете.
Ответ 2
Этот быстрый и простой поиск по отображению визуально выделенного текста (без перезаписи регистра h) и без использования зависимого от терминала + регистра:
" search for visually hightlighted text
vnoremap <c-f> y<ESC>/<c-r>"<CR>   
Если вам не нравится ctrl-f, замените его на свои предпочтения
После выделения текста вы всегда можете сделать s ubstitution, просто набрав:
%s//<your-replacement-string>
... потому что пустой поиск в команде s использует последнюю искомую строку.
Ответ 3
Принятый ответ отлично работает, если у вас нет специальных символов в вашем визуальном выборе. Я взломал два сценария (Джереми Кантрелл, размещенный здесь, и Peter Odding) чтобы сделать команду, которая позволит визуально выбрать строку, которую вы хотите найти, даже если в ней есть специальные символы регулярных выражений.
" 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 - /questions/71946/vim-search-and-replace-selected-text/485175#485175
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, если это более полезно для всех.
Ответ 4
Это также работает (по крайней мере, для выбора в одной строке/выборках, которые не содержат специальных символов)
- выберите текст в визуальном режиме
 -  держите текст с помощью 
y -  
:s/<C-r>0/ 
 0 является регистром yank.
Как говорили другие люди, есть более быстрые способы сделать это, но если вы только начали изучать Vim (как и я), это один из "общих" способов.
//edit: я только что понял, что подход "register" завершится неудачно, если в выборе будут символы, такие как вкладки или символы новой строки или / (мне пришлось бы вручную обработать эти символы так или иначе, чтобы команда :s для работы):
 
Ответ 5
Из http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection:
Когда текст визуально выбран, нажмите:, чтобы ввести команду. Командная строка автоматически войдет в диапазон:
:'<,'>
Вы можете ввести команду, например, s/red/green/g, чтобы заменить каждый красный цвет зеленым во всех линиях последнего визуального выделения. Команда появится как:
:'<,'>s/red/green/g
Чтобы повторить команду Ex над ранее выбранным блоком, используйте историю:. То есть, нажмите: затем, затем отредактируйте предыдущую команду.
Ответ 6
Николай Голубев, Спасибо за совет! После использования регистр "+", который (в зависимости от вашего терминала) уже содержит выделенный текст, сохраняет из-за использования регистра "h".
vnoremap <C-r> <Esc>:%s/<C-r>+//gc<left><left><left>
		Ответ 7
У меня это в моем 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>/
Это захватит визуальный выбор и запустит команду подстановки.
EDIT: Я должен указать, что это не работает с многострочным визуальным выбором. Хотя GetVisual() не имеет проблемы с возвратом, я не уверен, как правильно поместить его в командную строку. Если у кого-нибудь есть советы о том, как я могу это сделать, прокомментируйте.
Ответ 8
Из Vim 7.4 вы можете использовать движение gn, которое выбирает области текста, соответствующие текущему шаблону поиска.
После использования cgn для изменения текста в текущем выбранном совпадении (или dgn для удаления) в обычном режиме вы можете использовать ., чтобы повторить команду и действовать в следующем матче.
Там эпизод Vimcast, показывающий эту функцию.
Ответ 9
Я не думаю, что вы можете сделать это из коробки. Но многим людям нравится эта функция, поэтому там много макросов и т.д. (Я сам это добавил).  Здесь - это тот, который вы можете добавить, например; просто нажмите *, чтобы найти следующее совпадение на визуально выбранном тексте.
Ответ 10
Моя любимая короткая версия этого
vnoremap s/y: s/"/
Затем вы можете выделить выделение и просто нажать s/, чтобы запустить для него команду подстановки.
Ответ 11
У меня нет комментариев для комментариев, поэтому я добавляю еще один ответ...
 vnoremap <C-r> "0y<Esc>:%s/<C-r>0//g<left><left>
@dmd и @dotancohen: это работало для меня без использования "h (явно использует 0, что является последней позицией yank) и работает с putty ssh → mint (lmde); не знаю о ц. Также использует комментарии @Niloct и @Nathan Friend для удаления подтверждения.
Ответ 12
Пример 1. Цитировать выделение со звездами, удерживая курсор в начале выделения.
:%s,\%#\%V\_.*\%V/,**&**,c 
 Пример 2. Передача выделенного текста с base64:
:%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.