vim 特殊字符记录(持续更新)
记录一些 vim/nvim 的特殊字符含义,持续更新。
正则表达式中的特殊字符
这类符号的完整列表可参考文档 :help ordinary-atom
符号 | 含义 | 备注 |
---|---|---|
. |
任意字符,但是不包括行尾 | |
^ |
行首 | |
$ |
行尾 | |
\_ |
任意字符,包括行尾 | |
\< |
单词开始 | 精准匹配单词,例如 a 和 am , \<a\> 就仅匹配单词 a |
\> |
单词结尾 | 同 \< |
还有一类正则表达式称为字符类(character class):
符号 | 含义 | 备注 |
---|---|---|
\s |
一个空白字符(包括Tab和Space) | |
\d |
一个数字 | |
\w |
一个单词字符(包括数字、字母、下划线) | |
\l |
一个小写字符 | |
\u |
一个大写字符 | |
\a |
一个字符 |
字符类的完整列表可参考文档 :help character-classes
也可以显式地指定一个字符集合,供匹配时选择,语法是使用一对方括号 []
。比如,[A-Z0-9]
匹配所有的大写字母和数字,而 [,4abc]
只会匹配逗号、数字 4 和字母 a、b、c
在字符集合中,可以用短横线 -
来指定一个范围,这适用于构成序列的那些符号(如数字或字母表)。比如 [0-7]
表示 0~7
的数字,而 [a-z]
表示 a~z
的所有小写字母
[0-9A-Za-z_]
匹配字母、数字和下划线
如果取一个字符集合的差集,只需要在字符集合的前面加上脱字符 ^
即可。如果要匹配所有非字符数字的符号,则可以使用字符集合 [^0-9A-Za-z]
匹配文件行列 :help \%
有的时候可以结合 :g
、:g!
、 :v
来选择/反选指定的行/列内容
符号 | 含义 | 备注 |
---|---|---|
\% |
用于匹配行号或列号 | |
\%^ |
匹配文件开始的位置 | |
\%Nl |
匹配指定的[n] 行,l 表示行号,line |
|
\%'m |
匹配指定的 m 标记 |
|
\%>'m |
匹配在 m 标记之后的内容 |
可以使用<、>、' |
\%.l |
匹配光标所在的行 | |
\%>.23l |
匹配光标所在行下方的内容 | |
\%Nc |
匹配指定的列 ‘column’ | <23c、>23c、.c、<.c、>.c |
\%23v |
匹配指定的虚拟列 |
交替和分组(alternation、grouping)
交替(alternation)操作起到的是“或”的作用,比如,carrot\|parrot
同时匹配 carrot和parrot
分组(grouping)用于将多个字符放在一个组里,这样做有两个好处。首先,分组可以与其他正则表达式组合使用,比如 \(c\|p\)arrot
是一种同时匹配 carrot
和 parrot
的更精准的方式。有的时候用于交换(替换)两个字符的位置十分有用
符号 | 说明 |
\| |
alternation |
\(\) |
grouping |
量词和重复次数(quantifier、multi)
每个字符(无论是字面字符,还是特殊字符)或字符区间后面都可以接一个量词(quantifier),在 Vim 中称为重数(multi)
比如,\w\+
匹配一个或多个单词字符,而 a\{2,4}
匹配 2~4 个连续的字符 a(如 aaa)
符号 | 含义 | 备注 |
---|---|---|
* |
0或者多个,贪婪匹配模式 | |
\+ |
1或者多个,贪婪匹配模式 | |
\{-} |
0或者多个,非贪婪匹配模式 | |
\? |
0或者1个,贪婪匹配模式 | |
\= |
0或者1个,贪婪匹配模式 | |
\{n,m} |
n~m 个,贪婪匹配模式 |
|
\{-n,m} |
n~m 个,非贪婪匹配模式 |
魔法(magic)
当需要编写较长的正则表达式时,特别是涉及到字符串中含有很多特殊字符,如果对每一个特殊字符都转义是比较繁琐且容易出错的事情,特别是容易漏掉或者手快多敲了转义符,这时候就需要用到 Vim 的魔法模式了
可以使用 :help /magic
查看不同版本对于 magic 的处理方式。
Vim 的魔法模式用于确定如何解析正则表达式字符串(如搜索和替换命令)。Vim 有 3 种魔法模式:基本魔法(magic)、无魔法(nomagic)和深度魔法(very magic)
1.基本魔法(magic)
这是默认的模式,大部分特殊字符都需要转义,少数例外(如 .
和 *
)。
读者可以显式设置基本魔法模式,在正则表达式字符串前面加上 \m
即可,比如 /\mfoo
或 :s/\mfoo/bar
2.无魔法(no magic)
无魔法模式类似于基本魔法模式,只不过每一个特殊字符都需要用反斜划线 \
转义,包括 .
和 *
等字符。
比如,在默认的基本魔法模式下,搜索包含任意文本的行的命令为 /^.*$
,这里的 ^
表示行首,.*
表示 0
个或多个任意字符,而 $
表示行尾。而在无魔法模式中,这个命令则写为 /\^\.\*\$
读者可以显式地设置无魔法模式,在正则表达式前加上 \M
即可,比如 /\Mfoo
或 :s/\Mfoo/bar
。无魔法模式可以在 .vimrc
中设置,命令为 set nomagic
,但不建议这样做,因为修改 Vim 处理正则表达式的方式将很可能影响读者正在使用的很多插件(因为这些插件的作者可能并没有考虑无魔法模式)。
3.深度魔法(very magic) 深度魔法模式将数字、字母和下划线之外的字符都视为特殊字符。
使用深度魔法的方式是在正则表达式字符串之前添加 \v
,比如 /\vfoo
或 :s/\vfoo/bar
深度魔法模式的使用场合是特殊字符比较多的时候。比如,在基本魔法模式下,使用如下命令将 cat hunting mice
替换成 mice hunting cat
1
:s/\(cat\) hunging \(mice\)/\2 hunting \1
而在深度魔法模式下,这条命令可写成下列形式。
1
:s/\v(cat) hunging (mice)/\2 hunting \1
需要注意的是 very magic 模式有两种设置 \v
和 \V
“very magic” :使用 \v
意味着在它之后,除了 0-9
、a-z
之外的所有 ASCII 字符,A-Z
和 _
有特殊的含义
“very nomagic” :使用 \V
意味着在它之后,只有反斜杠和终止符字符(通常是 /
或 ?
)具有特殊含义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Some characters in the pattern, such as letters, are taken literally. They
match exactly the same character in the text. When preceded with a backslash
however, these characters may get a special meaning. For example, "a" matches
the letter "a", while "\a" matches any alphabetic character.
Other characters have a special meaning without a backslash. They need to be
preceded with a backslash to match literally. For example "." matches any
character while "\." matches a dot.
If a character is taken literally or not depends on the 'magic' option and the
items in the pattern mentioned next. The 'magic' option should always be set,
but it can be switched off for Vi compatibility. We mention the effect of
'nomagic' here for completeness, but we recommend against using that.
*/\m* */\M*
Use of "\m" makes the pattern after it be interpreted as if 'magic' is set,
ignoring the actual value of the 'magic' option.
Use of "\M" makes the pattern after it be interpreted as if 'nomagic' is used.
*/\v* */\V*
Use of "\v" means that after it, all ASCII characters except '0'-'9', 'a'-'z',
'A'-'Z' and '_' have special meaning: "very magic"
Use of "\V" means that after it, only a backslash and the terminating
character (usually / or ?) have special meaning: "very nomagic"
Examples:
after: \v \m \M \V matches ~
'magic' 'nomagic'
a a a a literal 'a'
\a \a \a \a any alphabetic character
. . \. \. any character
\. \. . . literal dot
$ $ $ \$ end-of-line
* * \* \* any number of the previous atom
~ ~ \~ \~ latest substitute string
() \(\) \(\) \(\) group as an atom
| \| \| \| nothing: separates alternatives
\\ \\ \\ \\ literal backslash
\{ { { { literal curly brace