ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux下vim退不出编辑模式?一文彻底搞懂vi/vim保存退出技巧

Linux下vim退不出编辑模式?一文彻底搞懂vi/vim保存退出技巧 你是不是也经历过这种场面只是想去服务器上改个配置文件用 vim 打开之后手一滑按了个i屏幕上突然出现-- INSERT --然后就彻底懵了。按方向键结果是 ABC敲回车也没反应CtrlC 也不管用窗口关掉重登之后发现有进程还在卡着。这时候在浏览器里打下“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. 退出命令一表流分清保存还是不保存很多人背不住命令的原因是不知道每个命令背后对应什么场景。我把最常用的一组命令整理成一个表格你可以把它当成速查卡收藏起来。命令英文全拼作用什么时候用:qquit退出不保存但如果有未保存的修改会失败只是打开看了几行没动过内容:q!quit 加叹号强制退出不保存修改改坏了想放弃直接走人:wqwrite then quit保存并退出改完配置确认无误后退出:wq!write then quit 强制强制保存并退出文件只读但你有权限覆盖时用:xexit保存并退出等价于: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。检查终端是否被 CtrlS 锁住了。Linux 终端里按CtrlS会暂停屏幕输出看起来像卡死实际程序还在后台跑。此时按CtrlQ解锁即可。这个坑我在教学生时碰到过好几次很多人以为自己把系统弄死机了。区分你是不是按了 CtrlZ。如果按了 CtrlZvim 会被挂到后台看起来像是突然“消失”了。你确实退出了编辑器但其实是切到了 shellvim 进程还在后台暂停。输入fg回车就能回到刚才的 vim 画面输入jobs可以看到挂起的任务列表。4.2 退出时提示 E37、E45 怎么处理vim 的错误提示虽然看起来唬人但翻译成人话后就那么几种提示含义处理方式E32: No file name你打开的是个新文件但没起名字例如vim直接启动用:w 文件名先保存再:qE37: No write since last change文件有修改但没保存q退出被拒绝:q!丢弃修改退出或者:wq保存退出E45: readonly option is setvim 层把文件标记为只读加感叹号强制覆盖或者确认权限没写错后退出E212: Cant 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 EDITORnano这样执行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 里没事不要乱按CtrlZ那只是把编辑器挂到后台并不是真正退出。遇到界面没反应时先输入fg试试别急着开新终端重建整个环境。
返回列表