在上一章中的第九部分, 我们介绍了全文定位跳转
只不过只定位了开头和结尾而已
快捷键分别是:
gg G
之后我们又介绍了定位跳转任意行的方法, 例如:
77G 1000G
接下来, 我们来更进一步, 介绍任意词的定位与跳转
一搜寻
1 查找
说到任意词的定位, 估计大家就已经想到了, 其实就是最最常见的搜索功能
比如我们要在 vim 中搜索: galipy
/galipy
在普通模式中, 按下正斜杠(/), 然后输入要搜索的内容回车就可以了
之后按下字母 n, 就可以查看其他匹配的项了
这是正向匹配, 也就是说, 它只会从光标处往下寻找
但若是想从光标处向上匹配, 应该如何操作?
答:
?galipy
用问号 (?) 就是反向匹配
你会发现, 正斜杠和问号其实是在同一个键位上
有没有熟悉的感觉?
以前我们进行单词间移动, 用字母小 w; 而反向移动, 用字母大 W, 同样是相同键位~
那么, 思考下, 当我们正向匹配 galipy, 按 n 向下查找, 如果我们想向回查找应该怎么办?
2 精准匹配
我们用上面的方法匹配并不精准
比如我输入:
/galipy
我想匹配 galipy, 但是, 匹配的结果只要包含 galipy 就都会显示出来
比如, 可能有:
- galipy
- galipython
- thegalipy
- thegalipython
那么如何精准匹配呢?
这里用到了两个特殊记号:
- \< #表示: 首匹配
- \> #表示: 尾匹配
这两个是什么意思呢?
其实很好理解
一个表示匹配结果开头完全相同, 一个表示匹配结果结尾完全相同
以上面提到的匹配结果为例:
1 如果输入:
/\<galipy
则会得到:
- galipy
- galipython
2 如果输入:
/galipy\>
则会得到:
galipy
thegalipy
3 如果输入:
/\<galipy\>
猜猜看会得到什么结果?
(注: 这是最精确匹配)
答案: 你只会得到 galipy
3 魔法匹配
这个名字是我瞎起的, 只是因为这个匹配方法比较好用, 所以就起了一个这样的名字
我们每次想精确匹配时, 都要输入一堆字符才能完成操作, 有没有相对简单一点的精确匹配呢?
答案是: 有!
不过他有一个前提条件: 那就是, 你的光标必须停留在相同字符串上
其实就是查找有没有其他相同单词的功能
操作很简单, 在普通模式下, 把光标移动到相应单词上, 然后输入:
*
是的, 就只输入一个星号, 他就能查找相同项目了
例如, 你把光标停留在 galipy 上(任意字母上即可), 然后按下星号,
他其实是执行了如下操作:
/\<galipy\>
明白了吗?
星号是从光标处开始向下查询, 那么向上查询呢?
你可能会说, 按住 shift
这次不同之前了因为你输入星号时本身就按着 shift 啊! 所以只好换一个键位了
即:
#
4 模糊匹配
模糊匹配其实涉及到正则表达式了所以我们不讲太多以后再单独讲解正则表达式
我们在搜索时, 并不是每次都 100% 确定自己要找的是什么比如, 我们想搜索 galipy, 但是我们不记得中间的字母是 i 还是 e 了
怎么办? 此时就需要用到模糊匹配了, 也就是正则表达式的技巧
注意看下面的搜索操作和之前有什么不同:
/gal.py
我们把不确定的地方用小数点 (.) 代替了
明白了吗?
虽然匹配的结果可能有很多, 比如:
- galipy
- galepy
- galapy
但总比你瞎写强
所以以后有不清楚的地方, 就用小数点 (.) 代替就好了
那么如果我想查找小数点 (.) 怎么办?
如果有编程语言基础的同学, 应该很容易想到吧~
这里就当思考题了~
5 拓展: 行尾行首匹配
这是个特殊的匹配, 大家只要知道就好
- /^galipy #字符 ^, 表示: 行首匹配, 也就是说必须开头是 galipy 才能匹配到, 有空格都不行
- /galipy$ #字符 $, 表示: 行尾匹配, 必须是 galipy 结尾, 有空格都不行
- /^galipy$ #完全匹配, 这一行只有 galipy 这几个字符才可以, 有空格都不行
不多讲, 可以自行实验: p
二跳转
说完了搜索, 我们来说说跳转
我们首先要明白跳转和光标移动是两个概念
最开始我们接触的 kjhl 都只是单纯的移动光标, 一般都发生在一行内;
但是跳转不同, 跳转多是跨越多行的行为
比如上面说到的搜索操作, 我们很少说用搜索操作去匹配第二行的相同内容一般都是一下不知道跳转到哪里去了对不对?
仔细体会这二者的区别~
三标记
m 表示 mark, 即标记的意思
我们常用 m 操作标记一些重要段落, 并用 a~z 加以区分
比如我们在 vim 文档开头按下 ms 表示 mark start; 中间按下 mm 表示 mark middle; 结尾按下 me 表示 mark end 具体用哪个字母表示什么意思完全看心情~
之后, 我们就可以通过 '单引号操作任意跳转了's #跳转到 s 标记处
'm #跳转到 m 标记处'e #跳转到 e 标记处
并且系统还为我们默认了一处标记, 叫做上一处标记, 区分符号是 ', 没错, 就是单引号本身'' #跳回上一处
''# 再跳回去'' #再跳回去
如果你想查看自己都进行了哪些标记, 可以在普通模式下输入如下操作:
:marks
大家可以试试看, 你会发现, 系统默认标记还有其他几个, 自己研究研究, 看看他们都是什么~
四拓展
除了通过单引号索引标记跳转外, 还有一种索引跳转方法:
历史记录跳转法
主要通过两个快捷键跳转:
- ctrl + o #字母 o 是 old 的缩写, 看到单词应该就知道什么意思了吧
- ctrl + i #字母 i 并不是什么的缩写, 据说只是因为它在字母 o 的旁边
可以自己实验一下
我截取文档相关部分来帮助大家理解:
首先是执行几次跳转, 之后尝试快捷键回跳
- | example text ^ |
- 33G | example text | CTRL-O | CTRL-I
- | example text | |
- V line 33 text ^ V
- | example text | |
- /^The | example text | CTRL-O | CTRL-I
- V There you are | V
- example text
如果想查看自己进行了那些跳转命令, 可以输入:
:jumps
多多练习哟~
来源: http://www.jianshu.com/p/9522e9a96761