转眼上`vim`的`“贼船”`有一年多了。从`PHP`到`C`,都在用。想要真正用`vim`于日常的编码工作,必然需要一些插件的支持。不过本文并不打算总结插件,笔者认为vim的两个精髓:`组合`和`重复`跟插件也没有什么关系。
Scanned 2/12/2026
Install via CLI
openskills install PChou/PChou.github.io---
layout: postlayout
title: 练上一年再来总结的vim使用技巧
categories: [linux]
tags: [vim]
---
转眼上`vim`的`“贼船”`有一年多了。从`PHP`到`C`,都在用。想要真正用`vim`于日常的编码工作,必然需要一些插件的支持。不过本文并不打算总结插件,笔者认为vim的两个精髓:`组合`和`重复`跟插件也没有什么关系。
## 命令模式应该是常态
在大多数编辑器中,相信大家都喜欢敲几个单词就“保存(ctrl+s)”一下。而在vim中,保存是`:w`,而且需要在命令模式下进行。因此,往往要按`Esc:w`多达三个键才能保存。很多初学者十分诟病这个设计。事实上,经常使用`Esc`切换到命令模式才是vimer需要练就的第一个重要的反射行为。可以毫不夸张的说,只要你不在输入文字,就应该切换在命令模式下,命令模式应该是常态!
## HJKL让右手歇歇,毕竟右手“很累”
这是vim中的光标上下左右的移动,刚开始使用vim的同学可能觉得这并没有什么卵用,我用键盘上的上下左右就可以了!我们知道,vim的大部分快捷键需要在命令模式下完成,而且HJKL也是需要在命令模式下才生效的,如果你经常在插入模式下工作,当然不会去用HJKL。然而,当你真正开始更多的使用命令模式的时候,你会懒到不想把右手挪到“上下左右”那儿去,这个时候HJKL成为无需思考的反射行为。HJKL的好处就是减少了右手的位移距离。毕竟右手还有很多“事情”要做。
## 让你的操作可重复
我们来举个例子,假设如下文本
```
one two three four five six
```
我希望改成
```
"one","two","four","five","six"
```
首先光标定位在该行的行首,可使用`^`。然后键入`f␣`(␣表示空格),此时光标定位在one和two之间的空格处,然后键入`c␣","`(修改空格,进入插入模式,然后增加`","`):
```
one","two three four five six
```
接着按`;.`,光标将先查找下一个空格,即重复`f␣`,这个空格位于two和three之间,然后`.`可以重复上一次的修改操作,即`c␣","`:
```
one","two","three four five six
```
接着重复按若干次`;.`即可完成所有中间字符的修改:
```
one","two","three","four","five","six
```
最后应用`I`和`A`,添加开始和最后的双引号就可以了。
通过这个例子,vimer必须要领会的一个精髓是:`让你的操作可重复!!`。如果上面的例子,我们用`l`或者`->`来定位空格的话,由于one、two、three这些单词的长度是不确定的,我们无法事先知道需要按多少次`l`,所以`l`定位是不可重复的。而通过`f`可以重复我们的查找操作,从而精确的定位到空格。另外,如果我们通过`xi","`代替`c␣","`也是不可重复的,因为`xi","`表示先删除空格,然后进入插入模式后键入`","`,这样就是两次分开的修改操作,而最近的操作变成了“进入插入模式后键入`","`”,如果通过`.`重复这个操作,是无法删除空格的。
这需要大量的实践和练习,才能改掉鼠标流的思维定式。一般来说,尽量多用`f`、`c`、`r`是不错的选择。另外,尽可能的利用`A`、`a`、`o`、`O`来进入插入模式,而不是每次通过`i`进入插入模式。
## 高效移动
光标移动效率是vim程序员达到甚至超过鼠标流程序员的关键技能。vim中的移动光标的方式有很多,我来举几个我实际使用过程中应用比较频繁的技巧:
`set relativenumber(显示相对行号)`。我无意间发现的一个十分实用的技巧,比`set number`显示行号更好用。通过这个设置,行号的显示会根据当前的光标的相对位置显示成偏移数,并动态变化。这个好处是,可以利用`数字+j` `数字+k`来进行多行跳转,因为是编译行数,所以数字不会太大。否则就算要向下移动10行,我们可能也需要用`138gg`。

- `w`、`e`、`b`:按照单词进行前后光标跳转,也可以组合数字进行跳转,不过以我的经验,与其去算要跳多少个单词,不如多按几次吧。
- `I`、`A`:移动到行首或行末的第一个字符处,并进入插入模式。
- `H`、`M`、`L`:光标分别跳转到可视区域的最上面、中间、最下面。
- `Ctrl+D`、`Ctrl+U`:有时,需要看的文本不在可视区域,通过这些组合进行上下翻页。
- `^`、`$`、`0`:光标移动到行首和行尾(0是绝对行首)。不过因为`^`和`$`都需要同时按住shift,而且数字键我们往往难以盲打,所以我一般直接使用`I+Esc`、`A+Esc`。
- `%`:移动到与当前括号匹配的括号处。
- `gj`、`gk`:有时可视区域不够宽,而一行的字符有很多,导致了wrap。那么通过jk是无法直观的定位到同一物理行,却不在同一个可视行里的位置,此时需要`gj`和`gk`。
- `f`、`F`:通过上面的例子,我们知道,`f`是find的意思,可以在一行内查找某个字符出现的位置,并直接跳转过去。比如`f<`可以从当前光标开始向右,找到第一个`<`,并移动过去。F是向左查找。
- `;`:重复上一次的`f`查找操作
- `.`:重复上一次的修改操作,跟`;`可以说是好基友,经常用来实现一些简单的重复操作,比录制宏要简单很多。经常有意识的使用这种简单重复,是vimer编辑思路进阶的分水岭。
## 高效修改
vim的另一个优势是高效修改。在vim下修改就要改掉传统鼠标流的思维方式,切忌提到修改就按`i`。有很多高效的修改办法,而且这些办法往往是可重复的。下面举一些我常用的例子:
- `r`:替换模式,替换当前光标所在位置的一个字符。虽然你同样可以`i`进入插入模式,然后删掉那个字符,再输入需要的字符,但这种操作是鼠标流思维方式。替换是一个可重复操作,多用没坏处。
- `cw`:`change word`可以删除从当前位置到一个单词的结尾,并进入插入模式。这种操作常用于修改一个变量。比如对于:`int count=0;`希望把`count`改成`cnt`,那么当光标位于`c`字符处的时候,按`cw`可直接删除`count`,并进入插入模式。然后直接继续输入`cnt`即可。
- `caw`:`change a word`可以删除当前光标所在位置的单词。对于`int count=0;`的例子,如果此时光标在`count`中间某处,比如`u`处,直接键入`caw`可以达到同样的效果。所以`caw`更强大一些。
- `c$`、`c^`:举一反三,可以猜到`c$`是从当前位置删除到行尾,并进入插入模式。
- `ci"`:`change inside "`可以用于修改当前位置附近,在相同配对的`"`中的内容。比如对于`const char *str="hello world";`。当在双引号中间的任意位置键入`ci"`可以直接清空字符串,并继续输入新的希望的字符串。
- `ci(`、`ci[`:举一反三`change inside (` `change inside [`。
- `cit`:这个比较特殊,可以直接编辑匹配的xml标签中的内容!经常编写html的童鞋可以熟悉一下。
- `yi"`:`yank inside "` 猜猜是啥意思?类似`ci"`只是把编辑操作编程复制操作,因为`y`是复制!是不是很强大。
- `ya"`:`yank around "` 复制整个字符串,包括双引号。
- `yw`、`yaw`、`daw`、`d$`...:好了,这些可以"发明"出来了。
- `o`、`O`:向下向上增加空行
- `u`、`Ctrl+r`:undo和redo
上面的例子体现了vim组合的思想,很多命令可以通过组合得到不同的效果。
## Visual模式是鼠标流后遗症,不过也有妙用
`v`、`V`、`Ctrl+v`是Visual模式,类似用鼠标选中一些文本。我在早期使用vim时候,十分喜欢用`v`,比如要删除一个单词,我往往会用`vwd`,试图用`vw`选中一个单词,然后`d`删除。这种方式明显是鼠标流的后遗症。直到我学会上面介绍的一些技巧后,`v`已经很少用了。不过`Ctrl+v`是`Block Visual`模式,类似选中列,这个技巧有时很有用。比如有如下文本:
```
one
two
three
four
```
希望变成
```
"one, two, three, four"
```
首先将光标定位到one的o处,`Ctrl+v`,`3j`,`$`,`A`,`,`,`Esc`,`V`,`3j`,`J`。这一套连招下来,出来了:
```
one, two, three, four,
```
如果要合的行数很多,就比较有优势了。问我怎么知道按`3j`,上文提到的`set relativenumber`帮到你。
## 总结
在开发效率上,不敢说vim由于IDE,不过vim的编辑和修改速度是比鼠标快的。使用vim的过程就是自我否定和自动重塑的过程,如果你不断的学习技巧的话,编辑习惯会一再被推翻,一再重塑。不断有新的理解注入到日常的工作中。最终会形成自己编辑风格。
No comments yet. Be the first to comment!