vim-shortcuts_1280x800.png

背景

编码过程经常要在单个文件各个位置跳转,或者跨文件跳转,一般使用鼠标或者快捷键(前端常用 VSCode、WebStorm)。但,即然使用了 Vim 插件,为什么不使用 Vim 的跳转功能进行更精确的跳转提高编码速度和掌控感呢?

以下我们的命令场景是在 Vim 普通模式下。

一、文件内跳转

动作命令跳转

简单的单词、行内跳转不赘述,请查表,这里提几个常用命令:

  • % - 匹配 () [] {} 跳转
  • f/F - 向前/后匹配字符跳转,同样的字符重复正/反向匹配跳转可以使用 ;/,
  • H/M/L - 跳转至编辑可视区的顶/中/底
  • gg/G - 跳转至整个编辑区的顶/底,10gg 则跳转到第 10 行

标记位置跳转

marks

键入 :marks 可查看记录的历史标记位置

手动标记

举个例子,先按 mm,再随意移动跳转光标,完了后按 `m,即可回到之前标记的位置,m 可以换成合法字符(注:使用大写字母会形成跨文件的标记)。

自动标记

标记列表除了记录手动标记的位置外,还有自动标记的,如下:
image.png
最常用的两个自动标记位置:

  • `` - 现在位置与上次跳转的位置之间切换
  • `. - 跳转到最后一次修改的位置

补充

  • 跳转是有定义的,比如小幅度的左右上下切换是不算跳转的,所以其中光标位置的切换是不记录在标记列表里的,只有大范围的动作命令造成的光标移动才算跳转被记录

二、文件间跳转

除了文件内的跳转,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 跳转无非就是命令式的跳转指令+通过列表复用位置的跳转指令组合而成,只要我们能够把指令归好类,再加深肌肉记忆,就能让我们更幸福的编码了。

参考

Vim实用技巧(第2版)