
1. 从“怎么退出vi”这个世纪难题说起为什么它值得花时间学如果你用过Linux大概率听说过这个梗“vi编辑器怎么退出”甚至有人调侃Linux新手的第一课不是hello world而是如何在vi里活下来。我当年第一次在服务器上执行vi敲了几个字母发现退不出去直接按了CtrlZ把进程挂起然后对着屏幕愣了半天。这个经历我相信很多人都有过因为vi的命令方式和我们平时用的图形化编辑器完全不同它没有显眼的按钮没有菜单靠的全是键盘命令。先给没接触过的朋友解释一下vi是Linux系统里内置的一款文本编辑器几乎所有的Linux发行版都默认带着它。无论是改配置文件、写脚本还是临时编辑一段文本它都是运维和开发绕不开的工具。甚至在一些最小化安装的系统和容器里别的编辑器可能没有但vi一定在。这也是为什么每个搞Linux的人都必须学会它。这篇文章不打算写成一本vi的字典而是把我这些年实际使用vi的经验、踩过的坑、总结出的高频操作按照一个从入门到进阶的路径整理出来。我会把重点放在“为什么要这样做”上而不只是罗列命令。比如为什么vi要设计成三种模式它和常规编辑器的思维方式差在哪里日常运维中最常遇到的那几个操作到底该怎么组合。不管你是刚接触Linux的新手还是已经能熟练敲命令但每次用vi都心里没底的人这篇文章都值得你花十几分钟读一遍。看完之后你会发现在终端里编辑文件这件事其实比想象中简单而且一旦习惯了这个编辑器的逻辑效率真的会提升不少。1.1 都2025年了vi为什么还没退休很多人会问现在都有VS Code、Sublime、各种云编辑器了为什么还要学vi这个问题我在带新人时经常被问到。我的回答是vi的地位不是靠“新”维持的而是靠“无处不在”和“稳定”。你在本地有图形界面当然可以用现代编辑器但当你SSH登录一台远程服务器、进入一个没有图形界面的纯命令行环境时vi就是你的救命稻草。救援模式、Docker容器、嵌入式设备这些场景图形化工具根本装不进去而vi是POSIX标准的一部分基本是系统自带的。哪怕是Vimvi的加强版没被安装系统里通常也有原生的vi。另外vi经过了四十多年的检验它的稳定性是经过无数服务器环境验证过的。我见过不少同事在服务器上改nginx配置、改crontab任务用的都是vi。因为对于一个只需要改几行文件的场景打开一个几百兆的IDE反而臃肿vi轻量、快、随手就能用。1.2 绝大多数新手真正卡住的地方新手用vi最常见的困惑不是不知道该按哪个键而是不知道“当前处于什么状态”。这个问题其实和vi底层设计的“模式”概念有关我后面会专门展开讲。这里先说一个现象很多新手进入vi后看到屏幕底部没有任何提示就以为可以像Windows里的记事本一样直接打字结果敲出来的字母被当成命令执行屏幕上出现一串奇怪的输出然后就更退不出来了。我在网上看到的热搜词里“退出vi编辑模式”这个关键词热度很高这也从侧面说明这个问题非常普遍。其实vi的退出逻辑并不复杂核心就几条输入:进入末行模式然后根据要不要保存来决定是wq还是q!。但前提是你要明白自己现在处于哪种模式如果搞混了按什么键都没反应或者总是误操作。1.3 学vi的正确姿势先建模型再记命令我见过太多人学vi就是死记硬背命令今天记住dd删除一行明天忘记yy复制一行过两周全部还回去。这不是记忆力的问题而是没有建立一个心智模型。vi的设计核心是“模式”和“命令组合”。你先理解它有几个模式每个模式能干什么模式之间怎么切换然后才是具体命令。一旦模型建立了很多操作可以自己推导出来哪怕偶尔记不住细节逻辑也是通的。所以我强烈建议你读这篇文章时先把第二章吃透后面的操作都是在这个模型上叠加的。2. 三种模式是vi的灵魂理解了这个命令就不靠背了vi和绝大多数现代编辑器的最大区别就是它的“模式驱动”设计。很多人觉得vi难学本质上是因为没有从这个角度去理解它。我直接说结论vi有三种模式——命令模式、插入模式、末行模式。你当前处于哪个模式决定了键盘上的按键会被解释成什么。2.1 三种模式与状态流转命令模式这是vi启动后默认所在的模式。在这个模式下键盘上的每个字母都可能是一个命令。比如j是向下移动光标k是向上移动dd是删除一行yy是复制一行。在这个模式下输入字母不会出现在屏幕上而是直接执行操作。插入模式在这个模式下你敲入的所有字符都会作为文本内容写入文件和你在普通编辑器里打字没什么区别。要进入插入模式通常按i、a、o等字母键。末行模式也叫命令栏模式按:进入屏幕最下方会出现一个冒号等待输入。在这个模式下可以执行保存文件、退出编辑器、全局替换等扩展指令比如:wq表示保存并退出:30表示跳到第30行。模式的切换逻辑可以这样理解启动vi后先进入命令模式你需要编辑内容时按i进入插入模式改完按Esc回到命令模式再按:进入末行模式输入退出或保存指令。整个流程就像一条流水线状态之间来回流转。2.2 模式切换的高频误区和解决思路我自己用vi这么多年见过最多的问题就是“不知道现在在哪个模式”。比如屏幕上没有显示任何提示新手按了一堆字母出现乱码之后就更慌了。这里分享一个我验证过很好用的办法任何时候不确定自己在哪个模式时先按几下Esc。Esc的作用是回到命令模式而且多按几次没有任何副作用。它就像是一个“回到原点”的保险按钮。如果你按了Esc之后听到蜂鸣声或者屏幕闪了一下说明之前确实处于插入模式。另一个常用组合是CtrlC在vi里也能中断当前操作返回命令模式。它比Esc在某些终端上更灵敏尤其是当你用SSH连接远程服务器、网络有点延迟时Esc偶尔会被吃掉CtrlC更可靠一些。但要注意有些终端软件的CtrlC会被会话管理器拦截所以还是以Esc为主。2.3 插入模式的多重入口与场景选择进入插入模式并不只有一种方式不同按键进入时光标的位置不一样。我做个简单对比按键进入插入模式后光标位置典型使用场景i当前字符之前普通插入用得最多a当前字符之后想在某个字符后面追加内容I当前行的行首在行首快速插入A当前行的行尾在行尾追加内容很常用o在当前行下方新建一行进入编辑直接在下面开新行写内容O在当前行上方新建一行进入编辑在上面开新行举个例子你打开一个配置文件光标的某个参数值中间需要追加内容按i或者a的差别就在于是向前还是向后插入。如果你想把整行的结尾补上分号按A最方便不用手动把光标移到行尾。理解了这些入口你会发现vi的编辑效率其实很高——因为很多操作是“光标本就在那个位置按一个键直接开写”不需要像记事本那样先移动光标再点一下。3. 高频操作实战把增删改查做到肌肉记忆模式理解了接下来就是真刀真枪的操作。这一章我按使用频率来组织先看书移动再讲编辑、删除、复制粘贴和查找替换。这些都是日常运维中用得最多的操作我会尽量给出使用场景方便你对应到实际工作中。3.1 光标移动比方向键快十倍的姿势命令模式下方向键其实也能移动光标但既然用vi就要适应它的“无方向键”哲学。这不仅是历史习惯问题更是效率问题——手不用离开主键盘区操作就快一步。基础的移动键是h、j、k、l分别对应左、下、上、右。刚接触时可能觉得别扭但配合“单词”级别的移动会非常高效w跳到下一个单词的开头b跳回上一个单词的开头e跳到当前单词的结尾这三个键比我见过效率提升最明显的操作。比如你想把一行里的某个参数从timeout改成time_out按b回到单词开头再按i进入插入模式修改整个过程一气呵成比按住方向键移动快很多。行内的快速定位也很重要。0跳到行首$跳到行尾^跳到行首第一个非空字符。我经常用$到行尾补分号或者逗号尤其是改配置文件时特别常用。整篇文件级别的移动gg跳到文件第一行G跳到文件最后一行nG跳到第n行。比如你改nginx.conf只想看第50行直接输入50G光标瞬间到位。还有一个高频操作是“按行号定位”在命令模式下输入数字然后按G。比如日志报错说第120行附近的配置有问题你就可以用120G跳过去。这个操作在面试题里也经常出现常见的问法是“怎么跳到第100行”答案就是100G。3.2 编辑、删除与撤销原子操作组合拳vi的编辑命令有个特点——“动作加范围”。你删除的对象可以是一个字符、一个单词、一行甚至一段语法都是按键组合。删除方面的核心命令x删除光标所在的一个字符相当于剪刀dd删除当前整行dw删除从光标到下一个单词开头的内容d0删除从光标到行首的内容d$删除从光标到行尾的内容ndd删除从当前行往下数n行我实际工作中用得最多的是dd和d$。比如清理配置文件里不需要的参数行直接dd如果只想清掉某一行末尾的注释就按d$保留行首的内容。撤销和重做是一对好兄弟命令模式下按u撤销上一步操作按CtrlR重做。这个组合可以说是最常用也是最救命的一个尤其你刚删错了一整行文件时u会让你瞬间回到删除前的状态。我建议所有读者立刻把这个习惯刻进肌肉记忆。3.3 复制粘贴从单行到跨文件vi里的复制粘贴和Windows的习惯不一样它不依赖鼠标全部在键盘上完成。yy复制当前行nyy复制从当前行往下数n行p在光标下方粘贴P在光标上方粘贴有一个比较反直觉的点vi的“剪切”和“删除”共用一批命令dd删除的内容其实已经保存在寄存器里你删除之后再用p粘贴效果等同于“剪切粘贴”。所以当你需要移动某一行业时直接dd把行删掉然后移动到目标位置按p内容就出现在那里。跨文件复制粘贴也很常见。比如你在file1里复制了某段配置想粘贴到file2里方法是在file1里按yy复制然后退出时不要关闭vi用:e file2切换文件再按p粘贴。如果你需要同时看两个文件也可以用:sp file2进行水平分屏窗口之间用CtrlW加方向键切换。3.4 查找与替换从关键词到正则表达式查找是重中之重。命令模式下按/输入关键词再回车光标就会跳到第一个匹配的位置然后按n跳到下一个匹配按N跳到上一个。要取消高亮可以用:nohlsearch。替换则依赖末行模式的:s命令。它有三种典型用法命令作用示例:s/old/new/只替换当前行第一个匹配:s/hello/hi/:s/old/new/g替换当前行所有匹配:s/hello/hi/g:%s/old/new/g替换整个文件所有匹配%表示全文:%s/hello/hi/g:%s/old/new/gc全局替换但每次询问确认:%s/hello/hi/gc我强烈建议你在做批量替换时先加c参数确认。尤其是改线上配置文件时一个不小心把不该替换的内容也换了后果可能很严重。我记得有一次在改prometheus配置时本来只想替换一个旧端口结果没加c把所有出现该字段的地方全改了幸好及时发现用u撤销。从那以后我做全局替换前一定会先确认一次。正则表达式在vi替换里也能用比如:%s/^#//g可以去掉每行开头的注释符号#这个操作在批量放开被注释的配置项时非常有用。4. 退出vi编辑模式保存、放弃、断电与恢复的全套排错指南既然“怎么退出vi”是很多人搜索的高频词我就专门用一章来把这个场景讲透。这里不仅要讲正常怎么退出还要讲各种异常情况下怎么救回来。4.1 常规退出的几种选择和取舍退出vi的前提是先按Esc回到命令模式然后按:进入末行模式输入退出相关的指令。我把它们整理成一个表格方便查阅命令作用使用场景:q退出但如果有未保存修改会拒绝执行没改过文件直接退出:q!强制退出放弃所有修改改乱了又不想保存直接不保存退出:wq保存修改并退出最常见的操作保存并退出:x与wq基本等价写入并退出习惯用法和wq没实质区别ZZ保存并退出小写z大写Z命令模式直接保存退出不用按冒号ZQ不保存强制退出等价于:q!但更快这几个命令中我日常用得最多的是:wq。如果你是在修改系统配置改完之后建议先用:w保存再确认一下命令是否正确最后:q退出。不要总是一上来就:wq万一手滑打错命令可能还会误写内容。有些人喜欢用ZZ因为它不用输入冒号手不用从主键盘区移开。我自己在改完文件时也经常用这个快捷键速度快而且一紧张也不会按错。如果你是新手我更建议先记住:wq和:q!这两个核心命令其他的都是体验优化。4.2 E37、交换文件和异常退出后的恢复如果你修改了文件但没有保存输入:q回车vi会提示E37: No write since last change意思是有修改未保存。此时要么保存后退出要么强制退出。没有第三种结果。还有一个更麻烦的情况文件被异常退出后比如SSH断线、终端被强杀当下次再打开同一个文件时vi会提示发现了一个交换文件swap file。这个文件以filename.swp的形式存在作用是记录编辑中间状态。我遇到这种情况时的处理逻辑是先查看交换文件的时间戳判断它是否保存了你想要的修改。如果交换文件里的内容我确实需要就在vi里按:recover恢复如果不需要就删掉它。交换文件的位置通常在同一个目录下也可以用ls -a查看。删除交换文件的命令是:q!退出后执行vi filename提示你选择。在现实操作中这一步最常见的坑是开了多个vi实例编辑同一个文件第二个实例打开时提示交换文件已存在然后有人直接乱按导致文件内容被覆盖。正确做法是先确认没有其他vi进程正在编辑再决定是否处理交换文件。4.3 终端断开、CtrlZ挂起和误操作救援很多人在服务器上通过SSH编辑文件网络一断就直接傻眼。我经历过的最惊险的一次是一个线上配置文件已经改到一半SSH突然断了。重新连上后发现vi进程还在后台运行交换文件还在我重新打开时提示恢复按:recover之后之前没保存的内容全部回来了。这个功能在断网场景下真的救过我好几次。还有一种情况比断网更常见按了CtrlZ。很多新手在vi里乱按时会按到CtrlZ这个操作会把vi进程挂起到后台看起来像是“卡住了”实际编辑器并没有真正退出。此时你回到shell提示符输入fg就能把vi恢复到前台继续编辑而输入jobs可以查看当前挂起的任务列表。需要注意的是如果不知道这个机理很多人会误以为vi彻底卡死然后直接关闭终端那样pid进程会残留交换文件也会留下带来后续的恢复问题。所以哪怕你记住了怎么退出也应该了解CtrlZ不是退出只是挂起。4.4 让保存退出更顺手的几个配置老实说默认的vi有些行为确实对新手不太友好比如没有显示行号、没有语法高亮。这里我建议你编辑自己的用户配置文件~/.vimrc如果是vim来优化体验。以下是我自己常用的一组基础配置set number set tabstop4 set shiftwidth4 set expandtab syntax on set hlsearch set incsearch set autoindent这些配置的作用分别是显示行号、设置tab为4个空格宽度、缩进宽度为4、将tab转换为空格、开启语法高亮、搜索高亮、搜索时实时预览、自动缩进。配置完以后退出vi时会舒服很多。尤其是set number这一条改完文件想快速定位不用在心里数行数了。另外如果你经常编辑配置文件建议在~/.bashrc里加一个别名alias vivim这样终端里输入vi实际打开的是vim体验会好很多。不过要注意系统自带的vi本身也很稳定在救援模式下可能只有原生vi所以基础操作还是要学扎实。5. 把vi放进Linux日常配置文件、用户管理与运维协作战vi从来不是孤立存在的工具它是要嵌进整个Linux工作流里的。这一章我结合日常运维中最常见的场景讲讲vi怎么跟其他命令配合起来干活以及修改各类系统文件时的注意事项。5.1 先用查看命令侦察再动手编辑很多人一上来就vi打开文件但其实有时候你只想快速看一眼内容完全不需要进入编辑器。先用普通命令侦察再决定要不要编辑可以省下很多不必要的操作。查看内容有三件套cat直接输出全文、grep按关键词过滤、head/tail看开头/结尾。比如你想确认/etc/nginx/nginx.conf里worker_processes的值改成什么了直接grep worker /etc/nginx/nginx.conf就能看到完全不用打开vi。当你确定要修改时才进入vi这样做的原因是vi是“有状态的编辑”进去之后如果忘记退出会带来后续问题。在运维中尽量让“读”和“写”的边界清晰一些读用命令写用vi效率和安全都更高。5.2 用户管理场景vi编辑passwd相关文件的姿势Linux用户管理和vi的关系非常紧密。比如新建用户之后你想修改用户的默认shell、家目录、密码过期时间等信息就需要直接编辑/etc/passwd、/etc/shadow、/etc/group这些文件。但这里我要特别提醒你不要用vi手动去编辑/etc/passwd和/etc/shadow。这两个文件的格式非常严格稍有写错就可能导致用户无法登录甚至系统无法验证身份。正确的方式是用专门的命令useradd、usermod、passwd、chage等。这些命令内部会正确处理文件格式和权限问题。vi真正适合直编的场景反而是那些格式相对宽松的配置文件。比如修改/etc/sudoers注意也不要用vi直接编辑而是使用visudo命令——这其实是vi的安全封装它会在你编辑时检查语法避免因为写错导致sudo权限全部失效。5.3 权限不够怎么办sudo、visudo与只读文件如果你打开一个只有root权限才能编辑的文件普通用户会看到只读提示。此时有两种做法一种是用sudo vi /path/to/file直接以root权限打开编辑。这是最快的办法但也要小心因为你有完整权限后误操作修复的难度更大。另一种是修改文件权限后用普通用户编辑但一般不建议这样做因为系统关键文件不应该随便改成普通用户可写。比如我之前在一台服务器上误把/etc/shadow的权限改成了普通用户可写结果安全审计时被标记了风险。这个错误提醒我权限设置的边界要清晰不要因为方便而牺牲安全。如果只是临时编辑一下推荐的结构是sudo vi /etc/systemd/system/myapp.service编辑完后记得检查一下语法或格式是否正确。改完系统服务配置后一般还需要重载配置比如systemctl daemon-reload。5.4 与Git、crontab等工具的协作vi还经常作为其他命令的默认编辑器自动弹出。最常见的场景是git commit当你执行提交命令而没有用-m参数时Git会打开vi让你写提交信息。如果此时不知道怎么保存退出就会卡在git提交的界面里。同样地crontab -e也会打开一个vi编辑界面这里是让你编辑当前用户的定时任务。很多人第一次编辑crontab时不知道保存退出也是用vi的基本功。这种场景下的使用套路是一致的进入vi以后按i进入插入模式写内容写完之后按Esc回到命令模式输入:wq保存并退出。如果你写提交信息时只写了标题Git会提示是否保留当前为空的内容这时直接:q退出可能取消提交所以还是应该先写内容再:wq。6. 从vi到vim的进阶路线图配置、插件与面试考点很多人在习惯了vi之后会自然地转向vim。这里我就把vi和vim的关系讲清楚再给出一份够用的配置方案最后聊聊面试里常出现的考点。6.1 vi与vim有什么不同vim是“Vi IMproved”的缩写是vi的增强版。它在兼容所有vi基础操作的前提下增加了语法高亮、多级撤销、插件系统、可视化选择、多标签页等功能。现在的Linux发行版里你输入vi可能打开的就是vim个别系统会用vim.tiny这种裁剪版。对我而言vim最大的增量在于“可配置性”。你可以定义快捷键、安装插件、定制主题让它变成一个适合自己工作习惯的编辑器。当然功能增强也意味着学习曲线更陡所以我的建议是先把vi的基础操作练熟再从vim的配置开始逐步扩展。6.2 一份够用不折腾的.vimrc网上关于vim配置的文章非常多很容易让人陷入折腾配置的泥潭。我的建议是循序渐进刚开始只需要基础配置后面根据实际需求再逐步添加。我推荐新手从这样一份简单配置开始set number syntax on set tabstop4 set shiftwidth4 set expandtab set autoindent set hlsearch set incsearch set nowrap解释一下几个关键项set nowrap可以让长行不自动折行编辑配置文件时能看清真正的换行位置set expandtab让tab键实际插入空格避免团队协作时因tab宽度不同出现格式混乱。等基础配置熟悉后可以试试插件。我建议新手先从最实用的装起比如vim-plug插件管理器后续所有插件的入口NERDTree文件资源树方便在文件之间切换vim-airline底部状态栏美化显示当前模式、文件名等fzf.vim模糊搜索文件非常高效不过我要提醒一句插件不要贪多每装一个都要确保自己真的用得上否则装一堆插件反而拖慢启动速度。6.3 面试和笔试里常见的vi考点Linux运维相关岗位的面试几乎都会问到vi的使用。我根据自己的面试和被面试经验总结几个高频考点vi有几种模式答案命令模式、插入模式、末行模式。如何保存退出答案:wq。如何不保存退出答案:q!。如何删除一行答案命令模式下按dd。如何跳转到文件第120行答案命令模式下输入120G。如何全局替换某个词答案:!%s/foo/bar/g注意不是!正确是:%s/foo/bar/g。如何撤销操作答案命令模式下按u。这几个问题如果你能脱口而出说明对vi的基础已经掌握得很扎实了。面试官关心的不仅是你会不会用而是你在实际工作中是否能快速定位和修改问题这其实是一个“工具熟练度”的信号。我个人的体会是vi这个工具最大的价值不在于它本身多高级而在于它让你真正融入Linux的命令行世界。你不再需要依赖图形界面来操作一台机器一个终端、一个编辑器就能完成绝大多数任务。这种能力恰恰是Linux运维、开发和嵌入式工作中最核心的底子。如果你现在已经打开终端不妨就练一下这几个操作打开一个文件复制两行删掉一行修改一个单词保存退出。整个过程控制在十秒内你就算真正入门了。