Удаление/изменение текста в Vim

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

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

Пример:

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

/hello .

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

Поэтому скажем, что первое совпадение, которое оно достигает, - "привет w".

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

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

Ответ 1

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

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.

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

:%s/hello .//gc

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

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

:%s/hello .//g

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

Ответ 5

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

Ответ 6

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

qa/ textsearch [ textsearch ] v9lvq

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

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

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

Ответ 7

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

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

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

Ответ 8

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

:[email protected][email protected]

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

@ Сепаратор

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