背景
编码过程经常要在单个文件各个位置跳转,或者跨文件跳转,一般使用鼠标或者快捷键(前端常用 VSCode、WebStorm)。但,即然使用了 Vim 插件,为什么不使用 Vim 的跳转功能进行更精确的跳转提高编码速度和掌控感呢?
以下我们的命令场景是在 Vim 普通模式下。
一、文件内跳转
动作命令跳转
简单的单词、行内跳转不赘述,请查表,这里提几个常用命令:
- % - 匹配 () [] {} 跳转
- f/F - 向前/后匹配字符跳转,同样的字符重复正/反向匹配跳转可以使用 ;/,
- H/M/L - 跳转至编辑可视区的顶/中/底
- gg/G - 跳转至整个编辑区的顶/底,10gg 则跳转到第 10 行
标记位置跳转
marks
键入 :marks 可查看记录的历史标记位置
手动标记
举个例子,先按 mm,再随意移动跳转光标,完了后按 `m,即可回到之前标记的位置,m 可以换成合法字符(注:使用大写字母会形成跨文件的标记)。
自动标记
标记列表除了记录手动标记的位置外,还有自动标记的,如下:
最常用的两个自动标记位置:
- `` - 现在位置与上次跳转的位置之间切换
- `. - 跳转到最后一次修改的位置
补充
- 跳转是有定义的,比如小幅度的左右上下切换是不算跳转的,所以其中光标位置的切换是不记录在标记列表里的,只有大范围的动作命令造成的光标移动才算跳转被记录
二、文件间跳转
除了文件内的跳转,Vim 还支持强大的文件间跳转,让我们来学几个常用的文件间跳转技巧吧!
jumps
Vim 维护了一个记录跳转历史的列表,可以通过 :jumps 查看。
使用 ctrl + o 与 ctrl + i 可以在跳转历史里往复切换,并且不会修改历史,可在文件内与文件间自由跳转。
changes
文档产生变更都会记录变更的位置到变更列表,可使用 :changes 查看。
可使用 g;/g, 命令对变更列表进行正/反向遍历。
g;
`.
u<C-r>
对比
除了上面提到的 `. 能跳转到最后修改的位置,利用 u 的副作用也能实现:按下 u 是撤回上次修改,这时候我们的位置已经切换到最后修改位置,只要按下 ctrl + r 即可抵消 u 的撤回操作。
. 类似于一个锚点,在使用 g; 不断在变更历史中跳转时,总能使用
. 回到最后一次变更处,而 u
似乎与 `. 功能一样,但是有两个缺点故不建议使用:一是键位更多如果 u 之后的键位未生效容易修改文档;二是假如变更是新增一行,u 则会撤销这行,此时位于目标位置上方造成定位不准。
gi
当我们退出编辑模式,光标在附近游荡,之后又想编辑时,gi 可以跳转到退出编辑的位置并且切换到编辑模式(利用 `^ 自动标记的位置)。
三、总结
总结下:
- 使用 m + ` 标记跳转
- 使用
+ 遍历跳转列表 - 使用 g; + g, 遍历变更列表(实测 ideaVim 无法使用 g;/g, 而 VSCode 可以使用但无法查询 :changes)
其实 Vim 跳转无非就是命令式的跳转指令+通过列表复用位置的跳转指令组合而成,只要我们能够把指令归好类,再加深肌肉记忆,就能让我们更幸福的编码了。