ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux下Vi编辑器入门:模式切换、核心命令与故障排查

2026/9/8 2:24:37 拓冰建站 浏览量
Linux下Vi编辑器入门:模式切换、核心命令与故障排查 我第一次打开vi编辑器的时候满屏都是~波浪线按方向键屏幕纹丝不动随手敲几个字母还莫名其妙冒出来一些字符两分钟不到就退出换了nano。后来真正开始维护Linux服务器、改配置、看日志才发现vi根本绕不过去。不管你是运维、后端开发还是刚接触Linux系统的学生vi编辑器都是必须过的一道坎它几乎存在于每一台Linux机器上很多场景下你根本没有机会装别的编辑器。这篇文章我不会给你堆一份几百条命令的速查表而是按我自己的学习路径来讲先理解vi为什么“反人类”再把它最常用的核心操作拆开揉碎最后附上我踩过的坑和排错思路。读完你至少能完成“打开文件、移动光标、修改内容、保存退出”这条完整链路并且不会再因为模式切换不清而把自己锁在文件里。1. 为什么被vi“卡住”的人特别多三种模式才是真正门槛1.1 三种模式到底是哪三种vi最让人困惑的地方在于它不是像记事本那样只有一个输入状态而是分成了普通模式、插入模式、命令行模式。你打开vi看到的默认状态就是普通模式在这个模式下你敲的字母基本都是命令不是往文件里输入的文字。比如按j是光标向下移动按dd是删除整行按x是删除当前字符。新手第一次进来疯狂敲键盘发现屏幕没有出现预期文本反而光标乱跳、行被删掉就是这个原因。插入模式才是真正往文本里写东西的状态。从普通模式按i就能进入插入模式左下角一般会出现-- INSERT --的提示。大部分新手最初的需求就是“我要打字”结果卡在了没有意识到要先按i这一步上面。命令行模式则是按:进入的底部输入状态用来执行保存、退出、搜索、替换这类全局操作比如:wq表示保存并退出。理解这三种状态的方式我是用一个类比才彻底搞明白的普通模式像你手里拿着一把瑞士军刀按键是在选择刀具插入模式像你已经打开了刀刃在加工材料命令行模式像是你退后一步在跟机器下达整体指令。三者的操作逻辑完全不同互相之间用Esc回到普通模式这是vi所有操作里最重要的一座桥。1.2 模式切换不清会引发什么结果我见过太多刚学vi的人也包括我自己在这上面翻过车。最常见的情况是在普通模式下想输入内容于是连着按了好几下i结果屏幕没反应以为vi坏了还有人是进入插入模式后不知道按Esc退出直接用鼠标去点界面上的按钮在纯终端环境里根本无效。更危险的场景是在普通模式下乱按了一串字母。vi的很多命令是组合键比如dd删除整行、dw删除单词、d$删除到行尾。如果你本意是想打字不小心敲了d又敲了d一整行内容就没了。所以我给初学者的第一条建议是在你还不熟悉命令的时候每做一个操作前先确认自己在什么模式拿不准就按一次Esc再思考。宁可慢一点也不要让文件内容被无意修改。vi的命令缩写大部分有英文来源记住来源就很好记i是insert插入a是append追加o是在下方新开一行openw是word单词d是delete删除y是yank复制p是paste粘贴q是quit退出x本来有删除的意思。当你意识到这些命令不是随机字母而是一套有语义的设计时学习难度会低很多。2. 上手前的环境准备与隐藏雷区2.1 先搞清楚你用的是vi还是vim在很多现代Linux发行版里你输入vi可能实际打开的是vim也就是vi的增强版。vim提供了语法高亮、方向键支持、多级撤销、可视模式等功能对初学者友好得多。但某些精简安装的容器、嵌入式系统、老牌Unix环境里只有最原始的vi连方向键都不好使只能靠h j k l移动光标。动手前可以先确认一下环境which vi which vim vi --version vim --version如果系统里连vim都没有Debian/Ubuntu系可以sudo apt install vimCentOS/RHEL系可以sudo yum install vim-enhanced或sudo dnf install vim。我自己的习惯是只要能装就装vim因为它保留了vi全部的操作逻辑却多了很多能让新手活下去的提示。2.2 终端会话里的两个大坑输入法冲突和CtrlS假死远程SSH到服务器上用vi时最容易踩的坑是输入法。如果你习惯用中文输入法进入插入模式后按i再敲英文字母可能触发输入法的拼音组合导致vi没有收到预期的按键表现为“打出来的字不对”或者“按字母没反应”。我建议使用vi时全程保持英文输入状态养成肌肉记忆。另一个非常隐蔽的坑是CtrlS。有些人在Windows上习惯了用CtrlS保存到了终端里也顺手按一下结果屏幕突然像死机一样敲任何键都没反应。这不是vi出问题了而是终端收到了CtrlS后进入了输出暂停状态所有屏幕刷新都被冻结。解决办法是按CtrlQ解除暂停。这个坑我当年卡了十分钟以为远程连接断了其实只是终端滚动锁定。准备环境这块还有一个小建议如果你是在图形界面里用终端模拟器尽量不要用鼠标滚轮在普通模式下操作vi滚轮行为在某些配置下会触发异常粘贴或光标乱跳。在大概率只靠纯文本界面的服务器维护场景里尽早习惯纯键盘操作会让你受益。3. 实操路线从打开文件到保存完整修改3.1 用一个真实任务串起整个流程我不建议一上来就背命令表最好带着任务去学。我拿当年改Nginx配置的案例来讲假设你要把/etc/nginx/nginx.conf里的worker_processes从2改成4完整操作流程是这样的。第一步打开文件vi /etc/nginx/nginx.conf如果你没有权限编辑这个文件用sudo vi /etc/nginx/nginx.conf打开。打开后你处于普通模式光标停在文件第一行这时你可以先用/worker_processes搜索目标配置。输入/是vi的搜索指令紧接着输入关键词再回车光标会跳到第一个匹配位置。如果有多处匹配按n跳到下一处按N跳到上一处。找到worker_processes 2;这一行之后先不要急着改。按下$把光标移到行尾再按b或w在单词间移动直到光标停在数字2上。然后按x删除当前字符再按i进入插入模式输入4。操作完成后按Esc退出插入模式回到普通模式最后输入:wq回车保存并退出。这个流程看上去简单但里面包含了几个关键操作搜索定位、行内移动、删除字符、插入修改、保存退出几乎覆盖了vi日常使用的全部核心能力。3.2 移动光标的入门肌肉记忆很多人刚用vi时最难受的是移动光标。方向键在部分vi环境里能用在纯vi环境里可能不支持所以h j k l这组键是必须练的h向左、j向下、k向上、l向右。刚开始会很不习惯但用久了手指不需要离开主键区效率反而碾压方向键。除了基础的方向移动还有几个高频移动命令值得练gg跳到文件第一行G跳到文件最后一行数字G跳到指定行比如50G跳到第50行0跳到行首$跳到行尾w跳到下一个单词开头b跳到上一个单词开头Ctrld向下翻半屏Ctrlu向上翻半屏这些移动命令在普通模式下操作它们的作用是让你快速把光标“运送”到目标位置。我发现很多新手在vi里改文件时习惯按住j一行一行往下挪文件稍微长一点就崩溃。正确做法是先用搜索或行号跳转再在局部之间用w b微调效率完全不是一个级别。3.3 进入插入模式的方式i不是唯一选择进入插入模式最常用的是i但还有很多变体针对不同场景更高效i在光标所在字符前插入a在光标所在字符后插入I在行首插入A在行尾插入o在当前行下方新开一行并进入插入模式O在当前行上方新开一行并进入插入模式举个例子如果我想在某一行的末尾追加内容直接按A比先按$再按i要少一个键位。如果我想在配置块之间插入一整行配置按o直接新开一行再开始打字。这些变体本质上都是“调整插入位置”的快捷方式理解了它们你会觉得vi的操作逻辑很统一。3.4 保存退出的几种方式及区别保存退出最常用的三条命令是:wq保存并退出:q!不保存强制退出ZZ保存并退出等价于:wq但少按一个冒号:q!里的感叹号是强制指令意味着即使文件被修改过也放弃所有改动直接退出。这个命令要记牢因为新手经常改了不想保留的内容不知道该怎么退出只能直接关终端。还有一个场景是编辑只读文件。如果你打开了一个没有写权限的文件修改后用:wq保存会提示类似readonly option is set的错误。这时可以用:w!强制写入或者:w !sudo tee %以sudo方式写入。后者在编辑系统配置时特别管用它是把当前缓冲区内容通过sudo tee命令覆盖回原文件很多老运维都在用这个技巧。保存前我建议形成一个小习惯先看一眼屏幕左下角是否有-- INSERT --。如果还处于插入模式直接输入:wq是不生效的因为冒号会被当成普通文本输入进去。必须按Esc回到普通模式才能进入命令行模式。4. 删除、复制、粘贴与撤回编辑效率的关键发力点4.1 vi的组合命令语法动词加范围如果只背单个命令你会发现vi的命令多到记不住。但vi真正厉害的地方在于它的组合语法操作命令加移动范围。删除是d复制是y它们可以搭配任何移动命令使用。比如dw表示删除到下一个单词开头d$表示删除到行尾d0表示删除到行首dG表示删除到文件末尾。同理yw是复制一个单词y$是复制到行尾yy是复制整行yG是复制到文件末尾。理解了这套组合逻辑你不需要逐一记忆每个命令只需要记住操作符和移动命令就能拼出无穷多种组合。粘贴使用p在普通模式下按p会把最近一次删除或复制的内容粘贴到光标位置之后按P大写粘贴到光标位置之前。这里有个很多新手没搞明白的细节删除命令删除的内容其实也被放进了寄存器相当于“剪切”所以dd删除一行后按p能把这行内容粘贴到别处。我自己经常用这个特性做行交换把光标移到某一行按dd剪切再移动到目标位置按p粘贴两行内容就完成了交换。4.2 高频删除命令详细拆解下面这张表覆盖了日常使用最频繁的删除场景建议把每个命令都实际操作一遍命令作用x删除光标所在字符dw删除从光标到单词结尾d$删除从光标到行尾d0删除从光标到行首dd删除整行3dd从当前行开始连续删除3行dG删除从当前行到文件末尾dgg删除从当前行到文件开头数字前缀是vi里一个很重要的语法几乎可以用在任何命令前。3dd删3行2yy复制两行5x删5个字符。在需要处理重复操作时数字前缀能大幅减少按键次数。4.3 反悔键撤销与重做编辑文件难免出错vi的撤销能力比很多编辑器强。普通模式下按u撤销上一步操作按Ctrlr重做。普通vi只支持一次撤销vim支持多级撤销这正是我推荐装vim的原因之一。如果你不小心删了重要内容不要慌狂按u一路撤回就行。还有一个很多教程忽略的小技巧撤销是基于状态的不是基于时间。也就是说如果你做了三次修改又做了一次光标移动按u撤销的是最近一次修改而不是光标移动。理解这个逻辑之后你就知道撤销操作只针对内容变动不会因为中间移动过光标而丢失历史。5. 搜索与替换把“找到内容”变成“定位目标”5.1 搜索的基本操作与高亮处理在普通模式下按/输入关键字回车即可搜索。搜索完按n跳到下一处匹配按N跳到上一处。如果想改变搜索方向可以按?向上搜索其他操作一致。搜索完成后所有匹配的地方会高亮显示。很多新手不知道如何取消高亮以为每次搜索完屏幕都要花掉其实取消高亮的方法是在命令行模式执行:nohlsearch这个命令只取消高亮不影响搜索历史。如果你经常使用搜索功能可以在.vimrc里设置set hlsearch这样搜索高亮自动开启再配合:nohlsearch手动关闭用起来非常顺手。搜索时需要注意大小写问题。vi默认区分大小写但你可以临时在搜索词里加\c忽略大小写例如/nginx\c。也可以在执行:set ignorecase后全局忽略大小写再用:set smartcase实现“如果搜索词里包含大写字母才区分大小写”的智能模式。我推荐开启smartcase符合大多数人输入搜索词的习惯。5.2 替换命令的结构与边界替换命令的完整结构是[范围]s[分隔符]旧内容[分隔符]新内容[分隔符][选项]。最常用的几个变体:s/old/new 替换当前行第一个匹配 :s/old/new/g 替换当前行所有匹配 :%s/old/new/g 替换整个文件所有匹配 :4,10s/old/new/g 替换第4行到第10行所有匹配 :%s/old/new/gc 全局替换但每次询问是否确认c选项是替换确认每次替换前会问是否执行按y确认按n跳过这是处理大范围替换时最安全的做法。我强烈建议任何全局替换都先加c跑一遍确认无误再用不加c的版本执行尤其是修改配置文件时一次误替换可能会造成整个服务起不来。5.3 边界问题与特殊字符一次误替换的诊断过程替换命令里最容易出问题的是匹配边界。举个例子我用:/s/user/worker/g想把所有user替换成worker结果发现useradd被替换成了workeradduser_group被改成了worker_group这不是我想要的结果。这个问题的根源是user作为子串匹配到了更长单词中间。解决方法是使用边界匹配符\和\分别匹配单词开头和结尾:%s/\user\/worker/g这样user只会作为独立单词被替换而不会影响useradd这类包含user的单词。处理配置项、变量名时我基本都会加边界符避免误伤。还有一个坑是特殊字符需要转义。/是分隔符如果替换内容里有/最常见的场景是路径替换直接写会出错。这时候可以把分隔符换成#或:%s#/usr/local/bin#/usr/bin#g这样就不用逐个去转义路径里的反斜线。如果替换内容里有.、*、[、这类正则特殊字符也需要加反斜线转义或者用\V开启“非常规匹配”模式。尤其是.很多人替换IP地址时发现把所有类似192x168x1x1的内容都误改了就是因为.在正则里匹配任意字符。6. 模式理解不到位引发的“人间惨案”常见故障排查链路6.1 症状写完半天保存不了直接关窗口数据丢失这是vi初学者最惨痛的经历也是我被求助最多的问题。现象是进入插入模式写了一堆内容然后不知道怎么退出最后直接关闭终端窗口重新打开发现文件是旧的。完整的排查链路是这样的先确认当前是否处于插入模式看左下角有没有-- INSERT --然后按Esc回到普通模式接着输入:w保存注意冒号是英文冒号最后输入:q退出。如果文件保存时报E212: Cant open file for writing说明当前用户没有写权限需要检查文件属主或用sudo重新编辑。我想特别强调一个理念Linux里没有什么“自动保存草稿箱”vi只保存你明确执行了保存命令时的内容。每次编辑重要配置前先备份原文件比如cp nginx.conf nginx.conf.bak这个习惯救过我很多次。修改前先想清楚要改什么而不是打开就乱动。6.2 症状按了i没有进入插入模式或者输入英文变成了中文很多情况下按i没有反应不是vi的问题而是终端焦点或输入法状态的问题。远程终端登录服务器后如果客户端输入法处于中文模式按i通常会变成输入中文拼音的状态而不是进入普通模式的命令。解决方法是把输入法切换回英文状态再按i。还有一个类似的坑是Caps Lock大写锁定。大写锁定开启时按I会变成“跳到行首插入”而不是“当前光标前插入”命令行为完全不同。如果你发现按i后光标跳到了行首检查一下大写锁定是否开启。6.3 症状文件里出现^M符号如果在Windows上编辑过的文件传到Linux用vi打开时经常看到每行末尾有一个^M符号。这是Windows的换行符\r\n里的\r在Linux下被显示了出来。处理方式有两种。一是用vim直接转换命令行模式执行:set ffunixff是fileformat的缩写unix表示使用\n作为换行符保存后^M就会消失。二是用sed批处理替换sed -i s/\r$// filename这个问题在导出文件、跨系统协作时非常常见花费的排查时间往往比预想的长。理解^M的本质是\r字符排查起来就很容易。6.4 症状vi异常退出后看到swap文件警告vi在编辑文件时会在同目录下生成一个隐藏的swap文件名字通常是.文件名.swp。如果vi异常退出断电、SSH断线、终端被强杀swap文件可能残留。下次再打开同一文件时vi会提示类似Swap file .nginx.conf.swp already exists的警告。这种情况要区分处理如果确定没有其他人在编辑这个文件可以选择删除swap文件再打开或者按d直接删除。但如果你不确定建议先按r恢复一下未保存的内容把重要改动保存出来之后再清理。这个swap机制背后是vi的崩溃恢复机制利用它远比直接删swap要安全因为你不知道里面有没有你写了几小时没保存的内容。清理swap文件的命令很简单rm .nginx.conf.swp但如果这个swap文件属于其他用户或属于系统正在使用的文件不要盲目删除。判断依据是看文件修改时间和进程状态最保险的方法是先ps aux | grep vi查看是否有vi进程正在编辑该文件。6.5 故障排查思路总结先查模式再查权限最后查环境我整理vi相关的故障时有一个固定的排查顺序第一确认你是否还在插入模式这一步解决80%的问题第二确认你有没有文件写权限ls -l看一眼文件属主和权限位第三确认终端环境是否正常比如是否按了CtrlS导致屏幕冻结第四查文件本身是否被其他进程占用或存在swap残留。这套思路适用于绝大多数vi问题。很多所谓的“vi卡死”其实就是模式没有切回来或者终端被暂停了跟编辑器本身无关。把这些因素挨个排除掉问题通常就找到了。7. 长期使用建议配置文件与习惯养成7.1 用.vimrc把vim调教成顺手的样子vim刚装好时默认配置非常朴素没有行号、没有自动缩进、没有语法高亮。这些都可以在用户主目录下的.vimrc文件里配置。我自己的基础配置长这样set number set relativenumber set autoindent set smartindent set tabstop4 set shiftwidth4 set expandtab set hlsearch set incsearch set ignorecase set smartcase set showcmd syntax on简单解释一下几个关键项set number显示行号set relativenumber显示相对行号配合数字跳转会非常高效set expandtab让Tab键自动展开成空格避免混用Tab和空格导致的缩进问题set hlsearch开启搜索高亮set incsearch边输入边搜索这两个搭配用体验提升明显。配置完.vimrc后用:source ~/.vimrc让配置立即生效或者重启vim。注意.vimrc只对vim生效如果你系统里的vi是原始vi它不会读取这个文件所以还是那句话能装vim就装vim。7.2 多文件编辑与分屏少开几个终端的技巧日常运维时经常需要同时看多个文件比较两个配置文件差异或者一边看日志一边改配置。vi的分屏功能非常实用。:sp filename水平分屏打开文件:vsp filename垂直分屏打开文件Ctrlw w在分屏之间切换光标Ctrlw q关闭当前分屏如果已经打开一个文件想再打开另一个文件到新分屏直接用上面命令指定文件路径即可。分屏的好处是不用来回退出切换尤其是在改配置时需要参照另一个文件时效率提升非常明显。多文件编辑还有一种场景启动时一次打开多个文件比如vi file1 file2然后用:bn切换到下一个文件:bp切换到上一个文件:ls查看当前打开的文件列表。不过我觉得分屏比这种隐藏切换更直观也更容易上手。7.3 可视化模式批量操作的最佳帮手可视化模式是vim独有的功能原始vi没有。它的作用是先用一种方式选中文本再执行操作。按v进入字符选择模式按V进入行选择模式按Ctrlv进入列块选择模式。选择好范围后可以按d删除、按y复制、按缩进。我最常用的是列块模式。举个例子一个文件里有五行配置我需要同时在每行行首加一个#注释符。在普通模式下按Ctrlv用j往下选中五行然后按I进入插入模式输入#最后按Esc五行的行首会同时出现注释符。这个操作在批量注释、批量修改对齐格式时特别好用比逐行修改快了不止一个数量级。7.4 我养成vi习惯的几个心得vi这个编辑器有一个特点只要入了门形成肌肉记忆之后你基本不会再想回到图形编辑器里慢慢找菜单。我给你几个亲测有效的方法第一强制自己一周内所有文件都用vi编辑不要用nano或gedit替代模式切换很快就会形成身体记忆第二每次进入文件后先按Esc再思考下一步避免“不知道自己在哪个模式”的混乱第三不要一开始就追求各种花哨的插件先把手感练出来再谈扩展。常用命令不需要背用多了自然就记住了。我后来发现自己记住的不是某个命令而是“我想删除一整个单词”这个意图对应dw这种意图和动作之间的条件反射才是vi真正的效率来源。还有一点vi并不是把所有编辑任务都变得更快而是让你在纯键盘环境下也能保持完整的编辑能力。对于Linux服务器运维来说很多时候你面前只有一个SSH终端没有图形界面可用vi就是最后一道保障。把基础操作练扎实你就能在任何Linux环境里从容地处理文件不会因为编辑器不会用而束手无策。