如果你在Linux终端里第一次打开Vim,多半会经历这么一段心路历程:光标不动,字母按上去没反应,屏幕底部还有一行看不懂的提示,想退出却发现Ctrl+C都不给面子。别怀疑人生,你不是第一个被Vim劝退的人。我用了十几年Linux,见过太多同事在第一次打开Vim之后抓耳挠腮。其实Vim的基本命令远没有传说中那么可怕,它只是换了一套和记事本、Word完全不同的操作逻辑:默认不让你直接打字,而是先让你选择怎么操作、再决定往哪输入。一旦想通这一点,多数命令都能举一反三。
这篇文章不打算翻译Vim官方手册,而是从我实际用Vim的体验出发,把“打开文件到退出编辑器”这条完整操作链路上最常用的命令讲清楚,顺便把那些文档里不容易搜到的细节也点出来。如果你是刚接触Linux、想在服务器上改配置文件的新手,这部分内容足够让你从容进出Vim;如果你已经用了几天但总觉得效率上不去,中间的几条组合逻辑可能正好能补上你缺的那块拼图。
1. 先搞懂Vim的模式,这比背命令更重要
1.1 三种模式的工作逻辑
Vim最有名也最唬人的设计,是它的“模式”。普通编辑器不管打开什么文件,光标所在位置就是输入位置,键盘按下什么字符就显示什么字符。Vim偏偏不这样,它给你准备了至少三种状态:普通模式、插入模式、命令行模式。
刚打开Vim时,你处于普通模式。在普通模式下,键盘上的h、j、k、l不是字母,而是“光标向左、下、上、右移动”的方向键;x是删除字符;dd是删除整行;yy是复制整行。换句话说,普通模式下按下的键是“操作指令”,而不是输入内容。这个设计和我刚提到的记事本逻辑完全相反,所以很多新手第一次打开Vim会觉得自己被困住了,其实只是还没有理解“模式”这个前提。
插入模式才是真正输入文本的状态。要进入插入模式,普通模式下按i、I、a、A、o、O都可以。其中i是在当前字符前插入,a是在当前字符后插入,o是在当前行下方新起一行再进入插入模式。要退出插入模式回到普通模式,按Esc,或者更稳的Ctrl+[。命令行模式则在普通模式下按冒号进入,屏幕最底行出现一个冒号,接下来输入w保存、q退出、%s/foo/bar/g全局替换这样的指令,按回车执行,执行完自动回到普通模式。
把Vim想象成一台需要换挡的车可能更好理解。普通模式等于空挡,你可以观察环境、调整状态;插入模式等于挂挡踩油门,把字符写进文件;命令行模式则是用语音指令控制整车。三种状态切换顺畅了,整个编辑器用起来就很顺手。
1.2 模式切换的肌肉记忆
很多教程只画了“普通模式/插入模式/命令行模式”的三角关系,实际用起来真正需要时刻记住的只有一条:没事就待在普通模式,要输入文字时按i进插入模式,输入完立刻按Esc回普通模式。用熟了之后,这个切换是微秒级的,根本不需要看屏幕确认。
我见过不少人花了很多时间学“怎样不用鼠标”,结果打开Vim后还是习惯性地去按方向键。Vim在插入模式中方向键确实可以用,但这样做效率很低,因为你的右手必须离开键盘主区去右下角。普通模式下用h、j、k、l就能完成移动,手不用动,注意力也一直留在字母区。这个差距在修改几百行配置文件时特别明显,手每往返一次方向键,都要重新定位一次键位,连续改二十分钟文件,指尖全是冤枉路。
这里有个常见误区要澄清:按Esc并不能进入命令行模式。Esc只负责从插入模式回到普通模式。命令行模式是通过冒号、斜杠、问号等按键临时进入的“输入指令”状态,不需要当成常驻状态来看。你只需要记住:想输入文字按i,想执行命令按冒号,想控制光标就回普通模式用hjkl,这三个切换动作就是Vim日常操作的全部入口。
2. 移动光标:先在文件里找对地方
2.1 字符级与单词级移动,把手速变成肌肉记忆
先来最基础的。普通模式下,h、j、k、l分别对应左、下、上、右。这几乎是Vim所有移动命令的地基,后面介绍的所有“组合技”都以它们为基础。刚上手不必强求不用方向键,你在普通模式下按方向键同样能移动,但练熟hjkl之后,你会发现自己的手根本不想离开键盘字母区。
移动命令可以带数字前缀,这是Vim操作效率高的一个重要原因。3w表示向右跳三个单词,5j表示向下移动五行的光标位置,10G表示跳到第10行的行首。数字加命令的组合贯穿着整个Vim命令体系,越早适应越好。我自己的习惯是移动幅度大时先想“大概几行”,然后直接输入数字加j或k,比一下一下按快得多。
光有上下左右还不够。在代码和配置文件里,“按单词跳”比“按字符爬”效率高得多。w跳到下一个单词的开头,W跳过标点直接按空格分隔的单词,e跳到当前单词或下一个单词的结尾,b和ge用于向后回跳单词开头或结尾。配合数字使用,比如3w连跳三个单词,在参数很多的长命令行里特别管用。这里要提醒一句,Vim对单词的切分以空格、标点为界,中文文本也适用,只不过中文词之间一般没有空格,跳起来会按标点切分,这一点在阅读中文文档时心里有数就行。
2.2 行内、跨行和屏幕级移动
说完了左右横移,再看行内定位。0跳到行首第一列,包括缩进的空格;^跳到行首第一个非空白字符;$跳到行尾。f和t是行内“瞬移”:fx是在本行内查找下一个字符x,光标停在x上;tx则把光标停在x前一个字符。加数字前缀如3fx是在行内找第三个x。这套小技巧在编辑有对齐关系的代码时几乎每天都要用。
跨行、跨屏幕的操作也很简单,我整理成一张表,方便对照记忆:
| 操作目标 | 命令 | 说明 |
|---|---|---|
| 跳文件开头 | gg | 光标到第1行 |
| 跳文件结尾 | G | 光标到最后一个字符 |
| 跳指定行 | 20G | 跳到第20行 |
| 整屏向下翻 | Ctrl+f | 下一页 |
| 整屏向上翻 | Ctrl+b | 上一页 |
| 半屏向下翻 | Ctrl+d | 快速浏览 |
| 半屏向上翻 | Ctrl+u | 快速浏览 |
| 跳屏幕顶部 | H | Home位置 |
| 跳屏幕中部 | M | Middle位置 |
| 跳屏幕底部 | L | Last位置 |
还有一组容易被忽视的移动命令是括号匹配:按(和)在句子之间移动,按{和}在段落之间移动。在C语言风格的花括号代码块里,{}跳转对定位函数边界特别有用,省去逐行扫的功夫。
到这一步,你已经能从文件任意一处到达另一处了。移动永远是为了编辑服务,所以接下来看看真正改文件的命令。
3. 编辑命令:改文本才是最终目的
3.1 插入:从普通模式“瞬移”到输入状态
编辑的第一步是进入插入模式。这里有几个容易混淆的按键,我实际工作中经常看到别人误用。i是在光标当前位置的左侧插入,a是光标当前位置右侧插入,A是跳到行尾再插入,I是跳到行首非空白字符前再插入,o是当前行下方新建一行再插入,O是当前行上方新建一行再插入。选哪个取决于你光标在哪、要往哪插,用熟了就是条件反射。
举个例子。你在一行参数的末尾,想追加一个配置项,直接按A然后输入,比先移动光标到行尾再按i少一步。空行之间想补内容,按o新开一行也顺手。光标停在某个字母中间想改掉整个词,那就用后面要说的c命令,而不是先删再进插入模式绕一大圈。
插入模式下也有一些顺手快捷键。Ctrl+w删除前一个单词,Ctrl+u删除到行首。这两个在插入模式下比按退格键连续删效率高很多,尤其是刚粘贴了一段内容发现自己多打了几个词的时候。不过我的建议是:一旦需要大范围删改,还是先按Esc回普通模式,用dd或ciw这类命令处理,肌肉记忆会让你更稳。
3.2 删除、复制、粘贴与撤销
删除操作在普通模式下按x删除光标处的单个字符,按X删除光标前一个字符。想删多个就带数字,5x一次删五个。dd删除整行,本质上是剪切,3dd剪切三行。删除单词有几种选择:dw删除到下一个单词开头,daw删除整个单词及周围空格,ciw删除当前单词并进入插入模式,适合直接重写一个词。
新手最容易困惑的一点是:dd掉的内容其实没有消失,而是被放进了Vim的寄存器,相当于“剪切”。剪切后用p在当前行下方粘贴,用P在当前行上方粘贴。yy复制整行,yw复制单词,y$复制到行尾,再用p或P粘贴。这套逻辑会颠覆一部分人对“复制粘贴”的认知,但掌握了之后会觉得特别自然。
撤销与重做必须放在一起记:u撤销一步,Ctrl+r重做一步。尤其要对新人强调u的存在,因为误删整行时第一反应不应该是“完了”,而是按u。我又多讲一句,普通模式下按英文句号.可以重复上一次的修改操作,比如刚用dd删了一行,连续按.就会继续往下删;刚用ciw换了一个词,下一个同类型单词也能用.快速执行同样的修改。这个命令把重复劳动压缩到极致,是我自己每天必用的高频键。
Vim命令还有一个底层逻辑值得单独拿出来讲:它像英语语法一样,由“动词”和“范围”组成。d是删除、y是复制、c是修改,后面的移动命令就是范围。dw就是“删除一个单词”,y$就是“复制到行尾”,c3w就是“修改接下来的三个单词”。你不用背几十种组合,掌握几个动词加几个移动命令,自己就能组合出新的操作,这才是Vim真正强大的地方。
4. 搜索与替换:在长文件里精准定位
4.1 用斜杠和问号在文档里搜索
在普通模式下按斜杠/进入正向搜索,屏幕底行出现输入框,输入关键词后回车,光标跳到第一个匹配位置。按n跳向下一个匹配,按N跳回上一个匹配。如果想向上搜索,用问号?代替斜杠,行为正好相反。这里有个很容易混淆的细节:斜杠搜索时,n是顺着搜索方向走,N是反方向;问号搜索时逻辑反过来。我最早也经常搞混,后来干脆记住一条:n永远是“下一个”,N永远是“上一个”,除非你还在纠结方向问题,那就看底部提示符。
搜索默认区分大小写。不想区分的话,执行:set ignorecase再搜索就大小写通吃了。:set smartcase是更聪明的做法:如果搜索词全小写则忽略大小写,一旦搜索词里包含大写字母,就严格区分。这个配置我建议每个新人都一开始就加上,对日常搜索体验改善非常明显。
搜完之后匹配词会高亮显示,这在匹配项很多时非常刺眼。取消高亮可以:set nohlsearch,但更好用的是:nohlsearch,缩写就是:noh,回车后高亮暂时消失,下次搜索又会自动出现,不会永久关闭高亮功能。
普通模式下还可以按星号*直接搜索当前光标下的单词,Vim会自动高亮所有相同项,配合n、N逐个跳转,在代码里看某个变量被用到了哪些地方特别方便。这个技巧也算是“基本命令”里最被低估的一个,很多人用了很久Vim都不知道,其实它比先输入斜杠再复制粘贴搜索词要爽得多。
4.2 替换命令的三种姿势和确认机制
替换是Vim里仅次于搜索的高频操作。单项替换:s/old/new/只替换当前行的第一个匹配;:s/old/new/g替换当前行全部匹配;全局替换:%s/old/new/g替换整个文件所有行;行范围替换:2,5s/old/new/g只处理第2到第5行。这里的%是“所有行”的快捷写法,底层意思是“文件范围内”,理解成百分号也没错。
带确认的替换是:%s/old/new/gc。每遇到一处匹配,Vim都会问你是不是要替换,输入y确认、n跳过、a全部替换、q退出。这个参数在你不敢确定替换范围时特别安全,尤其是全局替换前最稳妥的做法是先看一眼预览。我自己的习惯是,第一次做大规模替换先用带c的版本过一遍,确认没有意外匹配后再决定要不要全自动替换。
替换命令的分隔符其实不只有斜杠,也可以换成#或+,比如:%s#a/b#c/d#g。这样当被替换内容本身包含斜杠时,不需要逐个转义,路径类文本会舒服很多。另外,搜索和替换时遇到.、*、[这类正则特殊字符,普通字符串匹配会变得诡异,这时要么对其做转义,要么在搜索词前加\V表示“完全按字面含义匹配”。这个细节对新手特别容易踩坑,尤其是替换IP地址或文件路径时。
5. 保存退出与多文件协作
5.1 保存、退出、强制的正确姿势
比编辑更重要的是保存和退出,毕竟“怎么退出Vim”是搜索引擎上的一个经典问题。:w保存文件;:q退出编辑器;如果文件改过但没保存,Vim会报E37错误并拒绝退出,这时要么先:w再:q,要么用:q!强制放弃修改退出。:wq保存并退出,:x和ZZ也有同样的效果,区别在ZZ直接按普通模式下的两个大写字母,不用敲冒号。我实际用下来,ZZ比:wq快一点,适合批量改配置文件时的快速收尾习惯。
强制保存场景也要说一下:当文件是只读权限、但你确实需要写入时,:w!可以强制保存,前提是当前用户对文件所在目录有写权限。不少人想把服务器上权限为444的配置直接改掉,发现保存被拒,第一反应是奇怪,其实先检查Linux文件权限再动手才是正路。
| 命令 | 作用 | 注意事项 |
|---|---|---|
| :w | 保存 | 不退出 |
| :q | 退出 | 未保存会提示E37 |
| :q! | 强制退出 | 放弃所有修改 |
| :wq | 保存并退出 | 常用 |
| :x | 保存并退出 | 无修改时只退出 |
| ZZ | 保存并退出 | 普通模式直接按 |
| ZQ | 强制退出 | 普通模式直接按 |
5.2 多文件与分屏:Vim不只是一个编辑器
实际工作里经常要同时看两个文件,比如对比配置、把A文件的内容搬去B文件。Vim支持用:e 文件名打开另一个文件替换当前缓冲;:tabe 文件名新建标签页打开;:sp 文件名上下分屏,:vs 文件名左右分屏。分屏以后,用Ctrl+w w在窗口之间切换,Ctrl+w q关闭当前窗口。这些基础操作配合上表格里的移动命令,完全可以替代鼠标完成绝大多数多文件操作。
切换未保存文件时,Vim会检查缓冲区状态并阻止粗暴切换。新手最容易在这里卡住:明明打开了两个文件,第二个文件还没保存就切换,结果发现切不过去。最简单的处理方式是先按ZZ或:w保存,再执行切换命令。如果实在想保留未保存状态去别处看看,可以:set hidden让被切换走的缓冲区暂时隐藏,这个配置适合有一定经验之后再碰。
6. 配置一个顺手的启动环境:你的第一份vimrc
6.1 值得立刻加上的基础配置项
Vim默认配置非常朴素:没有行号、没有语法高亮、Tab缩进宽度是8个空格。这些全部可以改,配置文件是用户主目录下的.vimrc。打开方式很简单,:e ~/.vimrc编辑,保存后执行:source ~/.vimrc或:so %再重开Vim,改动就生效了。
一份适合新手起步的配置文件可以长这样:
set number set relativenumber set autoindent set smartindent set tabstop=4 set shiftwidth=4 set expandtab set ignorecase set smartcase set hlsearch set incsearch syntax on filetype plugin indent on set encoding=utf-8逐条说几个重点。行号用set number开启,相对行号用set relativenumber开启,两个一起开会在状态栏同时显示绝对行号和相对行号,配合跳转非常方便。缩进相关的四行设置把Tab宽度固定为4空格,并且用空格代替Tab,避免了不同编辑器之间Tab显示不一致的问题。搜索相关的三行设置让高亮常驻、边输入边预览匹配,体验提升立竿见影。encoding=utf-8处理中文显示乱码也很有用,尤其是打开服务器上那些用UTF-8保存的文档。
6.2 常用映射与“别过度配置”的提醒
用习惯了基本命令后,你会发现有些组合键按起来还是不够顺手,这时可以给.vimrc添加映射。最经典的例子是把jj映射成Esc,这样输入完文本不用伸手够右上角的Esc键:
inoremap jj <Esc>还有leader键的概念,也就是自定义前缀键。比如设置let mapleader=",",之后就可以把,+w映射成保存文件,,+q映射成退出,操作起来很顺手。不过我的建议是:映射是锦上添花,先把基本命令用熟,至少保持一两周的“原生操作”再去加映射。很多新人一上手就沉迷配置一百多个快捷键,结果第二天全忘光,反而是最影响效率的。
7. 常见坑与排查技巧
7.1 新手必踩的五个坑
第一坑:按i没反应。这种情况要么是根本没进入普通模式,要么是开了大写锁定,要么是已经在插入模式里又按了一次i,然后输入了字母i。Vim对模式的敏感性逼着你必须时刻知道自己处于哪个状态,所以我常说,学Vim第一课不是背命令,而是学会“看状态栏”。
第二坑:粘贴代码时缩进乱套。Vim默认会对多行粘贴内容重新做自动缩进,粘贴几十行配置时全部错位,像没对齐的表格一样难看。解决办法是粘贴前进入插入模式之前先:set paste,粘贴完再:set nopaste恢复。这个命令直观解释了“为什么Vim粘贴看起来总像智商有问题”,其实只是自动缩进在捣乱。
第三坑:插入模式下想改错字疯狂按方向键。从写文章的角度看这无可厚非,但从Vim效率的角度看,这就是给自己找罪受。正确姿势是先Esc回普通模式,用h、j、k、l或w、b精准跳到错字位置,再按i修改。
第四坑:把未保存的文件丢了。E37、E32这类错误编号都是提示,E37是“文件有修改但没保存就尝试退出”,E32是“没有文件名”,E212是“文件不存在或没有写权限”。遇到这些提示不用慌,底部状态栏已经把原因写得明明白白,读一遍再决定下一步。
第五坑:用/搜索时遇到正则特殊字符找不到。搜索普通字符串里的句点、星号、方括号时,Vim会把这些字符当成正则表达式,导致结果和直觉不符。解决办法在前面已经说过,要么转义,要么加\V按字面匹配。
7.2 排查顺序与常用命令速查表
遇到奇怪问题时,我的排查顺序一般是三板斧。先看当前处于什么模式,底部状态栏有指示,混了先按Esc再按冒号;再看提示信息,Vim的错误提示几乎都很明确,结合关键词上网检索就能定位;最后排除配置干扰,执行vim -u NONE -U NONE 文件名启动一个不带任何配置的Vim,如果问题消失了,就说明问题出在.vimrc里,逐行注释排查即可。
最后放一份覆盖本篇文章核心内容的速查表,方便你平时查阅:
| 操作 | 命令 |
|---|---|
| 进入插入模式 | i / a / o / I / A / O |
| 返回普通模式 | Esc / Ctrl+[ |
| 移动光标 | h j k l / w b / 0 $ |
| 删除 | x / dd / dw / daw |
| 复制粘贴 | yy / p / P |
| 撤销重做 | u / Ctrl+r |
| 保存退出 | :w / :q / :wq / ZZ |
| 搜索 | / 词 / ? 词 / n / * |
| 全局替换 | :%s/old/new/gc |
| 分屏 | :sp / :vs / Ctrl+w w |
| 查看帮助 | :help 命令名 |
我个人在实际操作里的体会是,Vim的基本命令并不算多,真正值钱的不是“背会了哪些键”,而是“形成了一套摆脱鼠标、纯键盘操作文本的心智模型”。我建议新人在一两周里先强制自己用Vim改配置文件、写脚本,哪怕一分钟能做完的事花十分钟也不要换编辑器。熬过最初那段痛苦期,你大概率会像我一样,在服务器上、在本地甚至写博客时都不自觉地打开Vim。如果你现在正卡在“怎么退出Vim”这个问题上,先记住:按Esc回到普通模式,然后输入冒号、q、感叹号、回车,你就能出来。但是出来之后,别忘了再打开Vim试一次。