Vim поиск и замена выделенного текста



допустим, у нас есть текст, и я вхожу в визуальный режим и выбираю какой-то текст. Как быстро выполнить поиск выделенного текста и заменить его чем-то другим?

670   12  
vim

12 ответов:

попробуйте выполнить следующее или положить в свой .vimrc

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

при нажатии ctrl+r в визуальном режиме, вам будет предложено ввести текст для замены. Нажмите введите а затем подтвердите каждое изменение, с которым вы согласны y или снижению с n.

эта команда переопределит ваш регистр h, Так что вы можете выбрать другой (путем изменения h в команде выше в другой ниже случае письмо), что вы не используете.

Это быстрый и простой поиск отображения визуально выделенного текста (без перезаписи регистра h) и без использования терминала dependant + register:

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

Если вам не нравится ctrl-f изменить его на ваши предпочтения

как только текст будет выделен, вы всегда можете сделать substitution просто набрав:

%s//<your-replacement-string>

... потому что пустой поиск на s команда использует последнюю искомую строку.

принятый ответ Отлично работает, если у вас нет специальных символов в вашем визуальном выборе. Я взломал вместе два скрипта (Джереми Кантрелл'ы размещены здесь & Питер Odding ' 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 - 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>/

Я включил это в мой vimrc если это более полезно для кого-либо.

Это тоже работает (по крайней мере, для выборок в одной строке / выборок, которые не содержат специальных символов)

  • выделите текст в визуальном режиме
  • вставить текст с y
  • :s/<C-r>0/

0 - это янки регистрации.

как упоминали другие люди, есть более быстрые способы сделать это, но если вы только начали изучать Vim (как и я), это один из "общих" пути.

//edit: я только что понял, что подход "register" потерпит неудачу, если есть символы, такие как вкладки или новые строки или / символы в выборе (я должен был бы вручную обработать эти символы как-то для на работу):

enter image description here

от http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection:

при визуальном выделении текста нажмите : для ввода команды. Командная строка автоматически введет диапазон:

:'<,'>

вы можете ввести команду, такую как s/red/green/g, чтобы заменить каждый красный на зеленый во всех строках последнего визуального выделения. Команда будет выглядеть следующим образом:

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

чтобы повторить команду Ex над ранее выбранным блоком, используйте : история. То есть нажмите : затем , затем отредактируйте предыдущую команду.

Мыкола Социально-Экономической Ситуации, Спасибо за подсказку! Ниже используется регистр"+", который (в зависимости от вашего терминала) уже содержит выделенный текст, сохраняя от использования регистра" h".

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

У меня есть это в мой 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 () не имеет проблем с его возвратом, я не уверен, как правильно поместить его в командную строку. Если у кого-нибудь есть какие-либо советы о том, как я могу это сделать, пожалуйста, прокомментируйте.

от Vim 7.4, вы можете использовать gn движение, которое выбирает области текста, соответствующие текущему шаблону поиска.

после использования cgn изменить текст в выбранном матче (или dgn удалить), в обычном режиме, вы можете использовать . чтобы повторить команду и работать на следующем матче.

здесь эпизод Vimcast отображение этой функции.

Я не думаю, что вы можете сделать это из коробки. Но многим людям нравится эта функция, поэтому есть тонны макросов и т. д. (Я добавил ее сам). здесь это тот, который вы можете добавить, например; просто нажмите * для поиска следующего совпадения по визуально выделенному тексту.

моя любимая короткая версия это

vnoremap s / y:s/"/

затем вы можете выделить выделение и просто нажать s/, чтобы запустить команду подстановки для него.

у меня нет репутации для комментариев, поэтому я добавляю еще один ответ...

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

@dmd и @dotancohen: это сработало для меня без использования "h (явно использует 0, что в любом случае является последней позицией Янка) и работает с putty ssh -> mint (lmde); не знаю о cent. Также использует комментарии @Niloct и @Nathan Friend для удаления подтверждения.

выбор цитаты со звездами, держите курсор в начале выбора.

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

заменить выделенный текст в 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.

не уверен, что \%V-Лучший способ сделать это.

Comments

    Ничего не найдено.