和方向键相比,hjkl方便很多,因为你不需要把手指从 定位行 移开。然而,在 Vim 中过度使用它们反倒会成为高效编辑的阻碍,因为它们一次只能移动一个字符的位置。
Vim 提供了很多其他的移动操作,能够让我们一次移动更多距离。
跳转到行
如果你发现你用了太多的 jjjj 或者 kkkk,那么你可以考虑用<line>gg 来代替它们(例如:用 12gg 跳转到第 12 行)。
<line>G和 <line>gg 的作用相同,但我觉得连按两次 g 要比按住 shift 更容易。
以词为单位的移动
如果你用了太多 h 或者 l,那么你可以考虑使用w 和b:w移动到下一个单词的开头,b移动到上一个单词的开头。还有另一个相似的命令e,它移动到下一个单词的结尾。
如果当前行有太多标点符号,那么 w 和b会变得很难用,因为每一个标点符号都会被当作一个 单词(Vim 对单词的定义是一串连续的字母、数字和下划线;详细的文档在:h iskeyword
)。
大多数时候,我发现 W、B 和E更好用;它们也是以 单词 为单位移动的,但是它们以 空格 来分割单词。因此,它们的分词结果更符合直觉。
跳到指定字符
f<char>和 F<char> 可以跳到下一个或者上一个 <char> 出现的位置(仅限于当前行内)。在编程中,使用他们跳转到下一个小括号或者中括号很方便,例如:f)或者F[。
在使用 f<char> 和F<char>之后,可以使用 ; 和,跳转到这个字符下一次 / 上一次出现的位置;类似于在使用 / 之后用 n 和N在多个查找结果之间跳转。
另一个略有差异的命令是 t<char>;它跳转到<char> 的前一个字符。
t<char>通常用来与 y、c、d 等命令组合,例如:使用 ct) 删除从当前字符到下一个 ) 之前的所有字符并进入插入模式。
我通常用 f 与标点符号搭配,而不是字母。因为人们更容易发现标点符号的位置,而比较难发现特定字母的位置。
关键词查找
Vim 中最常被忽视的命令之一就是 *。它的用途是跳转到 当前关键词 下一次出现的位置,相当于/<ctrl-r><ctrl-w>
。
在使用 * 之后,你也可以用 n 和N跳转到下一个或上一个位置。
如果希望反向找到当前关键词上一次出现的位置,可以使用g*。
应不应该使用 easymotion?
Easymotion 是一个很有创造性的插件。它提供了一套全新的跳转方法:首先你指定一种跳转方式,然后再敲一两个按键跳转到任何一个候选位置。
然而,它在实际使用中也有一些缺点。
如果你在 Vim 里安装了实时语法检查,那么它有可能和语法检查相冲突,因为它会临时修改 buffer 的内容。
另一个问题是它缺少 可预测性:直到它提示你所有的候选位置之前,你是不知道该敲入哪些键的。因此,使用 easymotion 时很难形成肌肉记忆。
但我认为 easymotion 仍然是一个很有意思的插件,很值得一试。