1. 先建立心智模型:Vim 是“给文本发指令”,不是“往编辑器里打字”
如果你碰过 Linux 服务器,多多少少都会被 vim 编辑器折磨过:第一次打开它,不知道怎么退出;写了几行配置想保存,按了一通操作,反而把内容改乱了;甚至有人到现在还会在普通模式下按方向键,然后发现右下角根本没有任何反应。
这不是你笨,而是 vim 的学习路径里有个大坑:绝大多数资料直接把一百多个命令砸给你,让你背。可现实中没人能靠背清单学会 vim,真正该做的是先把它的设计逻辑搞清楚。只要你明白 vim 不是一个“打字的编辑器”,而是一套“给文本发指令的语法”,后面所有命令都能串起来,记住指令只是顺带的事。
很多人问我:我就想改个 nginx 配置,为什么非要折腾 vim?我也没法反驳,因为大部分 Linux 发行版把 vim 作为默认编辑器装进系统,是有历史渊源的,但更核心的原因是:在纯命令行环境里,vim 有着无可替代的编辑效率。哪怕是维护服务器、改脚本、看日志,你打开了 vim 就必须能走完“打开—编辑—保存—退出”这条闭环,否则连最基本的文本修改都做不了。
所以这篇指南不打算给你塞一个命令大全,而是从最常被搜索的几个问题切入:vim 怎么保存退出、怎么一次注释多行、怎么全选复制、怎么把编辑效率提上去,再让你在实际 Linux 场景里看到 vim 的正确用法。读完你会觉得,它不是那个“反人类”的 relic,而是真的能帮你省力的工具。
1.1 为什么背命令这条路,走不通?
先感受一下经典的劝退现场:你输入 vim /etc/nginx/nginx.conf,然后发现自己到了一个有光标但没有输入框的界面。输入几个字母,屏幕没反应;按 i 也没反应,再按 Ctrl+C 好像更糟——最后还是靠 :q! 逃出来的。
问题在于,你抱着“记事本”的使用预期去见 vim,而 vim 根本不打算模仿记事本。
vim 启动后默认处在普通模式(Normal Mode),这个模式下你的按键不是输入字符,而是给编辑器下命令。i 是“进入插入模式”,j 是“光标向下”,d 是“删除”,也就是说,键盘本身就是你的完整工具集。这套设计在上世纪键盘没有鼠标的年代形成,一直保留到今天,恰恰说明它的操作模型是高效的。
你需要的不是背 100 条独立命令,而是理解下面这几个词:
- 普通模式:等待指令,也就是大多数时间的模式;
- 插入模式:真正输入文本的地方;
- 可视模式:像拿鼠标选中文本一样,高亮选中区域;
- Ex 模式:也叫命令行模式,输入
:、/、?后进入,用来执行替换、搜索、保存等指令。
这几个模式组合在一起,才是“你与 vim 对话”的基础方式。
很多人失败是因为他们在普通模式下拼命打字,或者在插入模式下拼命按方向键。所以第一步只有一个任务:破除“输入文本时,按键就应该直接出现字符”的执念,理解模式化操作。
1.2 把编辑动作拆成“操作符 + 范围”
vim 最精妙的地方,是把绝大多数编辑行为拆成了两个部分:你想做什么操作,以及这个操作作用在哪些范围上。
- 删除:
d - 复制(yank):
y - 修改(删除并进入插入模式):
c - 缩进:
>
范围则由动作词给出:
w:光标移到下一个单词开头;b:光标移到上一个单词开头;- 行首:
0; - 行尾:
$; - 整个文件:
gg(开头)和G(结尾)。
组合起来,命令就变得特别自解释:
dw:从光标所在位置删除到下一个单词的开头;d$:删除光标到行尾的内容;cw:删除当前单词并进入插入模式,直接改这个单词;y$:复制从光标到行尾的全部内容。
你也可以在前面加数字,让范围扩展为“几个单位”:
2dw删除后面两个单词;3j光标向下走三行;5yy复制五行。
到这里,你会发现 vim 命令不再是一串需要死记的符号,而是一个能拼装的积木系统。明白了这个心智模型,后面的所有细节都只是不断往这套模型里添加积木而已。
1.3 vim 大冒险式的新人路线:不要一步登天
市面上有很多“vim 大冒险”类的游戏化教程,会让你进入一个迷宫,你必须用真实按键才能移动角色,本质上就是逼你快速建立普通模式下的肌肉记忆。我挺推荐刚接触的人用这类方式玩一玩,因为它把“移动光标”这个最低频的动作练成了本能,而不是每个键都要停下来想。
但我也要给一个忠告:练习要按阶段来,不要第一周就追求掌握所有寄存器和宏。先用最少的命令把日常编辑流跑通,再逐步增加动作词和操作符。只要你能完成“打开文件 → 输入内容 → 保存退出”,就已经迈过了最重要的坎;后面每遇到一次“怎么操作这么麻烦”的瞬间,再去查一个针对性命令,这样记下来的东西才真正属于你。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模式切换、保存退出和应急逃生:先走出“新手村”
“vim 保存退出命令”是排在最前面的热搜词,因为它代表的是最急迫的现实需求:我改完了,我该怎么离开?这一节我们要把模式、保存退出、应急逃生这三件事一起解决。
2.1 vim 保存退出的几种写法,为什么有这么多变体?
你在网上搜索时,一定会看到 :wq、:q、:x、:ZZ 这些说法,一开始容易懵。我们先还原一下逻辑。
vim 的长命令都从 : 进入命令行模式,命令本身是英文缩写:
:w= write,把缓冲区写入磁盘文件,也就是“保存”;:q= quit,退出当前窗口;:wq= 先保存再退出;:x= 如果有改动才保存,再退出;ZZ= 等价于:wq,但它是普通模式下的快捷键,无需输入冒号;:q!= 不保存修改,强制退出。
对着这个列表,你就可以自由组合了。比如只打开一个文件看看,没改过,直接 :q;编辑到一半发现不想保存了,:q!;改完了想保留成果,:wq 或 ZZ。
需要特别提醒的是 :wq!,这个感叹号并不是“保存并退出”的万能保险,它表示“在只读文件或权限不足时强制写入”。在 Linux 上,如果你用普通用户打开一个只有 root 才能改的文件,就算加了感叹号也没用。正确姿势是先退出,再用 sudo vim 文件路径 打开,才真正拥有保存权限。
2.2 模式切换的核心逻辑:别把 Esc 当敌人
很多新手在插入模式下输入完内容,不知道下一步该怎么办;还有人到寻找了太久,甚至在普通模式下按着 i 停下来。
想一想,你其实只需要这么几条切换规则:
- 普通模式 → 插入模式:按
i(在光标前插入)、a(在光标后插入)、o(当前行下方新建一行并进入插入模式); - 插入模式 → 普通模式:按
Esc; - 普通模式 → 可视模式:按
v; - 普通模式 → 命令行模式:按
:或/。
所有按键操作的“落地”都在普通模式。按完删除、复制、移动、保存命令,都先回到普通模式再做下一个动作。有些新手误以为插入模式是默认状态,一路按方向键改,那就永远体会不到 vim 的便利。
这里有个细节:如果你在按 Esc 时感到小指难受,可以换成 Ctrl+[,这是我一直使用的等价方案。很多老 vim 用户不按 Esc,纯粹为了减小手部移动距离。
2.3 按下 Esc 没反应?可能是你根本没理解当前处于哪个模式
新手最常见的“死机式”体验是:在插入模式里按 Esc,然后开始输入 :wq,结果发现自己刚才敲的 :wq 全部出现在了正文里。
实际上,: 要生效,必须在普通模式下按。你按 Esc 之后还要再按一次 Esc,确保自己真的回到普通模式,然后在键盘上输入冒号加命令。
所以,我给你的应急流程是固定的:
- 先按一次
Esc,再按一次Ctrl+[,确保回到普通模式; - 光标停在正文中,但此时你输入的任何字母都不会进入文本;
- 输入
:wq然后按回车,完成保存退出; - 如果不保存退出,输入
:q!后回车; - 如果你只想保存还没想退出,输入
:w回车即可。
在这个流程里,最关键的检验方法是看窗口左下角的状态提示。如果出现 -- INSERT --,说明你还在插入模式;如果什么都没有,说明你已经在普通模式,这时候敲命令才有效。
还有一种容易让新人误判的:普通模式下默认不能按方向键吗?实际上大部分现代 Linux 的 vim,都允许你在普通模式按方向键移动光标,也可以在插入模式用方向键移动。很多教程会说这样不够高效,但如果你刚刚迁移过来,在没有肌肉记忆前,用方向键并不算错误。唯一的风险是,你一旦习惯了方向键,就跳过了一套和键位绑定的移动逻辑,长期看很吃亏。所以,在我们下一步讲移动时,我会更推荐先练习 h/j/k/l,哪怕前期慢,也刻意往外使。
3. 移动光标、行号跳转与“范围意识”:把编辑速度提上去
如果你只会用方向键一个字符一个字符地挪光标,vim 最重要的效率优势就完全体现不出来了。移动是 vim 所有动作的地基,因为删除、复制这些操作往往依赖“光标位置 + 动作范围”,移动够快,编辑自然也就够快。
3.1 跳过一个单词:w、b、e 三个键的日常演出
我们拿一个最常见的场景举例。假设光标停在下面这行的开头:
listen 80;
你想把 listen 改成 listen443,如果你只用一个字符一个字符地挪,会非常费劲。用单词级移动就舒服多了:
w:跳到下一个单词的开头;b:跳到上一个单词的开头;e:跳到当前或下一个单词的结尾。
在前面的例子里,光标在 listen 的 l 上,此时你可以直接按 e 跳到单词末尾,然后按 a 在单词后追加内容,输入 443,最后按 Esc,一个动作就完成了。
这个“单词”概念要稍微展开一下。vim 里有两种范围:
- 小词(word):由字母、数字、下划线组成的连续串;
- 大词(WORD):由空格分隔的任意非空字符串。
比如一行配置 server_name example.com;,在“小词”模式下,example.com; 会被拆成 example、.、com;;而在“大词”模式下,它整体算一个词。你可以在 w 和 W 之间选择,dW 删除到一个大词开头,d w 删除到一个小词开头。想编辑 URL、完整路径这种包含点号和斜杠的长串,大写 W 往往更符合直觉。
3.2 快速到行首、行尾,以及字符级“瞬移”
经常有人需要在一整行命令或配置里来回跑,这时候方向键加退格的方式就会让人崩溃。vim 提供了几个高频行内移动:
0:跳到行首第一列;^:跳到行首第一个非空字符;$:跳到行尾;f{字符}:跳到本行下一个指定字符处,比如fx会跳到下一个x字符上;t{字符}:跳到本行下一个指定字符的前一个字符处,方便对指定字符做修改。
比如你在 nginx 配置里看到 listen 443 ssl;,你想把 443 改成 8443。移动光标到那一行之后,可以用 f4 直接跳到出现的 4 上,再按 cw 把 443 这个单词改掉,打完 8443 后按 Esc,就好。
3.3 用行号跳转和相对行号,让你对文件“一览无余”
配置文件一长,你就不能总是肉眼找位置。这时候行号给你一个很好的定位桥梁。
gg:跳到文件第一行;G:跳到文件最后一行;数字 + gg或数字 + G:跳到指定行,比如50gg跳到第 50 行;Ctrl+d、Ctrl+u:向下/向上翻半页;H、M、L:跳到屏幕顶部、中间、底部。
但真正让 vim 用户舒服的,是开启相对行号(relative number)。它显示的是“当前行离第几行差多远”,而不是简单的“第几行”。比如你在配置里看到错误日志提示第 120 行出错,而你光标在第 100 行,只要屏幕右侧显示着“20”,就可以直接输入 20j 把光标往下跳 20 行。这在日常操作里特别实用,因为很多跳转动作其实是“往下走几行”或“往上走几行”,而不是“跳到绝对行号”。
开启方式在 vim 的 Ex 模式里执行:
:set number
:set relativenumber
你也可以把两行写进 .vimrc 永久生效。很多人担心相对行号会让新手迷惑,实践下来,只要配合 set number 一起使用,屏幕上既有真实行号,又有相对距离,查错、跳转都非常顺手。
3.4 搜索移动:不用一路翻,直接命中关键字
到最后,文件的移动还要靠搜索。尤其在看大段日志或配置文件时,直接按 / 输入关键字,按回车光标会跳到第一个匹配处,然后按 n 到下一个匹配,按 N 到上一个匹配。例如找 sshd 配置里的端口,用 sshd_config 做演示:
/Port
查到一个结果后,下一个匹配按 n。有了这个基础,你就不需要在几千行配置里上下翻页了。
如果你只想在当前行内做字符级匹配,上面提到的 f{字符} 就是速度的关键,它和 / 搜索一起,覆盖了“行内微移”和“全局跳跃”两个场景。
4. 删除、复制、粘贴与撤销:形成“动作词+范围”的记忆
很多人第一次听别人说 vim 里“复制”不叫 copy 而叫 yank,会觉得离谱。yank 是 vim 里的术语,中文社区常翻译成“复制”。你会看到屏幕下方显示比如 "5 lines yanked",意思是复制成功了 5 行内容。理解了这个词,很多命令阅读起来就没那么难了。
4.1 删除、复制、修改其实是同一套“配方”
我们前面提过,vim 的编辑动作是一条公式:
操作符 + 移动范围
最常用的三个操作符是:
d(delete):删除并保存到寄存器里,相当于剪切;y(yank):复制到寄存器,不会动原文;c(change):删除并进入插入模式,相当于“边删边改”。
配上移动命令,它们的威力才显示出来:
dd:删除当前整行;yy:复制当前整行;diw:删除当前单词(注意中间的i,表示“inside”,也就是“单词内部”),不加引号、括号;yiw:复制当前单词;ciw:直接改写当前单词;dap:删除整个段落;ci":把双引号内部的内容全部替换掉。
最后几个命令尤其值得练习。写作或改配置时,最常见的动作就是把一个值换成另一个值。比如 JSON 里的 "password": "123456",光标移到内容附近,输入 ci",再输入新密码,按 Esc,一次搞定。
4.2 vim 全选复制到底怎么做?
搜索“vim 全选复制”的人,大概率是从 Windows 的 Ctrl+A、Ctrl+C 习惯转过来的。对应到 vim,是三个动作的组合:
gg:跳到文件开头;V:进入行可视模式(注意是大写 V,表示一行一行地选中);G:跳到文件结尾,此时已经从头到尾选中了全文件;y:复制所选内容。
连起来就是:
ggVGy
如果你需要复制整个文件到剪切板,就必须用系统剪切板寄存器,我放到 4.4 小节专门讲。
这里要特别说明 V 和 v 的区别:
v:进入字符可视模式,按方向键或动作词可以选择任意字符;V:进入行可视模式,每次选择都是整行,适合复制多行配置;Ctrl+v:进入块可视模式,可以按列选择,后面做多行注释时会用到。
可视模式的本质是让你先选中范围,再执行命令。所以操作流程通常是:v 或 V 高亮选区 → 按 d 删除,或按 y 复制,或按 > 整体向右缩进。
4.3 撤销与重做:养成“错了可以回来”的安全感
用 vim 最让人安心的,是它的撤销机制远强于普通编辑器:
u:撤销上一步;Ctrl+r:重做上一步;.:重复上一次修改命令。
这套操作有几个细节值得掌握。比如你刚才 dd 删错了一行,按 u 就能恢复。如果你删除后又执行了别的命令,还可以通过连续按 u 一步步退回去。vim 默认的撤销记录是很长的,不用担心做错一步就回不去了。
4.4 寄存器与系统剪贴板:为什么粘贴后总是乱缩进?
你可能遇到过一个经典问题:从本机复制了一段代码,然后在 vim 的插入模式里按鼠标右键粘贴,结果每一行前都被加了一堆缩进,代码乱得没法看。
原因在于 vim 默认的粘贴处理会自动做缩进调整。你在插入模式下直接粘贴外部的多行内容,vim 会沿用上一行的缩进规则对每一行重新做 indent,于是代码就被“二次排版”了。
最直接的应对方法是在粘贴之前开启 paste 模式:
:set paste
进入这个模式后,vim 会暂时关闭自动缩进和快捷键映射,你再粘贴的内容就会原样进入文件。粘贴完成后建议及时执行 :set nopaste,回到正常编辑模式。
如果你希望 vim 能和系统剪贴板互通,那需要确认你手里的 vim 是否带有剪贴板支持。输入 vim --version,看看输出里有没有 +clipboard。如果是 -clipboard,说明这个 vim 默认不支持直接与系统剪切板交互,那你需要使用系统粘贴方式或安装完整版 vim(Ubuntu 系对应的是 vim-gtk3 之类的包)。拿到 +clipboard 之后,你可用以下寄存器:
"*y复制到系统 PRIMARY 剪切板;"+y复制到系统剪贴板;"+p从系统剪贴板粘贴。
这组命令也可以结合选区用。比如全选复制到系统剪贴板:
gg"*yG
常用它来把 vim 里的内容直接粘到浏览器或聊天工具里,非常方便。
5. 多行注释、批量替换与重复修改:比鼠标快一个量级的操作
你在搜索“vim 一次注释多行”时,大概率看到的是“Ctrl+v 之后 I 然后输入 # 再 Esc”,但很多人照做时却没反应。原因在于指令顺序里藏着一个关键细节:在按 I 后,输入注释符,最后必须按 Esc,vim 会在那时才把注释符批量应用到所有选中的行上。
5.1 一次注释多行的操作细节
假设你要把下面三行临时注释掉:
server {
listen 80;
return 301 https://$host$request_uri;
}
步骤是这样的:
- 把光标移到第一行行首(按
0可以快速到行首); - 按
Ctrl+v进入块可视模式; - 使用
j或k选中多行,让高亮块覆盖要注释区域的第一列内容; - 按
I,vim 会提示你进入插入模式,但这里的I是大写,意思是“在选中块的行首同时插入”; - 输入注释符号
#; - 按
Esc,这时你会看到每一行行首都多出来一个#,注释完成。
关键是第 4 步和第 6 步:必须先按大写 I,而不是直接按 i;按 Esc 才是真正触发批量生效的时刻。如果你按完 I 之后看不到效果,先别急,检查有没有按 Esc。
如果要取消多行注释,操作也很简洁:把光标移到注释符 # 所在列,按 Ctrl+v 选择多行,再按 x 删除块内容,注释符就被一次性去掉了。
5.2 使用块可视模式,快速对齐或修改列内容
一次注释多行只是块模式的牛刀小试。它真正的价值在按列编辑。比如你有一个文本,想要把所有行的前两列统一改成其他内容,用块选择就能精确锁定同一列:
- 光标移到某列位置;
Ctrl+v进入块模式;- 用
j、k选择行范围; - 用
l、h选择列范围; - 直接做删除或插入。
这个操作特别适合改 CSV、日志表格,以及大量带统一前缀后缀的文本。用鼠标逐个改的话,不知道要浪费多少时间。
5.3 批量替换:从单行到全文件,一次讲清
替换命令在 vim 里用 s(substitute)完成,前提是你先进入 Ex 模式。最常见的格式是这样:
:s/old/new/
它只替换当前行第一个匹配项。如果要在整篇文档里把所有 old 都换成 new,需要写成:
:%s/old/new/g
这里有三个符号需要理解:
%表示范围,指全文;如果你只想处理第 10 到第 20 行,就写:10,20s/old/new/g;g表示全局替换,即每行里所有匹配项都替换,而不是只替换第一个;c表示替换前先确认,例如:%s/old/new/gc,每次都会问你是否替换。
安全起见,我建议在大批量替换前先用这些形式确认目标,而不是直接一把梭。逐条确认虽然多按了几次 y,但能避免把 foo 和 foobar 一起改掉的惨剧。
在替换带特殊字符的路径时,比如要把 /usr/bin 改成 /opt/bin,可以换用 # 作为分隔符,减少转义麻烦:
:%s#/usr/bin#/opt/bin#g
这个技巧在工作里很实用,能少写很多反斜杠。
5.4 用 . 重复上一步,形成肌肉记忆
刚才说过 . 可以重复上一次修改。很多高效的 vim 工作流,都建立在这一个点号命令上。比如你在代码里想把某个变量名 db 改成 database,第一次做完 cw 替换之后,接下来每次在另一个 db 上,先把光标跳过去,再按 .,就能重复同一个替换动作。这样一来,连替换命令都不用频繁敲,效率天然高。
同样的思路也适用于注释、缩进和删除。你不需要每一次都重新敲完整命令,而是做一遍范例,之后不断用 . 去套用到下一个目标上。这正是 vim 设计得最像“语言”的地方:每一条操作都可以被借用、被重复、被组合。
6. 在 Linux 服务器上配合其他命令:从改 nginx 到处理交换文件
真实场景里,vim 不是孤立工作的,它总在跟 sudo、grep、nginx、systemd 这些 Linux 工具协同。这一节我们用几个高频案例来演示“vim 在 Linux 里到底怎么用”。
6.1 案例一:改 nginx 配置时的标准操作流
假设你刚在一台服务器上装好了 nginx,想修改默认站点配置:
sudo vim /etc/nginx/sites-available/default
打开之后先别乱动,用 G 跳到文件末尾,然后用 /server_name 搜索你想改的 server_name。按 n 可以往下跳到下一个匹配点,按 i 进入插入模式修改域名,改完按 Esc,输入 :wq 保存退出。
此时你大概率还是不确定配置语法有没有问题。正确做法是回到 shell,执行:
sudo nginx -t
如果出现 syntax is ok,再重载服务。你也可以直接在 vim 的 Ex 模式里执行外部命令,减少来回切换:
:!sudo nginx -t
:! 的意思是把后续内容当作系统 shell 命令来运行。运行完如果没问题,再输入 :wq 退出,这样完整流程可以一气呵成。
这个“先检查再退出”的习惯能帮你发现很多低级错误,比如配置文件漏了分号。与其让服务一起挂掉,不如养成保存前检查一次的习惯。
6.2 案例二:在 vim 内部调用外部 shell 命令
除了执行检查,vim 还允许你把外部命令的输出直接塞进当前文档。比如写代码时想附上当前时间,普通做法是切出去敲 date。vim 里的做法是:
:r!date
r 是读取(read),!date 表示执行外部命令 date,整条指令的意思就是:把 date 命令输出的内容插入到光标下一行。
很实用的场景还包括 :r!ls -l,把当前目录的文件列表导入文档,生成目录索引;以及 :r!grep "error" /var/log/syslog,把日志中所有匹配行拉进当前文件慢慢分析。
这种“文档与 shell 双向打通”的能力,让 vim 不再是孤立编辑器,而像是终端里一个可以随时跨界的文本工作台。
6.3 案例三:出现 swap 文件时怎么办?
如果你在使用 vim 时因为网络断连、终端关闭或系统崩溃非正常退出,下一次打开同一个文件时会看到提示说发现了一个 .swp 交换文件。这不是病毒,它是 vim 的“自动保存”机制:你在编辑过程中所有的未保存修改,都被写进了一个隐藏的交换文件中。
常见的 .swp 文件名是 .nginx.conf.swp。实际显示时,底部会有几个操作选项提示,常见的包括:
Open Read-Only:以只读方式打开原文件,查看但不修改;Recover:用交换文件恢复上次未保存的内容;Quit:直接退出;Delete:删除交换文件。
最安全的处理顺序是:先查看有没有另一个 vim 进程还在编辑同一个文件(比如你在另一个终端里没有退出),如果有,不要动交换文件,回到那个终端正常保存退出。
如果确认没有其他进程正在编辑,那么可以按 R 尝试恢复未保存的修改。恢复以后,先另存一份做检查,确认内容没问题,再正常 :wq。vim 会在正常退出后自动清理交换文件。顽固情况下,你可以在 shell 里手动清理:
rm /path/to/.nginx.conf.swp
只是删除前一定要确认没有占用,否则可能把别人正在编辑的内容背后的自动恢复机制删掉,导致工作丢失。
7. 用精简配置和刻意训练,让 vim 真正成为肌肉记忆
到这一步,你已经把 vim 的核心路径走通了:打开、编辑、保存、退出、移动、复制、删除、多行操作。最后需要做的,是把这些动作固化成自己的配置与习惯。
7.1 一份“负责任的 .vimrc”应该是什么样?
网上有很多几百行的 vim 配置,新手直接复制不一定能驾驭。我建议你的第一个 .vimrc 只放 10 行左右的必需内容,放在 ~/.vimrc 里:
syntax on
filetype plugin indent on
set number
set relativenumber
set tabstop=4
set shiftwidth=4
set expandtab
set autoindent
set ignorecase smartcase
set incsearch hlsearch
简单解释一下这几行分别解决什么问题:
syntax on打开语法高亮,读代码和配置时一眼看清结构;filetype plugin indent on让 vim 根据文件类型自动缩进;set number与set relativenumber组合,左侧同时显示真实行号和相对距离,方便跳转;set tabstop=4与set shiftwidth=4把 Tab 宽度统一为 4 个空格,避免团队协作时缩进混乱;set expandtab让 Tab 键自动展开为空格,这也是许多语言规范(比如 Python)的要求;set autoindent新行继续保持上一行缩进,注释和代码块不会突然断头;set ignorecase smartcase让搜索时如果全小写则忽略大小写,一旦包含大写则区分大小写,搜索非常舒服;set incsearch hlsearch边输入边高亮搜索结果,找关键词的效率提升很多。
把这些配好后,你会发现 vim 立刻“现代”了不少,用起来更接近 IDE 的基础体验,又不会因为过度配置让你不知所措。
7.2 用刻意练习替代死记硬背:vimtutor、vim 大冒险和现实任务
很多人问:到底怎么才能把 vim 练熟?
我的答案不是让你每天背二十个键位,而是坚持执行“每周刻意练习一种新动作”的计划。具体做法是:
- 第 1 周:只练移动
w、b、e、0、$和h/j/k/l; - 第 2 周:把删除
d、复制y、修改c配上动作词练熟; - 第 3 周:开始用
f、t、搜索/在长行和长文件中导航; - 第 4 周:掌握
Ctrl+v块选择和:%s/old/new/g批量替换; - 第 5 周:练
ciw、ci"这类的“对象操作”,写代码改代码的效率明显不一样。
你完全可以并行使用 vim 内置的教学工具 vimtutor,它是一条 30 分钟的交互式教程,直接在终端里输入:
vimtutor
就会打开一个练习文件,系统一步一步让你输入按键完成任务,比看任何资料都有效。另外,像 vim 大冒险这类游戏化练习可以选一个玩,哪怕只玩一小时,也能让移动类指令的肌肉记忆加深不少。
真实的 Linux 日常任务同样是最好的训练场,比如你在服务器上改 crontab:
crontab -e
这个命令默认会用 vim 打开你的定时任务表,每次编辑都当成一次实战。你需要新增一行任务、删除一段旧配置,顺手体验 dd、yy、:wq。用不了多久你就会发现,手指比脑子更先记住这些动作。
7.3 中文用户需要知道的输入法坑
我在教别人用 vim 时,很多中文用户碰到一个特别隐蔽的问题:在插入模式下输入中文,按 Esc 回到普通模式后,输入法还是中文状态。这时你敲 j 不会向下移动,而会在状态栏里变成字母,甚至弹出输入法候选框。
解决办法是在侵入模式下打完中文后,马上按一下切换中英文的快捷键(通常是 Ctrl+空格 或 Shift),再把输入法切到英文,再按 Esc。否则你在普通模式里无论怎么按,vim 都收不到有效的移动命令。
如果你用的是现代 Linux 桌面,还可以考虑在系统输入法里配置“应用级输入法状态保持”,让它只对特定应用生效,避免每次进 vim 都要手动切一次。
7.4 我自己的使用体会:偶尔退步也没关系,关键是持续用
写完这些内容后,我再回想最初用 vim 的日子,也有过被卡住时直接关终端、无限摔鼠标的经历。但后来真正让我觉得上手了的,不是某个神级插件,而是“每天日常小目标地用 vim 处理一个真实文件”这个动作。改 nginx 配置、维护 crontab、写 markdown 笔记、看系统日志,一旦你愿意用 vim 去解决这些随时出现的需求,键位就会形成一个越用越顺的闭环。
有些键位现在看着不常用,等你在真实场景里遇到痛点再查也不迟。熟能生巧的前提是“熟”,而熟的前提是持续的输入和反馈。把你新学的命令立刻用在一个真实文档上,比背一百遍都强。
