使用核心 Vim Motions 实现极速移动

2025-06-11

使用核心 Vim Motions 实现极速移动

这是《使用 VSCode 和 Vim 提升您的编码能力》一书中的《使用核心 Vim 动作快速移动》一章。

动作(Motion)指的是在 Vim 中移动的方式。这些命令输入后会高速精准地移动光标。动作有很多种,每种都最适合不同类型和长度的移动。我发现它们与 Visual Studio Code 原生的“前往”功能(例如“前往文件”“前往符号”)配合使用效果极佳。

以下是最有用的工具的简要列表,以及何时和如何使用它们:

逐字水平移动

单词移动功能可让你在任意方向(从左到右或从右到左)从一个单词跳转到另一个单词。因此,它们比基本的水平移动速度更快hl

您可以使用ww ord)命令跳转到下一个w ord的开头,如下所示:

同样,您可以:

  • 使用b( bback ) 向后跳转到单词的开头
  • 使用e( e nd) 跳转到单词的末尾
  • 用于ge向后跳转到单词的末尾

借助助记符学习命令

Vim 拥有海量命令。随着时间的推移,当你成为一名经验丰富的 Vim 用户时,这些命令将成为你的第二天性,成为你本能的反应和习惯。不过,一开始你需要逐一学习它们。

学习 Vim 命令的一个好方法是使用助记符,比如将字母与容易记住的单词关联起来。例如,你可以将 关联到wword 来记住它,这样你就可以在单词之间移动;或者,b将 关联到back来记住它,这样你就可以在单词之间向后移动。

按照这种技巧,你会发现你可以轻松地学习和回忆很多命令。

文字与文字

因此w,你可以在 Vim 中逐字移动。但单词究竟是什么?Vim 中的单词可以是bege

  1. 字母、数字和数字的序列
  2. 其他非空白字符序列
these are 4 words
and these below too
,,, ..... ((((( ,.(
Enter fullscreen mode Exit fullscreen mode

但 Vim 也有特殊单词的概念(由字母、数字和数值组成),其中也包括特殊字符,如.({等。在 Vim 术语中,它们被称为 WORD:

WORD 对我们程序员特别有用,因为代码中通常有很多 WORD:

this is a WORD: Iam_A_WORD(WORD)
this function call sum(2,3) is also a WORD
this array [1,2,3,4,5] is a WORD as well
Enter fullscreen mode Exit fullscreen mode

如果要逐个移动单词,可以使用前面描述的动作的大写字母 ( W, B, E, gE)。

一般来说,单词动作允许更精确的变化,而 WORD 动作允许更快的移动

wwww ==> v   v v   v   v
         word. are two words
         word. is one WORD
WWW  ==> ^     ^  ^   ^
Enter fullscreen mode Exit fullscreen mode

移动到特定字符

查找角色动作可让您快速且高精度地水平移动:

  • 使用f{character}( find ) 移动到行中某个字符的下一个出现位置。例如,f"转到下一个双引号。
  • 如果你的目标在光标后面,你可以使用它F{character}来查找字符的上一次出现

我们可以清楚地看到,f通过在一个示例中将一个与另一个进行对比,它比使用单词动作更快、更精确:

f(   ==> v                        v
         const fireball = function(target){
wwww ==> ^     ^        ^ ^       ^
Enter fullscreen mode Exit fullscreen mode

除此之外fVim还提供了t(un* t *il)命令:

  • 用于t{character}将光标移动到下一个字符出现之前(想象t{character}将光标移动到该字符之前
  • 同样,你可以使用T{character}来做同样的事情,t{character}但要反过来

f如果和命令之间的区别t还不太清楚,这里有一个比较它们的例子:

t(   ==> v                       v
         const fireball = function(target){
f(   ==> ^                        ^
Enter fullscreen mode Exit fullscreen mode

t当您将动作与操作符结合起来执行文本更改时非常有用,您很快就会发现(例如,您可以删除所有内容并将(其更改为其他内容)。

使用 后,f{character}您可以键入;来转到下一个出现的字符,或,来转到上一个出现的字符。您可以看到;,是重复上一次字符搜索的命令。这很有用,因为它可以避免您一遍又一遍地输入相同的搜索语句:

fdfdfd ==> v   v               v        v
           let damage = weapon.damage * d20();
           let damage = weapon.damage * d20();
fd;;   ==> v   v               v        v
Enter fullscreen mode Exit fullscreen mode

关于音符、旋律和和弦

Vim 非常特殊。如果你用过其他编辑器,你可能习惯于输入和弦键。也就是说,同时输入组合键。例如,CTRL-C复制和CTRL-V粘贴。虽然 Vim 对和弦并不陌生,但它更依赖于键盘的旋律。

旋律是一系列连续演奏的音符。如果你把琴键想象成音符,那么琴键的旋律就是快速连续地按下的琴键。所以,当你读到“你需要输入”f{character}来查找一行中的某个字符时,这意味着你先输入f,然后再输入字符{character}。因此,这两个键就演奏成了一段旋律。

使用键盘旋律是与 Vim 交互的最常见方式。虽然这种方式有些陌生和奇怪,但它非常方便,因为控制编辑器突然感觉就像在输入文本一样。它对你的手腕健康也大有裨益,因为你不再需要依赖那些会拉伤你脆弱关节的复杂而不自然的组合键1

水平移动极限

进行极度水平移动,请使用:

  • 0:移动到一行的第一个字符
  • ^:移动到一行的第一个非空白字符
  • $:移至行尾
  • g_:移动到行尾的非空白字符

垂直移动

k和开始j我们继续讨论一种更快的垂直操纵方法

  • }向下跳转整个段落
  • {类似但向上
  • CTRL-D让你通过滚动页面向下移动半页
  • CTRL-U让你也可以通过滚动向上移动半页

这些都不是我最喜欢的,但暂时就用用吧。在自定义映射章节中,你将学习如何创建自定义按键绑定,以实现极致的中距离垂直运动。

具有搜索模式的高精度垂直运动

当您心中有一个目标时,要想垂直移动得更快,最好的选择是使用和命令搜索该目标:/{pattern}?{pattern}

  • 用于在文件内向前/{pattern}搜索
  • 用于向后?{pattern}搜索

其中{pattern}片段通常是一个字符串文字(方法、类或变量的名称),但也可以是正则表达式。

如果您在电脑旁,请立即尝试输入搜索命令。您会发现,当您输入搜索命令时,文件中任何与模式匹配的文本都会被高亮显示。继续输入模式时,高亮显示的区域将会更新并反映新的匹配项。找到所需内容后,输入搜索命令<Enter>,光标就会跳转到文档中的第一个匹配项。您可以根据需要在此处进行一些编辑,之后使用搜索命令n跳转到下一个匹配项(或N上一个匹配项)。您可以将其视为n重复搜索

启用高亮搜索

由于某些我并不知道的原因,VSCodeVim 默认不启用高亮搜索功能。为了解决这个问题,请前往“首选项”并启用“Vim: Hlsearch”选项(或者,使用vim.hlsearchjson 版本配置中的选项)。

Vim 乐于帮你节省时间:随时输入/<Enter>?<Enter>即可运行上次搜索(向前或向后)。或者使用*来搜索光标下的单词(#向后执行相同操作)。

通过计数加快移动速度

计数是用来乘以命令效果的数字。你可以像下面这样在任何命令前加上计数来使用它们:

{count}{command}
Enter fullscreen mode Exit fullscreen mode

例如:

  • 2w允许我们将光标向前移动 2 个单词。
  • 5j将光标位置更改为下面 5 行。
  • 3;让你转到下一个第三次出现的字符。
  • 2/babybaby带您快速跳至文档中第二次出现的。

一般来说,用来{count}{motion}增加动作{count}次数。

相对行号

j在 Vim 中垂直移动的一个好方法是将计数与和动作结合使用k。但有时很难知道需要跳转多少行才能到达目标位置。这时相对行号就派上用场了。

相对行号显示的是相对于当前行的行号:如果当前行是光标所在的位置,则下一行的行号为 1,下一行的行号为 2,依此类推。使用相对行号,可以非常直观地看到需要跳转多少行才能到达目标行。只需查看一下相对行号,就可以将其用作计数。

您可以通过转到“首选项”CMD-SHIFT-P (记住!使用带有或 的命令面板CTRL-SHIFT-P,搜索行号配置并将其设置为相对,在 VSCode 中启用相对行号。

语义移动

除了前面提到的那些没有真正考虑代码含义的动作之外,Vim 还提供了额外的绑定来考虑代码语义:

  • 用于gd跳转到光标下内容的定义。
  • 用于gf在导入时跳转到某个文件。

还有一些更漂亮的核心动作

这些动作有时可能会派上用场:

  • 键入gg以转到文件顶部。
  • 用于{line}gg转到特定行。
  • 用于G转到文件末尾。
  • 输入%jump to 匹配({[]})

概括

动作是一些命令,让你可以在 Vim 中快速精准地移动。它们由一个或多个按键组成,这些按键被敲成旋律。它们可以让你以不同的长度和精度执行不同类型的动作。

最基本的是hjkl和 ,非常适合进行小修改。然后,我们有单词和段落动作w{),可以更快地浏览代码。除此之外,我们还有高精度的类似搜索的动作f/),可以让我们快速传送到字符或搜索模式。

查找字符和搜索动作都有重复符n, ;),只需输入一个字符即可重复上一次搜索。我们可以用它们在任意方向上快速地从一个匹配跳转到另一个匹配。重复符的概念是 Vim 中的一个常见主题,你将在本书中学习到很多重复符。训练自己依赖重复符,你将会因此而变得更加高效

你可以将计数与动作结合起来,以获得更佳效果。我们的大脑计数速度较慢,因此你应该将计数限制在短距离跳跃中。将计数与垂直动作结合使用时,最好启用相对数字,因为它们能让你清楚地参考目标。如果你还没有启用相对数字,请考虑启用

现在让我们转到 Vim 中的另一个基础块,它允许您像魔术一样编辑文本:运算符


  1. 如果你有腕管综合症或其他腕关节问题,这很有用。另外,帮自己一个忙,买一个好的人体工学键盘。这可是要长期坚持的 。↩

鏂囩珷鏉ユ簮锛�https://dev.to/vintharas/moving-blazingly-fast-with-the-code-vim-motions-2i1n
PREV
Termux Useful Tweaks
NEXT
值得使用的 JavaScript 模块🔥