Vim 指尖飞舞之移动篇
本文作者:IMWeb 刘志龙 原文出处:IMWeb社区 未经同意,禁止转载
用了 Vim 许久,发现经常在 h
j
k
l
上浪费非常多的时间。如果过多的使用这些在 Vim 上做移动,往往就会非常低效,严格的说,甚至按两次 h
也能找到别的方案替代 。如何更快的移动和跳转呢?
首尾移动
这个非常常用,也是基本用法,简单提一下。(这边只说实际行)
^
可以快速跳转到行首第一个非空白字符,要和 0
区分开,后者是移动到行首。
$
是移动到行尾,这个也非常常用,举个简单的例子。比如我们写代码在行位遗漏了分号,我们就可以用如下方式操作:
const a = 1 // $a;
const a = 1;
基于单词的移动
减少使用h
j
k
l
的一个重要操作是多用w
b
进行下一个单词行首和上一个单词行首之间的移动。熟悉使用w
b
会减少非常多不必要的h
j
k
l
。
除此之外,e
和 ge
有时候比 w
b
的场景更合适,比如:
const pig = 1; // 这时候假设光标在 p 这个地方,要把 pig 改成 pigs
const pigs = 1; // eas 可以做到在 pig 后面快速加上 s
查找移动
查找是 Vim 里最快的移动方法之一,可以用 f{char}
和 F{char}
进行正向和反向移动。比如:
const pig = a + b; // 这时候假设光标在行尾,发现变量 a 写错了,要改成 c
const pig = c + b; // Faxic 可以做到把 a 改成 c
实际使用经常会发现一个场景,就是 f{char}
执行一次,可能并不能到我们想要的位置。可能要按多次 f{char}
才到到正确的位置,这时候我们就可以用 ;
用来重复执行,用 ,
用来回退。
与 f{char}
类似的还有 t{char}
,区别在于 t{char}
是到目标字符的前一个位置。之所以需要这样一个操作符是因为有类似如下的场景:
pig.eat(); // 光标在 e 处,要删除 eat
pig.(); // dt( 可以做到删除 eat
多行查找移动
f{char}
虽然很方便,但是只能用在单行查找中, 多行查找我们使用 /{目标字符}
。多行查找是必须掌握的能力之一,否则无法再 Vim 中存活。多行查找经常被用来的用法还有如下:
const obj = {a: 1}; // 光标在 c 处,这时候如果要删除 const
obj = {a: 1}; // d/ob<enter>
位置标记
经常写代码的各位一定会发现写代码或者阅读代码的时候,经常要来回看两个地方的代码。这时候 m{标记字符}
'{标记字符}
就要用到了。标记字符可以是 a-z 的任意字符。
m{标记字符}
用来标记位置,'{标记字符}
跳到该标记位置
匹配括号
%
用来做匹配跳转,
const obj = {a: 1}; // 光标在 {,要跳转到 }
const obj = {a: 1}; // % 可以做到光标跳转到 }
和其它类似,可以配合删除等操作。比如:
const obj = {a: 1}; // 光标在 {,要删除 {a: 1}
const obj = ; // d% 可以做到删除 {a: 1}
神奇的 {模式}i 与 {模式}a
我们最后要提的,是 {模式}i 与 {模式}a。这两个用法,如果只是要在 Vim 里存活,并不需要了解。但是如果要提高操作效率,却是必不可少的东西。
模式我们可以用d(删除)
v(复制)
c(编辑)
等模式,这里我们用 d
模式举例。
const teacher = 1; // 光标在 a 处,删除 teacher
const = 1; // daw 可以做到删除 teacher
const teacher = 1; // 光标在 a 处,删除 teacher
const = 1; // diw 可以做到删除 teacher,注意会保留 teacher 原本后面的空格
daw
这里 w
代表了单词,还有 s
p
分别代表句子、段落,这里就不一一举例了。用法和 w
类似。
除了 w
s
p
,还有 [
{
<
'
"
等成对的符号可以使用。直接用 v 模式举例:
var tpl = [
'<a href="{url}">title</a>'
]; // 光标在 u 处
// vi} 会选中 url
// va" 会选中 "{url}"
// vi> 会选中 a href="{url}"
// va] 会选中 [ '<a href="{url}">title</a>' ]
总结
新手在 Vim 中存活不容易,要真正高效的使用 Vim 会更难。但是使用了 Vim 之后,你却会爱上这种编码方式。像现在大家用的更多的 VSCode 等一样都可以设置 Vim 模式。
要高效的使用 Vim,学会高效移动则是必经之路。每一次要多次按h
j
k
l
的时候,都可以考虑是否有更高效的方式移动。