刚接触vi的时候我差点被怎么退出逼疯。屏幕上全是波浪线按什么键都没反应百度一搜退出vi编辑模式常年挂在编辑器类热搜榜。这个场景我相信很多人都经历过。后来真正搞懂vi的三种模式之后我才意识到一个残酷的事实vi难学不是因为它功能少而是因为它和我们从小用惯的图形化编辑器思维完全不在一个频道上。这篇文章不打算写成一本vi操作手册而是想把我这几年从被迫使用到主动依赖的过程拆开来把那些卡住绝大多数人的关键点、高频命令背后的逻辑、以及从会编辑到高效编辑的跳跃方法讲清楚。1. 为什么到今天还在学vi先搞清楚它解决什么问题1.1 vi到底是编辑器还是编译器概念先掰正先说一个在热搜里反复出现的疑惑编译器和编辑器到底什么区别。这两个词虽然都带编字干的完全是两件事。编辑器Editor负责处理文本本身它的核心功能是让你创建文档、移动光标、修改文字、保存文件vi、vim、VS Code、记事本都属于这一类。编译器Compiler则是把人类可读的源代码翻译成计算机可执行的机器码的转换工具GCC、G、javac、Go编译器都属于这一类。你写代码用编辑器你把写好的代码变成可运行的程序用的是编译器两者是流水线上的上下游关系不是竞争关系。我见过不少初学者把vi是什么编辑器和vi能不能编译代码混在一起问甚至有人以为vim是用来替代GCC的这其实是把工具链上下游搞反了。vi这个名称源于Visual Interface它的出身是上世纪七十年代Bill Joy在BSD Unix上开发的屏幕编辑器。简单说它是一个纯文本编辑器不是IDE也不是编译器但它可以通过调用外部命令来执行编译任务这是后话。1.2 哪些场景你绕不开vi很多用惯了Windows图形界面的人会觉得vi是远古时代的产物跟自己没关系。但现实中你只要沾上这几类场景就迟早要面对它登录Linux服务器排查问题时没有图形界面vi是系统自带的最可靠编辑器修改各类配置文件时无论是Nginx、Apache还是某个服务的启动脚本服务器上默认只有vi/vim在Docker容器里改文件极简镜像里通常只装了vi参加算法笔试或远程面试时很多在线编码环境的底层编辑体验就是vim风格你日常使用的VSCode、JetBrains全家桶里面很多光标操作和快捷键逻辑本身就借鉴了vi的思想换句话说vi不是服务器管理员专属只要你写过代码、碰过Linux、部署过服务vi就是一道绕不开的门槛。与其每到现场才临时百度不如花一两个晚上把它吃透。2. 捅破那层窗户纸vi的三模式思维2.1 模式切换i与Esc的对称美vi最让人困惑的地方也是它最核心的设计——模式Mode。常规编辑器是编辑模式无处不在你打开就能打字需要的只是移动鼠标。vi不是这样它把键盘操作分成了几个不同的状态。先说最基础的三种普通模式Normal Mode、插入模式Insert Mode、底行模式Command-line Mode。普通模式是vi的默认状态在这个状态下你按下的每个键都不是输入文字而是执行一个编辑命令插入模式才直接录入文字底行模式则用于执行保存、退出、查找替换等殖民命令特点是按下冒号:后屏幕底部会出现命令行。这个设计初看让人崩溃但你换个角度想就明白了vi假设你的双手始终放在键盘上而且你的大部分操作不是打字而是修改。为了区分我想移动光标和我想输入字母它干脆把这两个动作放到不同模式下执行这样就不需要Ctrl、Alt、Shift等修饰键的组合了。类比一下驾驶手动挡汽车你得切换挡位来决定车的状态踩油门才对应到有效的加速。vi的模式就是挡位挡位没挂对踩油门也没用。切换到插入模式最常用的按键是i回到普通模式按Esc。提示如果你在输入状态按了一堆字母发现屏幕上没反应先按Esc回普通模式再重新思考你的操作。强扭的思维不要集中于到底是什么谜之状态而要先回到Normal这个根状态。2.2 插入模式的四个入口i、a、I、A怎么选进入插入模式有多个入口每个入口对应不同的光标位置这是vi在细节上优化手部移动的体现。iinsert在当前光标所在字符之前开始插入aappend在当前光标所在字符之后开始插入I移动到当前行的行首开始插入A移动到当前行的行尾开始插入o在当前行的下方新建一行并插入O在当前行的上方新建一行并插入把这七个动作记熟你写代码时最常遇到的需求——行首加个标签行尾补个分号往下一行插入新语句——都可以在按键层面做到极少移动。比如补个分号你不需要按End键再输入直接Esc A ;就能完成手几乎不离主键区。这套设计的关键价值在于vi把所有高频操作都压缩在了手不离字母区的范围里。你方向键用得越少整体编辑速度就越快这是它敢在无图形界面的环境下依然保持高效率的底气。2.3 退出vi的有效姿势从Esc到:wq全套回到那个热搜词退出vi编辑模式。这确实是每个vi新手都要经过的第一道坎。搞清楚层级关系后退出其实很简单如果你正在插入模式先按Esc回到普通模式在普通模式下直接ZZ两个大写的Z表示保存退出或者按下冒号进入底行模式输入wq保存退出输入q直接退出输入q!强制退出且放弃修改如果你处于某种半路状态多按几次Esc一般都能回到普通模式再按ZQ或:q!就能不保存退出注意ZZ保存退出和ZQ不保存退出这两个命令是我建议初学者最先记住的。它们不需要进底行模式操作路径最短适合干完活赶紧走的场景。另外补充一点如果你在普通模式下不小心按到大写锁定或输入了乱七八糟的字符屏幕上可能会跳出一些奇怪提示例如底行模式的历史命令。这时候按Esc关闭底行再重新执行你的操作即可。vi的界面环境反馈虽然简陋但出现异常提示时多读一下屏幕底部内容很多问题都能自己解开。3. 第一周就要消化的高频命令表3.1 移动和翻页别再用方向键了vi普通模式下光标移动是基于字母的方向键虽然在现代vim里也能用但效率和精神内核都差点意思。基础移动键位对应如下按键功能h、j、k、l左、下、上、右注意顺序w、b、e按单词向前移动、向后移动、移动到单词词尾0、^移动到行首、行首第一个非空字符$移动到行尾gg跳到文件第一行G跳到文件最后一行:N跳到第N行比如:120跳到第120行H、M、L跳到当前屏幕的顶部、中间、底部很多人觉得hjkl反直觉但你要是接触过盲打就会发现右手食指放在h上、中指在j、无名指在k、小指在l这个布局正是字母区最自然的位置。它不需要你手指离开主键区就能完成上下左右全部移动这是方向键永远比不了的。我自己的经验是学会这组键位后先别去追求花哨的跳跃命令把hjkl练到不加思考就能按对的程度这个过程大概需要两三天。之后再引入w、b、e、$这类跳跃移动你会感觉到自己的光标移动逐渐从一格一格爬变成一段一段飞。3.2 删除与修改x、dd、dw与它们之间的区别移动只是第一步编辑才是核心。vi的删除命令设计得非常精细x删除当前光标所在的那个字符类似Delete键dw删除从光标到下一个单词开头之前的内容d$删除从光标位置到行尾的所有内容dd删除当前整行最常用可以理解为剪断这一行dG删除从当前行到文件末尾的全部内容dgg删除从当前行到文件开头的全部内容注意dd删除的不只是那一行文字它会把整行连同换行符一起删掉所以两行会并为一行。另外dd和x都支持数字前缀2dd表示删除连续两行3x表示删除3个字符。这个数字前缀机制贯穿所有vi命令是提高效率的基本功。删除之外还有一个高频修改操作是替换。普通模式下按r再按一个字符可以替换光标所在字符按R则进入替换模式连续覆盖后续内容直到你按Esc退出。比如你写代码时把一个变量名写错了用r或者R修改比切换到插入模式删了再输要快得多。3.3 查找、替换与撤销改错也能安全回家查找是编辑文本最频繁的需求之一。在普通模式下按斜杠/输入关键词后回车就能从头开始向下查找按问号?则是反向向上查找。查找下一个匹配结果按n上一个按N。替换则依赖底行模式核心命令为:s/旧/新 替换当前行第一个匹配 :s/旧/新/g 替换当前行全部匹配 :%s/旧/新/g 替换整个文件全部匹配 :%s/旧/新/gc 替换时逐个确认方便人工筛查别小看这个c后缀我实际工作中哪怕是确认过的全局替换也习惯带上c。有时候你以为old只出现在预期的位置实际上某个注释、某个字符串里也可能包含它逐个确认能避免一批让人哭笑不得的改动。至于撤销普通模式下按u撤销上一步操作按Ctrlr重做。这里的一步不是单个字符而是你从进入插入模式到退出那段时间之内的所有输入所以写代码时习惯性按Esc再继续写能让你后续的撤销粒度更清晰。4. 两个编辑动作黏在一起vi命令的语法结构4.1 操作符动作理解d、c、y后面的学问很多初学者停留在一个个孤立命令背死板的阶段直到他们意识到vi的命令有语法。操作符是第一个突破口。vi里有一组操作符Operator它们本身不单独执行必须搭配一个动作Motion来指定作用范围ddelete删除指定范围的内容cchange删除指定范围的内容并进入插入模式相当于修改yyank复制指定范围的内容到寄存器动作Motion就是我们上一节看到的那些移动命令比如w、$、gg、G甚至是一个查找动作。两者组合起来威力就出来了dw 删除到下一个单词开头d$ 删除到行尾dd 删除整行这个你可以理解为d重复两次的特殊约定cw 修改当前单词此时vim会删除该单词并直接进入插入模式y$ 复制从光标到行尾的内容yiw 复制当前单词这个后面还会讲理解这个组合规则后你再也不需要一个一个去背哪个命令删到行尾、哪个命令删到词首了。任何移动命令只要在前面拼上d、c、y就能变成一个对应的删除、修改、复制操作。这就是vi命令体系的语法它是从零散记忆到系统掌握的转折点。4.2 文本对象从一个字到一对引号的跳跃如果说操作符动作已经是语法文本对象Text Objects就是这套语法的高级表达式。文本对象可以让你的操作范围不再局限于单词和行而是按结构来选比如一段引号内的内容、一对括号内的内容、一个HTML标签内的内容。几个核心文本对象iw当前单词不含空格aw当前单词含旁边空格i双引号内的内容不含引号a双引号内的内容含引号ip当前段落以空行分割的段落i( 或 i)一对圆括号内的内容i{ 或 i}一对花括号内的内容使用方式就是把它们拼在操作符后面。比如你有一个函数调用foo(bar)光标停留在foo里面ci 删除bar并进入插入模式输入新内容后自动保留了引号da 删除bar连同两个引号di) 删除括号内的内容但不删括号这个操作在实际改代码时太常用了。改一个JSON的值、换一个函数的参数、重命名一段文本用文本对象几乎都是一步完成。我见过很多人把ci系列称为vi里最令人上头的命令组合因为一旦尝到甜头你就不想回去用鼠标慢慢拖选了。4.3 .命令、宏与寄存器把重复工作交给机器高效编辑的另一个维度是让重复操作自动化。vi里的.命令、宏和寄存器就是干这个的。普通模式下按.会重复上一次的修改操作。比如你上一步做了在行尾追加一个分号并回到普通模式那么光标移到下一行再按.分号就会再次出现在行尾。批量修改时这个命令配合移动指令能做到先按一次然后不断移动按.的流水线操作。宏则更进一步。按q加上某个字母比如qa开始录制这之后你做的所有操作都会被记忆再次按q结束录制。回放时按a执行一次按重复上一次的宏调用。比如格式化某种重复性很强的文本段落录一个宏然后在多行上执行工作量瞬间从重复劳动变成一次性劳动。寄存器是vi的剪贴板系统但功能更强。普通模式下按加上寄存器名再加删除或复制命令可以把内容存到指定位置。比如ayy复制当前行到寄存器a然后到另一处按ap粘贴。这解决了默认剪贴板只能存取最近一次内容的问题同时操作多个文本片段时很好用。提示这些高级功能的初始学习成本比基础命令高一些我建议你先把操作符和文本对象练熟再上手宏。如果还不会写正常代码就去套宏容易把自己绕晕。循序渐进最稳。5. 从vi到vim配置文件与现代化改造5.1 先区分vi和vim再决定从哪个开始很多人把vi和vim当成同一个东西它们确实同属一族但vimVi IMproved是vi的扩展版本添加了多级撤销、语法高亮、窗口分屏、插件系统和更完善的宏处理等功能。当前Linux发行版里你执行vi命令时很多系统实际调用的是vim的精简模式。也就是说现代Linux环境里你基本不用太担心我打开的是远古vi还是增强版vim绝大多数发行版都提供了vim。但理解这个区分仍然很重要因为它决定了你搜索资料时该怎么找。网上几乎所有关于vimrc配置vim插件的教程都是以vim为基础写的纯vi并不支持这些功能。我建议你直接从vim开始学习学会的键位和命令在vi和vim中通用但多学到的功能能显著提升体验。你可以输入vim --version查看当前版本确认是否开启了语法高亮支持。5.2 你的第一份.vimrc哪些配置最值得写vim的配置文件是用户目录下的.vimrc在Windows上可能是_vimrc。它最大的价值在于你不用每次打开文件都敲一堆命令可以把默认行为和快捷键固化下来。我最推荐的基础配置syntax on set nu set relativenumber set tabstop4 set shiftwidth4 set expandtab set autoindent set incsearch set hlsearch set wildmenu set ignorecase smartcase逐条说下理由syntax on 打开语法高亮这个直接提升阅读代码的效率set nu 和 set relativenumber 显示行号相对行号在很多操作中非常实用比如5dd删除下方5行tabstop和shiftwidth控制缩进宽度针对不同团队规范可以调整但要保持一致expandtab把Tab转成空格避免混用导致格式错乱autoindent自动继承上一行缩进写代码省心一些incsearch从输入查找词时就开始匹配hlsearch高亮所有匹配结果wildmenu在底行的Tab补全上增强我个人的建议是第一次配置别贪多。先加上语法高亮、行号、缩进控制这三组就够用了等体验一段时间再逐步加其他项。配置加得太多、自己又不明白每条的含义出了问题反而难排查。5.3 插件生态按需引入别一开始就堆配置vim的插件生态很丰富尤其是配合Vundle、vim-plug这类插件管理器使用。现代vim社区最流行的方案之一还有把NeoVim与Lua配置结合但那已经属于用vim写vim配置的进阶玩法入门阶段不需要碰。如果你想装插件建议从这几类开始文件树nerdtree或者netrw内置Git状态集成vim-fugitive、git gutter状态栏美化vim-airline、lightline代码补全coc.nvim或者YouCompleteMe前者更主流一些但我想认真说一句插件不是你变高效的关键。我见过配置了40个插件但连文本对象都用不熟练的人编辑效率还不如一个裸vim基础命令熟练的老手。vim的威力首先来自它本身的操作模型插件只是锦上添花。先把4.2那些组合命令练进肌肉记忆再决定要装什么顺序别搞反。6. 真实使用中你会卡住的地方几则踩坑记录6.1 ctrls后屏幕卡死其实是锁屏在终端里用vim时我见过不止一次有人屏幕突然卡死按什么键都没反应。大部分时候原因不在vim本身而在你按了Ctrls——这个组合键在终端是暂停输出XOFF并不是程序挂了。这时候别急着关窗口按CtrlqXON就能解锁。终端对这种流控制的支持程度因软件的差异略有不同但Ctrls/Ctrlq是最通用的组合。这个坑可以说每个终端党都会踩一次我在这里提前记一账免得大家白紧张。6.2 打开Windows传过来的文件满屏乱码服务器运维中经常遇到Windows上传的文本文件vim打开后会出现乱码和奇怪的^M符号。这背后的原因是Windows和Linux使用了不同的换行控制符Windows用CRLF而Linux用LFvim直接打开时会把CR显示成^M。解决办法比较简单:set ffunix :%s/\r//g先统一文件格式为Unix换行再把历史遗留的\r字符全局替换掉。如果文件编码也是乱码比如中文字符显示成乱码还要检查并调整编码:set fileencodingutf-8 :e encutf-8vim会根据能力自动检测编码但遇到可疑文件时手动指定往往最靠谱。我的习惯是先在底行执行:set fileencoding查看当前文件被识别为何种编码再做决定。6.3 误删、误改、误保存建立你的逃生路线再熟练的人也会手滑。vi给你留了一条逃生路线普通模式下多次按u可以逐级撤销这是最直接的后悔药Ctrlr则用于撤销方向重做。但如果你已经保存并关闭了文件撤销记录就没了。因此我能给出的最实在建议是高风险大批量修改前先复制一份备份文件再操作比如cp config.ini config.ini.bak在vim里可以用:saveas newfile另存一份工作副本只有当你确认修改完全正确时才执行保存命令误保存后不要继续折腾原文件先看有没有swap文件vim崩溃或编辑时的自动备份机制会生成.filename.swp它可能帮你找回以前的版本提示vi类的编辑器还有一个强大的特性是不保存退出即ZQ或:q!。如果你发现自己在一通猛操作后把文件改乱了果断放弃这次修改并重新打开往往比绞尽脑汁撤销更快。写到最后说几句个人体会vi的学习曲线确实陡峭但它是少有的公平性工具你花两个小时背完模式换来的是后面十年不再怕任何无图形界面的服务器你花两周熟练文本对象和操作符组合换来的是双手在键盘上即使不用鼠标也能指点江山。我在实际使用中最大的感受是vi最难的不是命令多而是思维模式的转换。一旦你接受了键盘就是一切这个前提习惯了操作符与动作的语法后面的路会越走越宽。最后再分享一个小技巧每天逼自己用一回vi做点日常琐事比如用vim写日志、改配置文件、编辑脚本坚持两周你就把这套操作模型焊在肌肉记忆里了远比一次性啃完所有教程有效得多。
阅读完成 · 觉得有帮助?