vim 基础:简单的文字编辑 (4)

motion 是个十分有用并且核心的概念,我们如何快速移动光标,甚至在不同文件之间迅速切换就靠它了。在这之后,咱们再介绍一个兄弟概念 operator。在这一篇之后,基本就可以达到流畅 vim 编辑,妥妥的。咱们先来一个举个栗子介绍一下 operatormotion 这哥俩加在一块有多爽。

举个栗子

如果现在光标在图下这个位置,我们想把从光标向右到括号的内容都删掉

也就是删掉 , c=0 这段代码,应该怎么做呢?很容易,我们就直接告诉 vim

删掉从光标到 0 的内容

就好了。而把这句话 “翻译” 成 vim 能懂得操作也很容易:

df0

嗯,按下这三个键就搞定了。也就是说,刚才那句话可以和这三个键对应:

删掉 (d for delete)从光标到 0 (f0) 的内容

现在让我们来仔细拆分一下刚才究竟都发生了啥…首先我们说怎么通过 motion 来移动光标。

光标哪里去

motion 又名 “光标哪里去”。vim 在 普通模式下 (normal mode) 下有很多不同的方式来移动光标,而这也是它强大高效的原因之一,比如:

  1. 横向移动 (left-right motion)
  2. 纵向移动 (up-down motion)
  3. 按词移动 (word motion)
  4. 按文本移动 (object/text-object motion)

横向移动 (left-right motion)

比如咱们栗子里的 f 就是 left-right motion 第一种。如果你打开 vim 的帮助文档 ,你会发现它显示的是 f{char},那意思就是 f 之后需要加一个字符,单单一个 f 不构成完整的 motion

好的,我们继续说。f{char} 的作用是把光标向右移动,直到遇到 {char} 为止(而 F{char} 则是把光标向左移动)。如果我们按下 f0 的话,那意思就是:把光标向右挪,挪至找到 0 为止:

同样的,t{char} (和 T{char})也是类似的原理,但和 f{char} 相比有个小区别,如果我要把光标挪到同样的位置的话,需要按下 t)

这里我们再列几个常用的横向移动办法:

  1. h/l 向左/右移动一个字符
  2. 0 移光标到行首
  3. $ 移光标到行末

还有个神奇的 ^,小伙们可以尝试一下。

纵向移动 (up-down motion)

  1. j/k 向上/下移动一行
  2. gg 移光标至文件第一行
  3. G 移光标至文件最后一行
  4. :{number} 移光标至文件的第 {number} 行。比如 :3 (然后按回车)就是去第三行。

还有一对神奇的 gjgk ,小伙们也可以尝试一下,如果有需要的话,它们和普通 j/k 的区别下次再说不迟。

按词移动 (word motion)

  1. w/W 移光标至下一词
  2. b/B 移光标至上一词
  3. e/E 移光标至词末

按文本对象移动 (object/text-object motion)

这个部分也是 vim 的一个核心概念,为了不跑题太远,咱们再单开一篇细说。目前就把 文本对象 理解成是 vim 描述文本的一种方式就好。

vim 的动词:operator

如果说刚才咱们列举的 motion 可以视为 名词 的话,那么 operator 就是 vim 中的 动词 了。如果说:f0 是把光标向右挪,挪至找到 0 为止。那么 df0 就是 删除 从光标现有位置到向右找到 0 为止的所有内容。

如果说我们在同样的位置按下 cf0 的话,那就是删除 , c=0 并且进入 输入模式 (Insert Mode)。

除了常用的 d (delete) 和 c (change) 之外,还有以下几个常用的 “动词”:

  1. >
  2. <
  3. y

我在 2016 年曾经写过一篇 motion 进阶,虽然年头有点久了,而且当时写的也有点冗长,但是里面有不少使用 motion 的栗子。所以我也就偷偷懒,这里就不再重复啦。另外,细心的小伙伴肯定能发现:为啥这篇的演示图和 之前那篇 最后不一样…

那是因为他们之间相差了不少插件,比如:vim-airline, base16-vim, ultisnips

vim 的插件我之前写过了 vim-plugultisnips, 剩下还有好多咱们慢慢来…

我一个一个写…一定不拖更…

VZJ wechat
欢迎您扫一扫上面的二维码,订阅 V 字君的微信公众号。