1. 为什么今天还值得花时间学vi
说句实话,在2025年还在教学vi,听起来确实有点像在教人用算盘。但如果你真的在命令行环境里工作过哪怕一个星期,你就会明白vi从来就没有退出过历史舞台,它只是安静地躺在每一台Linux服务器的某个角落里,等着你某天SSH上去改配置时不得不面对它。
我最早接触vi是被逼的。当时要给一台无图形界面的服务器改nginx配置,手边只有PuTTY窗口,nano都没装,输入vi /etc/nginx/nginx.conf之后,界面进了,但我完全不知道该怎么输入文字。光标在闪,键盘敲了半天没有任何反应,我一度以为是服务器卡死了。后来才知道,vi默认处于命令模式,你敲的字母不是在输入文字,而是在输入"命令"。这种设计在今天看来确实反直觉,但一旦理解它的底层逻辑,就会发现vi的效率远超大多数现代编辑器。
这篇内容不是什么权威教程,更像是我把自己用过vi这几年踩过的坑、养成的习惯、以及带新人时反复讲的东西做一次系统梳理。不追求面面俱到,但保证你读完能解决两个最核心的痛点:第一,能在vi里自如地编辑文件而不被卡住;第二,理解vi的设计思维,让它真正成为你的工具而不是拦路虎。
无论你是运维工程师、后端开发、数据分析师,还是偶尔需要在服务器上改个配置的普通程序员,这篇文章都适用。我会从模式概念讲到高频命令,再到真实场景中的完整操作流程,最后说几个我自己摸索出来的、网上很多教程不会写的小技巧。
2. vi的两个模式真相:先解决"怎么退出"这个世纪难题
2.1 模式化设计的底层逻辑
打开vi的一瞬间,你面对的不是一个空白的输入框,而是一个处于"待命状态"的编辑器。这是vi与Windows记事本、macOS TextEdit等模态化编辑器最本质的区别。几乎所有新手都问过同一句话:"我怎么退出vi?"这个问题的根源就在于不理解模式的存在。
vi有且仅有两种核心模式:命令模式和插入模式。
命令模式是vi的默认状态,也是它的"主战场"。在这个模式下,你敲下的每一个键都被解释为命令——j代表向下移动光标,x代表删除当前字符,dd代表删除整行。这不是为了折磨新手,而是为了让你双手不离开键盘主区域就能完成所有编辑操作。
插入模式才是真正输入文字的状态。进入插入模式的方式有很多种,最常见的按i键。一旦进入插入模式,vi的行为就和普通编辑器基本一致,你可以正常打字、删除、换行。按Esc键则返回命令模式。
这个设计的巧妙之处在于:编辑文本这个动作,其实包含了两类完全不同性质的操作——指挥(命令)和输入(内容)。传统编辑器把这两者混在一起,你必须额外使用鼠标、菜单、快捷键组合(比如Ctrl+C、Cmd+S)来区分。vi干脆用模式把它们彻底分开,让你在命令模式里高效指挥,在插入模式里专注输入。就像开车一样,方向盘是方向盘,油门是油门,模式本身就是一种防呆设计。
提示:新手最常见的困境就是忘记自己在哪个模式。记住一句话就够了——看到屏幕左下角显示"INSERT"就是插入模式,没显示就是在命令模式。
2.2 退出vi完整手册
网上有个经久不衰的段子:Stack Overflow上面浏览量最高的问题之一,就是"How do I exit the Vim editor?"。这背后是无数人真实的崩溃体验。这里直接把退出方案列全,你以后不管遇到什么状态,都能找到对应的出口。
正常退出(文件已保存):
- 确保在命令模式(按
Esc) - 输入
:q然后回车
需要保存修改后退出:
- 在命令模式输入
:wq然后回车
无论怎么改都不想保存,强制退出:
- 在命令模式输入
:q!然后回车
保存但不退出:
- 命令模式输入
:w然后回车
如果进入了一些奇怪的状态:
| 屏幕状态 | 原因 | 恢复正常的方法 |
|---|---|---|
| 左下角显示"INSERT" | 处于插入模式 | 按Esc回到命令模式 |
| 左下角显示":"开头的信息 | 处于末行模式 | 按Esc取消 |
| 显示"E37: No write since last change" | 有未保存修改 | :q!强制退出 |
| 显示"E32: No file name" | 文件还没命名 | :w 文件名指定名称保存 |
进入了Ex模式(屏幕底部出现:提示符) | 误按Q键 | 输入:visual回车恢复 |
这套表基本覆盖了99%的卡死场景。我的建议是:作为新手,Esc键是你的逃生通道,不管你在什么状态,连按两下Esc通常都能回到命令模式的安全地带。
2.3 从"vi是什么"到实践的最小闭环
如果你在服务器上只想做一件最简单的事——打开文件、改一行内容、保存退出,完整流程是这样的:
vi /etc/hosts进入文件后,光标停在第一行。假设你要改第一行的IP地址:
- 按
i进入插入模式(光标前插入) - 把IP地址修改好
- 按
Esc退回命令模式 - 输入
:wq回车,保存并退出
就这么简单。等你完整跑通这个流程,vi的学习就算迈过了最大的门槛。剩下的所有操作都是在"命令模式下的快捷操作"和"插入模式下的不同进入方式"上面做文章。
3. 命令模式才是vi的灵魂:移动、删除、撤销一篇讲透
3.1 光标的四向移动与跳跃式定位
很多人用了vi好几年,翻页还是靠方向键,移动还是靠长按↓。这虽然能完成任务,但和vi的设计初衷背道而驰。vi在命令模式下提供了极其高效的字符级移动方案,核心键位是h(左)、j(下)、k(上)、l(右)。这组键位把右手食指和小指的移动范围控制在最小半径内,让你不必把右手从主键区挪到方向键区,长期下来速度差异相当明显。
不过真正拉开效率差距的,是vi的"跳跃式"移动:
w:跳到下一个单词的开头b:跳到当前单词或上一个单词的开头e:跳到当前单词的末尾0:跳到当前行行首^:跳到当前行第一个非空白字符$:跳到当前行行尾gg:跳到文件第一行G:跳到文件最后一行Ctrl + f:向下翻一页Ctrl + b:向上翻一页/关键词:搜索,n跳到下一个匹配,N跳到上一个匹配
这些移动命令的重要性,我怎么强调都不过分。我见过有人用vi改一个500行的配置文件,光是滚动光标就花了5分钟;而熟练者用gg跳头部、G跳尾部、/关键词直接定位,全程不超过30秒。差别不在手速,在于是否理解vi把"移动"当成一种检索行为,而不是滚动行为。
技巧:
数字+命令是vi中非常强大的组合。比如输入5j,光标向下跳5行;输入3w,向右跳3个单词。这对熟悉排版的人来说极其直观,好像英文写作里数着词移动一样。
3.2 删除不再用退格键
命令模式下的删除操作让你彻底摆脱长按退格键的噩梦:
x:删除光标所在位置的字符X:删除光标前面的字符dd:删除当前整行d$:删除从光标位置到行尾的所有内容d0:删除从光标位置到行首的所有内容dw:删除光标所在单词5dd:从当前行开始,向下删除5行
如果删除操作做错了,别慌:
u:撤销上一步操作Ctrl + r:重做(撤销的撤销)
vi的撤销粒度和普通编辑器不同。普通编辑器通常按字符撤销,vi按命令撤销。你执行了一次dd删除整行,按一次u就整行恢复。这个设计在某些场景下是优势,比如你误删了一大段代码,一次u就全部回来。但也意味着当你在插入模式下连续输入了500个字,再按u,这500个字会一次性被撤销掉。如果你只想要撤销最后几个字,需要进入命令模式再手动处理。
3.3 复制粘贴与搜索替换
复制粘贴在vi中叫做"yank"和"put",因为操作概念来自物理世界——掰下一段,放在别处。
yy:复制当前行yw:复制当前单词p:粘贴到光标之后/下一行(取决于复制的是字符还是整行)P:粘贴到光标之前/上一行
复制粘贴组合起来的典型场景:你有一段重复的配置要写三次,先yy复制第一段,然后光标移到第二个位置,按p粘贴,再移到第三个位置再按一次。注意,vi的粘贴默认使用一个名为"无名寄存器"的暂存区,也就是说你复制的文本会覆盖之前复制的文本,没有历史记录。不过vi真正强大的地方在于命名寄存器("a到"z),后面我会细讲。
搜索替换是vi的高频操作之一,语法遵循末行命令的格式:
:s/旧文本/新文本/ " 替换当前行第一个匹配 :s/旧文本/新文本/g " 替换当前行所有匹配 :%s/旧文本/新文本/g " 替换整个文件所有匹配 :%s/旧文本/新文本/gc " 逐个确认替换(会逐个询问) :2,10s/旧文本/新文本/g " 替换第2行到第10行我在改代码里的大批量节点名时,最常用的就是:%s/oldname/newname/g这条命令。它等价于很多IDE里的"全文件查找替换",但不需要鼠标操作,输入完一回车就完事。如果担心误替换,加c参数逐条确认,这在公开文本里替换时相当有用。
3.4 进阶移动:可视块选择与多文件编辑
vi还有一个宝藏功能——可视模式(Visual Mode)。在命令模式下按v进入字符可视模式,按V进入行可视模式,按Ctrl + v进入块状可视模式。块状可视模式最为惊艳,它允许你像在Excel里拖动框选一样,选中任意矩形区域的文本。选中后可以执行:
d删除选中的块y复制选中的块I在选中的每一行开头插入相同内容(先按I,输入内容后按Esc)
这个"批量行首插入"功能简直是我们改配置文件的救星:比如说给20行注释加#前缀,无需一行行改,直接块选这20行的开头,按I输入#回车,20行一次性搞定。操作路径:Ctrl + v进入块模式,方向键选中多行开头区域,按I,输入内容,按Esc。停,这里有个坑——输入内容后必须按Esc,修改才会应用到所有选中的行。我一开始不知道这个细节,输入完直接移动方向键,结果只改了一行。这种怪异行为让新手相当困惑,但一旦记住这个"先用Esc确认"的逻辑,之后就顺手了。
多文件编辑也是被很多人忽略的功能。vi可以同时打开多个文件,用:e 文件名在当前窗口打开新文件,用:n切换到下一个文件。如果你有3个文件需要同步修改,可以在启动时直接写好:
vi file1.txt file2.txt file3.txt然后用:n依次切换。如果担心改动丢失,用:wall一次性保存所有文件,再用:qall全部退出。这比开多个终端窗口省事多了。
4. 插入模式的下车方式:i、I、a、A、o、O之间的细微差别
4.1 六个入口,实用场景各有不同
插入模式有六个主要入口命令,它们决定了你在插入前光标如何定位。理解这几个键的差异,能让你的操作精准得像墙上打孔一样——不多一分,不少一毫。
i:在光标当前位置前插入。最常用,进入插入模式后直接在当前位置开始打字。I:在当前行行首插入。适合在行首添加代码或注释前缀。a:在光标当前位置后插入。比如你想在括号后面补一个参数,光标还在括号里,按a光标跳到括号后面再进入插入模式。A:在当前行行尾插入。这个是最常用但最容易被忽视的,因为它省去了先按$跳行尾再按i两步操作,直接A一步到位。o:在当前行下方另起一行并进入插入模式。适合在代码块之间新增一行。O:在当前行上方另起一行并进入插入模式。逻辑和o相反。
这六个键的规律其实很好记:小写是"光标当前位置附近",大写是"行首或行尾的意思更远一步";i和a是"在光标前后插入",I和A是"沿行首行尾插入",o和O是"另起新行插入"。
4.2 插入模式中的拼写与回退
进入插入模式后,很多人会习惯性地按方向键移动光标,这没有问题。但有一个小坑:在插入模式下按退格键(Backspace),不一定能删除上一个字符。vi中有一项设置叫backspace,默认仅允许删除"光标之前的内容",如果你在插入模式下想删除行首的字符,就会发现退格键没有反应。解决方案是在vimrc中配置:
set backspace=indent,eol,start这个配置允许在行首、行尾以及缩进区域使用退格键删除内容,体验上与普通编辑器一致。注意这是vim的设置,vi本身可能不支持,但绝大多数现代Linux系统的vi命令其实都指向了vim。在纯vi环境下,如果配置不生效,你仍然可以按Esc回到命令模式,用x删除单个字符。
4.3 一个容易混淆的细节:在插入模式下执行一次命令
键盘上Ctrl+o这个组合,在vi的插入模式下有一种神奇的效果:它让你临时执行一条命令,执行完成后再自动返回插入模式。比如你在插入模式编辑到一半,突然想起要看看文件路径,正常步骤是Esc、:pwd、回车、再按i回去。但用Ctrl+o,可以直接在插入模式中输入:pwd回车,然后自动回到插入模式,光标位置不变,输入状态不被打断。这像在驾驶途中临时看仪表盘,然后手自动回到方向盘上。这个技巧非常实用,但网上很少提到,我自己是用了大半年才偶然在一个论坛帖子里看到的。
5. 从vi到vim:现代开发者的必备配置
5.1 vi、vim、neovim的关系
很多人会问,我明明输入的是vi,为什么终端显示的是VIM?
在现代Linux发行版中,vi通常是一个指向vim(Vi Improved)的符号链接或替代程序。vim在vi的基础上增加了无数功能:语法高亮、多级撤销、可视化操作、插件系统等。而neovim是vim的一个现代化分支项目,采用新的代码架构,支持更灵活的配置语言和异步执行能力。对普通用户而言,你学的主角"vi"和vim的基本操作完全一致,迁移零成本。
查看当前实际使用的版本,命令是:
vim --version如果系统里只有vi没有vim,在Debian系可以用apt install vim安装,在RHEL系可以用dnf install vim-enhanced。
5.2 一份推荐的基础vimrc配置
如果你觉得vi的默认界面偏冷淡,一步一步优化即可。以下是一份经过实践验证的配置,能大幅提升体验,同时不改变vi的基本操作逻辑:
" 不兼容vi的经典模式,启用vim增强特性 set nocompatible " 显示行号 set number " 显示相对行号(当前行为0,上下行为1、2...) set relativenumber " 语法高亮 syntax on " 自动识别文件类型并启用插件缩进 filetype plugin indent on " 使用4个空格代替制表符 set expandtab set tabstop=4 set shiftwidth=4 " 显示匹配的括号 set showmatch " 搜索时高亮所有匹配 set hlsearch " 边输入边搜索 set incsearch " 启用鼠标支持(在终端中拖动选择) set mouse=a " 允许退格键跨行删除 set backspace=indent,eol,start " 开启系统剪贴板(需要vim编译时支持clipboard) set clipboard=unnamedplus " 显示当前文件名和状态 set laststatus=2 " 编码设置为UTF-8 set encoding=utf-8这份配置的每个选项几乎都对应一种"让vi更像现代编辑器但又保留其灵魂"的折中方案。注意clipboard这一行,如果你的vim没有编译剪贴板支持(用vim --version检查输出中是否有+clipboard),则该配置不生效。解决办法是安装vim-gtk或vim-gui-common这类带图形支持的版本。
5.3 插件:从基础到进阶
如果你要长期使用vim进行代码开发,插件是绕不开的话题。搭建一个简单的插件管理系统,在vim 8.0以上版本可以用内置的包管理器:在~/.vim/pack/目录下创建子目录,然后把插件克隆进去,vim启动时自动加载。
最经典的三件套:
- nerdtree:文件树侧边栏,按
F9显示文件列表 - ctrlp:快速文件搜索,按
Ctrl+p后输入文件名立即跳转 - vim-airline:美化状态栏,显示模式、分支、行列号
安装示例:
mkdir -p ~/.vim/pack/plugins/start git clone https://github.com/preservim/nerdtree.git ~/.vim/pack/plugins/start/nerdtree但我个人更推荐先不用插件,至少用纯vi操作一两个月,把这个编辑器的思维方式真正内化。如果一开始就装了文件树、代码补全这些重型插件,很容易陷入"用vim模拟IDE"的误区,反而失去了它轻灵的本性。工具是给人用的,合适就够了,不用整一堆花活。
6. 实操手记:用vi完成一次真实的服务器配置修改
纸上谈兵到这里,我决定用一个完整的实操场景串起前面所有知识点。情境:你新接了一台服务器,需要修改SSH服务的端口号(假设从默认的22改成22022),同时排查一个定时任务的配置问题。
6.1 第一阶段:定位与进入
vi /etc/ssh/sshd_config文件打开后,命令模式待命。先查看当前有多少个Port配置:
:/Port按n连续查找,发现默认的#Port 22被注释了。我们需要把它取消注释并修改。
光标定位到这一行,执行:^跳到行首(非空白字符),按x删除开头的#,按A跳到行尾,输入22022,按Esc,最后:wq保存退出。
这里用到的A键非常顺手:一次解决"跳行尾"+"进入插入模式"两个操作。如果不知道这个组合,就得先按$再按i,多两步。
6.2 第二阶段:验证与错误处理
当然,改完配置必须重启服务并验证:
ss -tlnp | grep 22022如果报错说端口被SELinux拦截,还需要调整SELinux端口规则。这种场景下,我会用vi打开SELinux的配置文件快速查看:
vi /etc/selinux/config把SELINUX=enforcing改为SELINUX=disabled(这属于生产环境的新手操作,实际上生产环境改SELinux需要谨慎评审,但这里仅作为演示vi用法)。执行gg跳文件头,/SELINUX搜索关键词,光标到达后按ciw(修改整个单词,这个组合后面会讲),输入disabled,Esc,:wq。
6.3 第三阶段:批量修改与多文件操作
接着排查某个定时任务脚本,这个脚本有多个文件都包含旧的日志路径/var/log/oldapp/,需要全部改成/var/log/neyapp/。此时多文件编辑就派上用场了:
vi /etc/cron.d/backup /etc/cron.d/cleanup /etc/cron.d/sync在当前文件执行:
:%s#/var/log/oldapp/#/var/log/neyapp/#g注意我用#作为分隔符而不是/,这是因为替换内容本身就包含/,用#可以避免转义地狱。这是vi中的一个小技巧:替换命令的分隔符可以是任意字符,只要内容里不冲突即可。
然后输入:n切换到下一个文件,同样执行替换,最后:wall保存所有文件,:qall退出。整套操作一气呵成,全程不需要鼠标,五秒都不到。
6.4 第四阶段:崩溃恢复——意外关闭后的救援
这里必须单独提一节,因为vi的崩溃恢复机制是每个运维人迟早需要用的。假设你正在编辑一个重要文件,突然终端卡死、SSH断连或者你直接把窗口关掉了,再次打开文件时会看到:
E325: ATTENTION Found a swap file by the name ".sshd_config.swp"这意味着vim检测到上一次编辑会话没有正常结束,产生了交换文件(swap file)。你可能记不清自己改了什么,或者想恢复那些未保存的修改,处理方式如下:
- 如果上次的修改还需要:输入
R(Recover),即可恢复到交换文件中的版本,然后:wq保存。 - 如果确定不需要上次的修改:输入
D(Delete),删除那个交换文件,再正常打开原文件。 - 如果想坚持用普通方式打开文件:输入
q退出,先手动处理交换文件。
交换文件一般以.+文件名+.swp形式存在于同目录下。恢复完成后,记得检查并删除它,否则vi每次打开这个文件都会报警告。
注意:有了这个机制,很多人在没保存的情况下直接关终端会手足无措。其实vi已经帮你保存了大部分输入到交换文件里,只要不随便删.swp,数据大概率是能找回来的。
7. 组合命令与实战心得:从"会用"到"用得顺"
到这一步,如果你已经掌握了上面提到的命令,基本日常操作是没有问题了。但"会用"和"用得顺"之间还有一段距离,关键在于组合。
7.1 复合指令:动词+数字+移动
vi命令的精髓在于"操作符+范围"的组合。操作符包括d(删除)、y(复制)、c(修改),范围可以是字符、单词、行、整个文件。当两者结合时,威力倍增:
ciw:修改当前光标所在的完整单词(Change Inner Word)。光标在单词中间时,ciw直接删掉整个单词并进入插入模式,等你输入新内容。改变量名、改API函数名时非常常用。dw:删除当前单词c$:从光标位置改到行尾ct,:从光标位置改到下一个逗号前(t表示"直到"某个字符前)di(:删除括号内的所有内容(不包含括号本身)da(:删除包括括号在内的内容y3w:复制后面的3个单词dgg:从当前位置删除到文件头部
这些组合看起来复杂,规律其实朴素:动词(d/y/c)+ 范围(i/a/t/数字 + 对象(w/s/括号等)+ 字符。理解了这层语法,几乎能推导出所有的组合命令。有点像学吉他:先记住和弦形状,再练习转换,最后手指形成肌肉记忆。
7.2 宏录制:把重复操作交给vi
宏录制(Macro)是真正考验vi功力的功能。它允许你录制一系列操作,然后在需要的地方回放。场景驱动:假设一个1000行的文本文件中,每行末尾都要加一个;,而且第5行到第10行还需要特殊处理。手工操作会烦死人,宏一键搞定。
录制步骤:
- 在命令模式,按
q,然后按a(定义一个名为a的宏寄存器) - 屏幕左下角出现"recording"提示
- 执行操作:按
$跳到行尾,按a进入插入模式,输入;,按Esc - 按
q停止录制 - 把光标移到下一行,按
@a回放宏
如果要对所有行执行,可以这样:
:%normal @a这条命令把宏a应用到文件的每一行。录一次、用百遍,这种批量操作带来的爽感,是很多编辑器无法给到的。
心得:宏录制时,注意不要录制跳转类命令(如
G、gg、/搜索),因为回放时会破坏位置。尽量录制"当前光标附近的修改",然后用移动命令逐行调用。
7.3 排除两个高频误解
有一个高频"卡顿"场景:新手在vim里执行了:tabnew(打开新标签页)之后,发现按什么键都无法关闭新标签,界面毫无反应。实际上关闭标签的命令是:q或:tabclose。这个误会源于对vim窗口、缓冲区(buffer)、标签页(tab)概念的混淆。理解:buffer是内存中的文件副本,窗口是buffer的显示区域,标签页是窗口的容器。操作时要清楚自己在操作哪个对象。
另一个高频误解是关于Ctrl+s冻结终端。在终端中,Ctrl+s默认是暂停输出(XOFF),很多人想用Ctrl+s做保存,结果发现终端整个卡住,按什么键都没反应。这是终端控制字符,不是vim的行为。按下Ctrl+q可以解除冻结。建议保存一律用:w。
7.4 实用心得:vi学习路径拆解
总结一个适合大多数人的学习路径,按阶段走,不焦虑:
- 第一周:只记
i进插入、Esc回命令、:wq保存退出、dd删行。能在vi里改文件就够用。 - 第二周:记
w、b、$、0四个移动命令,删除加移动,全面替换gg、G首尾跳转。 - 第三周:理解
ciw、di(等复合命令,开始用/搜索跳转。 - 一个月左右:开始配置vimrc,逐渐加入相对行号、系统剪贴板等选项。
- 两三个月:尝试宏录制、多文件编辑,并逐渐形成自己的默认配置。
学vi最大的敌人是"退回舒适区"。很多人第一天用Escape键被卡住,就果断放弃了,然后回到nano或sublime。这太可惜了。因为熟练vi之后,你在任何一台服务器上都能拥有相同的编辑体验,无需安装任何东西。这份能力,一旦获得就不会丢失。
8. 遭遇"vi报错"时不要慌:常见错误信息解读
最后一步,我结合前面提到的实际工况,整理一份vi相关报错排查表。很多新手遇到error信息就慌,尤其是网上那些自动抓出来的标题党信息,其实一半是vi的正常机制,一半是被"语言包安装报错"这类不相关问题误导了。
8.1 vi自身的常见错误
| 报错信息 | 含义 | 处理办法 |
|---|---|---|
E32: No file name | 文件没有名字 | 用:w 文件名命名保存 |
E37: No write since last change | 有修改未保存 | :w保存,或:q!放弃修改 |
E212: Can't open file for writing | 没有写权限 | 检查目录权限,必要时sudo vi |
E138: Can't write viminfo file | 无法写入历史记录文件 | 检查~/.viminfo权限或空间 |
E325: ATTENTION | 检测到交换文件 | 按上文所述处理 |
E486: Pattern not found | 搜索/替换的模式不存在 | 检查拼写,确认内容确实存在 |
8.2 一个容易被误认为是vi报错的常见情况
看这类网络热词,搜到过"error while installing 'chinese (simplified) (简体中文) language pack for vi"的信息——这个报错本质上不是vi编辑器本身的问题,而是某些IDE(比如VS Code)在安装简体中文语言包时,因为网络代理、插件市场访问不稳定或者版本不兼容导致的插件安装失败。报错里出现了"vi"字样,让很多人误以为vi出问题了。如果你遇到这个错误,请记住:
- 这不是系统vi的问题,你仍然可以正常使用vi编辑文件
- 处理方法:检查IDE的代理设置、重试安装、或者更新IDE版本;在某些受限环境下,可以手动下载语言包离线安装
- 完全不值得为此影响你对vi的学习
这种"同名关键词引起的误判",在技术领域很常见。排查问题时要先确认问题上下文,不要被错误信息中的关键词误导。比如vi编辑器遇到问题时,报错往往发生在打开文件、写入文件、切换缓冲区这几个环节;而IDE装语言包报错,发生在插件管理器层面。差别一目了然。
8.3 从报错到解决:一个完整个案例
拿一个典型场景说明排查思路:你在vi里执行:w保存文件,结果看到E212: Can't open file for writing。这时候首先确认的不是vi坏了,而是权限问题。处理步骤:
- 检查当前用户对文件是否有写权限:
ls -l 文件名 - 检查文件所在目录是否有写权限:
ls -ld . - 如果确实没有权限,用
:w !sudo tee %这个经典技巧保存——它以sudo权限将当前缓冲区内容写入文件;或者退出后直接用sudo vi 文件名打开重编辑。 - 如果文件属于你自己但目录只读,考虑是否需要调整目录权限。
这类问题之所以让新手困惑,是因为他们默认"打开文件能编辑就能保存",但Unix/Linux下,能否打开和能否写入是两回事。vi作为一门"老派"工具,其行为严格遵守操作系统的权限模型,不会变通,这也算是一种古老而质朴的确定性。
9. 写在最后:学习vi是值得的长期投资
我最初学习vi时也充满挫败感,Escape键按了无数遍,模式切换的折磨几乎劝退。但真当我用了一个多月后,那种"指尖碰到哪个键都是命令、无需经过鼠标和菜单中转"的流畅感,是其他编辑器完全替代不了的。特别是在远程服务器、Docker容器的环境里,没有图形界面,vi几乎是唯一稳定的编辑器。那些"必须依赖鼠标"的同学,在那时只能手忙脚乱。
我自己的使用习惯是:日常写代码用现代IDE,但改服务器配置、写快速脚本、查看日志文件,全都是vi。它和IDE不是替代关系,而是互补——一个擅长大规模重构和项目管理,一个擅长快速修改和轻量操作。学vi那点时间成本,在一次突发故障中抢救一个关键配置就可能全赚回来了。
如果你能坚持到看完这一篇,我觉得你至少已经理解了vi的核心哲学。接下来的路,就是在真实使用中慢慢积累自己的命令组合。希望这12年里,vi帮我省下的那些时间,也能变成你的时间。分享一个我的习惯:在终端的~/.bashrc里加一行EDITOR=vi,此后git commit、crontab -e等命令都会默认用vi打开,这是把vi融入工作流最简单的一步。试试看,它会在你完全没有察觉的时候,成为你最顺手的东西。