写这份速查笔记的初衷很直接:Vim 的学习曲线确实陡峭,但一旦上手,那种“手不离键盘、全程不用碰鼠标”的操作节奏,用习惯了就回不去。这篇文章不是系统教程,而是我平时实战里反复用到的高频操作集合,按“模式、移动、编辑、搜索、多文件、常见坑”这几个维度梳理,力求每条都能直接抄走。不管你是刚开始接触 vim 命令的初学者,还是已经用了几年想查漏补缺的老手,这里面的内容都应该对你有实际帮助。
1. 这份速查笔记的设计思路:把“记忆”变成“肌肉记忆”
1.1 Vim 的本质:不是编辑器,而是一种“编辑语言”
很多人初次打开 Vim 会懵,觉得普通模式(Normal)里按什么键都没反应,还会误删内容。最大的认知转变在于:Vim 不是一个“输入文字的工具”,而是一套“编辑文本的语言”。普通模式下,你按下的每个键都是一个“动词”或者“名词”,比如d是“删除”,w是“单词”,组合起来dw就是从光标处删除一个单词。这种设计带来的直接好处是:绝大多数高频操作都能在不移动手指到鼠标、不按组合快捷键的前提下完成,手指一直停留在键盘主区域,时间一长就形成了肌肉记忆。
这也是为什么网上所有 Vim 教程都强调“先理解模式,再记住按键”。普通模式负责发指令,插入模式负责输入内容,可视模式负责选择文本,命令行模式负责执行 : 开头的命令。四者切换的顺畅程度,直接决定了你的编辑效率。
1.2 为什么按“移动 → 编辑 → 搜索 → 多文件”的顺序来记
我这里把大量命令分成了几个主题层:先是移动和跳转,再是编辑和替换,然后是跨文件操作,最后是退出保存和一些容易被忽略的细节。分区逻辑很简单——移动是地基,光标都走不利索的话,再花哨的编辑命令也用不出来;编辑命令是日常主力,必须形成条件反射;搜索和替换解决的是“在几百行甚至几千行代码里定位并批量修改”;多文件操作则解决真实项目里“同时打开十几个文件来回切换”的需求。
还有个很实际的原因:Vim 里很多命令是层层递进的。比如你学会了f向后查找字符,后面学t、;、,就会很快;学会了%匹配括号,配合d%删除括号内内容就顺理成章。按这个顺序积累,知识是成网状的,而不是零散的点。
2. 模式切换与高频编辑:先掌握 80% 的日常操作
2.1 模式切换:普通模式是遥控器,插入模式是输入框
Vim 最核心也最先要适应的是模式切换。普通模式(Normal)是默认模式,你可以把它理解为“遥控器状态”,所有按键都是指令;插入模式(Insert)相当于“输入状态”,你敲什么就出什么。
切换入口上,这几个键最常用:
i 在光标前插入 a 在光标后插入 I 在当前行行首插入 A 在当前行行尾插入 o 在当前行下方新建一行并进入插入模式 O 在当前行上方新建一行并进入插入模式 Esc 从插入模式返回普通模式 Ctrl+[ 从插入模式返回普通模式的另一只手方案我个人最常用的三个是A(跳行尾直接追加)、o(下一行新开)、Esc(回普通模式)。这里有一个小经验:很多人刚接触时不习惯按Esc,因为手指要伸很远。推荐立刻把jj映射成Esc,在配置文件里加一行:inoremap jj <Esc>,能明显减轻切换成本。包括我自己在内,这个改动几乎是所有 Vim 新手体验提升的第一大功臣。
还有一种比较隐蔽的切换:在普通模式下按v进入字符可视模式,按V进入行可视模式,按Ctrl+V进入可视块模式(列模式)。可视模式的核心价值是“先选中,再操作”,选中后可以统一删除、替换、缩进、甚至生成序列数字。
2.2 删除、复制、粘贴与撤销:动词 + 名词的组合拳
编辑命令最关键的不是死记硬背单个键,而是掌握“动词 + 名词”的组合逻辑。动词有d(删除)、y(复制)、c(修改,相当于删除并进入插入模式)、>(缩进)等,名词有w(单词)、$(行尾)、^(行首)、}(段落)等。
我实际用下来频率最高的组合是:
x 删除光标处字符(等同于 dl) dw 删除一个单词 d$ 或 D 删除到行尾 dd 删除整行 diw 删除光标所在单词,不包含后面的空格(这个非常常用) ciw “改词”,删除单词并进入插入模式,重命名变量用这个 c$ 删除到行尾并进入插入模式 yy 复制整行 yiw 复制光标所在单词 p 粘贴到光标后 / 下方 P 粘贴到光标前 / 上方 u 撤销 Ctrl+R 重做其中ciw是我跟所有人安利的命令:当你把光标放在某个变量名中间,想改这个名字时,ciw+ 新名字 +Esc就完事了,不需要先精准移动到行尾删干净再输入。同理,dw和diw的区别也要理解——diw只删单词本身,dw会连带后面的空格一起删。在写代码时这两者用到的场景完全不同,需要刻意区分。
这里补充一个新手最容易踩的坑:许多人删除多行时会连续按dd,结果发现内容全没了。其实 Vim 里dd是剪切而不是真正删除,内容存在寄存器里,用p可以贴回去。这反而是个优点——错误操作可以用u撤销,也可以通过p救回来,但前提是你得知道自己动了哪些键。
3. 移动与跳转:让光标真正“跑”起来
3.1 字符级和词级移动:把手指从方向键上解放出来
方向键在 Vim 里能用,但效率极低。标准做法是h左、j下、k上、l右,这四颗键就在右手默认位置,不移动手腕就能完成上下左右移动。让这些键形成条件反射之后,手指就彻底不需要去找方向键了。
在此基础上,词级移动更关键:
w 跳到下一个单词开头 b 跳到上一个单词开头 e 跳到当前或下一个单词结尾 W 以空格分隔的大词向后跳 B 以空格分隔的大词向前跳 0 跳到行首(第一个字符) ^ 跳到行首第一个非空字符 $ 跳到行尾初学时最容易混淆的是^和0——如果代码有缩进,0会停在行首的空白字符上,而^会跳到第一个实际代码字符。我在 Python 开发里几乎只用^,因为缩进是语法的一部分,多数情况下你要去的是代码字符而不是行首。
词级移动有一组容易忽略的“查找字符”命令,用熟练之后会大幅提速:
f{char} 向后查找并跳到指定字符上 F{char} 向前查找并跳到指定字符上 t{char} 向后查找并跳到指定字符前一个位置 ; 重复上一次 f / t 查找 , 反向重复上一次 f / t 查找比如你有一段const myName = "张三";,光标在行首,想定位到"前面,直接t"就跳过去了,再按i就能进入引号内修改。这一套命令在处理 JSON、参数列表时简直快得飞起。
3.2 行级、段落级和文件级跳转:别再用 j j j k k k 数行了
用jjjj慢慢挪到目标行是新手通病。Vim 提供了非常多跳转方式,掌握以下几个基本能覆盖 90% 的场景:
gg 跳到文件第一行 G 跳到文件最后一行 {n}G 跳到第 n 行 :n 跳到第 n 行(命令模式) Ctrl+D 向下翻半屏 Ctrl+U 向上翻半屏 Ctrl+F 向下翻一整屏 Ctrl+B 向上翻一整屏 } 跳到下一个段落(空行分隔) { 跳到上一个段落 % 匹配括号、标签之间跳转 * 向后查找光标处的单词 # 向前查找光标处的单词我特别想强调%这个键。在一段嵌套很深的代码里,把光标放在括号上按%,会立刻跳到匹配的另一半括号,再按一下跳回来。排查“括号不匹配”问题基本靠它。配合d%可以删除从当前位置到匹配括号的所有内容,改代码块时效率极高。
*和#则是轻量级搜索:光标放在某个变量名上按*,Vim 会向后循环查找所有相同单词,按n继续到下一个。做代码走查时看一个函数在哪里被调用,我一般先用*定位,再n循环浏览。
4. 搜索替换与多文件操作:面对真实项目的必备技能
4.1 搜索与全局替换:从“肉眼找”到“一条命令改完”
搜索命令是 Vim 里性价比最高的记忆投资之一:
/pattern 从光标位置向下搜索 ?pattern 从光标位置向上搜索 n 继续下一次搜索 N 反向继续搜索 :set hlsearch 高亮所有匹配项 :set nohlsearch 取消高亮(临时取消用 :nohlsearch)实际使用中有个高亮设置的细节:默认开启hlsearch后,搜索完可能满屏黄底,非常干扰视线。我的习惯是平时关闭高亮,需要时用:set hlsearch打开;也可以映射成快捷键,让一次回车搜索后自动关闭高亮,避免“亮瞎眼”。
替换命令是高频中的高频:
:s/old/new 替换当前行第一个 old :s/old/new/g 替换当前行所有 old :%s/old/new/g 替换整个文件所有 old :%s/old/new/gc 逐个确认替换 :'<,'>s/old/new/g 替换可视区域内的 old(选中后输入 : 会自动出现 '<,'>)初次使用:%s时建议都加上c做逐个确认,尤其替换变量名时,避免把注释里的内容也一并改掉。批量替换中如果要处理带特殊字符的路径或正则符号,需要转义;如果只是字面替换,\V(very nomagic)模式可以避免正则解释,例如:
:%s/\V/usr/local/bin/\/usr/bin/g这种细节不常用,但一旦碰上就会卡很久,记在速查里很值得。
4.2 多文件切换与 minibufexplorer 插件:同时打开十几个文件的体验优化
真实项目里几乎不可能只编辑一个文件。Vim 原生支持多文件和多缓冲区,基础命令如下:
:e file 打开新文件 :bn 切换到下一个缓冲区 :bp 切换到上一个缓冲区 :b n 按编号切换到缓冲区,比如 :b 3 :bd 关闭当前缓冲区 :ls 列出所有缓冲区 :bw 彻底删除缓冲区而不影响已保存的文件只用:bn和:bp切换在文件较多时容易迷茫,这时强烈建议装minibufexplorer插件。它会在编辑器顶部显示一个缓冲区列表,所有已打开的文件名都在里面,当前文件高亮,按:MBEOpen或自动窗口就能一目了然。我的配置习惯是把minibufexplorer的窗口高度设成 1 到 2 行,避免占用过多编辑区域,具体配置类似:
let g:miniBufExplMapWindowNavVim = 1 let g:miniBufExplMapWindowNavArrows = 1 let g:miniBufExplMapCTabSwitchBufs = 1 let g:miniBufExplMapWindowNav = 1装上之后,Ctrl+Tab可以在缓冲区之间切换,顶部始终显示所有打开文件。当同时修改配置文件、页面模板、后端逻辑时,这种可视化列表比纯命令行记忆舒服太多。
4.3 在已有占位数字的一列上生成递增序列:g Ctrl+A 的妙用
这是我在很多交流群被反复问到的一个需求:有一个文件,每行前面都是0这样的占位数字,想一次性把这一列变成1、2、3、4……的递增序列,手动一个个改太累了。Vim 里有干净的解法,核心是利用可视块模式加g Ctrl+A。
操作步骤:
- 把光标移动到第一个占位数字上,比如第一行的
0; - 按
Ctrl+V进入可视块模式(Windows/Linux 下如果用 GVim 可能被系统快捷键占用,需要确认终端配置); - 用
j或k向下移动,选中所有需要递增的行; - 按
g再按Ctrl+A。
效果是:第一行数字加 1,第二行加 2,第三行加 3……如果原来都是0,就会变成1、2、3、4……,正好是目标递增序列。
这里有个容易踩的细节:如果列里的初始值不是统一占位符(比如有的是 0 有的是 1),递增结果也会基于各自原值加行号,结果就会很乱。所以我建议先统一占位符。先Ctrl+V选中整列,按r0把这一列全部改成0,然后再用上述g Ctrl+A,结果就是干净利落的1、2、3、4……。如果想要0、1、2、3这样的序列,可以先把初始列设成-1,执行后得到0、1、2、3……,或者直接手动把第一个数字改成 0,再用Ctrl+A而不是g Ctrl+A做局部处理。
另外在终端里如果Ctrl+V被系统占用(比如某些终端把它绑定成粘贴),可以临时改用普通模式的v进入行可视模式,但列模式仍然最好用Ctrl+V。实在冲突时,检查终端快捷键绑定,或者用Vim自带命令:set virtualedit=block配合块选择操作。
5. 保存退出、Windows 安装与工具对比:细节决定效率
5.1 保存退出命令全梳理:别再用 :wq! 一把梭了
保存退出几乎每个初学者都背过:wq,但实际用下来值得分场景记忆:
:w 保存 :q 退出(如果有未保存修改会提示) :q! 强制退出,不保存修改 :wq 保存并退出 :x 保存并退出,等价于 :wq,但只有在文件被改动时才写入 ZZ 保存并退出(普通模式下直接按) ZQ 强制退出,不保存(普通模式下直接按)我比较推荐在普通模式下用ZZ保存退出,少一次冒号输入,也有不少老 Vim 用户习惯用:wq。重点是:x与:wq的区别——:x只在有变化时写入,适合经常打开文件只看不改的场景,能减少磁盘写入。
退出时最困扰新手的可能是误触导致无法退出。如果 Vim 提示E37: No write since last change,说明有未保存内容,此时要么:w保存,要么:q!强制放弃。还有种情况是打开了多个缓冲区,:q会提示E89: No write since last change,可以:qa!强制退出所有窗口。
5.2 Windows 下安装 Vim 的完整路径:别再只用记事本改代码了
很多人以为 Windows 下没有 Vim,其实安装方式和 Linux/macOS 一样简单。当前主流方案有三个:
第一个是官方安装包。去 Vim 官网下载 Windows 下的自解压安装包(gvim 版本),安装时会自动关联右键菜单,装完后可以在命令提示符或 PowerShell 里直接输入vim。官方包里自带 GTK 图形界面,启动后是一个常规窗口,配色和字体在_vimrc里配置即可。
第二个是包管理器方案。Windows 10/11 可以先用winget install vim.vim或choco install vim安装,优点是无需手动下载、更新方便。装完后如果终端里提示找不到命令,多半是 PATH 没生效,重启终端或在系统环境变量里手动添加 Vim 安装目录(默认一般是C:\Program Files\Vim\vimXX\)。
第三是直接使用 Windows Terminal + WSL 方案。如果你平时在 WSL 里做开发,直接在 WSL 内sudo apt install vim安装,终端体验和 Linux 完全一致,还能用大量 Linux 生态插件。对日常写代码的人来说,我其实更推荐 WSL 方案,因为 Windows 自带 console 对颜色、字体支持稍差,而 WSL 里的 Vim 几乎零配置就能达到 Linux 下的效果。
安装完成后第一件事就是建立配置文件。Windows 下 Vim 默认读C:\Users\你的用户名\_vimrc,Linux/macOS 下是~/.vimrc。里面至少应该设置以下项目:
set number set relativenumber set tabstop=4 set shiftwidth=4 set expandtab set hlsearch set incsearch set ignorecase smartcase syntax on filetype plugin indent on set clipboard=unnamedplus其中set clipboard=unnamedplus在 Windows 下也很关键,它让 Vim 的复制粘贴直接走系统剪贴板,避免复制到 Vim 内部寄存器却粘贴不到别处的困扰。
5.3 Vim 和 Xcode 分别在什么场景更顺手:选工具要看上下文
热搜词里出现了“分别用 vim 和 xcode”,这说明很多人关心什么时候该用 Vim,什么时候该用完整 IDE。我的实践结论是:场景互补,而不是互相替代。
Xcode 适合完整的 Apple 平台工程:写 Swift、调试 UI、处理 Storyboard、配置签名、使用 Instruments 性能分析,这些功能深度集成,Vim 无论如何也比不上。在大型 Xcode 工程里硬用 Vim 编辑 Swift 文件你会非常痛苦,因为项目索引、编译、跳转定义全是 Xcode 的强项。
但 Vim 的用武之地在三个方向。一是快速修改单个文件或在终端环境里编辑配置,比如改.git/config、package.json、Dockerfile,vim xxx打开就改,改完走人,根本不需要启动一个 1GB 的 IDE。二是配合所有命令行工具使用,比如在终端里看日志、改提交信息、临时写脚本片段,所有环境都有 Vim 才叫真正的“随时可编辑”。三是远程服务器开发,SSH 到服务器上处理问题时,不可能把 Xcode 带过去,唯一可靠的编辑器就是 Vim 或它的同类。
如果你是用 Xcode 开发但不想放弃 Vim 手感,可以选择让 Xcode 支持 Vim 键位。Xcode 15 之后的版本内置了 Vim 模式,在 Settings 里的 Editor 区域打开 “Enable Vim Mode” 就能得到基础的 h/j/k/l、dd、ciw、/搜索等操作,配合 Xcode 的代码补全和重构功能,体验相当不错。我把这称为“全家桶里偷偷开的小窗”。
6. 常见问题与排查技巧实录
6.1 高频问题速查表
这一节整理我在长期使用中碰到最多、也最容易被搜索引擎反复搜索的问题。每一条都来自实际场景,按“现象 → 原因 → 解决办法”的方式给出:
| 现象 | 原因 | 解决办法 |
|---|---|---|
| 按方向键进入插入模式后光标乱跳 | 终端或配置把方向键映射成了ABCD | 检查~/.vimrc或_vimrc里是否有set noesckeys相关设置,也可以尝试set ttimeoutlen=50缓解 |
按Esc后界面切换有延迟 | 终端对 Escape 序列的判定超时过长 | 在配置文件里设置set timeoutlen=1000 ttimeoutlen=50,一般能明显改善 |
Ctrl+V不是可视块,而是粘贴 | 终端软件占用了Ctrl+V快捷键 | 改用Ctrl+Q作为可视块模式的替代(需要set pastetoggle或终端设置支持),或者在终端快捷键里解除占用 |
| 搜索后满屏高亮不想保留 | 错误地认为搜索完会自动清除 | 使用:nohlsearch临时清除,或配置nnoremap <Esc> :nohlsearch<CR>让按 Esc 自动取消高亮 |
| 复制到 Vim 外部粘贴失败 | Vim 默认寄存器不是系统剪贴板 | 编译时保证+clipboard特性,配置文件里加set clipboard=unnamedplus |
| 打开 Windows 下的文本文件乱码 | 文件编码 GBK 而 Vim 默认 UTF-8 | 执行:e ++enc=gbk重新读取,或在_vimrc里设置set fileencodings=ucs-bom,utf-8,gbk,latin1 |
dd想删除却发现剪切走了 | 没意识到 Vim 删除即存寄存器 | 按p可粘贴回来;如果要真不留寄存器,用"_dd删除到黑洞寄存器 |
6.2 我的几条避坑经验
第一个经验:把jj映射成Esc只是第一步,进阶的优化是把大写锁定键映射成Esc(Windows 下可以用 PowerToys,macOS 下用系统设置里的修饰键映射)。这样从插入模式回普通模式完全不需要移动左手,长时间编辑的疲劳感会低很多。
第二个经验:学会用相对行号。set relativenumber打开后,每行显示的是相对当前光标的行距离,配合5j、3k这样的相对跳转会非常方便。但注意初次使用可能不太适应,建议在配置里保留当前行绝对行号,比如set number和set relativenumber同时开启。
第三个经验:不要一上来就追求装 50 个插件。Vim 的内置功能远比你想的强大,先把内建命令用熟,再根据实际痛点引入插件。我见过很多新手的vimrc里一大半插件根本不知道干什么用,反而拖慢了启动速度。插件应该是“发现问题再引入”,而不是“为了酷炫而引入”。
第四个经验:遇到奇怪问题先排除配置文件。Vim 的报错大多会在命令行显示E...之类的错误码,比如E492是“不是编辑器命令”,E32是“文件名冲突”。多花 30 秒把这些错误码的意思记住,排错效率远高于全文搜索。
结尾
写到这里,这份速查笔记基本覆盖了我日常使用 Vim 的方方面面。如果你刚开始接触,不用急着一次全记住——先把i、Esc、dd、yy、p、/、:wq这几个练成条件反射,再逐步叠加移动和替换;如果你已经用了一阵子,不妨从“搜索替换”和“多文件操作”这两章开始查漏补缺,尤其是g Ctrl+A生成递增序列那个技巧,很多人用了好几年 Vim 都不知道,白白手动改了很久。
我个人始终觉得,Vim 最大的门槛不是记住命令,而是改变“遇到重复操作就手动做”的思维方式。当你开始想“这个动作能不能用一条命令解决”的时候,就说明你已经摸到 Vim 的门道了。