Usr_27

Nvim :help 页面,生成源代码,使用 tree-sitter-vimdoc 解析器。


VIM 用户手册 - 作者 Bram Moolenaar
搜索命令和模式
在第 3 章中,提到了几个简单的搜索模式 03.9。Vim 可以执行更复杂的搜索。本章将介绍最常用的搜索模式。详细的规范可以在此处找到:pattern
27.1 忽略大小写 27.2 环绕文件末尾 27.3 偏移量 27.4 多次匹配 27.5 备选方案 27.6 字符范围 27.7 字符类 27.8 匹配换行符 27.9 示例
下一章:usr_28.txt 折叠 前一章:usr_26.txt 重复 目录:usr_toc.txt

忽略大小写

默认情况下,Vim 的搜索区分大小写。因此,“include”、“INCLUDE” 和 “Include” 是三个不同的单词,搜索将只匹配其中一个。现在打开 'ignorecase' 选项
:set ignorecase
再次搜索 “include”,现在它将匹配 “Include”、“INCLUDE” 和 “InClUDe”。(设置 'hlsearch' 选项以快速查看模式匹配的位置。)您可以使用以下命令再次关闭它:
:set noignorecase
但让我们保持设置,搜索 “INCLUDE”。它将与 “include” 相同的文本完全匹配。现在设置 'smartcase' 选项
:set ignorecase smartcase
如果您的模式中至少包含一个大写字符,则搜索将区分大小写。这样做是为了避免您必须输入该大写字符,所以您一定是想要匹配大小写才这样做的。这很聪明!设置了这两个选项后,您将找到以下匹配项
模式匹配
word word, Word, WORD, WoRd, etc. Word Word WORD WORD WoRd WoRd

一个模式中的大小写

如果您想对一个特定的模式忽略大小写,您可以通过在前面添加 “\c” 字符串来实现。使用 “\C” 将使模式匹配大小写。这将覆盖 'ignorecase''smartcase' 选项,当使用 “\c” 或 “\C” 时,它们的取值无关紧要。
模式匹配
\Cword word \CWord Word \cword word, Word, WORD, WoRd, etc. \cWord word, Word, WORD, WoRd, etc.
使用 “\c” 和 “\C” 的一个很大优势是它会与模式保持一致。因此,如果您重复搜索历史记录中的模式,无论 'ignorecase''smartcase' 是否发生变化,都会发生相同的事情。
注意: 在搜索模式中使用 “\” 项目取决于 'magic' 选项。在本章中,我们将假设 'magic' 已开启,因为这是标准设置,也是推荐设置。如果您更改 'magic',许多搜索模式将突然变得无效。
注意: 如果您的搜索比您预期的时间长得多,您可以使用 Unix 上的 CTRL-C 和 MS-Windows 上的 CTRL-Break 中断它。

27.2 环绕文件末尾

默认情况下,向前搜索从当前光标位置开始搜索给定的字符串。然后它继续到文件的末尾。如果到那时还没有找到该字符串,它将从开头开始,从文件的开头搜索到光标位置。请记住,当重复使用 “n” 命令来搜索下一个匹配项时,您最终会回到第一个匹配项。如果您没有注意到这一点,您将永远搜索下去!为了给您一个提示,Vim 会显示以下消息
搜索到达底部,从顶部继续
如果您使用 “?” 命令在另一个方向搜索,您将收到以下消息
搜索到达顶部,从底部继续
尽管如此,您仍然不知道何时回到第一个匹配项。一种方法是打开 'ruler' 选项
:set ruler
Vim 将在窗口的右下角(如果有状态行,则在状态行中)显示光标位置。它看起来像这样
101,29 84%
第一个数字是光标的行号。记住您开始时的行号,这样您就可以检查是否再次经过该位置。

不环绕

要关闭搜索环绕,请使用以下命令
:set nowrapscan
现在,当搜索到达文件末尾时,将显示一条错误消息
E385: 搜索到达底部,没有匹配项:forever
因此,您可以通过使用 “gg” 转到文件的开头,然后不断搜索,直到看到这条消息,从而找到所有匹配项。如果您使用 “?” 在另一个方向搜索,您将获得
E384: 搜索到达顶部,没有匹配项:forever

27.3 偏移量

默认情况下,搜索命令将光标定位在模式的开头。您可以告诉 Vim 将光标放在其他地方,方法是指定一个偏移量。对于向前搜索命令 “/”,偏移量通过附加一个斜杠(/)和偏移量来指定
/default/2
该命令搜索模式 “default”,然后移到该模式后的第二行的开头。将此命令应用于上一段,Vim 会在第一行找到单词 “default”。然后,光标向下移动两行,并停留在 “an offset” 上。
如果偏移量是一个简单的数字,则光标将被放置在该模式匹配项从该模式匹配项开始算起的第几行(包括该匹配项所在行)的开头。偏移量数字可以是正数或负数。如果是正数,则光标向下移动这么多行;如果是负数,则光标向上移动。

字符偏移量

“e” 偏移量表示从匹配项末尾开始的偏移量。它将光标移到匹配项的最后一个字符上。该命令
/const/e
将光标放在 “const” 的 “t” 上。从该位置开始,添加一个数字会向前移动这么多字符。此命令将光标移到匹配项的下一个字符
/const/e+1
正数将光标移到右侧,负数将光标移到左侧。例如
/const/e-1
将光标移到 “const” 的 “s” 上。
如果偏移量以 “b” 开头,则光标将移到模式的开头。这不太有用,因为省略 “b” 会做同样的事情。当添加或减去一个数字时,它就变得有用。然后光标向前或向后移动这么多字符。例如
/const/b+2
将光标移到匹配项的开头,然后向右移动两个字符。因此它停留在 “n” 上。

重复

要重复搜索之前使用的搜索模式,但使用不同的偏移量,请省略模式
/that
//e
等于
/that/e
要使用相同的偏移量重复
/
“n” 执行相同的事情。要重复同时删除之前使用的偏移量
//

向后搜索

“?” 命令以相同的方式使用偏移量,但是您必须使用 “?” 来将偏移量与模式分开,而不是使用 “/”
?const?e-2
“b” 和 “e” 保持其含义,它们不会随着 “?” 的使用而改变方向。

起始位置

当开始搜索时,它通常从光标位置开始。当您指定行偏移量时,这会导致问题。例如
/const/-2
这会找到下一个单词 “const”,然后向上移动两行。如果您使用 “n” 再次搜索,Vim 可能会从当前位置开始并找到相同的 “const” 匹配项。然后再次使用偏移量,您将回到起点。你将被困住!可能会更糟:假设下一行中还有另一个 “const” 匹配项。然后重复向前搜索将找到这个匹配项并向上移动两行。因此,您实际上会将光标向后移动!
当您指定字符偏移量时,Vim 会对此进行补偿。因此,搜索会向前或向后移动几个字符,这样就不会再次找到相同的匹配项。

27.4 多次匹配

“*” 项目指定它前面的项目可以匹配任意次数。因此
/a*
匹配 “a”、“aa”、“aaa” 等。但也匹配 “”(空字符串),因为零次也包括在内。 “*” 仅应用于它直接之前的项目。因此,“ab*” 匹配 “a”、“ab”、“abb”、“abbb” 等。要匹配整个字符串多次,它必须被分组到一个项目中。这是通过在它前面放置 “\(" 并在它后面放置 “\)” 来完成的。因此,此命令
/\(ab\)*
匹配:“ab”、“abab”、“ababab” 等。以及 “”。
为了避免匹配空字符串,请使用 “\+”。这将使前一个项目匹配一次或多次。
/ab\+
匹配 “ab”、“abb”、“abbb” 等。它不会匹配 “a”,因为后面没有 “b”。
要匹配可选项目,请使用 “\=”。例子
/folders\=
匹配 “folder” 和 “folders”。

特定计数

要匹配特定数量的项目,请使用 “\{n,m}” 形式。“n” 和 “m” 是数字。它前面的项目将匹配 “n” 到 “m” 次 包含。例子
/ab\{3,5}
匹配 “abbb”、“abbbb” 和 “abbbbb”。当省略 “n” 时,它默认为零。当省略 “m” 时,它默认为无穷大。当省略 “,m” 时,它正好匹配 “n” 次。例子
模式匹配次数
\{,4} 0, 1, 2, 3 或 4 \{3,} 3, 4, 5, etc. \{0,1} 0 或 1,与 \= 相同 \{0,} 0 或更多,与 * 相同 \{1,} 1 或更多,与 \+ 相同 \{3} 3

尽可能少地匹配

到目前为止,这些项目将匹配尽可能多的字符。要尽可能少地匹配,请使用 “\{-n,m}”。它与 “\{n,m}” 的工作方式相同,只是使用尽可能少的数量。例如,使用
/ab\{-1,3}
将匹配 “abbb” 中的 “ab”。实际上,它永远不会匹配超过一个 “b”,因为没有理由匹配更多。它需要其他东西来迫使它匹配超过下限。相同的规则适用于删除 “n” 和 “m”。甚至可以同时删除这两个数字,从而得到 “\{-}”。这将匹配它前面的项目零次或多次,尽可能少地匹配。该项目本身总是匹配零次。当与其他东西组合时,它很有用。例子
/a.\{-}b
这将在 “axbxb” 中匹配 “axb”。如果使用此模式
/a.*b
它将尝试使用 “.*” 匹配尽可能多的字符,因此它将匹配整个 “axbxb”。

27.5 备选方案

模式中的 “或” 运算符是 “\|”。例子
/foo\|bar
这匹配 “foo” 或 “bar”。可以串联更多的备选方案
/one\|two\|three
匹配 “one”、“two” 和 “three”。要匹配多次,必须将整个内容放在 “\(" 和 “\)” 中
/\(foo\|bar\)\+
这匹配 “foo”、“foobar”、“foofoo”、“barfoobar” 等。另一个例子
/end\(if\|while\|for\)
这匹配 “endif”、“endwhile” 和 “endfor”。
一个相关的项目是 “\&”。这要求两个备选方案在同一位置匹配。生成的匹配项使用最后一个备选方案。例子
/forever\&...
这将在 “forever” 中匹配 “for”。例如,它不会匹配 “fortuin”。

27.6 字符范围

要匹配 “a”、“b” 或 “c”,您可以使用 “/a\|b\|c”。当您想匹配从 “a” 到 “z” 的所有字母时,这会变得很长。有一个更短的方法
/[a-z]
“[ ]” 结构匹配单个字符。在其中,您指定要匹配的字符。您可以包括一个字符列表,如下所示
/[0123456789abcdef]
这将匹配所包含的任何字符。对于连续的字符,您可以指定范围。“0-3” 代表 “0123”。“w-z” 代表 “wxyz”。因此,与上面相同的命令可以缩短为
/[0-9a-f]
要匹配 “-” 字符本身,请将其放在范围的开头或结尾。接受这些特殊字符是为了便于在 “[ ]” 范围内使用它们(它们实际上可以在搜索模式的任何地方使用)
\e <Esc> \t <Tab> \r <CR> \b <BS>
对于 [] 范围,还有一些特殊情况,请参阅 /[] 以了解所有内容。

取反范围

为了避免匹配特定字符,请在范围开头使用 "^"。然后 [] 项目匹配除包含的字符之外的所有字符。例如
/"[^"]*"
" 一个双引号 [^"] 任何不是双引号的字符 * 尽可能多 " 另一个双引号
这将匹配 "foo" 和 "3!x",包括双引号。

预定义范围

许多范围非常常用。Vim 为这些范围提供了一个快捷方式。例如
/\a
查找字母字符。这等效于使用 "/[a-zA-Z]"。以下是一些其他示例:
项目匹配等效项
\d 数字 [0-9] \D 非数字 [^0-9] \x 十六进制数字 [0-9a-fA-F] \X 非十六进制数字 [^0-9a-fA-F] \s 空格 [ ] (<Tab><Space>) \S 非空格字符 [^ ] (不是 <Tab><Space>) \l 小写字母 [a-z] \L 非小写字母 [^a-z] \u 大写字母 [A-Z] \U 非大写字母 [^A-Z]
注意: 使用这些预定义范围比它代表的字符范围快得多。这些项目不能在 [] 内部使用。因此 "[\d\l]" 不会匹配数字或小写字母。请改用 "\(\d\|\l\)"。
请参阅 /\s 以了解所有这些范围的完整列表。

27.7 字符类

字符范围匹配一组固定的字符。字符类与此类似,但有一个本质区别:字符集可以在不更改搜索模式的情况下重新定义。例如,搜索此模式
/\f\+
"\f" 项目代表文件名字符。因此,这将匹配可以作为文件名的字符序列。哪些字符可以作为文件名的一部分取决于您正在使用的系统。在 MS-Windows 上,反斜杠包含在内,在 Unix 上则没有。这是使用 'isfname' 选项指定的。Unix 的默认值为
:set isfname
isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=
对于其他系统,默认值不同。因此,您可以使用 "\f" 创建一个搜索模式来匹配文件名,它会自动调整到您正在使用的系统。
注意: 实际上,Unix 允许在文件名中使用几乎所有字符,包括空格。从理论上讲,将这些字符包含在 'isfname' 中是正确的。但这将使其无法在文本中找到文件名的结尾。因此,'isfname' 的默认值是一个折衷方案。
字符类如下所示:
项目匹配选项
\i 标识符字符 'isident' \I 与 \i 相似,但不包括数字 \k 关键字字符 'iskeyword' \K 与 \k 相似,但不包括数字 \p 可打印字符 'isprint' \P 与 \p 相似,但不包括数字 \f 文件名字符 'isfname' \F 与 \f 相似,但不包括数字

27.8 匹配换行符

Vim 可以找到包含换行符的模式。您需要指定换行符的位置,因为到目前为止提到的所有项目都不匹配换行符。要检查特定位置的换行符,请使用 "\n" 项目
/one\ntwo
这将在以 "one" 结尾的行和以 "two" 开头的下一行匹配。要匹配 "one two" 以及,您需要匹配空格或换行符。用于此的项目是 "\_s"
/one\_stwo
允许任意数量的空格
/one\_s\+two
这也会匹配 "one " 在行尾,而 " two" 在下一行开头的情况。
"\s" 匹配空格,"\_s" 匹配空格或换行符。类似地,"\a" 匹配字母字符,而 "\_a" 匹配字母字符或换行符。其他字符类和范围可以通过插入 "_" 以相同的方式修改。
许多其他项目可以通过在前面添加 "\_" 来匹配换行符。例如: "\_." 匹配任何字符或换行符。
注意: "\_.*" 匹配直到文件结尾的所有内容。请谨慎使用,因为它会使搜索命令变得非常慢。
另一个示例是 "\_[]",它是一个包含换行符的字符范围
/"\_[^"]*"
这将找到可能跨越多行的双引号内的文本。

27.9 例子

以下是一些您可能会发现有用的搜索模式。这展示了如何组合上面提到的项目。
查找加州车牌
一个示例车牌号码是 "1MGU103"。它包含一个数字、三个大写字母和三个数字。将此直接放入搜索模式中
/\d\u\u\u\d\d\d
另一种方法是指定有三个数字和字母,并使用计数
/\d\u\{3}\d\{3}
使用 [] 范围代替
/[0-9][A-Z]\{3}[0-9]\{3}
您应该使用哪一个?您可以记住的任何一个都可以。您可以记住的简单方法比您无法记住的复杂方法快得多。如果您能记住所有方法,那么请避免最后一种方法,因为它既需要更多输入,执行速度也更慢。

查找标识符

在 C 程序(以及许多其他计算机语言)中,标识符以字母开头,之后可以包含字母和数字。也可以使用下划线。可以使用以下方法找到它:
/\<\h\w*\>
"\<" 和 "\>" 用于仅查找完整单词。"\h" 代表 "[A-Za-z_]",而 "\w" 代表 "[0-9A-Za-z_]"。
注意: "\<" 和 "\>" 取决于 'iskeyword' 选项。如果它包含 "-",例如,那么 "ident-" 不会匹配。在这种情况下,请使用
/\w\@<!\h\w*\w\@!
这将检查 "\w" 在标识符之前或之后是否不匹配。请参阅 /\@<!/\@!.
下一章: usr_28.txt 折叠
版权:请参阅 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主页面
命令索引
快速参考