你是不是也经历过这种场面:只是想去服务器上改个配置文件,用 vim 打开之后手一滑按了个i,屏幕上突然出现-- INSERT --,然后就彻底懵了。按方向键结果是 ABC,敲回车也没反应,Ctrl+C 也不管用,窗口关掉重登之后发现有进程还在卡着。这时候在浏览器里打下“Linux怎么退出编辑模式”的人,十有八九都是被 vi/vim 这个老古董给按在地上摩擦了。
这篇文章就把这件事彻底讲透。不管你是刚接触 Linux 的新手,还是偶尔登录服务器改配置的运维、开发,看完以后至少不会再被“编辑器退不出去”这个问题卡住。核心就一句话:先按 Esc 退到普通模式,再输入:q、:wq或:q!回车。但这句话背后牵扯出来的坑特别多,我下面一个个拆开说,保证你以后看到 vi/vim 不会再慌。
1. 为什么“退不出去”?先搞懂 vi/vim 的模式到底是怎么回事
很多教程上来就丢命令,告诉你按 Esc、按冒号、按 q,但没解释为什么。结果新手就会遇到更尴尬的情况:按了 Esc 没反应,输了:q屏幕上还在跳字母。问题就出在,你根本不知道 vi/vim 是个“多模式”编辑器——它和 Windows 上的记事本完全是两种逻辑。
1.1 三种模式,不是只有“编辑”和“非编辑”
vi/vim 一共分三种主要模式:
- 普通模式(Normal mode):启动 vim 后默认就处于这个模式。在这个模式下,你按的
i、a、o是进入编辑状态的命令,按:是输入退出和保存命令的入口,按dd是删除整行,按x是删除光标所在字符。这里面的字母几乎不会直接作为文本输入到文件里。 - 插入模式(Insert mode):屏幕上出现
-- INSERT --的提示,就是进入了这个模式。此时你就是在一个“正常的文本编辑器”里输入内容,按什么字母屏幕上就会出现什么字母。这个模式通常就是大家口中的“编辑模式”。 - 底线命令模式(Command-line mode):按了冒号(英文冒号
:)才会进入。此时屏幕最底部会出现一个冒号等待你输入命令,最常见的:wq、:q!、:w都是在这里输入的。
很多新手说的“怎么退出编辑模式”,其实精确一点应该是“怎么退出插入模式,回到普通模式”。这个操作非常简单:按一下 Esc 键。
但为什么很多人按了 Esc 还是没反应?大概率是因为你按 Esc 之前,输入法还停在中文状态,或者你按的是全角字符,甚至你按了好几下 Esc 后,Vim 底部出现了至少按下一次 Esc的提示,结果你还在继续按——这些细节我放到后面第 4 节专门讲。
1.2 一个类比:它更像是一个“键盘被锁定”的游戏
你可以把 vim 想象成一个角色扮演游戏,普通模式就是“待机状态”,你按i就相当于走了个“交互对话”选项,进入插入模式后所有按键都变成了讲话内容。而Esc 就是退出这个对话的快捷键,回到待机状态你才能输入真正的指令。
这个类比虽然糙,但是特别管用。一旦你理解了“模式”这个概念,就不会在插入模式下傻乎乎地敲:q了——因为你敲出来的只是普通文本字符,它不会执行任何命令。
另一个容易混淆的点是:按下 Esc 只是退出了“编辑模式”,但并没有退出 vim。就像你打完字按了回车,光标换行了,但你的文档还开着。这个时候屏幕底部没有冒号提示,你以为已经“退出到命令行”了,其实并不是。真正退出 vim 还需要第二步——输入冒号命令。
1.3 分清三句话:退出编辑、退出编辑器、保存退出
- 退出编辑模式:按 Esc 回到普通模式。
- 退出编辑器不保存:在普通模式下输入
:q!回车。 - 退出编辑器并保存:在普通模式下输入
:wq回车。
这三句话如果你能一眼分清,Linux 面试里被问到“如何退出 vi 编辑器”时基本稳了。面试官要是再深入一点,问“q和q!有什么区别”,你能顺便答出“q只允许在未修改文件时退出,修改了会提示 E37,而q!会强制丢弃修改退出”,那就是加分项。
2. 退出命令一表流:分清保存还是不保存
很多人背不住命令的原因是不知道每个命令背后对应什么场景。我把最常用的一组命令整理成一个表格,你可以把它当成速查卡收藏起来。
| 命令 | 英文全拼 | 作用 | 什么时候用 |
|---|---|---|---|
:q | quit | 退出,不保存,但如果有未保存的修改会失败 | 只是打开看了几行,没动过内容 |
:q! | quit 加叹号 | 强制退出,不保存修改 | 改坏了想放弃,直接走人 |
:wq | write then quit | 保存并退出 | 改完配置,确认无误后退出 |
:wq! | write then quit 强制 | 强制保存并退出 | 文件只读,但你有权限覆盖时用 |
:x | exit | 保存并退出,等价于:wq | 强迫症想少按一个键 |
ZZ | 大写双Z | 保存并退出,不用冒号 | 修改完直接连续按两个大写 Z |
你会发现,核心其实就是q和w的组合。w是写(write)文件,q是退出(quit),合起来就是“写完了再退”。感叹号就是“强制”的意思,当 vim 发现你有未保存的修改,普通:q会拒绝执行,此时要么:wq保存后离开,要么:q!放弃修改后离开。
2.1 为什么你的:q输入了却没反应?
我见过不少人卡在这里:明明在普通模式下按了:,屏幕底部也出现了冒号,输入了q,也按了回车,但 vim 纹丝不动,甚至底部跳出来一句英文提示。这种情况通常有三个原因:
第一,冒号是中文冒号:。很多人在中文输入法状态下按了 Shift+分号 键,出来的其实是全角冒号,vim 根本认不出来。解决办法是先把输入法切到英文,或者直接观察屏幕底部是否出现半角冒号。
第二,你按了:q但屏幕底部其实显示的是:q!或者:quit之类的输入错误。这种情况多发生在键盘不太灵敏或你连着按了好几次 q。
第三,也是最高频的一个:你并没有真正处在普通模式。如果你按 Esc 后没有仔细看屏幕,可能你其实还停留在插入模式,这时候你输入的:q会被当成普通文本写进文件里。所以无论如何,输入冒号命令之前,先看一眼左下角是不是没有-- INSERT --字样。
2.2 vim 里按 Esc 的替代方案
有些人的键盘 Esc 距离很远,或者在某些终端工具里 Esc 会被特殊按键映射吃掉,按了没反应。这里有三个替代方案,你可以选一个练成肌肉记忆:
- 按
Ctrl + [:这个组合键和 Esc 是同一个功能键码,几乎在所有终端里都有效。 - 按
Ctrl + C:也能从插入模式退回到普通模式,虽然它本来是用来终止命令的,但 vim 同样支持。 - 在 vim 配置文件里把
jj映射成 Esc:在~/.vimrc里加一行inoremap jj <Esc>,之后在插入模式连按两下 j 就能退出,很多习惯了盲打的人会这么干。
不过我个人建议你别太依赖映射,因为到了别人的服务器上,人家不一定有这套配置。老老实实练熟Ctrl + [和 Esc 就够了。
2.3 区分 vi、vim、nano、less 的退出方式
Linux 下常见的文本查看编辑工具非常多,不少新手会把它们记混。尤其是less这个分页查看命令,它的退出方式是直接按q键,而且不需要冒号。如果你用less读日志,读完之后按q就回命令行,这和老朋友 vi/vim 完全不一样。
nano编辑器的退出方式则是Ctrl + X,如果文件有修改,它会问你要不要保存,输入 Y 后回车即可。由于 nano 的提示栏一直显示在屏幕底部,对新手极其友好,很多 Linux 发行版默认会给纯新手配上 nano 而不是 vim。
这就引出一个很实用的判断标准:你打开文件用的命令是什么,退出方法就跟着那个命令走。别在less里试着输入:q,也别在vim里直接按个q幻想它退出——前者是花式报错,后者可能只是把光标移动命令按了一遍。
3. 真实场景实操:改配置、提交代码、计划任务里的退出姿势
纸上谈兵没用,真正让你卡住的往往不是单独打开一个文件,而是某些程序自动调起了 vim。这一节我挑三个最常见的真实工作场景,按步骤走一遍。
3.1 场景一:vim 修改服务器配置文件后保存退出
假设你正在修改 Nginx 的配置:
vim /etc/nginx/nginx.conf你查看文件内容时觉得需要加个参数,于是按i进入插入模式,光标移动到最后一行,把配置加好。接下来想退出:
- 按
Esc,确保左下角没有-- INSERT --。 - 输入
:wq,回车。 - 看到文件名、行数和字节数的提示,回到命令行。
这里有一个容易踩的坑:如果你没改过文件,只是想退出查看,就干净利落输入:q回车。有些人习惯性输入:wq,导致修改时间和文件内容被无意义地刷新了一遍,虽然大多数时候没影响,但如果你检查文件修改记录,就会看到一堆你明明没改过的文件被“动”了一下。
顺便说个稍微进阶的校验习惯:改完 Nginx 配置后,千万别立刻退出完就完事。正确做法是先在 vim 外做语法检查,比如nginx -t,确认无误后再执行systemctl reload nginx。如果检查直接报错,你还能快速回到 vim 里按:q!把没验证的改动丢弃。
3.2 场景二:crontab -e 和 git commit 里的 vim
这两个命令在几乎没有预兆的情况下把 vim 弹出来,第一次遇到的新人基本都懵。
crontab -e是在编辑当前用户的计划任务表。它默认用的可能是 vi,也可能是 vim,取决于系统配置。编辑完计划任务后,按 Esc,然后:wq保存退出。如果退出时看到类似crontab: installing new crontab的提示,说明写入成功。如果你发现自己加错行了,不打算保存,那就:q!强制退出。
git commit打开 vim 让你写提交信息。很多新手在这里慌,是因为写完提交信息后不知道怎样退出。其实流程一样:按 Esc,然后输入:wq。如果你连提交信息都懒得写,想直接取消这次提交,就输入:q!。顺便提一句,如果提交信息里带着中文,Windows 下 Git Bash 打开 vim 时输入法可能会有一堆兼容问题,这种情况建议直接使用git commit -m "xxx"绕过交互式编辑器,省心省力。
3.3 场景三:只读文件如何退出
用 vim 打开系统配置文件后,有时候你根本没写权限。此时如果直接输入:wq,底部会提示:
E45: 'readonly' option is set (add ! to override)翻译过来就是:文件是只读权限,如果要强制覆盖请加感叹号。
但这里要特别注意——在确认你没有写权限之前,不要随便用:wq!。如果你是用普通用户tom打开/etc/nginx/nginx.conf,这个文件对你来说就是只读,敲:wq!大概率会提示“无法打开文件来写入”之类的错误,因为系统层面的权限是拦得死死的,vim 内部那点强制标记根本不管用。
如果只想退出不保存,直接:q!就行。如果一定要保存,建议退出后用sudo vim /etc/nginx/nginx.conf重新打开,再进行修改。网上有个终极写法:w !sudo tee %,能让你在普通用户打开 vim 时以 sudo 权限直接写文件,效果很炫,但新手阶段不建议依赖这个,还是老老实实学权限基本操作更靠谱。
4. 常见问题与排查技巧实录
按了 Esc 没反应、退出时提示一堆英文、甚至整个终端都像卡死了一样……这些场景我都遇见过,下面列一份实战排错清单。
4.1 按 Esc 没有反应,或者屏幕上还在冒字母
先不要急着砸键盘,按这个顺序排查:
- 看输入法状态。如果你处于中文输入法,按 Esc 不一定能触发 vim 的响应,尤其是按下后输入法仍处于中文模式,后续冒号命令也会变成全角符号。先切到英文再操作。
- 确认当前窗口是否聚焦到终端。尤其在虚拟机(VMware、VirtualBox)里,鼠标焦点可能还在虚拟机窗口外,此时你按什么键都到不了 vim。点击终端窗口内部,再按 Esc。
- 检查终端是否被 Ctrl+S 锁住了。Linux 终端里按
Ctrl+S会暂停屏幕输出,看起来像卡死,实际程序还在后台跑。此时按Ctrl+Q解锁即可。这个坑我在教学生时碰到过好几次,很多人以为自己把系统弄死机了。 - 区分你是不是按了 Ctrl+Z。如果按了 Ctrl+Z,vim 会被挂到后台,看起来像是突然“消失”了。你确实退出了编辑器,但其实是切到了 shell,vim 进程还在后台暂停。输入
fg回车就能回到刚才的 vim 画面,输入jobs可以看到挂起的任务列表。
4.2 退出时提示 E37、E45 怎么处理
vim 的错误提示虽然看起来唬人,但翻译成人话后就那么几种:
| 提示 | 含义 | 处理方式 |
|---|---|---|
E32: No file name | 你打开的是个新文件但没起名字,例如vim直接启动 | 用:w 文件名先保存,再:q |
E37: No write since last change | 文件有修改但没保存,q退出被拒绝 | :q!丢弃修改退出,或者:wq保存退出 |
E45: 'readonly' option is set | vim 层把文件标记为只读 | 加感叹号强制覆盖,或者确认权限没写错后退出 |
E212: Can't open file for writing | 文件系统权限不让你写 | 退出后用 sudo 重新打开,或切换目录所有者 |
遇到带E开头的编号,不要慌,vim 底部一般会给出进一步提示。我习惯的做法是:先什么都不用做,用键盘清掉这个提示信息,再决定走哪条命令。清提示很简单,按一下回车,或者按两次 Esc。
4.3 误闯了 ex 模式、图形模式怎么办
有些人在普通模式下不小心按了大写Q,会进入 vim 的 Ex 模式。这个模式看起来就像是能连续输入命令的管道,屏幕底部一直提示:,输入visual回车才能回到正常的 vim 界面。很多人在这个状态下输了一堆q、w,以为编辑器坏了,其实就是切换到了另一种命令模式。
另外一个是 Vim 的 GUI 模式,只有在很少数的发行版图形界面下才会出现。遇到这种界面,退出方式往往也是输入:q!或者直接点窗口关闭按钮。
4.4 下次打开文件提示 swap 文件存在怎么办
退出不当的另一个坑是 swap 文件残留。比如你用 vim 编辑nginx.conf,突然断电、终端断开,或者编辑器被强杀,下次再打开这个文件,vim 会提示:
Found a swap file by the name ".nginx.conf.swp"这其实是 vim 的自动保护机制,它很严谨地告诉你:上次编辑可能没正常结束,你确定要继续吗?如果只是误操作,没有其他进程占用文件,你确认当前没有人编辑后,按D删除 swap 文件再打开即可。如果确实有另一个 vim 进程在编辑同一个文件,那就先切过去正常退出那个进程,再回到当前终端。看到 swap 提示时千万不要顺手把.swp文件删了,先搞清楚是不是你自己的残留,以免把别人正在编辑的内容搞乱。
5. 几条让你彻底告别“编辑器退不出去”的实操建议
前面讲得比较细,这一节我总结成几条能长期用的习惯,你照着做,基本不会再被这种问题卡住。
5.1 养成看底部状态栏的习惯
vim 的左下角不是摆设。进入插入模式会显示-- INSERT --,普通模式默认什么都不显示或显示文件名。当你不知道自己在哪个模式时,低下头看一眼,比闭着眼睛乱按强一百倍。如果你看到-- INSERT --说明还在编辑模式,按一次 Esc;如果底部出现冒号并且后面有光标闪烁,说明在输入命令,这时再输入q或wq回车。
5.2 花二十分钟把 vim 的基础操作过一遍
很多发行版都自带一个交互式学习工具,叫vimtutor,直接在终端输入:
vimtutor它会用半小时左右带你走一遍移动光标、删除、插入、查找、退出这些常用操作。我见过太多人“会用 vim 改几行配置就满足”,等真的要在服务器上写脚本时又一头雾水。其实 vim 的学习曲线远没有网上说的那么陡,你只需要掌握Esc、i、dd、:wq、:q!这几个,就已经能覆盖日常 90% 的编辑需求了。剩下的,边用边查。
5.3 给终端设置“安全的默认编辑器”
如果你实在不习惯 vim,又特别容易被crontab -e这种命令直接拉进 vim,你可以临时把默认编辑器改成 nano。不需要换系统,只需要在 shell 配置文件里设置:
export EDITOR=nano这样执行crontab -e时就会调用 nano,而不是 vi。但这里我想提醒一句,别急着逃离 vim。在绝大多数 Linux 服务器环境里,vim 是缺省必装的,nano 未必有,你切到 nano 之后到另一台机器上又抓瞎。更好的态度是,直接用我上面说的方式把 vim 的基本操作磨熟,去哪台服务器都不怕。
5.4 实在搞不定时的底线操作
如果有一天你真的被一个 vim 会话卡住了,而且手头事情特别急,最暴力的退法就是关掉这个终端窗口,或者杀掉进程。但要处理善后:
- 如果你只是查看文件,没有改动,直接关窗口没问题。
- 如果你改了文件但没保存,关窗口也没关系,因为 vim 没有自动保存机制,你的修改不会生效,最多留下一个 swap 文件。
- 如果你想保存但 vim 卡死了,可以先去另一个终端执行
ps aux | grep vim找到进程,然后kill 进程号强制结束。下次打开时按提示消除 swap 文件即可。
这个方法虽然能解燃眉之急,但属于“最后手段”,不要当成常规操作。稍微冷静一下,按 Esc、按:、按q!,往往几秒钟就解决了。
写在最后
我遇到过太多因为“退出不了 vim”而对 Linux 产生恐惧心理的朋友。其实这个问题和 Linux 本身的强大与否没有关系,纯粹是 vi/vim 这个特殊的模式设计与我们的使用习惯不同。只要你理解了“普通模式、插入模式、底线命令模式”这三者之间的切换关系,再把:q、:q!、:wq这三条命令烂熟于心,基本上就告别了这个烦恼。
根据我个人的经验,真正想把 Linux 用顺手,先别急着背几百条常用命令,花半小时解决掉“编辑器退出”这种让人抓狂的基础问题,往往比啥都管用。以后不管是面试题里被问到“vi 如何保存退出”,还是日常在服务器上改配置,你都能淡定地按两下 Esc,然后潇洒地敲出:wq回车。最后再多啰嗦一句:在 vi/vim 里没事不要乱按Ctrl+Z,那只是把编辑器挂到后台,并不是真正退出。遇到界面没反应时,先输入fg试试,别急着开新终端重建整个环境。