第一次打开 Vim 时,我盯着满屏的波浪线和空荡荡的编辑区,心里只有一个问题:这东西到底怎么退出。折腾了十几分钟,最后是离线重启才关掉的。后来能熟练使用之后回头看,才发现问题不在于“记不住命令”,而在于很少有人把“vim 的命令”讲成一个完整体系。这篇内容不准备按手册罗列,而是从一个真实使用者的角度,把模式切换、移动编辑、搜索替换、多文件操作、宏录制和配置文件这些高频场景拆开讲透,希望帮你把命令变成肌肉记忆。
如果你刚接触 Vim,这篇文章可以当入门路线图;如果你已经会i进插入模式、dd删一行,但总觉得碰到复杂操作就卡壳,那其中关于组合逻辑和工程化操作的部分会更值得你反复看。
1. 先理解模式,再记命令
1.1 Vim 为什么是模式化编辑器
很多人第一次用 Vim 觉得反人类,是因为我们用惯了“输入即所见”的编辑器。在大部分编辑器里,键盘就是打字机,你按下什么字符,屏幕上就出现什么字符。但 Vim 把编辑过程拆成两种状态:普通模式(Normal Mode)和插入模式(Insert Mode)。
普通模式是 Vim 的默认状态,也是它的灵魂所在。在这个状态下,你按下的j不是字母 j,而是光标向下移动一格;按下的x不是字符 x,而是删除光标当前位置的字符。从键盘的物理功能上看,普通模式更像一个“遥控器”,几乎所有的高效操作都发生在这个遥控器上。
插入模式则是真正往文本里写字的状态,和普通编辑器没有本质区别。两者之间的切换是最高频的动作:i在光标前插入,a在光标后追加,o在当前行下方新建一行并直接进入插入模式。我见过不少新手从普通模式切到插入模式,却不知道按Esc或者Ctrl+[退回来,结果就是连续打出好几个字母后才反应过来光标怎么不动了。
有一段时间我刻意练习“能不进插入模式就不进”。改一个字,用r;删一个词,用dw;换一个词,用cw。你会发现一旦养成这个习惯,双手基本不需要大范围移动,编辑效率的提升非常明显。这种体验与手速无关,纯粹是模式化设计带来的结构性优势。
1.2 移动命令是组合语法的地基
Vim 命令体系里最迷人的一点,是它像一门微型语言:动词 + 宾语,外加数字前缀。移动类命令正是这门语言的“宾语库”。
先记住最基本的四个方向键:h左、j下、k上、l右。把手指放在键盘基准位上,这四个键刚好对应左手食指和中指、右手中指和食指的移动方向。刚开始会觉得很慢,因为移动是逐字符的,但 Vim 的真正优势在于词级和句级的跳跃:
w:跳到下一个单词开头b:跳到当前单词或上一个单词开头e:跳到当前单词或下一个单词结尾0:跳到行首(含缩进)^:跳到行首第一个非空白字符$:跳到行尾
我还特别喜欢用f和t系列。f后面接一个字符,光标会跳到本行下一个出现该字符的位置;t则是跳到该字符前一个位置。比如fx会跳到当前行下一个字母 x 上,tf会跳到下一个字母 f 的前面。配合;和,,可以在同一个字符的多个出现位置间来回跳。
再往上还有Ctrl+d向下翻半页、Ctrl+u向上翻半页、gg跳到文件首行、G跳到文件末行、gg加行号可以跳到指定行。用一段时间后你会发现,移动不再是“逐步走过去”,而是“直接传送过去”。这属于第一层认知转变。
下面这张表是我认为最核心的基础移动命令,建议先背熟这一份就够了。
| 命令 | 含义 | 常用场景 |
|---|---|---|
h/j/k/l | 左/下/上/右移动一格 | 微调光标位置 |
w/b/e | 按词跳转 | 快速跨越单词 |
0/^/$ | 跳行首/行首非空/行尾 | 行内大范围移动 |
gg/G | 首行/末行 | 文件级定位 |
Ctrl+d/Ctrl+u | 下翻半页/上翻半页 | 浏览长文件 |
f{字符} | 跳到下一个指定字符 | 行内精确打击 |
移动命令最大的意义不只是“少按几次方向键”,而是它们可以作为动词的宾语。移动练得越熟,后面学删除、复制、修改就越顺。
2. 编辑命令的核心是“动词 + 宾语”组合
2.1 从改一个字到删一句话
Vim 的编辑效率,全部建立在几个基础动词上,非常朴素:
d:delete,删除c:change,更改(删除后进入插入模式)y:yank,复制p:paste,粘贴>/<:缩进/反缩进
这些动词本身不完整,后面必须跟一个宾语,也就是移动命令来指定作用范围。比如:
dw:删一个单词d$:从光标删到行尾dd:删除整行ciw:change inside word,删除当前单词并进入插入模式ct,:删除到本行下一个逗号之前,并进入插入模式
c命令是我日常使用频率最高的,因为它把“删掉旧的”和“写新的”两步合并了。写完代码后想改个函数名、换掉一段文本的措辞,用ciw或者ct.特别顺手。与之对应的是y,yiw复制当前单词,yyp复制当前行并在下方粘贴,yy复制整行。可以灵活点,不局限于某个固定格式。
还有个容易被忽略的操作是u撤销,Ctrl+r重做。在普通模式里,撤销的单位不一定是一次按键,通常是一个完整的命令,比如dw删掉整个单词后按一下u,单词会完整恢复,不用一个字一个字地撤销。这比很多编辑器更符合直觉。
原文本: 我喜欢学习vim的命令 光标停在"学习"的"学"字上 输入 ciw 再输入 "掌握" 并按 Esc 结果: 我喜欢掌握vim的命令这一个小小的例子,演示了 Vim 组合逻辑的威力。一次命令完成“选择单词、删除、进入插入状态、输入新词”的全流程。
2.2 用数字前缀和范围批量处理
动词前面可以加数字,表示执行次数。3dd删除连续三行,2yy复制两行,d3w从光标位置开始删三个单词。数字让本来需要重复按键的操作变成了单次命令。
常见用法:
5dd:向下删 5 行d2j:删除当前行及下方两行y3w:复制三个单词>G:给当前行到文件末尾的每一行增加一级缩进
这一类需要精确的批量任务,数字前缀很有用。不过我更常用的是行范围寻址,也就是冒号命令。:10,20d表示删除第 10 行到第 20 行,:.,+3y表示从当前行开始复制 4 行。这里的.代表当前行,$代表文件末行。理解这套地址规则之后,批量操作会变得非常接近于“编程化”的文本处理。
:5,15d、:1,$s/foo/bar/g这些命令看起来有点吓人,实际就是“给出一段范围,然后执行某个操作”的固定句式。行范围语法可以套用到几乎任何冒号命令里,也是后面学习多文件处理的基础。
这里有个实用心得:想快速对某一段连续行做操作时,不用去数行号,直接用可视模式选中再操作。按V进入可视行模式,用j/k上下移动选中范围,然后输入d、y、>等命令,麻烦事立刻变简单。可视模式本质上是帮你在屏幕上画出宾语。
3. 搜索、替换与全文操作:文本处理的真正进阶
3.1 搜索命令的高效姿势
搜索是文本编辑里使用频率最高的操作之一。按/进入搜索状态,输入关键词后回车,光标就会跳到第一个匹配处。n跳下一个,N跳上一个。反向搜索用?,同样用n和N在两个方向移动。
Vim 默认搜索是不区分大小写的,这有时候挺烦。搜索时临时控制大小写的办法是在关键词里加入\c或\C,前者强制不区分,后者强制区分。比如/vim\c匹配 Vim、VIM、vim,/Vim\C只匹配 Vim。这个技巧在日志文件里搜关键字特别好用,我经常用它区分Debug和debug。
还有一个容易被忽略的功能是增量搜索(incsearch)。开启set incsearch后,输入/的过程中,Vim 会随着你每输入一个字符实时跳到匹配位置,而不是等你按回车后才显示结果。我建议直接写进配置文件,配合set hlsearch(高亮所有匹配)和set smartcase(智能大小写,混合大小写时自动区分),搜索体验会有质的提升。
" 在配置文件中加入 set incsearch set hlsearch set smartcase /所以关键词 " 回车后 n 和 N 切换搜索可以和编辑联动。d/foo表示从光标当前位置删到“foo”出现的位置之前,c/foo则是把这段内容改成新文本。这种用法适合处理“从某一点到另一个标记点”的删除操作,比先用视觉选中再删除更快。
3.2 替换命令的边界陷阱
替换命令的基本结构是:范围s/目标/替换/选项。写文档或者改配置时最常用的是全文件替换:
:%s/old/new/g这个命令的意思是:在整个文件(%)范围内,把old全部替换成new,g表示不限于每行第一个匹配。如果只替换当前行,可以省掉%写成:s/old/new/g。如果只想替换第 5 到第 12 行,那就写成:5,12s/old/new/g。
见过不少人在替换时直接下手,结果发现替换多了或少了。我强烈建议先忘掉g,用一次c选项试试:
:%s/old/new/gcc会让 Vim 对每处匹配都询问你是否替换,回车确认,n跳过,q退出。第一次用它你会觉得每个替换都要按一次很烦,但批量修改文档时,这反而是救命的功能,能防止真正的不小心。
关于替换另一个必须说清的坑:Vim 的替换本质上是正则表达式匹配。目标串里如果出现了/、.、*、[这些特殊字符,结果可能和你预期完全不一样。只是想精确匹配某个带点号的字符串,先加\V(very nomagic)让所有字符都按字面处理,比如:
:%s/\Vcompany.name/company_name/g这样.就不会被当成“任意字符”了。如果拿不准正则行为,先在文档里手动搜一遍确认匹配范围,再进行替换,避免被特殊字符坑到。
4. 多文件、缓冲区与分屏:从单文件到工程管理
4.1 缓存文件的逻辑:Vim 里的缓冲区
很多刚用 Vim 的人习惯了一个文件开一个窗口,只在反馈循环里“打开、操作、关闭”。但在 Vim 中,同时打开的文件并不会立刻显示在屏幕上,而是存进缓冲区(Buffer)。你可以把缓冲区理解成一组等待编辑的文件列表,当前窗口只是它的一个“展示口”。
基础操作:
:e 文件名:打开新文件:ls:查看缓冲区列表:bn/:bp:切到下一个 / 上一个缓冲区:bd:关闭当前缓冲区
如果你打开的文件没有保存就切走,Vim 默认会阻止你。这个设计让很多人抓狂。解决方法是设置隐藏缓冲区,让未保存的切换不被阻拦:
set hidden这条配置在工程化操作里几乎必备。开了它以后,你可以放心用:bn在多个文件之间来回切换,不用担心弹出一堆报错。把缓冲区当作“编辑会话的标签页”,而不是一个个独立窗口,你的组织方式会灵活很多。
实际体验中,这种模式和多标签页很像,但更轻量。尤其在处理十几个配置文件时,我通常只打开一个 Vim 窗口,用:e和:bn完成全部文件的浏览。省掉频繁退出进入的开销。
4.2 分屏与窗口导航
很多场景下需要同时看两个文件,比如对照着配置文件和日志文件排查问题。Vim 的分屏只需要三个命令:
:sp 文件名:水平分屏打开文件:vsp 文件名:垂直分屏打开文件Ctrl+w后按方向键或h/j/k/l:在不同分屏间移动光标
分屏之间调整大小用Ctrl+w =(等宽)、Ctrl+w _(高度最大化)、Ctrl+w |(宽度最大化)。这一套命令在代码注释、日志对比时极其好用。
:vsp config.yaml :sp debug.log Ctrl+w w " 来回切换如果你分屏开太多,记不住对应关系,建议用:res +5或者:vertical resize +10微调窗口尺寸。分屏虽好,不要贪多,两三个足够,太多反而容易迷失。
标签页在 Vim 里是另外一个维度,用:tabnew 文件新建,:gt和:gT前后切换,:tabclose关闭。我个人的习惯是:大块思路对比用分屏,不同任务间切换用标签页。这个组合在同时维护多个功能模块时最顺手。
5. 宏、映射与配置文件:把重复劳动真正消灭
5.1 宏录制与批量操作
Vim 里有一个几乎不会在初级教程里被教透的杀手级功能:宏(macro)。它允许你录制一系列操作,然后立刻重复执行,相当于把“手动编辑动作”变成了可以回放的脚本。
录制方式非常简单:
- 在普通模式按
q,再按一个字母作为寄存器名,比如q a - 此时底部状态栏会显示“recording”
- 执行你需要的编辑操作,比如
ciw改词、dd删行、j下移 - 编辑完成后按
q结束录制 - 用
@a回放刚才录制的宏,@@重复上一次回放
如果录制的操作涉及多行,后续通过数字前缀执行,比如10@a,Vim 会自动把宏执行十次。这个功能最适合处理重复性极强的批量任务,比如把一列name"张三"格式改成name=张三,或者给每一行末尾加一个分号。
把每行末尾加冒号,三步完成 qa $ " 跳到行尾 a " 追加模式 ; " 添加冒号 Esc " 回到普通模式 q " 结束录制 :1,5 normal @a " 在第1到5行分别执行宏:1,5 normal @a这种写法是宏和范围命令结合的典型例子,先录一个基础动作,再指定范围批量执行。比手动切换逐行操作稳定得多,也不会因为手抖漏掉某一行。
5.2 自己的配置文件:Vim 的启动装备
能支撑你一直用下去的,是一个不断打磨的配置文件。Linux 环境下是~/.vimrc,在较新的 Neovim 中是~/.config/nvim/init.vim。配置文件的本质就是一系列启动时的默认设置和键位映射。
我的最小配置心得就三行起步:
set number set relativenumber set smartindent set tabstop=4 set shiftwidth=4 set expandtab set cursorline相对行号(relativenumber)是我转型的关键设置。显示行号本来是 1、2、3,打开相对行号后,每一行显示的是“距离当前行有多少行”。想移动到上 5 行直接看行号输入5k,想复制下 3 行输入3yy。配合前面的组合命令,操作时不用再心算。
映射键是另一块效率提升空间。我给常用命令设置了简写:
let mapleader=" " nnoremap <leader>w :w<CR> nnoremap <leader>q :q<CR> nnoremap <leader>x :bd<CR>空格键作为 leader 键后,空格+w保存、空格+x关闭缓冲区,瞬间降低了高频操作的按键成本。这个方案的好处是左手无需离开基准位,几周后你会发现自己再也回不去Esc后还要找:w的旧习惯。
不过也别一上来就把配置堆得很厚。我个人的经验是,先把默认配置用熟,遇到一个痛点就加一条配置,比如“分屏切换太麻烦”就配置Ctrl+h直接切左边,然后再理解它。这比一次性抄一份大神的配置更有价值,因为你清楚地知道每一行背后的使用动机。
6. 从入门到流畅,我踩过的几个典型坑
回忆这几年的 Vim 使用经历,有几个坑几乎每次带新人都会看到。先说最常见的:在普通模式里一顿乱按,结果光标突然跳走,文本被整个替换了。原因基本都是p和P,粘贴命令会覆盖选区里的内容。想避免误粘贴,最稳妥的办法是按V进入可视模式先把选区看清楚,或者养成粘贴前先u撤销的习惯。
第二个典型坑是没有设置set hidden就用缓冲区。项目里开着十个文件,频繁切来切去,突然弹出“No write since last change”,瞬间心情全无。这个问题的解决很简单,就是前面提到的set hidden。它让未保存的文件像折叠起来的纸一样停留在缓冲区里,既不会丢失内容,也不打断节奏。
第三个坑是想用一个宏解决所有问题,结果中途某个操作走样,后面全乱了。宏录制的顺序和光标位置密切相关,回放时如果每行的情况不完全一致,就会出现偏差。正确做法是先小范围测试三条,确认无误后再放大批量执行。
第四个其实算不上坑,更多是认知层面。很多人在一个星期内放弃 Vim,是因为一开始就想把全部命令背下来。其实只要掌握十来个命令就能应付日常工作,后续的命令是因为碰到了具体痛点才去学,才记得牢。不要试图一步登顶,让命令随着需求自然生长。
如果你打算在真实项目中练习,个人建议先拿自己的个人笔记或配置文件下手,改坏了也不心疼。从一个文件开始,慢慢扩展到多文件、宏、分屏。坚持两到三周,你会看到明显的效率提升。
编辑本来就是一个高频动作,工具的手感会直接决定你的工作流体验。希望这篇关于 Vim 命令的实战拆解,能帮你少走一些我当初走过的弯路,真正上手之后,你会明白这种“换一种思考方式”的编辑器到底有多值。