vi编辑器入门与进阶:模式切换、寄存器与宏全解析
1. 为什么绕不开viLinux世界里的“劝退第一课”vi不只是一个文本编辑器。对刚接触Linux的新手来说它是第一道必须迈过去、但看起来最反人性的门槛。我见过太多人第一次打开vi敲了几个字母发现屏幕完全没反应或者卡在某个状态里不知道怎么退出最后只能粗暴地关闭终端窗口。问题通常不在vi本身而在于你还在用Word或记事本的思维去操作一个Unix世界孕育出来的老派编辑器。vi诞生于1976年比现在很多读者的工龄都长。它到今天还活着是因为在服务器、容器、嵌入式设备这些没有图形界面的环境里vi几乎是系统默认自带的唯一可靠文本编辑工具。你可以在一台最小化安装的Linux服务器上找不到任何IDE但一定找得到vi。做运维要改配置文件、做开发要提交commit信息、排查问题要临时改脚本、面试时还可能被现场拷问——这些场景都会让你和vi正面相遇。这篇指南写给两类人一类是刚入门Linux、被vi的“反人类”操作搞得想放弃的新手另一类是已经会用几个命令但觉得自己只懂皮毛、想补齐移动、替换、寄存器、宏这些进阶能力的朋友。我会把命令背后的设计逻辑讲清楚而不是丢给你一张死记硬背的命令表——理解了规律记忆量至少减半。内容覆盖vi的三种模式与切换原理、高频编辑操作、无数人崩溃的“如何退出vi”、寄存器与宏的组合玩法以及vi和vim的关系。文中所有命令都是我在真实工作中敲过的没有一条是凑数的。2. vi的三模式设计把“记事本思维”换成“档位思维”2.1 三种模式各自的职责很多人的第一反应是为什么vi不能像记事本那样打开就能直接打字这得从它的诞生背景说起。vi诞生时终端键盘没有方向键没有HOME、END这类功能键屏幕刷新还特别慢。为了让手指不离开主键盘区就能完成所有操作设计者把操作分成两大类——编辑内容和操控内容然后用不同的模式来承载。这个设计很老但逻辑到今天依然合理。具体来说vi有三种模式命令模式Command Mode打开vi后的默认状态。在这个模式下键盘上几乎每个按键都是指令。比如h/j/k/l移动光标dd删除整行yy复制整行。插入模式Insert Mode按i、a或o进入。在这个模式下键盘恢复正常你输入什么就会显示什么跟记事本没区别。末行模式Last Line Mode按冒号:进入。屏幕底部会出现一个输入区域用来执行保存w、退出q、查找替换s、设置行号set nu这类控制命令。把三者想成一台手动挡汽车的档位就很好懂了命令模式是空挡用来做各种操控准备插入模式是D挡正常行驶打字末行模式相当于倒挡和手刹处理停靠退出和驻车保存。你不可能一直挂在D挡上做所有事vi也是这个道理。2.2 模式切换的底层逻辑与常见事故切换模式的核心按键其实只有几个必须形成肌肉记忆i在当前光标前插入inserta在当前光标后追加appendo在当前行下方新开一行并进入插入模式Esc从插入模式或末行模式返回命令模式新手事故几乎都发生在插入模式里。在插入模式下输入dd屏幕上就真的会出现两个字母dd而不是删掉一行。更糟的是如果终端键盘映射没配好按方向键会输入A、B、C、D这样的乱码——因为在vi眼里方向键的转义序列就是几个普通字符。遇到这种情况别慌连按两下Esc回到命令模式再用u撤销那些乱码瞬间恢复正常。还有一个高频事故是按了:进入末行模式后找不到出口。其实同一个Esc就能退出末行模式回到命令模式。记住一句话所有模式的出口都是Esc。不确定自己处在哪个状态时连按两下Esc屏幕左下角的模式提示消失你就回到了最稳定的“原产地”。这个习惯我到现在还在用尤其是在生产服务器上处理重要文件时多按一次Esc不丢人误操作才丢文件。2.3 怎么确认自己当前在哪个模式理论上插入模式会在屏幕左下角显示-- INSERT --之类提示但很多精简的终端环境里这个提示并不显眼。我建议你打开vi后养成一个习惯先敲一个光标移动命令试试比如按j看光标是否向下走。如果屏幕内容在滚动但光标纹丝不动说明你可能还在插入模式——先Esc再说。也可以在末行模式执行set showmode让模式提示更醒目。这条命令我一般会写进~/.vimrc配置文件里但现场临时设置也完全有效。另外set number显示行号我强烈建议打开尤其当你准备在vi里做批量替换或按行号跳转时没有行号等于盲人摸象。3. 高频命令实操移动、编辑、查找替换和保存退出3.1 光标移动让手指始终留在主键盘区vi的移动命令全部集中在主键盘区手不用离开打字位置。这是它“高效”的底层来源也是它“难学”的原因——因为你得暂时忘记方向键。先记四组基础动作操作命令说明左移h光标向左一个字符下移j光标向下移动一行上移k光标向上移动一行右移l光标向右一个字符小写L进阶移动命令更常用0跳到当前行行首$跳到当前行行尾w按单词往后跳b按单词往前跳gg跳到文件第一行G跳到文件最后一行:n跳到第n行比如输入:100回车光标就到第100行Ctrl f向下翻一页Ctrl b向上翻一页这里重点说下gg和G因为这俩命令几乎是搜索热点。很多人在搜索框里输入“vi g”其实想问的就是怎么快速跳到文件首尾。日志文件动辄上千行用方向键翻半天不现实——gg回文件头看配置G去文件尾看最新日志是日志排查场景下最高频的两个动作。配合:行号精准跳转到报错行排查效率直接翻倍。移动命令同样遵循“数字命令”的重复规则比如5j向下移动5行3w向后跳3个单词。这个规则贯穿vi几乎所有命令学会它之后很多复杂操作就不用单独记了。3.2 删除、复制、粘贴与撤销先定范围再下命令vi的删除、复制、粘贴基于一个核心概念先定范围再下命令。范围可以是“一个字符”“一个单词”“整行”范围不同命令写法就不同。最常用的编辑命令x删除光标处的字符dd删除当前整行dw删除从光标位置到单词结尾的内容d$删除从光标位置到行尾的内容yy复制当前整行yw复制从光标位置到单词结尾的内容p在光标所在位置后面粘贴P在光标所在位置前面粘贴u撤销上一次操作Ctrl r重做“数字命令”在这里特别好用3dd一次删除3行2yy复制2行。我改配置文件时最喜欢用dd加p的组合来调整参数行顺序——先删掉一行再把光标移到目标位置按p放回去比鼠标拖来拖去快得多。这里有一个值得记住的组合逻辑d和y本质上是“动作”它们可以搭配范围来使用。d}能一次删除整个段落y$能复制光标到行尾所有内容。理解了“动作范围”的组合方式你就不需要背完所有命令——遇到没见过的组合也能猜个大概。比如cw是删除光标到词尾并进入插入模式change word这个设计非常优雅。3.3 查找与替换日志排查和生产配置的看家本领查找是vi里使用频率最高的操作之一/关键字回车向下搜索?关键字回车向上搜索n跳转到下一个匹配项N跳转到上一个匹配项搜索这里有个进阶用法在/之后可以使用正则表达式。比如/error$能匹配行尾的error/^ERROR能匹配行首的内容。查日志时偶尔用一次你就会发现它比肉眼强太多。替换命令格式为:s/旧内容/新内容/通过加后缀控制替换范围命令作用:s/old/new/替换当前行第一个old:s/old/new/g替换当前行所有old:%s/old/new/g替换整个文件所有old:5,20s/old/new/g只替换第5到第20行之间的old这里最需要防的坑是如果忘记加g默认只替换每行第一个匹配结果。我有一次在生产环境的一份几百行配置里执行:%s/path/data/以为全局替换完成结果只改了每行第一个path后面几处漏掉的匹配直接导致了程序启动报错。从那以后凡是影响面大的替换我都会先加c后缀:s/old/new/gc让vi逐个弹出确认确认完再执行。虽然慢一点但它能保住生产环境不炸这个代价完全值得。3.4 保存退出的完整命令表保存和退出相关的命令是vi所有搜索里最热门的原因下一章专门讲。先给结论常用命令一共6条按场景选择即可。场景命令说明保存但不退出:w写盘保存可继续编辑退出且不保存:q!放弃所有修改直接退出保存并退出:wq最常用保存并退出简写:x效果等同于:wq保存并退出命令模式ZZ大写Z按两下不需要冒号强制保存并退出:wq!对只读文件但当前用户有改动能力时使用需要特别留意:q不带感叹号如果文件已有修改但未保存vi会拒绝退出提示No write since last change。这正是无数新手卡住的地方。后面我会专门展开讲这里先记一个结论想放弃修改直接出去就按:q!想保留修改出去就按:wq。4. 退不出去的vi那个被搜索了无数次的“世纪难题”4.1 退不出去的根因其实是一场心理博弈“如何退出vi”常年霸占Linux新手问题的搜索榜这不是偶然。根因很简单vi打开后默认在命令模式页面上没有任何“文件正在编辑”的提示。新手凭直觉开始敲内容结果按出的字母全变成了指令屏幕一阵乱跳。等想退出时按q、按quit、按CtrlC统统没有反应最后只能关掉终端窗口心态直接爆炸。我给新手的第一个建议是在vi里按任何键之前先问自己一句“我现在在哪个模式”。如果屏幕左下角没有-- INSERT --提示那你多半还在命令模式或末行模式。如果刚才已经一顿乱按最稳妥的做法是连按两下Esc回到命令模式再输入:q!退出。Esc键在键盘左上角闭着眼睛都能摸到它是你在vi里的“安全出口”。另一个经典误区是方向键。不少终端的键盘映射会把方向键的转义序列翻译成字符于是插入模式下按一次上键屏幕上多一个A再按又加一个。要是文件里因此攒了一堆ABCD退出前记得用u多撤销几次把那些乱码清掉再保存。4.2 不同退出场景对照表与误操作代价当前状态推荐退出方式说明已保存修改想离开:wq或ZZZZ省去冒号需确认文件处于已保存状态未保存修改想放弃:q!修改全部丢失只想保存继续编辑:w不退出文件只读想保存到别处:w /tmp/backup.txt另存为新文件打开文件后一步没动:q安全退出插入模式夹带乱码Esc后再:q!必要时先用u撤销乱码强制退出:q!的代价是全部未保存修改瞬间丢失。我最心疼的一次在服务器上临时改脚本改到一半被人打断回来时忘记先:w随手一个:q!一晚上的调试结果全没了。从此我养成两个习惯一是编辑过程中每隔几分钟敲一下:w就当是游戏存档二是每次退出前瞄一眼屏幕左下角看清状态再动手。4.3 如何防止“手滑强退”吃掉你的成果在生产服务器上误敲:q!的破坏力不小。防误触发的办法其实都很朴素重要文件编辑前先用cp备份一份再动手把set number和set showcmd写进vim配置文件让当前状态更透明减少误判如果只是查看文件内容用view 文件名以只读模式打开从源头杜绝误编辑还有一个易被忽略的点在只读文件上直接执行:wq会失败并提示readonly。这时如果确实需要保存要么确认当前用户是否有写权限后用:wq!要么另存为:w /tmp/xxx再处理。别把:wq!当万能钥匙到处用——它不等于绕开权限只是在你本就有权限时忽略只读标记而已。5. vi寄存器与宏被埋没的批量处理利器5.1 寄存器是什么为什么它比系统剪贴板更可靠vi里的寄存器可以理解为多个相互独立的剪贴板。默认的复制、删除内容会进入无名寄存器而命名寄存器从a到z一共有26个每个都能独立保存一段内容。和操作系统剪贴板最大的区别是vi寄存器内容在编辑器退出前始终保留不会因为你复制了别的东西就被覆盖。这意味着你可以先复制A段内容再去复制B段内容最后还能把A段完整贴回来——如果放在系统剪贴板里A段早就被覆盖了。在编写配置模板、批量生成脚本片段时这个能力非常好用。比如你在写一个脚本需要在不同位置反复粘贴同一段公共函数代码用a保存一次之后每到一个位置按ap就能贴出来完全不会和中间复制的参数行互相干扰。这一点在vi 寄存器 操作的搜索结果里被问得最多值得你专门练熟。5.2 命名寄存器的核心操作基本用法只有三句练几遍就能记住ayy复制当前行到寄存器aap粘贴寄存器a的内容到光标后bdd把当前行剪切存入寄存器b按键顺序是引号键Shift加单引号即键盘上双引号那个键、字母a、然后yy或dd等具体命令。熟练之后输入速度很快。这里还有一个容易忽略的点用大写字母作为寄存器名时是“追加”而不是“覆盖”。Ayy会把当前行追加到寄存器A的末尾适合在多次复制后把散落各处的关键行拼成一段长文本。我整理日志摘要、拼装报告时常用这个方法一边浏览文件一边用Ayy把关键行收集起来最后找个空文件整体贴出效率极高。5.3 寄存器与宏、点号命令的组合玩法寄存器更大的威力在于配合宏使用。宏录制的命令是q流程如下在命令模式按下qa后续所有操作都会被录制到寄存器a中执行你要批量重复的那几步操作再按一次q结束录制按a执行宏一次100a连续执行100次举一个真实场景要给文件里50行每行行首加一个#注释符号。手动做50次肯定崩溃但用宏只需十秒。先把光标移到第一行按qa开始录制按i输入#按Esc回到命令模式按j跳到下一行再按q结束录制。此时执行49a因为第一行已经手动处理过只需要执行49次50行注释一次完成。宏录制是vi里最接近“编程”的玩法。理解了它之后很多重复劳动都能机械化。除了宏还有一个常和寄存器混着用的小命令是.点号它用于重复上一次的完整修改操作。比如你刚在某一行粘贴了内容按.会在下一行重复同样的粘贴。在不需要精确控制每一步时点号比宏更轻量值得养成习惯。6. 从vi到vim现代环境下的实际选择与学习路径6.1 vi和vim的区别以及该装哪个很多人会问现在发行版里默认的vi到底是不是真vi其实大多数现代Linux发行版已经做了vi到vim的软链接你输入vi打开的就是vim除非你身处一个极其精简的BusyBox环境比如某些容器基础镜像。vimVi IMproved在vi基础上增加了几项核心改进多级撤销vi只有一级撤销vim可以连续u一步步向前回退语法高亮编辑脚本或配置文件时高亮关键字排查漏掉括号、引号的效果很明显可视模式按v进入用方向键选中文本后统一操作相当于命令行里的“鼠标拖选”更完整的寄存器、宏、多窗口支持在Ubuntu、CentOS、Rocky Linux这些常见系统上直接vim 文件名或vi 文件名都没问题。如果命令提示找不到vim安装也很快Debian系用sudo apt install vimRedHat系用sudo dnf install vim。生产环境里如果只有最简vi没有vim大部分基础操作依然可用但涉及高亮和多级撤销时体验会差一些。6.2 面试和生产环境常考的vi细节结合Linux面试题的热点我整理了经常被问到的几个细节怎么显示行号set nu取消用set nonu怎么实现全文替换:g/旧内容/s//新内容/g这是全局替换的另一种写法怎么在多个文件间切换:e /路径/文件打开新文件到缓冲区再用:n或:prev在缓冲区列表里切换怎么全选没有图形界面的“CtrlA”但可以gg跳到文件开头按vG用可视模式选中到文件末尾这就是全选只读打开文件启动时用view 文件名或进入后执行:set readonlygvim图形界面的vim里的“全选”也有同样问题。我在图形环境下一般直接按v进入可视模式再用ggVG完成全选这个习惯在纯终端里也通用不依赖图形界面。其实这些所谓面试题多数都是从生产场景中提炼出来的你只要在真实编辑中用过一次面试时自然答得上来。6.3 我的学习路径建议别背命令去背“语法”最后分享一点个人体会。vi真正的难点不在于记忆命令数量而在于理解它的“语法”所有操作都可以拆成“动作范围”。y是复制动作w是单词范围yw就是复制一个单词d是删除动作$是行尾范围d$就是删除到行尾。数字是倍数3yy就是复制3行。一旦理解了这套组合逻辑遇到没见过的命令你也能根据“动作范围”猜个大概记忆负担至少减少一半。我把学习vi分成三个阶段第一个阶段只要求能打开、能编辑、能保存退出顺手记住h/j/k/l和gg/G这几个移动操作一两天就能搞定第二个阶段掌握查找替换、可视模式、行号显示能应付日常编辑第三个阶段再研究寄存器、宏、多窗口这时候你已经不需要教程自然会在实际场景中摸索出自己的套路。不建议一上来就背完整命令字典那比背英语单词还枯燥而且很快会忘。更实际的做法是把这篇指南里最常用的十几条命令挑出来今天就拿一个真实配置文件练手。等到某天你需要“给50行加注释”或“看日志最后100行”时再回头翻寄存器和宏的部分一次就能记住比死记硬背强太多。vi值得你投入时间因为它在Linux世界里无处不在。而且说句实话当你习惯了这套“动作范围倍数”的操作语法之后再回到那些只能靠鼠标点点点的编辑器你会觉得自己的手速真的被解放了。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →