我最早对VIM的印象,来自一次深夜改服务器配置的尴尬。当时刚接触Linux,需要修改Nginx的配置文件,用vi打开后,能移动光标却不知道怎么输入内容,几下乱按后,屏幕上满屏都是插入的字母。最后实在没办法,直接断开了SSH连接,重新登录后才发现文件被锁住了。后来才明白,那天我连VIM的三种模式都没搞清楚。
这个场景,我相信很多人都有过。VIM作为Linux服务器上绕不开的编辑器,从配置文件修改到代码编写,从日志查看到临时脚本编辑,你总会在某个时刻和它迎面撞上。而且它和Windows下的记事本、IDE完全是两套逻辑,用鼠标、用Ctrl+C/Ctrl+V的习惯在纯终端环境里几乎全部失效。但只要掌握了三种模式的核心逻辑和几十个高频命令,VIM就会从"劝退神器"变成"效率利器"。
这篇博文不会讲那些花里胡哨的插件配置,而是把VIM最核心的三种模式和常用命令彻底讲透,附带我在实际运维和开发中踩过的坑。适合所有Linux新手,也适合用了VIM一段时间但总觉得"不够顺手"的人。
1. 三种模式,其实是VIM的设计哲学
1.1 为什么VIM要设计成多模式
要理解VIM,先得理解它为什么长这样。VIM的前身是Vi,诞生于1976年,那个年代的终端根本没有鼠标,键盘也没有方向键、Home、End这些按键,甚至屏幕上的光标移动都是一件"奢侈"的事情。在这样的环境下,一个编辑器如果还按照"打字机"的思路设计——打开就能输入——效率会极低,因为你每次要移动光标、删除字符,都得把手伸向那些终端根本就不认识的按键。
所以Vi的创造者Bill Joy做了一个非常颠覆的设计:编辑器默认不进入输入状态,而是处在一个"命令状态"。在这个状态里,所有的按键都不是输入字符,而是执行命令。比如按j是向下移动一行,按x是删除一个字符,按dd是删除整行。只有当你想真正输入文字时,才通过命令切换到"插入状态"。这种设计让手指始终停留在键盘的主键区,不需要去够方向键,也不需要鼠标,效率极高。
后来的VIM(Vi IMproved)完全继承了这个思想。你现在用的VIM,本质上就是在一台"没有鼠标、没有方向键"的虚拟终端里设计出来的高效编辑工具。模式切换不是VIM故意难为你,而是它提高效率的底层逻辑。
1.2 三种模式各自的职责
VIM最核心的是三种模式:普通模式(Normal Mode)、插入模式(Insert Mode)、命令行模式(Command-Line Mode)。严格来说,VIM还有可视化模式(Visual Mode)和替换模式(Replace Mode),但新手阶段先把三种核心模式吃透就够了,可视化模式我会在第4节单独讲。
普通模式是VIM的默认模式,你打开VIM后所处的就是普通模式。在这个模式里,所有按键都是命令,比如h j k l分别对应左、下、上、右的移动,w是跳到下一个单词开头,dd是删除当前行。这个模式的核心任务是"操作",而不是"输入"。它是VIM最强大的地方,也是新手最容易懵的地方。
插入模式就是你熟悉的"打字模式",按i、a、o等命令可以从普通模式进入插入模式。在这个模式下,键盘输入的内容会直接写入文件,和记事本没区别。任务完成后按Esc回到普通模式。
命令行模式则是用来执行保存、退出、查找、替换等"全局操作"的模式,在普通模式下按冒号:进入。比如:wq表示保存并退出,:q!表示不保存强制退出,:%s/old/new/g表示全局替换。它叫"命令行模式",是因为屏幕底部会出现一个以冒号开头的命令行,你输入的内容会显示在那里。
1.3 模式切换一目了然
三个模式之间的切换,记忆起来并不复杂,我把最核心的切换方式列在下面:
| 切换动作 | 按键 | 说明 |
|---|---|---|
| 普通模式 -> 插入模式 | i | 在光标前插入 |
| 普通模式 -> 插入模式 | a | 在光标后插入 |
| 普通模式 -> 插入模式 | o | 在下方新建一行并插入 |
| 普通模式 -> 插入模式 | I/A/O | 行首插入/行尾插入/上方新建行 |
| 插入模式 -> 普通模式 | Esc | 最常用,返回命令状态 |
| 普通模式 -> 命令行模式 | : | 进入命令行,输入命令后回车执行 |
提示:在插入模式下如果按了Esc屏幕没有反应,不用怀疑,说明你已经回到了普通模式。VIM不会对每次模式切换都给出明显提示,右下角的状态栏会显示当前的模式名(比如INSERT、NORMAL),留意那里就能确认当前状态。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 先练保命技能:模式切换与文件保存退出
2.1 打开文件、进入编辑、回到命令状态
我见过太多人第一次在服务器上用VIM改配置,进入界面后光标能移动,但一按键盘就在屏幕上打出字母。原因很简单——他们从普通模式直接开始打字,VIM把这些字母当成命令执行了,根本不是"没有生效",而是命令在生效,只是效果不是他们想要的。
所以第一步一定要建立肌肉记忆:打开文件后,默认处于普通模式,此时键盘是"命令键盘"。如果想要输入内容,先按一次Esc确保回到普通模式(谁加谁知道,多按一次不亏),然后按i进入插入模式,这时候再打字就正常了。改完内容后,先按Esc回到普通模式,再做保存或退出操作。
这里有一个细节我建议新手养成习惯:每次进入插入模式之前,先想清楚你要做什么。如果是在行尾追加内容,按A比先移动到行尾再按i要快;如果是要在下方新建一行,按o就够了。这些细微的按键习惯,日积月累能省下大量时间。
2.2 保存退出命令的区别
保存退出是新手最关心的问题,因为谁都不想辛辛苦苦改了半天,结果没保存。我把常用的保存、退出相关命令整理成一个表:
| 命令 | 含义 | 适用场景 |
|---|---|---|
| :w | 保存文件 | 继续编辑时使用 |
| :q | 退出VIM | 没有改动或已保存时使用 |
| :wq | 保存并退出 | 最常用,改完就走 |
| :x | 保存并退出 | 和:wq基本等价,若有未保存改动则保存后退出 |
| :q! | 不保存强制退出 | 改错了不想要了,直接放弃 |
| :w! | 强制保存 | 文件只读但你有权限时用 |
| ZZ | 保存并退出 | 普通模式下直接按两个大写Z,不用输入冒号 |
| ZQ | 不保存退出 | 普通模式下直接放弃修改退出 |
这里面有两个容易踩的坑。第一个是:q和:q!的区别。
