我先说一句实在话:用了这么多年 vim,我的“快捷键表”依然是一张一张攒起来的,每次换了新环境,第一件事就是重新搜“vim 常用命令”、搜“vim 查找字符串怎么用”。所以我对“零散的快捷方式或命令”这个词特别有感触——零散本身不是问题,问题是记了一堆命令,却不知道它们背后的组合逻辑,真到了服务器上改配置的时候,手指就会卡壳。
这几天看到挺多人搜索“sudo vim”和“package vim is not available”这类问题,我大概能猜出画面:一个刚接触 Linux 的开发者,第一次被迫在终端里编辑文件,输入vim xxx之后发现怎么都退不出去。所以这篇我不打算写什么 vim 从入门到精通的大体系,也不准备照搬一份官方帮助文档,就按我这些年真实用得最多的零散快捷键和命令,把它们串成几组能直接带走、能互相配合的模块。写完之后你会发现,vim 不是让你背字典,它更像一门小语法,掌握几个核心部件就能拼出大部分操作。
1. 零散命令背后的三个底层逻辑:模式、动词、范围
1.1 先弄清模式,再谈快捷键
很多人的 vim 学习路径是这样的:看到同事在终端里一顿操作,光标动得飞快,于是记住一个dd是删除整行,一个gg是跳到文件开头,再收藏起来。等真正自己上手,按Esc没反应,按i倒是进插入模式了,但屏幕上凭空冒出一堆字符,瞬间怀疑人生。
这就是把 vim 当“固定快捷键大全”去背的典型症状。vim 里的按键行为是分状态的,同一个按键在不同模式下的含义完全不同。默认进入文件后,你处在普通模式(normal mode),这时候按手柄,主角不是输入字符,而是给编辑器发命令;按i才进入插入模式(insert mode),这时打的每个字符才会落到正文里。除此之外还有可视模式(visual mode)用于选中文本,以及命令行模式(command-line mode)用于执行:开头的命令。
| 模式 | 作用 | 典型进入方式 |
|---|---|---|
| 普通模式 | 移动光标、执行命令 | Esc |
| 插入模式 | 输入和修改文字 | i、a、o |
| 可视模式 | 选中文本后批量操作 | v、V、Ctrl+v |
| 命令行模式 | 执行命令和搜索 | :、/、? |
这个“状态式设计”是新手最痛苦的点,但只要脑子里始终绷着“当前在哪个模式”这根弦,就没有奇怪的按键了。判断模式的方法很简单:唯一可能锁定你的是Esc按多了没反应,这通常说明你已经处于普通模式,不用慌。
1.2 动词加动作:命令不是咒语,是语法
零散命令记不住,是因为没有拆解它的结构。vim 里大量命令都是“动词 + 动作”这样的组合。动词是操作意图,比如删、改、复制、粘贴;动作是操作范围,比如一个词、一行、一段、整个文件。
最典型的是dw,它的意思是“删除一个词”,拆开看就是d(delete,删除)+w(word,单词)。同理,d$是删到行尾,d0是删到行首,dG是直接删到文件末尾。我常用的组合还有这些:
cw—— 删除一个词并进入插入模式ci"—— 删除双引号内的内容并准备重新输入y2w—— 复制两个单词>G—— 从当前行开始缩进直到文件末尾
这些命令用熟了之后,你会慢慢摆脱“一个操作一个固定快捷键”的思维。c是 change(改变),y是 yank(复制),p是 put(粘贴),v是进入可视模式选选中,这些动词和w(词)、j(下一行)、$(行尾)一组合,几乎能表达所有编辑意图。
1.3 数字前缀和范围:从小命令拼出大操作
vim 命令的前面可以加数字前缀,表示“这个动作重复多少次”。我第一次意识到这一点时,觉得之前记几十个命令都白背了。比如5j是向下移动五行,3dd是删除三行,2yy是复制两行。
再配合行号定位,效率会更高。比如你看到第 27 行有问题,输入27G,光标直接飞到第 27 行;然后输入d$删掉从光标到行尾的内容;如果后面 5 行都要同样处理,再输入5j,继续下一个操作。每个步骤都是零散命令,但它们通过“数字 + 动词 + 动作”串成完整流程。
我特别推荐打开相对行号(后面讲 vimrc 时会配置),这样在普通模式下看左边列号,就能直接数出“下面第 4 行”是多少,再也不用心算出绝对行号再去跳转。这个习惯一旦养成,编辑效率会提升一个档次。
2. 高频编辑命令:把光标移动和增删改查练成条件反射
2.1 光标移动:先治好方向键依赖症
新手最常见的场景,是进入 vim 之后一边骂一边按方向键。我的建议是首先强制自己使用h、j、k、l四个键,分别是左、下、上、右。刚开始确实慢,每次移动都像打字,但一周之后不该方向键也能流畅操作。
移动命令里真正的高频内容主要在词级和行级:
w—— 跳到下一个单词开头b—— 跳回上一个单词开头e—— 跳到当前单词结尾0—— 跳到行首(第 0 列)^—— 跳到行首第一个非空白字符$—— 跳到行尾gg—— 跳到文件开头G—— 跳到文件末尾
比如你在一行很长的配置里想删掉某个参数到行尾的所有内容,直接d$就行,比按住方向键一路删过去快得多。我甚至会把这些键绑在肌肉记忆里:看书时脑子里念念有词“w w b e $”,类似于打字练习。
视野方面还有几个实用命令:Ctrl+d向下翻半屏,Ctrl+u向上翻半屏,zz把当前行滚动到屏幕中间,zt滚到屏幕顶部,zb滚到底部。长时间阅读或检查大文件时,这些特别省事。
2.2 插入、删除、复制、粘贴:顺序很重要
进入插入模式的常用键,各有不同语义:
i—— 在光标前插入a—— 在光标后插入I—— 在行首插入A—— 在行尾插入o—— 在当前行下方新建一行并插入O—— 在当前行上方新建一行并插入
我习惯在写一段新配置时用o,在补充行尾说明时用A,很少再移动光标后按i,这能减少按键次数。删除和复制则要看操作范围:x删除光标所在字符,dd删除整行,yy复制整行,p在光标下一行粘贴,P在上一行粘贴。如果只想复制当前词,用yiw(yank inner word),只删除单词内部保留空格的话,用diw。
有一点常被忽略:可视模式配合删除和复制。输入v进入字符可视模式后移动光标,选中区域会高亮,之后按d删除、按y复制、按>整体缩进,这一套在处理多行重复结构时比手动逐行操作稳定得多。
2.3 撤销、重做与重复命令的节奏感
vim 的撤销不是一次只撤销一个按键,而是撤销一个“操作单位”。如果你连续输入了一段话,按一次u会一次性撤销回到上一次进入插入模式之前的状态。这个设计初看有点不习惯,但用顺了会觉得比很多编辑器的分步撤销更符合人的直觉——因为你平时撤销的是“我这次改了啥”,而不是“我打了哪个字”。
重做用Ctrl+r,如果你撤销过头了,按它就会重新应用。还有一个我特别喜欢的功能:g-和g+,它们按时间线来回跳转编辑历史。假设我改了三个地方,想回到第一个改动的现场,按几次g-就能依次回退,不会破坏后面的操作。
这里还必须提一个常被忽略但极其好用的命令:.(英文句号)。它表示“重复上一次修改”。比如你给好几个变量的末尾都要加上分号,第一次改完后,后面每次只移动到下一行按.即可。同理,如果在多行前面都要插一个空格,改一次后其他行也按.完成。什么场景最适用?批量修改同类格式时。
3. 搜索与替换:从“vim 查找字符串”到全文件批量改写
3.1 正着搜、倒着搜、配合 N/n 循环跳转
在 vim 里查找字符串,最基本的就是普通模式下按/,输入要搜的内容,回车。光标会跳到下一个匹配位置,按n继续往下找,按N往回流找。如果搜到一半发现不想找了,Esc退出输入状态即可。
比如我要在一个脚本里搜所有user_id,输入/user_id,一路按n就能挨个检查。这种搜索还支持正则,比如/^#.*TODO/能搜索所有以#开头且某处带TODO的行,在爬配置的时候很实用。另外?是反向搜索,也就是往文件上方找。
一个小细节:搜索时如果按过/但没输入任何内容直接回车,vim 会重复上一次搜索;在批量操作同一关键词时很方便。而*键更妙——光标放在某个词上按*,vim 直接搜索光标下的词,还自动高亮所有匹配。这是我看代码最常用的快捷键之一。
3.2 高亮、大小写与搜索历史
默认搜索后高亮会一直留着的,再次搜索其他内容前高亮不消失,很多人烦躁。临时取消高亮可以用:nohlsearch,但每次手动敲太麻烦,我更建议在 vimrc 里加一个映射,后面再讲。在搜索时,大小写敏感由ignorecase和smartcase选项决定。我自己的配置是:
set ignorecase set smartcase这两行组合的效果是:当你的搜索词全是小写时,不区分大小写;只要搜索词里包含一个大写字母,就自动变成区分大小写。比如搜error会把Error也搜出来,搜Error就只匹配大写开头的Error。
搜索历史是存在寄存器里的,:history search可以查看,命令行模式下按Ctrl+r再按/也可以展开搜索历史,上下选择历史记录。这比反复输入同一关键词方便。
3.3 替换命令的三个作用范围和确认机制
替换是搜索的进阶用法,它不在普通模式下操作,而是在命令行模式下输入:s命令。最基础的形式是:
:s/旧字符串/新字符串/这只会替换当前光标所在行第一次出现的匹配。按习惯,我会更频繁使用这些形态:
:s/旧/新/g—— 当前行所有匹配都替换:10,20s/旧/新/g—— 第 10 到 20 行的所有匹配替换:%s/旧/新/g—— 全文件所有匹配替换:%s/旧/新/gc—— 全文件替换,但每处都问一下是否确认
我在改配置时几乎总会加上g参数,因为裸:s只改一处确实反直觉。而参数c很适合做危险的重命名:vim 会逐处显示“替换吗?”,输入y确认、n跳过、a全部、q退出。这比编辑器里的全局替换更安全,适合在线上配置里使用。
3.4 用捕获组做一次高级替换
替换命令里可以用正则捕获组,这是很多熟悉编辑器的人也不知道的能力。举个例子,我有一段这种格式的配置:
name: "zhang" name: "li"想改成常量格式:
USER_NAME = "zhang" USER_NAME = "li"直接用:
:%s/name: "\(.*\)"/USER_NAME = "\1"/这里的\(和\)在 vim 正则里表示捕获组,\1引用第 1 个捕获的内容。如果需要捕获两组,可以用\2。这个能力在批量修代码里的 SQL 语句、JSON 字段重命名时都很香。
如果不知道正则能不能匹配正确,先在一条测试行上用:s不带g验证一条,再扩大到全文件。我踩过不少次坑,都是因为.*贪婪匹配把多余内容吞进去,所以说小范围验证永远比肉眼检查全文件靠谱。
4. 多文件与分屏:不要永远只在单个文件里编辑
4.1 打开多个文件和缓冲区切换
默认vim file1只打开了一个文件,但真实项目里经常要在多个文件间跳转,比如看配置的同时改模板,这就需要善用缓冲区。打开多个文件的方式很简单:
vim file1.txt file2.txt在 vim 内部也可以用:e file2.txt再打开第二个文件,两个文件会作为独立的缓冲区存在。输入:ls能查看缓冲区列表,每个缓冲区前面有个编号,然后用:bn跳转到下一个缓冲区、:bp回到上一个、:b 编号直接跳到指定缓冲区。
一个很容易踩的坑是:当你只打开一个文件时,vim 右下角不会显示文件名;改成多缓冲区后建议在 vimrc 里设置set statusline或至少开启set laststatus=2,这样每个文件的状态都能在底部看到。否则切换多了容易迷路。
4.2 分屏:两个文件并排对照
分屏是我改配置文件时最常用的能力。输入:sp是水平方向分成上下两屏,:vsp是垂直方向分成左右两屏。新打开的分屏默认显示同一个文件,这用来上下对照同一个文件的两块区域很方便;如果想在新分屏里打开另一个文件,可以这样操作:
:vsp file2.txt多分屏之后,切换靠Ctrl+w加方向键,比如Ctrl+w后按j把光标移到下一屏,Ctrl+w后按l移到右一屏,Ctrl+w后按_放大当前屏。
另一个实用场景是 diff。输入vimdiff file1 file2打开两个文件,vim 会自动给差异处着色,并且支持同步滚动。手动开启可以用:diffthis。这种对比方式在核对配置版本差异时省了我大量时间。
4.3 跨文件搜索:vimgrep 才是大家伙
如果说“vim 查找字符串”停留在单文件搜索,那vimgrep就是进阶版——它可以跨整个文件树搜索。命令格式如下:
:vimgrep 要搜的内容 **/*.conf后面这个**表示递归所有子目录,*.conf是文件通配符。执行完后,vim会打开搜索结果列表,按回车跳到对应文件的匹配行。我用它在一个配置仓库里一次性搜出所有残留的测试域名,效率极高。
唯一需要注意的是:这个命令在文件特别多时可能稍慢,但相比grep加-n之后还要自己跳文件位置,它已经把结果和编辑器结合起来了,值得用熟。
5. vimrc 配置:让常用快捷键按你的习惯长出来
5.1 vimrc 在哪,先配什么
零散命令装不装得活,很多时候取决于配置文件里有没有基础设置。vim 的用户配置文件是~/.vimrc(Linux/macOS),每次启动 vim 都会读取它。如果你的系统上还没有,直接新建一个即可。
我先给出我长期使用的基础版:
set number set relativenumber syntax on set encoding=utf-8 set tabstop=4 set shiftwidth=4 set expandtab set autoindent set ignorecase set smartcase set showcmd set laststatus=2set relativenumber让每行的行号显示成“距当前行几行”,比如当前行是第 100 行,上面一行左边列显示为 1。配合5j、d2j这类命令极其好用。expandtab把 Tab 键统一转成空格,避免不同编辑器打开后缩进错乱,这是我强烈推荐的项目级规范。showcmd会在右下角实时显示你按下的命令,这能帮你确认命令输入状态。
5.2 leader 键和自定义映射
vim 里有个特殊概念叫 leader 键,相当于自定义快捷键的前缀。默认是反斜杠\,我习惯把它改成空格键,因为空格最好按。
let mapleader = " "然后就可以自定义映射了。我最常用的几条:
nnoremap <leader>w :w<CR> nnoremap <leader>q :q<CR> nnoremap <leader>n :nohlsearch<CR> map <C-s> <esc>:w<CR>这几行提供的内容分别是:leader 加w保存文件、leader 加q退出、leader 加n取消搜索高亮、Ctrl+s保存。尤其是取消高亮那个,配合搜索命令我每天都在用,你不需要再像我以前那样自己敲:nohlsearch了。
5.3 配置思想:别复制别人的整个配置
零散命令和配置最大的坑,是从 GitHub 上复制一份几百行的 vimrc 到自己的机器,结果花一整天检查它绑定了哪些键,比自己从头配还痛苦。我现在的做法是,只往 vimrc 里加自己真正用得到的映射,每个映射旁边留一行注释,说明自己为什么这样设置。这样时间长了,vimrc 就成了你个人编辑器习惯的日志,既干净又可控。
比如我早期写了一行nnoremap ; :,意思是 Shift 分号直接进入命令行模式。因为我嫌Shift+:容易按歪,于是把分号键变成了命令前缀。后来觉得干扰太大,又把分号还原了。这种折腾过程,其实就是逐步把命令从“零散记忆”变成“顺手习惯”的最佳路径。
6. 安装与权限的坑:sudo vim 和“package vim is not available”怎么处理
6.1 为什么会有“sudo vim”这个习惯
很多人在服务器上编辑系统文件时,习惯直接敲sudo vim /etc/xxx。这确实能打开文件,但有个隐藏问题:你是在 root 权限下运行整个编辑器,属性设置、vimrc 文件都不一定和平时一致,如果一个文件权限写错,后续排查还要花时间看。更稳妥的替代方案是sudo -e /etc/xxx,这个命令会先复制一份临时文件给你编辑,保存时才真正写入原文件,权限提升范围更小、更符合安全习惯。
有人会问,那w !sudo tee %是什么?这个命令的思路是:如果文件本身没写权限,但你有 sudo 权限,普通:w会报错,这时在 vim 的命令行模式输入:w !sudo tee %,它会通过sudo tee把内容写回原文件。细节我就不展开了,作为临时救急方案记下来即可。
6.2 “package vim is not available”的完整排查路径
这条报错通常在 Ubuntu/Debian 系的apt install vim时出现。很多人第一次看到就懵了,但其实它不是说 vim 不存在,而是当前 apt 的软件源里找不到这个包。最常见原因是系统里 apt 源没更新,或者默认只带了精简版 vim。
我一般按照这个顺序排查:
sudo apt update sudo apt install vim如果还是提示包不可用,检查系统里有没有装了别的 vim 变体:
apt list --installed | grep vim实际在 Debian/Ubuntu 上,有时候安装vim-tiny或vim-nox也能解决需求,如果只想编辑文件而不在意其他额外功能,vim-tiny已经足够轻量了。如果包源里确实找不到,可以考虑加上 universe 源,或者通过 snap 安装:
sudo snap install vim还可以通过update-alternatives管理 vim 命令的默认版本,然后按需切换。这些都是我在新环境里实际验证过的路径,基本能把七成以上“装不上”的问题解决掉。
6.3 编辑完之后的收尾检查
命令和快捷键都掌握得差不多之后,最后的收尾习惯往往才是真正的效率分水岭。无论是:wq保存并退出,还是:x只有在有改动时才写回,我都建议在关闭文件前用:qall或:wqall处理多文件场景,避免漏存。如果改错了想强制不保存退出,q!是你最需要记的命令,但也要想清楚,q!真的不会给你任何反悔机会。
还有个小习惯:每次在命令行里执行完 vim 编辑后,我会立刻git diff或对比查看改动,确认没有误删空行、没有加密符被替换。vim 的查找和替换能力强,强到你一不留神把整批字符串都改了,所以在批量替换的时候,c确认参数不是可有可无的东西,它值得成为你的第一个习惯。
按我个人的体会,零散命令不可怕,可怕的是没有连成逻辑。如果你刚从网上扒了十来个命令,我建议你就从这六组开始:模式概念、移动技巧、搜索替换、多文件切换、vimrc 配置加到自己的流程里,最后再记牢安装和权限的坑。把这些组合成一套属于自己的操作习惯,比收藏一百篇“vim 命令大全”都管用。