如何对每次出现的单词应用一组击键?


13

如果我想删除每个单词,那很容易,因为我会做这样的事情:

:s%/WORD//g

但是,如果我想对xyz每次出现的“ WORD”都该怎么办?例如,假设我要删除包含“ WORD”的每一行。我可以想到几种方法来执行此操作,但是似乎没有一种方法是理想的。

1)

/WORD

然后手动按ddnddnddnddn...直到不再出现。但是,如果有很多行可以执行此操作,则将很耗时。

2)

qd/WORD<enter>ddq

然后猜测出现WORD的次数,然后,例如:

500@d 

但这将要么A)丢失一堆线,要么B)删除一堆多余的线。

有一个更好的方法吗?


3
请注意,500@d正如您所描述的,实际上是安全的。一旦找不到搜索词,宏播放将停止。因此,在删除所有包含该行的行之后,您只会看到错误“找不到模式:WORD”。
2015年

@Wildcard谢谢,真是太好了!
詹姆斯

Answers:


17

您可以使用:global:normal命令。该:global命令具有以下语法:

:global/{pattern}/{command}

这将在每次出现“模式”时运行“命令”。然后,您可以使用:normal命令使用来对每个单词出现时执行一系列击键操作:global。像这样:

:g/WORD/normal {keystrokes}

如果这些击键涉及特殊键(例如)<Ctrl>,则可以将其与:execute命令结合使用,如下所示:

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

请注意,每次出现特殊键之前,都必须加一个反斜杠。

有关这些命令的更多信息,请参见:help :normal:help :global


击败我 我猜我打字太慢了。:)
通配符

3

仅出于完整性考虑,如果匹配-在示例中(删除包含WORD 的整行)- 包含WORD 的整行,则可以 使用,例如::substitute

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

这有一个隐式的“替换匹配,没有任何内容”,即它是以下形式的缩写:

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

联合\zs\ze\(- \)(分组),以及\=(在更换部件)有submatch():substitute可以非常强大。


2

看来您正在寻找:global

:g/WORD/d_

下划线是做什么的?
2015年

这可行,但是我所知道的命令都不起作用。我不断收到“不是编辑器命令”。
詹姆斯

1
@Wildcard:下划线丢弃正在剪切的内容。实际执行的命令:delete不是正常模式下的操作d
Luc Hermitte

@DJMcMayhem:对于其他正常操作,您将需要:normal。而且,如果您需要特殊键,甚至可能需要:exe->`exe“ normal aFooFar \ <esc>”
Luc Hermitte 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.