Як застосувати набір натискань клавіш до кожного виникнення слова?


13

Якщо я хочу видалити кожне слово, це легко, тому що я б зробив щось подібне:

:s%/WORD//g

Але що робити, якщо я хочу робити xyzкожен випадок "СЛОВА"? Наприклад, скажімо, що я хочу видалити кожен рядок, що містить "WORD". Я можу придумати кілька способів зробити це, але жоден з них не здається ідеальним.

1)

/WORD

а потім натискайте вручну, ddnddnddnddn...доки не буде більше випадків. Але це забирає багато часу, якщо для цього є багато рядків.

2)

qd/WORD<enter>ddq

а потім відгадайте, скільки разів виникає СЛОВ, а потім, наприклад:

500@d 

Але це буде або A) пропустити купу рядків, або B) видалити купу зайвих рядків.

Чи є кращий спосіб зробити це?


3
Просто так ви знаєте, 500@dяк ви описуєте насправді безпечно. Відтворення макросів припиниться, коли пошуковий термін не буде знайдений. Тож ви просто побачите помилку "Шаблон не знайдено: WORD" після того, як всі рядки, що містять його, були видалені.
Wildcard

@Wildcard Thankyou, це дійсно добре знати!
Джеймс

Відповіді:


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може бути дуже потужним.


2

Здається, ви шукаєте :global.

:g/WORD/d_

Що робить підкреслення?
Wildcard

Це працює, але жодна з відомих мені команд не працює. Я продовжую отримувати "не команду редактора".
Джеймс

1
@Wildcard: Підкреслення відкидає те, що вирізається. Виконана команда - це насправді, :deleteа не нормальний режим роботи d.
Люк Ермітт

@DJMcMayhem: для інших звичайних операцій вам знадобиться :normal. А якщо вам потрібні спеціальні ключі, можливо, вам навіть знадобиться :exe-> `exe 'нормальний aFooFar \ <esc>"
Люк Ермітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.