查找
快捷键 | 功能 |
---|---|
/PATTERN | 在后面的文本中查找something |
?PATTERN | 在前面的文本中查找something |
/PATTERN/+N | 将光标停在pattern匹配行的后面第N行上 |
/PATTERN/-N | 将光标停在pattern匹配行的前面第N行上 |
n | 查找下一个,和查找方向有关 |
N | 查找上一个,和查找方向有关 |
* | 向下搜索光标所在词 |
g* | 向下搜索光标所在词,但部分符合即可 |
# | 向上搜索光标所在词 |
g# | 向上搜索光标所在词,但部分符合即可 |
q: | 正常模式下,q然后按':',打开命令行历史缓冲区 |
q/ | 正常模式下,q然后按'/',可以正向查找命令历史记录 |
q? | 正常模式下,q然后按'?',可以反向查找命令历史记录 |
可以用grep或vimgrep查找一个模式都在哪些地方出现过
- :grep是调用外部的grep程序
- vimgrep使用vim自己的查找算法
- % 代表正在编辑的文件
用法为
:vim[grep]/pattern/[g] [j] files
- g的含义是如果一个模式在一行中多次出现,则这一行也在结果中多次出现
- j的含义是grep结束后,结果停在第j项,默认是停在第一项
- vimgrep前面可以加数字限定结果的上限,如
:1vim/pattern/ %
只查找第一个vimgrep在读纯文本电子书时特别有用,可以生成导航的目录。
- 比如电子书中每一节的标题形式为
n.xxx
,你就可以这样:vim/^d{1,}./ %
- 然后用:cw 或 :copen查看结果
- 可以用ctrl-w + H 把quickfix窗口移到左侧,就更像个目录了
替换
快捷键 | 功能 |
---|---|
:s/PATTERN/STRING | 替换第一个匹配为STRING |
:s/PATTERN/STRING/g | 替换*当前行所有的匹配为STRING |
:n1,n2s/PATTERN/STRING/g | 替换第n1到n2行所有的匹配为STRING |
:%s/PATTERN/STRING/g | 替换文件中所有的匹配为STRING |
:%s/^/STRING/g | 在每一行的行首插入STRING,^表示行首 |
:%s/$/STRING/g | 在每一行的行尾插入STRING,$表示行尾 |
% 代表所有行
替换语法后面可跟多个标记
快捷键 | 功能 |
---|---|
c | 表示每个替换都将需要用户确认 |
i | 表示匹配时忽略(ignore)大小写 |
g | 表示替换一行上的所有匹配 |
还有一种比替换更灵活的方式,它是匹配到某个模式后执行某种Ex命令,语法为
:[range]g[lobal][!]/pattern/ex_command
例如
:%g/^xyz/d
表示对xyz开头的行执行delete命令
下面是Ex命令表,更多内容参考这里
命令 | 说明 |
---|---|
:[range]d[elete] [x] | 删除指定范围内的行【到寄存器x中】 |
:[range]y[ank] [x] | 复制指定范围的行【到寄存器x中】 |
:[line]put [x] | 在指定行后粘贴寄存器x中的内容 |
:[range]copy ADDRESS | 把指定范围内的行拷贝到address所指定的行下 |
:[range]move ADDRESS | 把指定范围内的行移动到address所指定的行下 |
:[range]join | 连接指定范围内的行 |
:[range]normal COMMANDS | 对指定范围内的每一行执行普通模式命令commands |
范围
vim的很多命令前面都可以指定范围(range),如果不指定范围则表示当前行
字符 | 说明 |
---|---|
m,n | 从m行到n行 |
0 | 最开始一行 |
$ | 最后一行 |
. | 当前行 |
% | 所有行 |
正则
正则表达式能够实现更为复杂的查找
:help pattern 可以查看帮助文档
元字符
元字符是在正则中有特殊含义的字符,不当做字符本身来解释,表示为单个字符或斜杠与单个字符组成的双元字符
基本元字符
元字符 | 说明 |
---|---|
. | 匹配任意一个字符 |
. | 匹配任意一个字符 |
[] | 字符集匹配,匹配方括号中定义的字符集之一 |
[^] | 字符集否定匹配,匹配没有在方括号中定义的字符 |
[0-9] | 所有的数字 |
[a-z] | 所有的小写字母 |
[A-Z] | 所有的大写字母 |
[a-zA-Z] | 所有的字母 |
[0-9a-zA-Z] | 所有的数字和字母 |
[abc-e] | 匹配方括号中的任意一个字符,-表示字符范围 |
[^abc] | ^符号表示匹配除方括号中字符之外的任意字符 |
\d | 匹配阿拉伯数字,等同于[0-9] |
\D | 匹配阿拉伯数字之外的任意字符,等同于[^0-9] |
\x | 匹配十六进制数字,等同于[0-9A-Fa-f] |
\w | 匹配单词,等同于[0-9A-Za-z_] |
\W | 匹配单词之外的任意字符,等同于[^0-9A-Za-z_] |
\t | 匹配TAB字符 |
\s | 匹配空白字符,等同于[ \t] |
\S | 匹配非空白字符,等同于[^ \t] |
\a | 所有的字母字符. 等同于[a-zA-Z] |
\l | 小写字母[a-z] |
\L | 非小写字母[^a-z] |
\u | 大写字母 [A-Z] |
\U | 非大写字母[A-Z] |
\| | 表示或 |
量词元字符
元字符 | 说明 |
---|---|
* | 匹配0个或多个(匹配优先) |
+ | 匹配1个或多个(匹配优先) |
\? | 0个或1个(匹配优先),\?不能在 ? 命令(逆向查找)中使用 |
\= | 0个或1个(匹配优先),\=不能在 ? 命令(逆向查找)中使用 |
{n,m} | 匹配n个到m个(匹配优先) |
{n,} | 最少n个匹配(匹配优先) |
{,m} | 最多m个匹配(匹配优先) |
{n} | 恰好n个匹配 |
位置元字符
元字符 | 说明 |
---|---|
$ | 在行尾匹配 |
^ | 在行首匹配 |
\< | 匹配以某些字符开头的(\<)或结尾(>)的单词,单词是用标点符号或空格来分隔的 |
\> | 匹配以某些字符结尾的(\<)或结尾(>)的单词,单词是用标点符号或空格来分隔的 |
元字符的转义
如果想要元字符表达字符本身的意思,则需要使用反斜杠转义
转义 | 说明 |
---|---|
\. | 匹配 . 字符 |
\* | 匹配 * 字符 |
\\ | 匹配 \ 字符 |
\/ | 匹配 / 字符 |
\` | 匹配 ` 字符 |
\[ | 匹配 [ 字符 |
高级正则
更多高级内容,例如magic,正反向查找,贪婪模式和非贪婪模式等参考这里
参考
Vim使用笔记
Vim的正则表达式
VIM中使用正则匹配中文
global命令
Vim高级进阶之ex命令集
vim查找替换及正则表达式的使用