Как применить набор нажатий клавиш к каждому вхождению слова?

13

Если я хочу удалить каждое слово, это легко, потому что я бы сделал что-то вроде этого:

:s%/WORD//g

Но что если я захочу сделать xyzдля каждого случая «СЛОВО»? Например, допустим, я хочу удалить каждую строку, содержащую «WORD». Я могу придумать пару способов сделать это, но ни один из них не кажется идеальным.

1)

/WORD

и затем нажмите вручную, ddnddnddnddn...пока больше нет вхождений. Но это занимает много времени, если есть много строк для этого.

2)

qd/WORD<enter>ddq

а затем угадать, сколько раз WORD происходит, а затем, например:

500@d 

Но это либо А) пропустит кучу строк, либо Б) удалит кучу лишних строк.

Есть лучший способ это сделать?

Джеймс
источник
3
Просто чтобы вы знали, 500@dкак вы описываете, на самом деле безопасно. Воспроизведение макроса остановится, как только условие поиска не будет найдено. Таким образом, вы просто увидите ошибку «Шаблон не найден: СЛОВО» после того, как все строки, содержащие его, будут удалены.
Wildcard
@Wildcard Спасибо, это действительно приятно знать!
Джеймс

Ответы:

17

Вы можете использовать :globalи :normalкоманды для этого. Команда :globalимеет следующий синтаксис:

:global/{pattern}/{command}

Это будет запускать «команду» при каждом появлении «шаблона». Затем вы можете использовать :normalкоманду для запуска серии нажатий клавиш при каждом появлении слова с помощью :global. Вот так:

:g/WORD/normal {keystrokes}

Если эти нажатия клавиш включают специальные клавиши, например <Ctrl>, вы можете объединить их с :executeкомандой, например, так:

:g/WORD/exe "normal {keystrokes}"

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

Подробнее об этих командах смотрите :help :normalи :help :global.

Вечнозеленое дерево
источник
Ударь меня к этому; Я думаю, что я печатал слишком медленно. :)
Wildcard
3

Просто для полноты, вы можете использовать :substitute, если вы соответствуете - в вашем примере (удалить всю строку, которая имеет WORD) - всю строку, содержащую WORD, например:

:%s/^.*\<WORD\>.*\n

Это имеет неявное «заменить совпадение ничем», то есть это более короткая форма:

:%s/^.*\<WORD\>.*\n//

В сочетании с \zs, \ze, \(- \)(группировка), и \=(в части замены) с submatch(), :substituteможет быть очень мощным.

VanLaser
источник
2

Кажется, вы ищете :global.

:g/WORD/d_
Люк Эрмитт
источник
Что делает подчеркивание?
Wildcard
Это работает, но ни одна из команд, которые я знаю, не работает. Я продолжаю получать "не команда редактора".
Джеймс
1
@Wildcard: подчеркивание отбрасывает то, что вырезается. Выполненная команда является действительной, :deleteа не обычной операцией d.
Люк Эрмит
@DJMcMayhem: для других нормальных операций вам понадобится :normal. А если вам нужны специальные ключи, вам может даже понадобиться :exe-> `exe" normal aFooFar \ <esc> "
Люк Эрмит