查找字符
命令f
用于在本行内向前搜索。例如fx
是向前(Forward)搜索字母x。而命令F
是向后(Backward)搜索。例如Fx
是向后搜索字母x。与f和F这两个相类似的是t和T命令。t
命令类似于f向前搜索命令,所不同的是t搜索到时并不是将光标停在目标字符上,而是停在目标字符的前一个字符上。在搜索的过程中,我们可以使用ESC来退出搜索而开始新的工作。
对于以上四个查找命令,我们可以重复执行这些操作。命令;
是按照前一次的查找方向继续查找,如果要向相反的方向查找可以使用,
命令。但是这些查找只是在行本行内进行,并不会将光标移动到其它的行。
查找字符串
我们可以使用/string
命令来向前(Forward)查找字符串string,按下回车后,光标就能跳到正确的地方。在这个命令中,/后的字符是我们想要查找的字符,而回车键则表明了命令的结束。
有时想要查找的内容并不仅在一处,我们可以在整个文章中进行查找:/
可以继续刚才的查找操作。我们还可以使用n
命令来继续刚才的查找命令。这两个命令都能达到同样的效果。
一般来说,在进行查找时总是在向前查找。我们也可以使用?
命令向后(Backward)查找。N
也是逆向查找命令,他可以实现立即反向查找。
如果我们想要停止这一查找,可以使用ctrl+C命令,如果是在Windows系统中,则要使用ctrl+Break命令。
vi具有记录查找命令历史的功能,这样就不用重复输入查找命令了。例如你刚才做过的三次查找分别是:/one,/two,/three。而现在输入/,然后按方向键的上或是下就看到刚才查找的内容显示在vi的下面,这时只要按下回车就会找到想要的内容了。
指定光标放置位置
在默认情况下,查找时Vim会将光标放在第一个匹配的结果的开始处。我们也可以指定查找结束后,光标所处的位置。对于向前查找的命令,我们可以在斜线后用数字来指明光标所处的位置,例如/set/2
命令会在查找结束后将光标放在第一个set字符串之后第二行的开始处。命令中的数字可以是正数也可以是负数。如果仅是一个简单的数字,光标会被放在第一个匹配字符串之后或之前的数字所指定的行的开始处。正是向后,负数是向前。如果斜线后是b和数字,那么在查找结束后,光标将会放在第一个匹配字符串的开始处,然后向左或是右移动n个字符,这里的n即为数字所指定的数。如果为正数则是向右移动,如果是负数,则是向左移动。例如/set/b2
,这个命令使光标在查找结束后放在第一个匹配字符的开始处,然后向右移动两个字符,也就是说最后光标会位于第一个匹配字符串中的t的位置。将b改为s也是一样的效果。而参数e会使得光标放在第一个匹配字符串的结尾处。同样我们也可以用数字来指定向右还是向左移动光标以及移动的字符数。例如/set/e
命令会使光标放在第一个匹配字符处的结尾处。如果命令改为/set/e2
,会将光标放在第一个匹配字符串的结尾处,然后向右移动2个字符。这里的数字如果是正数则向右移,如果为负数则向左移。
命令/set/e+2
是在查找set字符串结束后,将光标放在第一个匹配字符串的结尾处,然后向右移动两个字符。在这里我们将这个数字称为偏移量。如果要重复上一次的查找,但是需要不同的偏移量,可以用//5
命令。不使用偏移量时,可以指明一个空的偏移量,如//
命令。/
命令,重复前一次的查找,使用相同的偏移量。
查找命令?
也可以实现类似的功能。例如?set?b5
命令,是将光标放在最后一个匹配字符串的开头部分,然后向右移动5个字符。??-2
命令,则继续前一次的查找命令,但是使用新的偏移量。??
命令,是继续前一次的查找命令,但是不使用偏移量。
立时查找字符串
如果我们想快速查找当前光标下的字符串,可以使用命令*
,这个命令可以向前查找与当前光标下的字符精确匹配的字符串。而命令#
,则向后查找与当前光标下的字符精确匹配的字符串。如果当前光标下的字符串为word,在执行*命令查找时并不会与Word相匹配。与这个立时查找命令相类似的就是g*
命令。他不会进行严格的匹配。如果用这个命令来查找word,那么就有可能和Word相匹配。而g#
命令与其相同,只不过他是向相反的方向进行查找匹配。
设置查找选项
我们可以选择高亮显示查找的文本,命令为::set hlsearch
,关闭高亮显示的命令为::set nohlsearch
。如果想关掉刚才高亮显示的结果,可以使用:nohlsearch
命令。
使用:set incsearch
命令,将打开匹配查找选项。在进行查找时就会显示出不断匹配的过程。例如你想查找的内容是include,在打开这个选项后,当你输入/i,光标定位在i上,再继续输入n光标定位在in上,如此直到查打到所要求的内容。关闭这个选项的命令为::set noincsearch
。
在默认的情况下,Vim是大小写敏感的。如果一个文件中有这样几个字符串:include,INCLUDE,Include。当我们使用命令/include
来查找字符串时,只有include字符会被高亮显示。但是如果我们用:set ignorecase
命令打开ignorecase选项后,所有的类似的字符都会被高亮显示。如果这样的查找结果并不是我们想要的,可以使用:set noignorecase
命令关闭这个选项。
如果设置了ignorecase选项后,我们想要查找字符串word,而匹配的则可能是word、Word,WORD。如果我们要查找字符串WORD,匹配的结里也是一样的。但是如果设置了:set ignorecase
和:set smartcase
两项后,执行结果就会变得不一样了:如果我们输入的是小写字符,那么就会匹配各种可能的组合,这时与设置了ignorecase的情况相同,但是如果我们在输入中有一个大写字符,那么这时就变成了精确查找,与设置了noignorecase的情况相同。
我们在执行查找命令时,也可以用修饰符来控制大小写敏感。在命令中加入修饰符/C将告诉Vim执行大小写敏感的查询,比如?/Cword
命令就只匹配单词word。而在命令中加入修饰符/c则执行忽略大小写的查询。
在默认的情下,我们输入要查找的字符串,vim是从当前光标处向前查找,直到文件的结尾,如果没有找到,那么就会从文件的开头开始查找,直到光标所处的位置。我们可以通过:set nowrapscan
命令,来禁止这种循环查找的方式,这样如果已经查找到文件的底部时,就会在底部显示出一条错误信息。如果我们想要回到正常的状态,可以使用:set wrapscan
命令。
f |
向前搜索并将光标停留在目标字符上 |
F |
向后搜索并将光标停留在目标字符上 |
; |
重复刚才的查找 |
, |
反向重复刚才的查找 |
t |
向前搜索并将光标停留在目标字符的前一个字符上 |
T |
向后搜索并将光标停留在目标字符的后一个字符上 |
/ |
向前查找 |
? |
向后查找 |
n |
继续查找 |
N |
反向查找 |
* |
向前查找与当前光标下字符精确匹配的字符串 |
# |
向后查找与当前光标下字符精确匹配的字符串 |
:set hlsearch |
打开高亮显示查找的文本 |
:set nohlsearch |
关闭高亮显示查找的文本 |
:nohlsearch |
关闭当前高亮显示的结果 |
:set incsearch |
打开显示查找匹配过程 |
:set noincsearch |
关闭显示查找匹配过程 |
:set ignorecase |
忽略大小写 |
:set noignorecase |
精确匹配大小写 |
:set nowrapscan |
禁止循环查找方式 |
:set wrapscan |
启用循环查找方式 |