Skip to content
Back to skills

Posts

ASecurity

转眼上`vim`的`“贼船”`有一年多了。从`PHP`到`C`,都在用。想要真正用`vim`于日常的编码工作,必然需要一些插件的支持。不过本文并不打算总结插件,笔者认为vim的两个精髓:`组合`和`重复`跟插件也没有什么关系。

  • 11 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added February 6, 2026
developmentgophp

Security analysis

A100/100

Pro scans all 21 files and shows the line behind each finding

Scanned February 12, 2026

npx -y skills add PChou/PChou.github.io --skill _posts --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Posts?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Posts
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/pchou-posts/badge)](https://www.skillsdirectory.com/skills/pchou-posts)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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`。

![](http://pchou.qiniudn.com/2016-11-10-vim-skill-00.jpg)

- `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的过程就是自我否定和自动重塑的过程,如果你不断的学习技巧的话,编辑习惯会一再被推翻,一再重塑。不断有新的理解注入到日常的工作中。最终会形成自己编辑风格。

Files in this skill

  • 2013-01-02-hello-github.md916 B
  • 2013-01-03-git-resource.md490 B
  • 2013-01-06-linuxcast-video-link.md2.5 KB
  • 2013-01-10-ftp-notwork-in-nat.md4.1 KB
  • 2013-01-11-net-cpp-hobby.md8.4 KB
  • 2013-01-12-linux-permission-sys.md2.6 KB
  • 2013-01-12-net-cpp-hobby-01.md5 KB
  • 2013-01-12-net-cpp-hobby-02.md4.4 KB
  • 2013-01-13-cppcli-target-net2-without-vs2008.md6.6 KB
  • 2013-01-16-cpu-history.md2.4 KB
  • 2013-01-17-bmc-performance-tuning.md15.1 KB
  • 2013-01-20-net-cpp-hobby-04.md15.2 KB
  • 2013-01-21-high-performance-web-site-infrastructure.md10.8 KB
  • 2013-01-21-high-performance-web-site-program.md9.7 KB
  • 2013-02-26-bmc-remedy-construction.md5.1 KB
  • 2013-02-27-bmc-itsm-disadvantage.md4.4 KB
  • 2013-03-02-bmc-license.md6.5 KB
  • 2013-03-07-bmc-assignment-engine.md5.8 KB
  • 2013-05-05-bmc-portmapper-detail.md5 KB
  • 2013-05-14-remedy-mid-tier-sso.md12.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.