📄 pattern.cnx
字号:
*pattern.txt* For Vim version 6.2. 最近更新:2004年6月 VIM REFERENCE MANUAL by Bram Moolenaar (译者: lang2 http://vimcdoc.sf.net)模式及查找命令 *pattern-searches*最基本的东西可以在用户手册的 |03.9| 节中找到。在 |usr_27.txt| 也有一些解释。1. 查找命令 |search-commands|2. 匹配模式的定义 |search-pattern|3. 模式项总揽 |pattern-overview|4. 多项 |pattern-multi-items|5. 普通匹配原 |pattern-atoms|6. 忽略大小写 |/ignorecase|7. 与 Perl 匹配模式的比较 |perl-patterns|8. 高亮显示匹配 |match-highlight|==============================================================================1. 查找命令 *search-commands* *E486* */*/{pattern}[/]<CR> 向前查找第 [count] 次出现 {pattern} 的地方 (不包含)/{pattern}/{offset}<CR> 向前查找第 [count] 次出现 {pattern} 的地方 并向上或下移动 |{offset}| 行。 */<CR>*/<CR> 向前查找第 [count] 次出现处,使用上次的模式 |last-pattern| 以及 |{offset}|.//{offset}<CR> 向前查找第 [count] 次出现处,使用上次的模式 |last-pattern| 以及新偏移 |{offset}|. 若 {offset} 为空不使用任何偏移。 *?*?{pattern}[?]<CR> 向后查找第 [count] 次出现 {pattern} 的地方 (不包含)?{pattern}?{offset}<CR> S向后查找第 [count] 次出现 {pattern} 的地方 并向上或下移动 |{offset}| 行。 *?<CR>*?<CR> 向后查找第 [count] 次出现处,使用上次的模式 |last-pattern| 以及 |{offset}|.??{offset}<CR> 向后查找第 [count] 次出现处,使用上次的模式 |last-pattern| 以及新偏移 |{offset}|. 若 {offset} 为空不使用任何偏移。 *n*n 将上次的 "/" 或 "?" 重复 [count] 次。 |last-pattern| {Vi: 无次数} *N*N 将上次的 "/" 或 "?" 在反方向上重复 [count] 次。 |last-pattern| {Vi: 无次数} *star* *E348* *E349** 向前查找第 [count] 次出现距离当前光标最近的单词的地方。 用于查找的单词是一下的先符合条件的: 1. 光标下的关键字 |'iskeyword'| 2. 当前行内的光标后的第一个关键字。 3. 光标下的非空白单词 4. 当前行内的光标后的第一个非空白单词 只查找整字,象和命令 "/\<keyword\>" 一样。(不包含) {not in Vi} 使用 'ignorecase', 'smartcase' 没有。 *#*# 同 "*", 但向后查找。 磅符号 (字符 163) 也可。如果 "#" 的功能和退格键一样,试着在启动 Vim 前使用 "stty erase <BS>" (<BS> 是 CTRL-H 或真的退格键). {not in Vi} *gstar*g* 同 "*",但不使用 "\<" 和 "\>"。这样查找就会匹配非整字的 地方。{not in Vi} *g#*g# 同 "#",但不使用 "\<" 和 "\>"。这样查找就会匹配非整字的 地方。{not in Vi} *gd*gd 跳转至局部声明。当光标下是一个局部变量时,此命令会跳转 到该变量被声明的地方。首先,Vim 会查找当前函数的起始处。 就象使用 "[[" 一样。如果找不到会停止在第一行。如果找到, Vim 会向后直到找到一个空行,然后从这里开始向前查找光标 下的关键字,就象 "*"。看起来象注视的行会被忽略。 (见 'comments' 选项). Note 这并非总有效。Vim 不会做语法分析。它仅仅查找关键 字的匹配。如果需要搜索头文件的话,可以使用 |include-search| 列出的命令。 这个命令之后,可以使用 |n| 向前查找下一个匹配 (不能向后). {not in Vi} *gD*gD 跳转至全局声明。当光标下是一个全局变量时,此命令会跳转 到该变量被声明的地方。这和 "gd" 命令一样,不过查找总是 从第一行开始。{not in Vi} *CTRL-C*CTRL-C 中止当前的 (搜索) 命令。在 MS-DOS 上用 CTRL-Break |dos-CTRL-Break|. 在普通模式下,任何等待的命令将被终止。 *:noh* *:nohlsearch*:noh[lsearch] 停止 'hlsearch' 选项的高亮显示。如果再执行查找命令 或者设定 'hlsearch' 选项,高亮会被自动打开。此命令 无法使用在自动命令里,因为加亮的状态会被自动保存和 恢复 |autocmd-searchpat|。如果 'incsearch' 选项被打开,当年出键入查找模式时,当前的匹配会被显示。你还得用 <CR> 来结束查找命令并将光标定位到显示的匹配。或者用 <ESC> 来放弃查找。如果 'hlsearch' 被打开,你最后一次查找命令的所有匹配点都会被加亮。这可以用|:nohlsearch| 命令终止。 *search-offset* *{offset}*这些命令查找一个指定的模式。对于 "/" 和 "?" 命令可以指定一个额外的偏移量。有两种偏移:行偏移和字符偏移。{字符偏移不适用于 Vi}偏移用来指定光标相对于找到的匹配的位置: [num] [num] 行向下,列 1 +[num] [num] 行向下,列 1 -[num] [num] 行向上,列 1 e[+num] [num] 字符向右 (从匹配结束处算起) e[-num] [num] 字符向左 (从匹配结束处算起) s[+num] [num] 字符向右 (从匹配开始 (start) 处算起) s[-num] [num] 字符向左 (从匹配开始 (start) 处算起) b[+num] [num] 字符向左 (从匹配开始 (begin) 处算起) b[-num] [num] 字符向左 (从匹配开始 (begin) 处算起)如果给出了 '-' 或 '+' 但是省略了 [num],会使用缺省的 1。如果使用了 'e',查找会成为包含的 (光标所落在的字符被包含在操作中).例子:模式 光标位置 ~/test/+1 "test" 下一行,第一列/test/e "test" 的后一个 't'/test/s+2 "test" 中的 's'/test/b-3 "test" 前的第三个字符如果把这些命令之一和一个操作符连用,查找之前和之后光标位置之间的字符会被影响。然而,如果一个行偏移被使用,两光标位置之间的所有行都被影响。一个如何查找一个模式并用另一个单词来更改匹配的例子: > /foo<CR> 查找 "foo" c//e change until end of match bar<Esc> type replacement //<CR> go to start of next match c//e change until end of match beep<Esc> type another replacement etc.< *//;* *E386*一个很特别的偏移是 ';' 后面接另一个查找命令。例如: > /test 1/;/test /test.*/+1;?ing?第一次查找先找到下一个出现 "test 1" 的地方,然后找第一次出现 "test" 的地方。这就好象接连执行两次查找命令,不同之处在于:- 这可以被当做一个移动命令而于一个操作符之后。- 后续的 "n" 或 "N" 命令取决于第一个查找操作。- 当有错误时光标原地不动。 *last-pattern*最近被使用的模式和偏移会被记住。它们可以被用来重复查找,向前或向后均可,还可以使用次数。 Note Vim 会记住两个模式:一个普通模式下查找命令用的,另一个是替换命令 ":s" 用的。每次给处一个空白的模式时,上次的模式都将被用到。'magic' 选项的值是被绑在上次使用的模式上的。如果你改变了 'magic',这不会改变上次使用的模式的解释方法。'ignorecase' 选项就不同。当 'ignorecase' 的值被改变时,会使得该模式匹配另外的文本。如果你设定了 'hlsearch' 选项,所有最后一次查找的匹配都会被加亮。要清除最后一次查找的模式: > :let @/ = ""这不会把该模式设置为空串,因为那样会匹配所有的东西。该模式是真的被清除了,就象Vim 刚刚启动一样。通常查找会跳过那些不移动光标位置的匹配。下一次匹配是开始于下一个字符还是在跳过的匹配之后取决于 'cpoptions' 选项中的 'c' 标志位。见 |cpo-c|. 带 'c' flag: "/..." 前进 1 至 3 个字符 不带 'c' flag: "/..." 前进 1 个字符从第一栏开始搜索并忽略任何光标位置之前的匹配导致了 'c' 标志的不可预见性。在 Vi 里 ":tag" 命令会将最后一次查找的模式设定为要搜索的标签。Vim 没有这样做。前一次查找的模式仍然被记住,除非 'cpoptions' 选项中包括 't' 标志位。查找模式总被存入查找历史记录。如果 'wrapscan' 选项的值为真 (缺省) 的话,查找会在缓冲的结尾折返。否则,向后查找会在开始处停止;向前查找会在结尾处停止。如果该选项为真但找不到该模式,会给处一个错误信息:"pattern not found"。光标原地不动。否则给处的信息是:"search hit BOTTOM without match" 或者 "search hit TOP without match",取决于查找的方向。如果该选项为真,当查找折返时会显示:"search hit TOP, continuing atBOTTOM" 或 "search hit BOTTOM, continuing at TOP"。这各信息可以用设定'shortmess' 选项里的 's' 标志位来关闭。该信息的显示会使用 'w' 的加亮方法。(缺省: 标准输出)。 *search-range*你可以限定 "/" 命令查找的范围。一个窍门是使用 ":substitute" 命令并与 'c' 联用。例: > :.,300s/Pattern//gc这个命令会从光标所在处开始查找 "Pattern",知道第 300 行。在匹配处,你会被提示键入一个字符。键入 'q' 终止;键入 'n' 找下一个匹配。"*", "#", "g*" 和 "g#" 命令依照一下的次序在光标附近查找一个单词,第一个被找到的会被使用:- 光标下的关键字。- 同行的光标右侧的第一各关键字。- 光标下的第一个字 (WORD)。- 同行的光标右侧的第一各字 (WORD)。关键字只能包括字母和 'iskeyword' 中的字符。字 (WORD) 可以包括任何非空白 (<Tab>和/或 <Space>) 。Note 如果你用十个指头打字的话,这些字符是很容易记住的:"#" 在你的左手中指上 (向左上查找);"*" 在你的右手中指上 (向右下查找)。(这取决于你的键盘布局).==============================================================================2. 模式的定义 *search-pattern* *pattern* *[pattern]* *regular-expression* *regexp* *Pattern* *E76* *E361* *E363* *E383* *E476*头一道菜已经在用户手册的第 27 章 |usr_27.txt| 上过了。 */bar* */\bar* */pattern*1. 一个模式 (pattern) 是由 "\|" 分割开的一个或多个分支 (branch)。它可以匹配 其中的任何一个分支。例如:"foo\|beep" 可以匹配 "foo" 或 "beep"。如果超过 一个分支可以匹配,第一个被选用。 pattern ::= branch 或 branch \| branch 或 branch \| branch \| branch 等。 */branch* */\&*2. 一个分支是一个或多个被 "\&" 分割的邻接。它匹配最后一个邻接,但仅仅当前面所 的邻接也在同样位置匹配。例: "foobeep\&..." 匹配 "foobeep" 中的 "foo" . ".*Peter\&.*Bob" 匹配同时包括 "Peter" 和 "Bob" 的一行 branch ::= concat 或 concat \& concat 或 concat \& concat \& concat 等。 */concat*3. 一个邻接 (concat) 是一或多个相邻的组件 (piece)。它匹配第一个组件,后接第 二个组件的匹配,等。 例如: "f[0-9]b",先匹配 "f",然后是一个数位,接着 "b"。 concat ::= piece 或 piece piece 或 piece piece piece 等。 */piece*4. 一个组件是一个原 (atom),后面可能带一个倍数 (multi),用来表示匹配原的次数。 例如:"a*" 匹配任意个 "a" 组成的序列: "", "a", "aa", 等。参见 |/multi|。 piece ::= atom 或 atom multi */atom*5. 一个原可以是一个很长的条目列表中的一个。很多原被用来匹配文本中的一个字符。 原经常是一个普通的字符或字符类。可以用圆括号来将一个模式变成一个原。结构 "\z(\)" 仅仅被用在语法加亮中。 atom ::= ordinary-atom |/ordinary-atom| 或 \( pattern \) |/\(| 或 \%( pattern \) |/\%(| 或 \z( pattern \) |/\z(|==============================================================================3. 模式项总揽 *pattern-overview*多项总揽。 */multi* *E61* *E62*下面给处一些解释和例子,包括链接。 *E64* multi ~ 'magic' 'nomagic' 匹配前面的原 ~|/star| * \* 0 或更多 尽可能多|/\+| \+ \+ 1 或更多 尽可能多 (*)|/\=| \= \= 0 或 1 尽可能多 (*)|/\?| \? \? 0 或 1 尽可能多 (*)|/\{| \{n,m} \{n,m} n 到 m 尽可能多 (*) \{n} \{n} n 准确 (*) \{n,} \{n,} 最少 n 尽可能多 (*) \{,m} \{,m} 0 到 m 尽可能多 (*) \{} \{} 0 或更多 尽可能多 (*)|/\{-| \{-n,m} \{-n,m} n 到 m 尽可能多 (*) \{-n} \{-n} n 准确 (*) \{-n,} \{-n,} 最少 n 尽可能多 (*) \{-,m} \{-,m} 0 到 m 尽可能多 (*) \{-} \{-} 0 或更多 尽可能多 (*) *E59*|/\@>| \@> \@> 1, 象匹配一整个模式 (*)|/\@=| \@= \@= nothing, requires a match |/zero-width| (*)|/\@!| \@! \@! nothing, requires NO match |/zero-width| (*)|/\@<=| \@<= \@<= nothing, requires a match behind |/zero-width| (*)|/\@<!| \@<! \@<! nothing, requires NO match behind |/zero-width| (*)(*) {not in Vi}普通原总揽。 */ordinary-atom*下面给处一些解释和例子,包括链接。 ordinary atom ~ magic nomagic matches ~|/^| ^ ^ 行首 (在模式起始) |/zero-width||/\^| \^ \^ 字符 '^'|/\_^| \_^ \_^ 行首 (用于任何地方) |/zero-width||/$| $ $ 行尾 (在模式结尾) |/zero-width||/\$| \$ \$ 字符 '$'|/\_$| \_$ \_$ 行尾 (用于任何地方) |/zero-width||/.| . \. 任何单个字符 (不包括行尾)|/\_.| \_. \_. 任何单个字符,包括行尾|/\<| \< \< 一个单词的起始 |/zero-width||/\>| \> \> 一个单词的结尾 |/zero-width||/\zs| \zs \zs 任何字符,设定匹配起始|/\ze| \ze \ze 任何字符,设定匹配结尾|/\%^| \%^ \%^ 文件首 |/zero-width| *E71*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -