Удаление / изменение искомого текста в Vim - PullRequest
11 голосов
/ 21 октября 2010

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

В идеале, то, что я ищу, будет работать так: я нажимаю n, чтобы получить результат поиска, а затем magic command чтобы выделить этот результат в визуальном режиме, а затем я могу сделать d или c, чтобы удалить или изменить выделенный текст.

Пример :

Я ввожу команду

/hello .

, и она соответствует hello, пробелу и любому символу после него.

Итак, первое совпадение, которое он достигает, - "привет w".

Теперь я хочу удалить все hello w, найти следующий матч (скажем, hello a), изменить следующий матч на hello there и продолжать делать разные вещи для каждого матча.

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

Ответы [ 8 ]

15 голосов
/ 21 октября 2010

Чтобы выбрать полное совпадение текущего матча (если вы находитесь в начале матча), вы можете набрать

v//e

Удалить до конца матча

d//e

Чтобы изменить совпадение

c//e

Единственный минус в том, что вы не можете использовать n (поскольку это повторится //e) и вместо этого придется использовать //

Так что типичный рабочий процесс будет выглядеть так

/hello ./    : Jump to the start of the next "hello ."
d//e         : Delete the item
//           : repeat the search to get to the begining of the next "hello ."
c//e         : change it
//           : next one.
etc.
8 голосов
/ 31 августа 2014

Я думаю, что вы хотите gn: (перейдите к следующему совпадению и) выберите его в визуальном режиме.Вы можете поставить префикс с помощью команды, например, cgn изменяет совпадение, dgn удаляет и т. Д. Я обнаружил, что, если совпадение уже есть, это совпадение используется, поэтому оно должно это сделать.

2 голосов
/ 21 октября 2010

вы ищете "подтвердить"

:%s/hello .//gc

: чтобы перейти в режим ex,% для применения ко всему буферу, s для замены, / hello ./ для поиска этого регулярного выражения, //чтобы заменить его ничем, g, чтобы найти все совпадения в строке, и c, чтобы подтвердить, следует ли удалять перед каждым совпадением.

Предполагается, что вы ищете подтверждение.Если вы хотите сделать все сразу, это уже упоминалось несколько раз

:%s/hello .//g

: перейти в режим ex,% применить ко всему буферу, s заменить, / hello./ чтобы найти это регулярное выражение, // заменить его ничем, и g, чтобы найти все совпадения в строке

2 голосов
/ 21 октября 2010

Я бы сделал то, что предложил один из предыдущих авторов: Создайте одну команду удаления с помощью d target и нажмите.после использования n, чтобы найти каждое вхождение.В этом случае 7x удалит все, что соответствует hello . Это сокращенная форма d7l или d7[space], поскольку d принимает любую команду перемещения.

Однако, если вы хотите действительно общее решение для поиска иудалив регулярное выражение, вы можете выполнить одну команду подстановки (даже если она потерпит неудачу), а затем выполнить поиск и использовать &, чтобы повторно применить последнюю подстановку к текущей строке:

:s/hello .//
/hello .
&
n
&

Первая строка (замена) может потерпеть неудачу.Вы все еще можете применить его снова с & позже.Я немного удивлен, что первая команда подстановки не устанавливает шаблон по умолчанию, но, возможно, она делает это в vi, отличном от vim.

1 голос
/ 21 октября 2010

Как насчет этого с записями.

qa / textsearch ENTER v9lvq

9(длина textsearch - 1) т.е. 10 - 1 = 9

Теперь, когда вы подготовили запись в регистре a, выполните @ agv ( @ a : выполняет запись с именем a и gv выбирает текст для поиска.)

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

1 голос
/ 21 октября 2010

Измените первое, используя cwfoo esc или любое другое, затем используйте команду ., чтобы повторить это редактирование для каждого последующего вхождения, которое вы хотите изменить.

0 голосов
/ 11 мая 2019

Также для удаления всех строк, содержащих строку, вы можете использовать команду

:g@search_query@d

g для глобального поиска

@ Разделитель

d команда для удаления.

0 голосов
/ 21 октября 2010

Нажмите клавишу x.

или поиск и замена пользователя: [esc] :%s/[search-regex]/[replace-regex]/g

Если replace-regex пусто, вы удалите все, что искали.

...