Linux vi编辑器核心用法与实战技巧详解 📅 发布时间:2026/9/7 19:46:52 👁 浏览次数: 用了这么多年Linuxvi编辑器几乎是绕不开的一道门槛。哪怕现在有VS Code远程插件、有各种现代化的图形化IDE一旦你登录到服务器、进到容器里、或者处理嵌入式开发板上的文件vi和它的增强版vim仍然是那个最稳定、最通用的存在。很多新手刚接触vi时体验很差进去之后不知道怎么输入文字不知道怎么保存退出甚至只能直接关掉终端重来。这篇文章我就从实际操作的角度把vi编辑器的核心用法、常见坑和效率技巧完整梳理一遍希望你看完之后能真正把它用起来而不是停留在“会用方向键移动光标”的阶段。这篇文章的内容适合谁刚接触Linux的运维新人、做嵌入式开发的工程师、需要频繁登录服务器处理配置文件的开发者以及那些已经在用vi但总觉得不顺手、想提升编辑效率的人。文章会从模式概念讲起逐步深入到高频命令、查找替换、多文件协作、配置调优最后整理我实际踩过的坑和排查思路。每个命令我都会说明它的作用、使用场景和背后的原因让读者不仅会点还能理解为什么这么用。1. 内容整体设计与思路拆解1.1 为什么vi编辑器值得花时间学vi的全称是Visual Interface由Bill Joy在1976年编写最初是BSD Unix的一部分。经过几十年演进现在几乎所有Linux发行版都内置了vi或它的增强版vimVi IMproved。你可能会说我用nano不也能编辑文件吗为什么非要学vi实际遇到的那些场景会告诉你答案。我经常需要在没有图形界面的服务器上修改Nginx配置、写systemd服务文件、调整Crontab任务这些场景下vi几乎是默认存在的编辑器。更关键的是vi的设计哲学是“手指不离开键盘”所有操作都通过快捷键完成在SSH连接、串口终端等环境下这种无鼠标操作方式效率极高。而且由于vi是POSIX标准的一部分你在任何Unix-like系统上都能找到它学习一次终身受用。还有一个容易被忽略的点vi在资源占用上极其克制。在嵌入式设备或者配置很低的云服务器上启动一个vim只需要几MB内存而打开一个VS Code动辄几百MB甚至上GB。我曾在只有512MB内存的机器上部署服务用vi编辑配置文件是唯一顺畅的选择。同时vi支持几乎所有的文本编码、文件格式和语法高亮从简单的.txt到复杂的代码文件都能处理。1.2 vi编辑器VS其他常见编辑器的差异拿nano、gedit和VS Code来对比vi最独特的地方就是“模式”设计。nano没有模式概念打开就能打字VS Code通过快捷键组合实现编辑功能vi则把编辑过程拆分成多种模式每种模式负责不同的操作类型。初学者觉得模式绕但一旦习惯之后你会发现这种设计其实极其高效——它把“移动光标”“选择文本”“执行命令”这些动作彻底分离开减少组合键冲突操作也更专注。举个例子在nano里想删除多行文字你需要反复按删除键但在vi的命令模式下输入dd就能删掉当前行输入5dd就能删掉从当前行开始往下的5行。这就是模式化操作的力量相同的手指动作在不同模式下代表不同含义学习成本虽然略高但熟练后的效率是指数级提升的。不过也要实话实说vi的学习曲线确实比较陡峭。很多新手在实际使用中遇到的困惑不是命令不够用而是“不知道当前处于什么模式”“不知道按了什么键导致进入奇怪状态”。所以掌握vi的关键第一步就是把三种模式彻底搞明白搞清楚模式之间的切换逻辑。接下来我就详细拆解这部分。2. vi编辑器核心细节解析与实操要点2.1 三种模式的本质逻辑与切换方法vi总共有三种基本模式命令模式Normal Mode、插入模式Insert Mode和末行模式Last Line Mode也有叫命令行模式的。可能你在网上还会看到可视模式Visual Mode的说法那是vim对vi的扩展后文会单独讲。命令模式是vi的默认模式也是所有编辑操作的入口。启动vi后你处于命令模式此时键盘上几乎所有按键都是命令而不是输入文本。比如按j是向下移动一行按x是删除光标处字符按yy是复制当前行。这种设计让你的手指不必移动很远就能完成大量操作减少切换成本。插入模式是真正输入文字的状态。要进入插入模式在命令模式下按i在光标前插入、a在光标后插入、o在当前行下方新增一行、O在当前行上方新增一行都可以。这个模式很容易理解你输入什么屏幕上就出现什么跟普通编辑器的行为一致。末行模式用于执行文件级操作保存、退出、查找、替换、设置参数等。在命令模式下按冒号:就进入末行模式此时光标跳到屏幕最底部可以输入命令。比如:w保存、:q退出、:wq保存并退出、:q!不保存强制退出。模式切换的核心逻辑就一句话默认在命令模式想输入文字就进入插入模式想执行全局操作就进入末行模式想返回就按Esc键。Esc键是所有模式的“回退键”无论如何操作按Esc总能回到命令模式。注意当你不确定当前处于什么模式时不要乱按先按几次Esc回到命令模式再继续操作。这是新手最需要养成的习惯。2.2 光标移动效率提升的基础很多新手在vi里习惯用方向键移动光标这样不是不行但效率很低。vi提供了更精细的移动方式学习之后你会发现手不用离开字母区就能快速定位。基础移动对应关系h向左、j向下、k向上、l向右这四个键在键盘上正好是相邻的适合盲打状态下操作。很多人不理解为什么不用方向键核心原因是vi诞生在键盘没有独立方向键时代的终端上使用字母键可以避免手在键盘上大范围移动从而保持输入节奏。进阶移动就更有意思了。按w跳过下一个单词开头按b回到上一个单词开头按e跳到当前单词结尾这些都是词级移动。按0跳到行首按$跳到行尾。按gg跳到文件开头按G跳到文件末尾按nG跳到第n行。如果你编辑的是代码文件按%可以在左右括号之间跳转这个在调试逻辑时特别有用。还有一个效率利器搜索定位。在命令模式下按/然后输入关键词回车后光标会跳到第一个匹配位置按n跳到下一个按N跳到上一个。配合?向前搜索这套定位方式比肉眼滚动屏幕快得多。如果你要跳转到某个函数定义处用/function_name回车再按几次n精准定位整个过程不超过3秒。2.3 核心编辑操作插入、删除、复制、粘贴、撤销掌握了移动接下来就是核心编辑操作。这些操作全部在命令模式下完成熟练之后编辑效率至少翻倍。删除操作x删除光标所在字符类似于Delete键dw删除从光标到单词结尾d$删除从光标到行尾dd删除整行。这些命令遵循一个通用逻辑操作符移动范围。d是删除操作符后面跟移动动词就组成完整命令。理解了这一层d2w删除两个单词、d3d删除三行就不难理解了。复制和粘贴yy复制整行y$复制从光标到行尾yw复制一个单词。粘贴命令是p在当前光标后粘贴和P在当前光标前粘贴。这套命令逻辑和删除完全一致只是把字母d换成yyank的缩写。撤销和重做u撤销上一步操作Ctrl r重做。也许你会觉得这个没什么特别但在实际操作中u几乎是我使用频率最高的命令之一误操作全靠它救场。vi甚至支持无限次撤销vim默认就算你连续删了几十行也能一步步恢复回来。实操心得删除和复制前先想清楚范围用v进入可视模式移动光标选中文本后再按d删除或y复制这种方式对文本块操作最直观。可视模式是vim的一个亮点按v进入字符选择模式按V进入行选择模式按Ctrl v进入列选择模式块选择处理表格、代码块对齐时非常好用。2.4 保存退出每个新手的第一道坎vi被吐槽最多的就是“不知道怎么退出”。其实保存退出非常简单核心就是末行模式下的几个命令:w保存当前文件但不退出:q退出当前文件:wq或ZZ保存并退出:q!放弃所有修改强制退出:wq!强制保存并退出。这里要特别解释:q!和:wq!的区别。当文件被修改但你不想保存时用:q!放弃保存退出。当文件是只读属性或你当前用户没有写权限但你知道必须修改时用:wq!强制保存。注意强制保存也不是万能的——如果文件系统本身是只读挂载的仍然会报错这个在排查问题时需要留意。还有几个使用频率高的变体:w /path/to/newfile另存为其他文件:saveas /path/to/newfile以新文件名保存:r /path/to/otherfile把另一个文件内容插入到当前光标位置。如果你是系统管理员:w !sudo tee %这个组合命令值得记住——当你以普通用户打开一个需要root权限修改的文件时可以用这个命令直接提权保存省去重新用sudo打开文件的麻烦。3. 实操过程与核心环节实现3.1 高频文本操作查找与替换的完整指南编辑配置文件时查找和替用是最常见的需求。vi的查找功能前面已经提到这里重点说替换。在末行模式下输入s/old/new/g会把当前行内所有old替换成new。如果要在整个文件中替换就在前面加%%s/old/new/g。要指定行号范围比如只在第10到第20行替换:10,20s/old/new/g。这里的s是substitute替换的缩写g是global全局意思是每行内所有匹配都替换不加g的话每行只替换第一个匹配。还需要了解几个常用的标志位cconfirm替换前逐个询问是否替换用于批量操作时避免误替换iignore case忽略大小写进行匹配Iexact case区分大小写默认就是区分大小写组合使用%s/Error/错误/gc意思是全文件把“Error”替换成“错误”每个匹配位置都会询问是否执行这样最安全。还有一个技巧是用\c在搜索时临时忽略大小写比如/nginx\c会匹配Nginx、NGINX、nginx等。这个在处理日志文件时特别有用。实操心得做全文件替换前我习惯先执行%s/old/new/gc带确认的版本快速浏览一遍所有匹配位置再按a全部替换确认。这样既能保证替换准确又不会反复确认影响效率。3.2 多文件操作与缓冲区管理vi不只是单文件编辑器它也能同时打开多个文件。在启动时传入多个文件名vi file1.txt file2.txt file3.txt。默认打开第一个文件使用:n切换到下一个文件:prev回到上一个文件。同时打开多个文件的另一种方式是用:split或:vsplit切分窗口。:split file2.txt水平切分显示两个文件:vsplit file2.txt垂直切分。窗口之间用Ctrl w加方向键切换。这种多窗口布局适合一边参考配置一边编辑另一个文件或者边看日志边修改代码。还有一个重要的概念是缓冲区buffer。每次打开的文件都会存在缓冲区里使用:ls查看所有缓冲区列表:buffer 2切到编号为2的缓冲区。缓冲区机制让你可以在不退出vi的情况下切换多个文件比连续打开关闭文件高效很多。多文件操作中跨文件复制粘贴也很有用。在文件A中yy复制然后Ctrl w切到文件B按p粘贴文本就跨文件传输了。这比终端里切换会话复制粘贴快得多。3.3 个性化配置打造自己的vim环境vim之所以比vi更受欢迎很大程度上是因为它支持个性化配置。配置文件通常在用户目录下~/.vimrc。如果你用的是vi而不是vim可能没有这个文件但现代Linux发行版中的vi通常都是vim的别名。一个最小化的.vimrc可以设置以下内容set number 显示行号 set relativenumber 相对行号vim 7.4以上版本支持 set tabstop4 Tab键显示的宽度 set shiftwidth4 自动缩进宽度 set expandtab 用空格代替Tab键 set hlsearch 搜索结果高亮 set incsearch 输入搜索词时实时匹配 set ignorecase 搜索时忽略大小写 set smartcase 如果搜索词含大写字母则区分大小写 set autoindent 自动缩进 set cursorline 高亮当前行 set paste 粘贴时保持原格式或者用paste模式切换 syntax on 语法高亮 filetype on 文件类型检测这些配置能够明显改善使用体验。比如set number让行号显示出来:n跳转时你就能清楚地知道自己在文件中的位置set expandtab避免了在Python文件中混用Tab和空格导致的缩进错误set hlsearch让搜索结果高亮显示不再需要在长文件中费力寻找当前匹配位置。更高级的配置还包括set runtimepath~/.vim/bundle/...配置插件路径set termguicolors启用真彩色终端颜色map 键位映射自定义快捷键关于键位映射举个例子map F5 :wCR把F5设置为保存文件map F9 :nohCR取消搜索结果高亮。这些配置依据个人习惯而定不必追求复杂先满足自己的需求最重要。注意修改.vimrc文件后在vim中执行:source ~/.vimrc或者重开vim就能生效。如果在.vimrc中写了无效命令vim可能启动报错这时用vim -u NONE启动可以跳过所有配置进入干净环境排查问题。3.4 可视模式与块操作批量编辑的利器前面提到过可视模式这里展开说一下。它本质上是vim对标准vi的扩展是日常批量编辑最实用的工具。按v进入字符可视模式移动光标选中任意文本区域。按V进入行可视模式每次选中整行。按Ctrl v进入块可视模式按矩形区域选择文本。后两种模式在处理代码时尤其有用。块可视模式有一个典型用法批量注释。假设你要注释掉一个Python文件中第10到第20行首先按Ctrl v进入块选择然后移动光标到第10行的行首按j向下移动选中第10到第20行的行首列按I进入插入模式输入#按Esc。这时候vim会把#插入到所有选中的行首一次完成批量注释。取消注释类似进入块选择选中行首的#按x删除。行可视模式适合大段移动。按V选中多行按d剪切移动光标到目标位置按p粘贴。这比逐行操作效率高太多。比如你想把配置文件中某段参数从文件尾部挪到文件头部用行可视模式选中那段d剪切gg跳到文件头部p粘贴几秒完成。块操作还有一个实用场景是批量添加缩进。选中多行后按右缩进按左缩进。Python代码调整层级结构时这个操作能节省大量时间。4. 常见问题与排查技巧实录4.1 启动异常与编辑器崩溃恢复使用vi最崩溃的瞬间可能是在编辑重要配置文件时因为SSH掉线、终端崩溃或者误操作导致vim异常退出。重启后打开同一个文件你可能会看到类似这样的提示Swap file filename.swp already exists! [O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:这个.swp文件是vi在编辑过程中自动生成的交换文件用于崩溃恢复。文件名规则是当前文件名前加.后加.swp。比如编辑nginx.conf时交换文件是.nginx.conf.swp。遇到这个情况的正确排查顺序先按R恢复Recovervim会尝试从交换文件恢复未保存的内容恢复后执行:wq保存理想版本手动删除交换文件rm .nginx.conf.swp再重新打开文件确认一切正常如果确定不需要恢复可以直接按D删除交换文件然后打开。但要注意如果当前文件还有另一个vim实例在编辑千万不要删交换文件否则可能丢失另一个实例的未保存数据。实操心得每次SSH连接不稳定、或者要在远程服务器上编辑重要文件前我会先执行:set noswapfile临时关闭交换文件生成或者编辑完及时:w保存。但如果是正常编辑建议保留交换文件功能它确实是崩溃时的最后一道保险。4.2 中文乱码与编码问题排查在Linux下用vi编辑中文文件经常碰到乱码这种问题通常和终端编码、文件编码、vim内部编码三者不一致有关。最简单的解决办法是在.vimrc里加上全局编码设置set encodingutf-8 set termencodingutf-8 set fileencodingsutf-8,gbk,gb2312,gb18030,latin1这三行配置的含义分别是vim内部使用UTF-8编码终端输出使用UTF-8编码打开文件时按这个顺序依次尝试文件编码匹配成功即采用。加了这些配置后用vim打开UTF-8、GBK编码的中文文件基本都能正常显示。如果打开某个文件仍然乱码可以用:set fileencoding?查看当前文件编码用:e encgbk重新以GBK编码加载文件看是否能正常显示。如果确认文件是GBK编码而你想转换为UTF-8可以使用:set fileencodingutf-8然后:w保存vim会帮你完成编码转换。还要注意一个常见误操作在插入模式下粘贴中文时出现乱码通常是因为终端和vim的编码不一致。解决办法是使用vim的paste模式在命令模式下执行:set paste然后进入插入模式粘贴粘贴完成后再:set nopaste恢复。这能避免vim重新缩进导致的格式混乱和编码显示问题。4.3 自动缩进与粘贴格式错乱编辑代码文件时从外部复制一段代码粘贴到vim中经常遇到代码被自动缩进得乱七八糟的情况。比如粘贴一个缩进好的Python函数保存后发现每一行都比上一行多出几个空格。根本原因是vim默认开启了autoindent粘贴时它会自动对每一行重新缩进。解决有几种方式临时关闭自动缩进:set noautoindent粘贴完成后再恢复:set autoindent使用粘贴模式:set paste这个命令会自动关闭很多自动格式化功能粘贴后:set nopaste使用系统剪贴板寄存器p直接从系统剪贴板粘贴绕过vim内部处理这几种方式里我推荐第三种。如果vim支持系统剪贴板现代Linux发行版默认支持p粘贴的内容不会经过vim的自动格式化处理是最干净的方式。使用前可以用:echo has(clipboard)检查vim是否支持剪贴板返回1就表示支持。4.4 后台任务与编译运行的配合在实际开发中vi经常与编译、运行任务配合使用。比如你打开一个C源文件修改完想编译运行。传统操作是退出vi执行gcc再重新进入vi继续修改循环往复效率很低。更好的方式是在vi的末行模式中直接执行命令。:!gcc -o hello hello.c可以执行编译命令:!./hello运行程序:!ls查看文件列表。:!的意思是在shell中执行后面的命令执行完后按回车返回vi。这个功能还支持命令替换与过滤。例如用:%!sort对当前文件内容按行排序用:%!python -m json.tool对JSON文件格式化:%!grep nginx只保留包含nginx的行再替换回当前文件。:!配合操作系统命令能实现很多第三方编辑器才有的功能。如果需要在vi中分屏终端vim 8.0以上版本有内置终端:terminal或:term打开一个内置shell面板用Ctrl w切换窗口比退出vi另开一个终端方便得多。在嵌入式开发或者远程服务器场景下这种“编辑器内嵌shell”的组合方式非常实用。4.5 模式混淆与误操作的急救指南最后说一个每个vi新手都遇到过的问题按了某些键后突然进入了很奇怪的状态无论输入什么屏幕都没有反应或者光标位置不断变化最后甚至不知道该按什么键恢复正常。这个问题的本质通常是你无意中进入了某种模式比如按了Ctrl v进入块可视模式或者按了:但输入了半截命令或者按了/但没输入搜索词就回车了。正确的急救流程先按几次Esc确保回到命令模式如果屏幕底部有冒号后跟半截命令按Ctrl c取消当前命令如果底部出现-- INSERT --之类的模式提示按Esc退出如果按了/或?后卡在搜索状态按Ctrl c退出搜索如果实在不知道状态输入:q!回车强制退出不保存重新打开文件再编辑我见过很多新手在vi里误按Ctrl s导致终端“冻结”以为程序卡死了。其实Ctrl s是终端流控制命令暂停屏幕输出按Ctrl q恢复。这个和vi本身无关但在vi中使用特别容易误触尤其是在习惯使用Ctrl组合键的人身上。遇到屏幕突然不刷新时先试试Ctrl q再考虑其他操作。备忘如果你按了:q!还是无法退出可能是终端设置的Readline快捷键干扰了vim的映射。试试先按Ctrl c取消当前操作然后按Esc回到命令模式再执行:q!。5. 学习路线与效率提升建议5.1 从vi到vim功能扩展的取舍前文提到vim是vi的增强版两者大部分基本命令兼容但vim增加了更多功能。常见发行版中/usr/bin/vi 可能是 vi 也可能是 vim.tiny一个裁剪版vim。如果你想要完整vim功能通常需要安装vim包apt install vim、yum install vim或dnf install vim。安装后建议确认一下vim --version看看支持的feature。vim相对vi增加的最有价值功能包括语法高亮syntax on多级撤销不只是最近一次操作可视模式前面详细讲过插件系统Vundle、vim-plug等分屏窗口内置终端vim 8.0异步任务控制但也要注意vim的功能增加也带来了复杂性。在生产服务器的vi上我通常保持着标准vi工作流只动最基础的命令在本地开发环境才充分使用vim的高级特性。这种场景化的取舍很重要——你不需要在任何环境下都使用完整功能只要能高效完成当前任务就行。5.2 常用命令速查表贴在工位上的一张纸这里整理一份我平时用得最多的命令速查表你可以复制保存用一段时间后基本就烂熟于心了。分类命令作用模式切换i/a/o在光标前/后插入、新行插入模式切换Esc返回命令模式移动hjkl左/下/上/右移动移动wbe按词移动下个单词开头/上个单词开头/词尾移动0$跳到行首/行尾移动ggGnG跳到文件头/文件尾/第n行删除xdddwd$删字符/删行/删词/删到行尾复制粘贴yyy$pP复制行/复制到行尾/粘贴后/粘贴前撤销uCtrl r撤销/重做查找/word?word向后/向前搜索查找nN下一个匹配/上一个匹配替换:s/old/new/g当前行替换替换:%s/old/new/g全文件替换替换:%s/old/new/gc全文件替换带确认保存退出:w:q:wq:q!保存/退出/保存退出/强制退出多文件:n:prev下一个文件/上一个文件多文件:split:vsplit水平/垂直分割窗口外部命令:!ls执行外部命令ls文件处理:r file读取file内容插入当前光标处设置:set number:set nonumber显示行号/取消行号这张表看起来内容多但真的不需要死记硬背。我的建议是先掌握最核心的iEscddypu:wq然后在日常编辑中逐步增加新命令。每周熟悉一两个新命令两个月下来基本就能流畅使用了。5.3 从编辑器思维到vim思维实际使用中需要跨越的坎用vi一段时间后你会发现它跟现代编辑器最大的区别不是操作方式而是思维模式。现代编辑器是“可视化操作”思维看到什么选什么鼠标点到哪里改哪里。vi是“命令式操作”思维用文本命令描述你要做的修改比如“跳到下一个单词结尾”“删除从光标到行尾的内容”“把第3到第8行缩进”。这种思维转换对很多人是颠覆性的。刚开始可能会问为什么要这么绕直接鼠标拖选复制不就行了但在没有鼠标的终端环境里命令式操作的效率和精确度是可视化操作无法比拟的。举个例子你要把文件中所有localhost:8080改为127.0.0.1:9000鼠标操作可能需反复查找替换几十次而vi只需要一条命令:%s/localhost:8080/127.0.0.1:9000/g。这种思维转变的核心是学会“用动词加宾语来描述操作”。删除是d移动是w、e、$、gg组合起来就是dw、d$、dgg。复制是y组合起来是yw、y$、ygg。当你掌握了这套组合逻辑你会发现vi的命令不是一个个孤立的快捷键而是一套可以无限组合的语法体系。到这一步vi才真正成为你手上顺手的工具而不是需要死记硬背的负担。根据我的使用经验很多“vim高手”并不是记住了多少冷门命令而是熟练掌握了这套组合语法能根据场景即兴拼出合适的操作命令。希望这篇分享能帮所有正在学习vi的朋友跨过这道坎真正体会到这种高效编辑方式的乐趣。6. 最后一次建议从今天开始把所有测试文件都用vi打开给所有刚入门的读者一个最实用、最直接的行动建议从今天开始凡是需要修改文本文件的场景刻意强迫自己用vi打开不要退回nano或图形界面编辑器。先掌握i进入编辑、Esc返回命令模式、:wq保存退出这三板斧再逐步增加新命令。坚持两周你会发现自己对vi的恐惧感消失了坚持一个月大部分常用命令已经能本能使用。我个人的体会是vi学习的最大障碍不是命令太多记不住而是缺少一个“逼自己使用”的环境。很多人在服务器上被vi折磨一次后立刻转头去装nano、装图形化编辑器、装远程插件结果永远没有跨过最初的适应期。但如果坚持下来当你习惯了“手不离键盘不做多余动作”的编辑方式后你会发现在终端里处理文本的效率真的可以是惊人的。这也解释了为什么在今天这样一个图形化工具满天飞的时代vi仍然是Linux世界里不可替代的存在。