ARTICLE DETAIL

资讯详情

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

vi/vim从入门到精通:三种模式、高频命令与Linux运维实战

vi/vim从入门到精通:三种模式、高频命令与Linux运维实战 当年在机房第一回用Linux我对着黑底白字的终端窗口敲了个vi结果屏幕上剩下一行波浪号按什么都没反应最后干脆按电源键重启。后来才知道那个状态叫命令模式不是死机而是vi在等我输入命令。这个场景大概每个Linux新手都经历过网上甚至有个经典帖子在问“怎么退出vim”底下回复都乐了。玩笑归玩笑vi确实是一款绕不开的编辑器——几乎所有Linux发行版都自带它任何一台服务器只要装了最小系统vi就一定能用。它不像VS Code、Notepad那种图形编辑器不能用鼠标点也没有菜单栏但对做运维、开发、嵌入式的人来说vi就是终端里最靠谱的救命工具。这篇文章我不讲虚的直接按我多年实际操作的经验把vi从三种模式、基础操作到常用配置和问题排查完整过一遍如果你是刚接触Linux的新手照着练能少走弯路如果你已经用了很久但总有几个命令记不牢这篇文章也能当一份速查笔记。1. vi编辑器为什么绕不开三种模式与设计逻辑1.1 三套模式一个中枢vi和大多数编辑器最大的区别就是它不是只有“编辑”一种状态而是把工作状态分成了三套模式。命令模式Normal Mode打开文件后默认进入的状态。在这个模式下键盘上敲的字符一律不往文件里写而是被当作命令解释。比如按dd删除当前行按yy复制当前行按gg跳到文件第一行。新手最容易在这里懵掉——以为可以像记事本一样直接打字结果敲了一堆字母内容没进去反而执行了一堆莫名其妙的操作。插入模式Insert Mode在命令模式下按i、a、o等键进入。此时键盘输入才会真正写入文件屏幕下方通常会出现-- INSERT --提示。要回到命令模式按Esc就行。末行模式Last Line Mode在命令模式下按冒号:进入也叫ex模式。它和命令模式的区分在于你按:以后屏幕底部会出现一个命令行输入框可以输入类似w保存、q退出、s替换这样的完整命令。三种模式的切换规律其实很简单命令模式是中枢按i或a或o进插入模式按:进末行模式插入模式和末行模式按Esc都能回到命令模式。记不住别的没关系先记住“Esc回命令模式i进插入冒号进末行”这一个组合后面所有操作都是在这个骨架上长出来的。1.2 1976年留下的效率设计很多人第一次接触vi都会吐槽这设计反人类。但vi诞生于1976年那个年代没有鼠标终端屏幕刷新慢键盘布局也跟现在不一样。设计者Bill Joy做vi的核心思路是让使用者手尽量不离主键盘区不用去够方向键、功能键所有操作都在字母键、Esc、Enter附近完成这样能最大化减少手指移动和等待屏幕刷新的时间。这也就带来了vi最核心的一个思维操作是“动词宾语”的组合。d是删除deletew是单词worddw就是删除一个单词y是复制yank$表示行尾y$就是复制从光标到行尾的内容。当你理解了这套组合逻辑很多没刻意背过的命令也能自己拼出来。比如d加G文件末尾就是删除当前光标到文件末尾的所有内容。这也是为什么很多老工程师说vi“入门难入门后回不去”——它不是在模仿纸质文档的操作而是在用一套类似语法的规则让你盲打。1.3 vi和vim到底是什么关系严格来说现在大多数Linux发行版里的vi命令指向的其实是vimVi IMproved。你可以同时输入vi和vim看它们打开的文件界面是不是一样。vim在vi的基础上加了语法高亮、多级撤销、可视模式、分屏等现代功能但底层核心操作跟vi完全一致。所以本文讲的所有命令在真正的vi和vim上都能用只是vim更好用一些。建议新手不要纠结“练vi还是练vim”直接在系统里用vim姿势学得一模一样体验还好不少。生产环境里就算只有最朴素的vi你也能用a、i、o、dd、:wq这套基础命令把活干完。2. 打开、编辑、退出vi的完整生存周期2.1 打开文件的各种姿势vi 文件名是最基本的用法但在实际运维里你会遇到很多需要“直接跳转到某个位置”的场景这时候光会这一条就不够了。下面这些打开方式都是我实际用过的vi file打开文件光标在文件开头。vi file 打开文件光标直接停在文件末尾。看日志、追加内容很好用。vi 50 file打开文件并跳到第50行。改配置时经常要看中间某段。vi /password file打开文件光标自动定位到第一个出现password的地方。省得进去以后再查一遍。vi -R file以只读方式打开。防止自己手滑改掉重要配置。vi file1 file2 file3同时打开多个文件后续用:n切下一个文件:N切上一个:ls列出所有打开的文件。还有一种常见情况文件名本身带空格比如my config.conf用vi my\ config.conf别把空格理解成开两个文件了。2.2 进入插入模式的六个键命令模式下按i就能进插入模式但光会i不够很多时候用其他几个键效率高得多i在光标所在字符的前面插入。I在光标所在行的行首插入记住是大写I。a在光标所在字符的后面追加。A在光标所在行的行尾追加。o在光标所在行的下方新开一行并进入插入模式。O在光标所在行的上方新开一行并进入插入模式。举例说明使用场景。你想在一行配置的末尾加个注释光标还在行中间按A直接跳到行尾省得先按End再按i你想在某个段落之间补一行空行直接按o就行比先回车再找位置灵活得多。核心规律是小写都在光标附近操作大写都在行首、行尾这种“边界位置”操作。2.3 保存退出的所有路径“怎么退出vi”是所有新手的头号难题。很多人按了Esc还出不来就是因为不在命令模式下按不了:。先把知识理清命令含义适用场景:wq保存并退出最常用改完文件就靠它收尾:x保存并退出与:wq基本等价但只在有改动时才写文件ZZ保存并退出注意是大写ZZ不用按冒号直接在命令模式按两个大写Z:q退出不保存只有文件没被修改过时才有效:q!强制退出不保存改坏了想反悔用这个最安全:w只保存不退出边写边存好习惯比如改长脚本时每隔一段按一次记不住这么多没关系先死记一句“想保住修改就用:wq想全盘放弃就用:q!”。保存退出最容易被忽略的替代品是ZZ不需要按冒号直接两个大写Z操作动作小适合手已经放在字母键上的状态。:x也很好有改动才写盘对SSD寿命也友好一点。有个经典梗是Stack Overflow上有人问“How do I exit the Vim editor?”底下最高赞回答直接发了:q!。这真不是玩笑很多新手确实会卡在这里很久常见原因是没有先按Esc回到命令模式就按了:或者在插入模式里敲了半天一直按不了冒号。缓解手忙脚乱的办法遇到任何异常按几次Esc确认回到命令模式后再输入命令。按Esc不会有副作用放心按。2.4 修改了想放弃重新加载比反复开关靠谱有一次我改/etc/my.cnf删掉了一个参数想了想还是觉得原来的写法稳妥但已经保存了。这时候不用慌在vi里可以直接放弃当前所有改动、重新加载磁盘上的文件内容:e!放弃当前缓冲区里的所有修改重新从磁盘加载文件。效果等同于不保存退出再重新打开但不用退出vi。这个命令在试错时特别好用。比如你调试一段脚本改了一堆想全部回滚到未修改状态按:e!一瞬间就回来了。注意它的前提是你还没执行:w保存如果已经保存过了:e!会把文件恢复到磁盘上的最新保存版本也就是你最后保存的那一版昨晚的版本是回不去的。3. 高频操作命令速查与实操笔记3.1 光标移动先把手从方向键解放虽然vi支持方向键但在老的vi和较差的终端模拟器里按方向键偶尔会出现ABCD这种乱码输出。而且手在字母区和方向键之间来回移动效率确实低。更科学的移动方式是用h、j、k、l四个键分别代表左、下、上、右这样右手保持在主键盘区就能完成所有移动。单词级移动w跳到下一个单词开头b跳到上一个单词开头e跳到当前单词末尾。行内移动0跳到行首包括空格和缩进^跳到行首第一个非空白字符$跳到行尾。行间移动gg跳到文件第一行G跳到文件最后一行数字G跳到指定行比如50G就是第50行。翻页Ctrlf向下翻页Ctrlb向上翻页。数字前缀和命令组合在命令模式下命令前可以跟数字。比如3j表示向下移动3行5w表示跳过5个单词。这个规则和删除、复制是通用的。实际用起来处理一个几百行配置文件gg定位开头、50G定位到具体行、G翻到末尾几乎是我每天的操作习惯。方向键反而只在偶尔微调时使用。3.2 删除、复制、粘贴与组合命令编辑文件的核心操作无非就是删、改、移。删除命令在vi里非常灵活x删除光标所在的一个字符。dd删除当前行。3dd删除当前行及后面两行。dw删除从光标位置到当前单词末尾。d$删除从光标位置到行尾。d0删除从光标位置到行首。dG删除从光标位置到文件末尾。复制和粘贴同样有一套yy复制当前行。3yy复制当前行及下面两行。y$复制从光标到行尾。p在光标所在位置的下一行粘贴粘贴整行时或者光标后面粘贴粘贴字符时。P在光标所在位置的上一行粘贴或光标前面粘贴。这里有个容易忽略的细节在vi里dd删掉的内容其实也会进入缓冲区所以dd再加p就相当于“剪切粘贴”。这经常用来上下移动一段代码把光标停在某行dd删掉它再移动到目标位置按p内容就被填进去了。配合V可视模式按大写V进入行选择模式用方向键或hjkl选中多行然后按d删除、按y复制批量操作会更直观尤其适合整块搬运配置段落。3.3 查找与替换改配置文件的刚需改配置文件时最烦的就是要在几十个相同参数里找到目标那一个。这时候用vi的查找和替换就能快速定位。/keyword向下查找keyword光标跳到第一个匹配位置。?keyword向上查找keyword。n跳到下一个匹配位置。N跳到上一个匹配位置。:set hlsearch高亮所有匹配项搜索时更容易看清。:nohlsearch取消高亮或者用:set nohlsearch。替换则是末行模式下的重头戏:s/old/new替换光标所在行的第一个old。:s/old/new/g替换光标所在行的所有old。:%s/old/new/g替换整个文件中所有old。:%s/old/new/gc替换整个文件所有old但每次替换前询问确认。这几个命令里%表示“整个文件”g表示“全局替换”c表示“每一次都要让我确认”。实际我在改配置时经常用:1,$s/old/new/g来表示从第1行到末尾效果和%一样。如果要替换的内容里包含正斜杠/比如要替换文件路径/usr/bin可以把分隔符换成#写法是:%s#/usr/bin#/home#g省得转义蛋疼。3.4 撤销、重做与重复操作写完一段代码觉得不对想退回光靠删除重打效率太低撤销命令才是王道。u撤销上一步操作。Ctrlr重做也就是撤销的逆操作。U撤销当前行内的所有修改这个和u不一样U是整行级别的vim里很少用但在纯vi里是救命招。.重复上一次修改操作。比如说你给5行文本末尾都加上分号只要改完第一行后面每行按一次.就能重复同样的操作。.我有个习惯是改脚本时每几步按一次u试错确认写坏了就u到底比重新敲一遍快得多。Ctrlr对应不小心撤销多了的情况配合起来就是“反悔了还能反悔”。4. 多文件、分屏与进阶配置4.1 多文件编辑与窗口分割单文件编辑很多时候不够用比如改配置时要在A文件里复制一段再去B文件粘贴。vi里可以用分屏做到同一窗口同时看多个文件。:sp水平分割窗口上下分。:vsp垂直分割窗口左右分。:sp /etc/nginx/nginx.conf指定打开另一个文件来分割。Ctrlw加方向键或在分隔窗口间切换焦点。Ctrlw再按q关闭当前窗口。分屏模式下可以一边看nginx主配置一边开虚拟主机配置文件对照修改改完:wq逐个退出。多文件的另一种方式是之前提到的vi file1 file2然后用:n切到下一个文件:N回上一个:ls查看当前打开了哪些文件并显示编号。4.2 .vimrc最小配置vim强大的原因之一是可以定制配置文件在用户家目录下的.vimrc。以下是我无论到哪台机器都会先配上的最小清单set nocompatible 不要完全模拟老vi set number 显示行号 syntax on 语法高亮 set tabstop4 Tab缩进显示宽度为4 set shiftwidth4 自动缩进时按4格 set expandtab 用空格替换Tab set autoindent 自动缩进 set hlsearch 搜索高亮 set ruler 右下角显示行列号 set fileencodingsutf-8,gbk 自动识别编码 set encodingutf-8这些配置用vim打开配置文件后一眼能看到行号、语法颜色改代码缩进也不会乱。对新手来说set number和syntax on是最值得先加的没配行号的时候报错提示说在第125行你就得自己慢慢数了。4.3 终端环境下提高效率的实操习惯除了配置我摸索出来的几个终端操作习惯分享出来也许能帮你省不少时间。第一插入模式下别只依赖退格键。按Ctrlw能快速删除前一个单词按Ctrlu能一次性删掉当前行光标前的整段内容适合打错一串字符时不用连续退格。第二粘贴大段内容前先进入粘贴模式。用set paste能让vim关闭自动缩进粘贴一长段缩进敏感的代码时格式不会被自动缩进搅乱。用完再set nopaste恢复。第三用/usr/bin/vi的环境变量问题。如果你在根用户下编辑普通文件后保存时报“E45: readonly option is set”说明文件对你来说不可写。这时别强来要么:w!强行写入不推荐除非权限允许要么退出后用sudo重新打开“sudo vi 文件名”。第四处理大文件时小心点。vi不适合编辑那种上GB的日志文件打开很慢不说拖动也卡。看日志用tail -f或者less别全塞进vi里。真要编辑也要等加载完成后才能输入命令看着像卡在打开状态时别着急按一堆键。5. 常见问题排查与面试考点实录5.1 五个让新手抓狂的经典现场踩坑记录是最值钱的内容我把实际过程中最容易让人懵的场景都列出来场景一按了CtrlS屏幕卡住了。这不是vi卡死是终端收到了暂停输出的控制键整屏输入输出都冻结了。解决办法很反常识按CtrlQ解除。多数人以为死机了就关窗口重开其实只是软冻结。场景二误按CtrlZvi不见了。CtrlZ会把当前进程挂起到后台vi界面会消失回到Shell提示符。此时输入fg可以把它重新调到前台继续编辑。如果忘了是哪个进程挂起了用jobs命令查看再fg %1拉回来。场景三方向键变成ABCD。老式vi不识别方向键的终端转义序列按上键会在光标位置蹦出A、B、C、D。解决方法就是不依赖方向键改用h、j、k、l这本来也是vi的正统操作。出现已经输入进去的ABCD字符直接dd删掉那几行再重输。场景四中文内容显示乱码。文件本身是GBK编码vim默认用UTF-8解释就会显示成乱码。在.vimrc里配上set fileencodingsutf-8,gbk,gb2312并在打开文件后执行set encodingutf-8通常能恢复正常。已经乱码了先别急着保存退出:w encutf-8 新文件名可以换编码另存。场景五粘贴内容缩进全乱。从系统剪贴板粘贴一大段代码进去每行都被自动缩进缩进层级越来越离谱。原因就是自动缩进把原本的缩进再加了一遍。设set paste进入粘贴模式解决粘贴完马上set nopaste恢复自动缩进不然后面手输入又想用自动缩进时忘了关又会觉得不对。5.2 面试中的vi考点速查给准备Linux岗位面试的朋友整理一份常考题。面试官考vi一般不是考花哨操作而是看基础是否扎实问题标准答案要点vi有哪几种模式命令模式、插入模式、末行模式命令模式是默认状态如何从命令模式进入插入模式按i、a、o等其中最常用是i如何强制退出且不保存命令模式按Esc后输入:q!如何保存并退出:wq或ZZ如何全文替换某个字符串:%s/old/new/g如何撤销操作命令模式按u重做按Ctrlr如何删除当前行dd如何复制当前行并粘贴到下方yy复制p粘贴如何在打开文件时跳转到指定行vi 行号 文件名或在文件内按数字G如何查找关键字并跳转输入/关键字按n下一个面试中还有个加分项会解释系统默认编辑器。面试官可能问“Linux的默认编辑器是哪两个”标准答案是vi和ed但现代发行版默认的vi实际都是vim解释清楚这个细节会显得更懂行。用vi编辑文件时还有一条安全经验值得记住不要直接在大文件上长时间操作先思考你的目标是“定位”“修改”还是“查看”然后用对应场景的最优命令组合别把所有动作都靠方向键和退格键硬扛。我第一次在生产环境改nginx配置手一抖多按了dd好在那时已经养成了:wq前先:w的习惯一个u救回来了。从那以后再也不敢说“vi没必要学那么细”这种话因为关键时候能把自己从坑里拉出来的往往就是这些平时看着不起眼的命令。如果你还在被“按了i进不去插入模式”“按了Esc没反应”这种细节折磨别怀疑自己这一步所有人都走过。真正值得投入的是每天在vi里多练几次组合命令把dw、yy、p、u变成肌肉记忆。几天后你会发现自己改配置文件的速度快得连自己都意外。
返回列表