Предположим, у нас есть текст, и я вхожу в визуальный режим и выбираю какой-то текст. Как быстро выполнить поиск выделенного текста и заменить его чем-то другим?Vim поиск и замена выделенного текста
ответ
Попробуйте выполнить следующее или положить в в вашем .vimrc
vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>
Нажатием Ctrl + г в визуальном режиме, вам будет предложено ввести текст для замены с. Нажмите введите, а затем подтвердите каждое изменение, которое вы согласны с y или отклонитесь с n.
Эта команда отменяет ваш регистр h
, поэтому вы можете выбрать другое (изменив h
в приведенной выше команде на другую строчную букву), которую вы не используете.
Я не думаю, что вы можете сделать это из коробки. Но многим нравится эта функция, поэтому есть много макросов и т. Д. (Я добавил ее сам). Here - это тот, который вы можете добавить, например; просто нажмите *
, чтобы найти следующий матч по визуально выбранному тексту.
У меня есть это в моем 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() не имеет проблемы с возвратом, я не уверен, как правильно поместить его в командную строку. Если у кого-нибудь есть советы о том, как я могу это сделать, прокомментируйте.
Mykola Golubyev, Спасибо за подсказку! После использования регистр «+», который (в зависимости от вашего терминала) уже содержит выделенный текст, сохраняет из-за использования регистра «h».
vnoremap <C-r> <Esc>:%s/<C-r>+//gc<left><left><left>
У моего VIM 7.0 на CentOS 5.x, похоже, нет регистра +. Является ли это стандартной функцией? – dotancohen
Я отмечаю, что я обращаюсь к машине CentOS через Putty, а при поиске в google я вижу, что + является регистром буфера обмена. Кажется, Штука это не поддерживает! Таким образом, этот ответ на самом деле зависит от термина. – dotancohen
Привет, я попробовал вашу команду, но он просит меня заменить вхождения указанного текста по всему файлу, а не только выделенный текст – solalito
Принятый ответ отлично работает, если у вас нет специальных символов в вашем визуальном выборе. Я взломал два сценария (Jeremy Cantrell здесь, & 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 - 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, если это более полезно для всех.
спасибо за решение, объединив несколько предложений, я получил следующее: 'vmap
От http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection:
Когда текст визуально выбран, нажмите: чтобы ввести команду. Командная строка будет автоматически ввести диапазон:
:'<,'>
Вы можете ввести такие команды, как с/красный/зеленый/г заменить каждый красный с зеленым во всех линиях последнего визуального выделения. Команда появится в виде:
:'<,'>s/red/green/g
Чтобы повторить команду Ex над ранее выбранным блоком, используйте следующую команду: history.То есть, нажмите: затем, затем отредактируйте предыдущую команду.
Хороший совет, но не учитывает указанную потребность. – Chris
да, это заменяет красный цвет зеленым * в выбранной области * - очень полезно, но не то, о чем попросил оп. – ErichBSchulz
@ErichBSchulz Он на самом деле делает это на всех выделенных линиях. Таким образом, даже если выбрана только часть строки, она будет делать это по всей строке. – Cully
Моя любимая короткая версия этого
vnoremap с/у: s/"/
Затем вы можете выделить выбор и просто ударил с /, чтобы начать команду подстановки для него
Didn «Работаю для меня, обрабатывается' '' как литерал. '
Это быстрый и простой поиск отображения для визуальных выделенного текста (без чрезмерной записи регистра ч) и без использования терминала зависимых + регистр:
" search for visually hightlighted text
vnoremap <c-f> y<ESC>/<c-r>"<CR>
Если вы не любите изменения Ctrl-F его к вашему предпочтению
После того, как текст выделен, вы всегда можете сделать s
ubstitution просто набрав:
%s//<your-replacement-string>
... потому что пустой поиск на s
команда использует последний поиск строки.
Когда я использую это в моей конфигурации vim, 'control + f' всегда выбирает самый следующий символ, а также то, что я визуально выбрал. Есть идеи? –
'% s //
Это один работает также (по крайней мере, для выбора в одной строке/выборов, которые не содержат каких-либо специальных символов)
- выбрать текст в визуальном режиме
- дергать текст с
y
:s/<C-r>0/
0
является регистром yank.
Как говорили другие люди, есть более быстрые способы сделать это, но если вы только начали изучать Vim (как и я), это один из «общих» способов.
// edit: Я только что понял, что подход «register» завершится неудачно, если в выборе будут символы, такие как вкладки или символы новой строки, или /
символов (мне пришлось бы вручную обработать эти символы так или иначе, чтобы :s
команда работы):
у меня нет респ комментировать, поэтому я добавил еще один ответ ...
vnoremap <C-r> "0y<Esc>:%s/<C-r>0//g<left><left>
@dmd и @dotancohen: это сработало для меня, не используя "h
(явно использует 0, что является последней позиции yank) и работает с putty ssh -> mint (lmde); не знаю о ц. Также использует комментарии @Niloct и @Nathan Friend для удаления подтверждения.
Из Vim 7.4 вы можете использовать движение gn
, которое выбирает области текста, соответствующие текущему шаблону поиска.
После использования cgn
, чтобы изменить текст в выбранном совпадении (или dgn
), в обычном режиме вы можете использовать .
, чтобы повторить команду и действовать в следующем матче.
Есть an episode of Vimcast, показывающий эту функцию.
Отметьте выбор со звездами, держите курсор в начале выбора.
:%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.
Объяснение РИТ:
\=expr() Replace match with result of expr() for each substitution.
Не уверен, то \% V является лучшим способ сделать это.
- 1. vim: Поиск и замена
- 2. VIM Поиск и замена
- 3. Поиск индексов выделенного текста
- 4. Замена выделенного текста в строке
- 5. Поиск текста и замена
- 6. Удаление и замена выделенного текста в JEditorPane
- 7. Поиск и замена Vim 7.3
- 8. Vim - Поиск и замена результатов
- 9. VIM поиск и замена regex
- 10. Basic Vim - Поиск и замена текста, ограниченный определенными символами
- 11. Vim поиск и замена на основе окружающего текста
- 12. Поиск и замена текста odfpy
- 13. Замена/замена текста косой чертой в VIM
- 14. Замена выделенного текста HTML в JQuery
- 15. Замена выделенного пользователем текста в Javascript
- 16. Замена выделенного текста в текстовом поле
- 17. Regex (поиск/замена/добавление) VIM
- 18. Поиск и замена с использованием Vim
- 19. Поиск и замена Vim - ограничить определенные строки
- 20. Поиск и замена полями на VIM
- 21. Поиск и замена шаблона переменной длины Vim?
- 22. переменный поиск и замена в vim
- 23. vim поиск и замена между номером
- 24. Интеллектуальный поиск/замена в Vim
- 25. Поиск выделенного (выбранного) текста в Emacs
- 26. perl поиск и замена случайного текста
- 27. Поиск и замена случайного текста ячейки поначалу:
- 28. Поиск и замена текста в datagridview C#
- 29. Поиск и замена текста в IntelliJ IDEA
- 30. Поиск и замена текста в PDF
Где вы это можете добавить? ... извините, что я действительно новичок в vim –
Если вы используете UNIX как систему, вы имеете файл ~/.vimrc. Поместите данную строку в этот файл и перезапустите vim. –
Если вы опустите 'c' в' gc', замена выполняется сразу во всем буфере. Если вы допустили ошибку и хотите ее вернуть, просто введите 'u' в командном режиме. Мне нравится этот подход лучше, чем подтверждение каждой из замен (что происходит с модификатором 'c'). – Niloct