5月27日 14:00

Vim 有哪些快速移动命令?光标跳转怎么操作?

Vim 的移动命令比你想象的多得多

很多人学 Vim 的第一步是记住 hjkl,然后就在这四个键上原地踏步。其实 hjkl 只是 Vim 移动体系里最慢的一层——当你学会更高级的移动方式后,会发现自己几乎不再需要逐字符挪动光标。

下面按粒度从细到粗,把 Vim 的快速移动命令梳理一遍。

字符级:行内的精确打击

行内移动是最高频的操作,掌握这几个命令能省大量按键:

  • f{char} — 跳到当前行下一个出现 {char} 的位置,光标落在字符上
  • F{char} — 反向搜索,跳到当前行上一个 {char}
  • t{char} — 和 f 类似,但光标停在目标字符前一个位置
  • T{char} — 反向的 t
  • ; — 重复上一次 f/F/t/T 查找
  • , — 反向重复上一次 f/F/t/T 查找

举个例子,光标在行首,行内容是 const result = calculate(x, y),按 f= 直接跳到等号,再按 ; 可以继续找下一个等号。t) 则会跳到右括号的前一个字符——配合 d 操作符删除到括号前非常顺手。

单词级:以语义单位跳转

逐字符移动太慢,逐单词才是日常节奏:

  • w / W — 跳到下一个单词开头(小写以标点为分隔,大写只认空格)
  • b / B — 跳到上一个单词开头
  • e / E — 跳到当前/下一个单词末尾
  • ge / gE — 跳到上一个单词末尾

小写和大写的区别在于"单词"的定义:wfoo-bar 视为三个单词(foo、-、bar),而 W 视为一个。写代码时大写往往更实用,因为变量名里经常有连字符和点号。

加数字前缀可以倍增:3w 向后跳三个单词。

行级:一秒到行首行尾

  • 0 — 跳到行首(第一列)
  • ^ — 跳到行首第一个非空白字符
  • $ — 跳到行尾
  • g_ — 跳到行尾最后一个非空白字符

实际编码中 ^0 更常用,因为代码行首通常有缩进。g_ 则在处理行尾注释或多余空格时很方便。

段落与句子:大块跳转

  • { — 跳到上一个空行(段落开头)
  • } — 跳到下一个空行
  • ( — 跳到上一句开头
  • ) — 跳到下一句开头

在代码里 {} 非常实用,因为函数之间通常有空行分隔。按 } 就能快速跳到下一个函数。

屏幕级:视野内的快速定位

  • H — 跳到屏幕顶部第一行
  • M — 跳到屏幕中间一行
  • L — 跳到屏幕底部最后一行
  • zt — 当前行滚到屏幕顶部
  • zz — 当前行滚到屏幕中间
  • zb — 当前行滚到屏幕底部

zz 是被严重低估的命令——当你编辑了一行代码想让它在屏幕中间显示时,按 zz 比翻页再移光标快得多。

翻页:半页比整页更实用

  • Ctrl+d — 向下翻半页
  • Ctrl+u — 向上翻半页
  • Ctrl+f — 向下翻一整页
  • Ctrl+b — 向上翻一整页

新手容易习惯整页翻,但半页翻(Ctrl+d / Ctrl+u)更好用——翻完之后眼睛不需要重新定位,因为上下文还有一半留在屏幕上。

文件级:跳到任意行

  • gg — 跳到文件第一行
  • G — 跳到文件最后一行
  • {n}G:{n} — 跳到第 n 行

配合相对行号(set relativenumber),可以一眼看出目标行与当前行的距离,直接 {n}j{n}k 跳过去,比输入行号更快。

搜索:最快的"我想去哪就去哪"

  • /pattern — 向下搜索
  • ?pattern — 向上搜索
  • n / N — 跳到下一个/上一个匹配
  • * — 向下搜索光标下的单词
  • # — 向上搜索光标下的单词

* 是日常高频操作——把光标放在一个变量名上按 *,立刻跳到下一个使用该变量的位置,比手动输入 /variableName 快得多。

搜索还能和操作符组合:d/pattern 删除到下一个匹配处,c/pattern 修改到下一个匹配处。

括号匹配:在代码结构间穿梭

  • % — 在匹配的括号之间跳转(支持 ()[]{}

光标在 ( 上按 % 跳到对应的 ),再按一次跳回来。配合 v% 可以选中整个括号内的内容。

标记:书签式的瞬移

  • m{a-z} — 设置局部标记(当前文件内有效)
  • m{A-Z} — 设置全局标记(跨文件有效)
  • `{mark} — 跳到标记的精确位置
  • '{mark} — 跳到标记所在行的行首

标记适合在两个位置之间反复切换的场景。比如在函数定义和调用处各设一个标记,用 `a`b 来回跳。

跳转列表:Vim 内置的"后退/前进"

  • `` — 跳回上一次跳转来的位置
  • Ctrl+o — 在跳转列表中后退
  • Ctrl+i — 在跳转列表中前进

Vim 会自动记录你的跳转历史。无论你用 G/* 还是 :{n} 跳到别处,按 Ctrl+o 都能回到之前的位置。连续按可以一路退回去,Ctrl+i 则反方向前进。这对阅读大型代码库特别有用。

gd 和 gD:跳到定义

  • gd — 跳到光标下变量的局部定义
  • gD — 跳到光标下变量的全局定义

虽然不如 LSP 的"跳转到定义"精确,但在没有语言服务器的情况下,gd 已经能覆盖大部分场景。

数字前缀:一切移动命令的倍增器

前面提到的几乎所有移动命令都能加数字前缀:

  • 5j — 向下 5 行
  • 3w — 向后 3 个单词
  • 2f= — 跳到第 2 个等号
  • 10Ctrl+d — 向下翻 10 行(而非半页)

这是 Vim 的核心设计思路——移动命令是名词,数字是量词,操作符是动词,组合出无限可能。


如果你目前还主要靠 hjkl 和方向键移动,建议先从 w/bf/tCtrl+d/Ctrl+u 这三组开始练。它们覆盖了最高频的移动场景,熟练之后编辑速度会有明显的跃升。其他的命令用到了再查,不用刻意背——Vim 的学习本来就是用出来的,不是背出来的。

标签:Vim