gn是Vim 7.4新增的一个操作(motion),作用是跳到并选中下一个搜索匹配项。
具体说,Vim里执行搜索后,执行n操作只会跳转到下一个匹配项,而不选中它。但是我们往往需要对匹配项执行一些修改操作,例如替换、删除或修改大小写等,如果先跳转再执行对应操作,会比较繁琐。gn可以和相应的操作结合,简化这些过程。
常用的组合有:
- cgn: 删除下一个匹配项,并进入插入模式
- dgn: 删除下一个匹配项,并保持常规模式
在执行搜索后通过使用 dgn 命令可以删除匹配项:
- 使用正则表达式
/\d\+\.\d\+\.\d\+\.\d\+
搜索匹配的 ip - 使用
:set hls
高亮匹配项 - 在 normal 模式下使用
dgn
可以删除当前匹配项,可以重复使用dgn
删除后续的匹配项
同样,可以使用 cgn
可以编辑修改每个匹配项。
此外,可以将搜索与 gn
命令配合使用:
:g/\d\+\.\d\+\.\d\+\.\d\+/normal! "Aygn
1. :g
命令
:g
是Vim中的全局命令(global command),它用于在整个文件范围内对满足特定条件的行进行操作。其基本语法是 :g/{pattern}/[commands]
,这里的 {pattern}
是一个正则表达式模式,用于匹配要操作的行;[commands]
则是要对匹配到的行执行的具体操作。
2. 正则表达式 \d\+\.\d\+\.\d\+\.\d\+
这是一个用于匹配IP地址的正则表达式:
\d
表示匹配数字字符。\d\+
表示匹配一个或多个数字字符,这里用来匹配IP地址每一段中的数字部分。\.
表示匹配小数点,因为在正则表达式中,点(.
)本身是一个通配符,要匹配实际的小数点需要用反斜杠转义。- 整个表达式
\d\+\.\d\+\.\d\+\.\d\+
就是用来匹配常见的IP地址格式,例如192.168.1.1
这样由四个数字段用小数点分隔的形式。
3. normal! "Aygn
这是在 :g
命令中要对匹配到的行执行的具体操作:
-
normal!
:表示接下来要执行的是普通模式下的命令序列。它确保执行的命令不会受到当前可能存在的映射(mappings)等的影响,按照Vim原本的普通模式命令逻辑来执行。 -
"Aygn
:"A
:指定寄存器A
,在Vim中可以使用不同的寄存器来临时存储文本内容,这里是告诉Vim要把后续操作获取到的文本存到寄存器A
中。ygn
:这是一个常用的组合命令,y
是复制(yank)命令,gn
会自动作用于当前搜索到的匹配文本(在这种情况下,就是匹配到的IP地址),所以ygn
整体的作用就是复制当前行中匹配到的IP地址。
综合起来,这条命令的完整作用是:在整个文件中,对于每一行中匹配到IP地址(按照 \d\+\.\d\+\.\d\+\.\d\+
这个正则表达式模式匹配)的情况,在普通模式下执行操作,将该行中匹配到的IP地址复制到寄存器 A
中。
参考资料
- Practical Vim
- Vim实用技巧进阶